diff --git a/fedireads/migrations/0024_federatedserver_application_version.py b/fedireads/migrations/0024_federatedserver_application_version.py new file mode 100644 index 00000000..ee65f963 --- /dev/null +++ b/fedireads/migrations/0024_federatedserver_application_version.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.3 on 2020-03-29 22:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('fedireads', '0023_auto_20200328_2203'), + ] + + operations = [ + migrations.AddField( + model_name='federatedserver', + name='application_version', + field=models.CharField(max_length=255, null=True), + ), + ] diff --git a/fedireads/models/user.py b/fedireads/models/user.py index 7aecd7b2..dfc03f7c 100644 --- a/fedireads/models/user.py +++ b/fedireads/models/user.py @@ -108,6 +108,7 @@ class UserRelationship(FedireadsModel): base_path = self.user_subject.absolute_id return '%s#%s/%d' % (base_path, self.status, self.id) + class UserFollows(UserRelationship): @property def status(self): @@ -121,16 +122,19 @@ class UserFollows(UserRelationship): relationship_id=follow_request.relationship_id, ) + class UserFollowRequest(UserRelationship): @property def status(self): return 'follow_request' + class UserBlocks(UserRelationship): @property def status(self): return 'blocks' + class FederatedServer(FedireadsModel): ''' store which server's we federate with ''' server_name = models.CharField(max_length=255, unique=True) @@ -138,6 +142,7 @@ class FederatedServer(FedireadsModel): status = models.CharField(max_length=255, default='federated') # is it mastodon, fedireads, etc application_type = models.CharField(max_length=255, null=True) + application_version = models.CharField(max_length=255, null=True) @receiver(models.signals.pre_save, sender=User) diff --git a/fedireads/remote_user.py b/fedireads/remote_user.py index 2fe1fb1d..ac58e5a4 100644 --- a/fedireads/remote_user.py +++ b/fedireads/remote_user.py @@ -13,8 +13,6 @@ def get_or_create_remote_user(actor): except models.User.DoesNotExist: pass - # TODO: handle remote server and connector - # load the user's info from the actor url response = requests.get( actor, @@ -30,6 +28,9 @@ def get_or_create_remote_user(actor): shared_inbox = data.get('endpoints').get('sharedInbox') if \ data.get('endpoints') else None + + server = get_or_create_remote_server(actor_parts.netloc) + # throws a key error if it can't find any of these fields user = models.User.objects.create_user( username, @@ -46,6 +47,7 @@ def get_or_create_remote_user(actor): fedireads_user=data.get('fedireadsUser', False), manually_approves_followers=data.get( 'manuallyApprovesFollowers', False), + federated_server=server, ) if user.fedireads_user: get_remote_reviews(user) @@ -65,3 +67,36 @@ def get_remote_reviews(user): if status.get('fedireadsType') == 'Review': create_review_from_activity(user, status) + +def get_or_create_remote_server(domain): + ''' get info on a remote server ''' + try: + return models.FederatedServer.objects.get( + server_name=domain + ) + except models.FederatedServer.DoesNotExist: + pass + + response = requests.get( + 'https://%s/.well-known/nodeinfo' % domain, + headers={'Accept': 'application/activity+json'} + ) + data = response.json() + try: + nodeinfo_url = data.get('links')[0].get('href') + except (TypeError, KeyError): + return None + + response = requests.get( + nodeinfo_url, + headers={'Accept': 'application/activity+json'} + ) + data = response.json() + + server = models.FederatedServer.objects.create( + server_name=domain, + application_type=data['software']['name'], + application_version=data['software']['version'], + ) + return server + diff --git a/fedireads/wellknown.py b/fedireads/wellknown.py index 5081d597..66c454f8 100644 --- a/fedireads/wellknown.py +++ b/fedireads/wellknown.py @@ -105,6 +105,6 @@ def peers(request): if request.method != 'GET': return HttpResponseNotFound() - # TODO - return JsonResponse([]) + names = models.FederatedServer.objects.values_list('server_name', flat=True) + return JsonResponse(list(names), safe=False)