2018-03-28 22:00:20 +00:00
|
|
|
from django import forms
|
|
|
|
from django.conf import settings
|
|
|
|
|
2018-04-08 08:42:10 +00:00
|
|
|
from funkwhale_api.common import session
|
|
|
|
|
2018-07-22 10:20:16 +00:00
|
|
|
from . import serializers
|
2018-03-31 13:47:21 +00:00
|
|
|
|
2018-06-09 13:36:16 +00:00
|
|
|
VALID_RESOURCE_TYPES = ["acct"]
|
2018-03-28 22:00:20 +00:00
|
|
|
|
|
|
|
|
|
|
|
def clean_resource(resource_string):
|
|
|
|
if not resource_string:
|
2018-06-09 13:36:16 +00:00
|
|
|
raise forms.ValidationError("Invalid resource string")
|
2018-03-28 22:00:20 +00:00
|
|
|
|
|
|
|
try:
|
2018-06-09 13:36:16 +00:00
|
|
|
resource_type, resource = resource_string.split(":", 1)
|
2018-03-28 22:00:20 +00:00
|
|
|
except ValueError:
|
2018-06-09 13:36:16 +00:00
|
|
|
raise forms.ValidationError("Missing webfinger resource type")
|
2018-03-28 22:00:20 +00:00
|
|
|
|
|
|
|
if resource_type not in VALID_RESOURCE_TYPES:
|
2018-06-09 13:36:16 +00:00
|
|
|
raise forms.ValidationError("Invalid webfinger resource type")
|
2018-03-28 22:00:20 +00:00
|
|
|
|
|
|
|
return resource_type, resource
|
|
|
|
|
|
|
|
|
2018-04-08 08:42:10 +00:00
|
|
|
def clean_acct(acct_string, ensure_local=True):
|
2018-03-28 22:00:20 +00:00
|
|
|
try:
|
2018-06-09 13:36:16 +00:00
|
|
|
username, hostname = acct_string.split("@")
|
2018-03-28 22:00:20 +00:00
|
|
|
except ValueError:
|
2018-06-09 13:36:16 +00:00
|
|
|
raise forms.ValidationError("Invalid format")
|
2018-03-28 22:00:20 +00:00
|
|
|
|
2018-04-08 08:42:10 +00:00
|
|
|
if ensure_local and hostname.lower() != settings.FEDERATION_HOSTNAME:
|
2018-06-09 13:36:16 +00:00
|
|
|
raise forms.ValidationError("Invalid hostname {}".format(hostname))
|
2018-03-28 22:00:20 +00:00
|
|
|
|
|
|
|
return username, hostname
|
2018-04-08 08:42:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
def get_resource(resource_string):
|
|
|
|
resource_type, resource = clean_resource(resource_string)
|
|
|
|
username, hostname = clean_acct(resource, ensure_local=False)
|
2018-06-09 13:36:16 +00:00
|
|
|
url = "https://{}/.well-known/webfinger?resource={}".format(
|
|
|
|
hostname, resource_string
|
|
|
|
)
|
2018-04-08 16:24:07 +00:00
|
|
|
response = session.get_session().get(
|
2018-06-09 13:36:16 +00:00
|
|
|
url, verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL, timeout=5
|
|
|
|
)
|
2018-04-08 08:42:10 +00:00
|
|
|
response.raise_for_status()
|
|
|
|
serializer = serializers.ActorWebfingerSerializer(data=response.json())
|
|
|
|
serializer.is_valid(raise_exception=True)
|
|
|
|
return serializer.validated_data
|