From abca719d163aa69be615a1f9dd8abe48b087cb6a Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Fri, 30 Mar 2018 18:02:50 +0200
Subject: [PATCH] More fields on instance actor repr

---
 api/funkwhale_api/federation/serializers.py | 17 ++++++++++
 api/tests/federation/test_serializers.py    | 36 +++++++++++++++++++++
 api/tests/federation/test_views.py          | 19 +++--------
 api/tests/federation/test_webfinger.py      |  4 +--
 4 files changed, 59 insertions(+), 17 deletions(-)
 create mode 100644 api/tests/federation/test_serializers.py

diff --git a/api/funkwhale_api/federation/serializers.py b/api/funkwhale_api/federation/serializers.py
index 62a4500db..6e3754203 100644
--- a/api/funkwhale_api/federation/serializers.py
+++ b/api/funkwhale_api/federation/serializers.py
@@ -1,6 +1,8 @@
 from django.urls import reverse
 from django.conf import settings
 
+from dynamic_preferences.registries import global_preferences_registry
+
 from . import utils
 
 
@@ -8,6 +10,10 @@ def repr_instance_actor():
     """
     We do not use a serializer here, since it's pretty static
     """
+    actor_url = utils.full_url(reverse('federation:instance-actor'))
+    preferences = global_preferences_registry.manager()
+    public_key = preferences['federation__public_key']
+
     return {
         '@context': [
             'https://www.w3.org/ns/activitystreams',
@@ -18,4 +24,15 @@ def repr_instance_actor():
         'type': 'Service',
         'inbox': utils.full_url(reverse('federation:instance-inbox')),
         'outbox': utils.full_url(reverse('federation:instance-outbox')),
+        'preferredUsername': 'service',
+        'name': 'Service Bot - {}'.format(settings.FEDERATION_HOSTNAME),
+        'summary': 'Bot account for federating with {}'.format(
+            settings.FEDERATION_HOSTNAME
+        ),
+        'publicKey': {
+            'id': '{}#main-key'.format(actor_url),
+            'owner': actor_url,
+            'publicKeyPem': public_key
+        },
+
     }
diff --git a/api/tests/federation/test_serializers.py b/api/tests/federation/test_serializers.py
new file mode 100644
index 000000000..68672e6b4
--- /dev/null
+++ b/api/tests/federation/test_serializers.py
@@ -0,0 +1,36 @@
+from django.urls import reverse
+
+from funkwhale_api.federation import keys
+from funkwhale_api.federation import serializers
+
+
+def test_repr_instance_actor(db, preferences, settings):
+    _, public_key = keys.get_key_pair()
+    preferences['federation__public_key'] = public_key.decode('utf-8')
+    settings.FEDERATION_HOSTNAME = 'test.federation'
+    settings.FUNKWHALE_URL = 'https://test.federation'
+    actor_url = settings.FUNKWHALE_URL + reverse('federation:instance-actor')
+    inbox_url = settings.FUNKWHALE_URL + reverse('federation:instance-inbox')
+    outbox_url = settings.FUNKWHALE_URL + reverse('federation:instance-outbox')
+
+    expected = {
+        '@context': [
+            'https://www.w3.org/ns/activitystreams',
+            'https://w3id.org/security/v1',
+            {},
+        ],
+        'id': actor_url,
+        'type': 'Service',
+        'preferredUsername': 'service',
+        'name': 'Service Bot - test.federation',
+        'summary': 'Bot account for federating with test.federation',
+        'inbox': inbox_url,
+        'outbox': outbox_url,
+        'publicKey': {
+            'id': '{}#main-key'.format(actor_url),
+            'owner': actor_url,
+            'publicKeyPem': public_key.decode('utf-8')
+        },
+    }
+
+    assert expected == serializers.repr_instance_actor()
diff --git a/api/tests/federation/test_views.py b/api/tests/federation/test_views.py
index 3d8218c23..6a8de8c14 100644
--- a/api/tests/federation/test_views.py
+++ b/api/tests/federation/test_views.py
@@ -2,6 +2,7 @@ from django.urls import reverse
 
 import pytest
 
+from funkwhale_api.federation import serializers
 from funkwhale_api.federation import webfinger
 
 
@@ -9,21 +10,9 @@ def test_instance_actor(db, settings, api_client):
     settings.FUNKWHALE_URL = 'http://test.com'
     url = reverse('federation:instance-actor')
     response = api_client.get(url)
-    assert response.data['id'] == (
-      settings.FUNKWHALE_URL + url
-    )
-    assert response.data['type'] == 'Service'
-    assert response.data['inbox'] == (
-      settings.FUNKWHALE_URL + reverse('federation:instance-inbox')
-    )
-    assert response.data['outbox'] == (
-      settings.FUNKWHALE_URL + reverse('federation:instance-outbox')
-    )
-    assert response.data['@context'] == [
-      'https://www.w3.org/ns/activitystreams',
-      'https://w3id.org/security/v1',
-      {},
-    ]
+
+    assert response.status_code == 200
+    assert response.data == serializers.repr_instance_actor()
 
 
 @pytest.mark.parametrize('route', [
diff --git a/api/tests/federation/test_webfinger.py b/api/tests/federation/test_webfinger.py
index 4cee9c8c7..d2b00f8f1 100644
--- a/api/tests/federation/test_webfinger.py
+++ b/api/tests/federation/test_webfinger.py
@@ -54,12 +54,12 @@ def test_service_serializer(settings):
         'links': [
             {
                 'rel': 'self',
-                'href': 'https://test.federation/instance/actor',
+                'href': 'https://test.federation/federation/instance/actor',
                 'type': 'application/activity+json',
             }
         ],
         'aliases': [
-            'https://test.federation/instance/actor',
+            'https://test.federation/federation/instance/actor',
         ]
     }
 
-- 
GitLab