from django import forms from django.conf import settings from django.urls import reverse from funkwhale_api.common import session from . import actors from . import utils from . import serializers VALID_RESOURCE_TYPES = ['acct'] def clean_resource(resource_string): if not resource_string: raise forms.ValidationError('Invalid resource string') try: resource_type, resource = resource_string.split(':', 1) except ValueError: raise forms.ValidationError('Missing webfinger resource type') if resource_type not in VALID_RESOURCE_TYPES: raise forms.ValidationError('Invalid webfinger resource type') return resource_type, resource def clean_acct(acct_string, ensure_local=True): try: username, hostname = acct_string.split('@') except ValueError: raise forms.ValidationError('Invalid format') if ensure_local and hostname.lower() != settings.FEDERATION_HOSTNAME: raise forms.ValidationError( 'Invalid hostname {}'.format(hostname)) if ensure_local and username not in actors.SYSTEM_ACTORS: raise forms.ValidationError('Invalid username') return username, hostname def get_resource(resource_string): resource_type, resource = clean_resource(resource_string) username, hostname = clean_acct(resource, ensure_local=False) url = 'https://{}/.well-known/webfinger?resource={}'.format( hostname, resource_string) response = session.get_session().get( url, verify=settings.EXTERNAL_REQUESTS_VERIFY_SSL, timeout=5) response.raise_for_status() serializer = serializers.ActorWebfingerSerializer(data=response.json()) serializer.is_valid(raise_exception=True) return serializer.validated_data