From 581e890ad9338a586ded1d81ca579620bfc89151 Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Fri, 21 Jun 2019 15:57:04 +0200
Subject: [PATCH] See #853: advertise allow-list configuration in nodeinfo

---
 api/funkwhale_api/instance/nodeinfo.py | 13 ++++++++++++-
 api/tests/instance/test_nodeinfo.py    | 22 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/api/funkwhale_api/instance/nodeinfo.py b/api/funkwhale_api/instance/nodeinfo.py
index f45fbb129..178a8c1ab 100644
--- a/api/funkwhale_api/instance/nodeinfo.py
+++ b/api/funkwhale_api/instance/nodeinfo.py
@@ -2,7 +2,7 @@ import memoize.djangocache
 
 import funkwhale_api
 from funkwhale_api.common import preferences
-from funkwhale_api.federation import actors
+from funkwhale_api.federation import actors, models as federation_models
 from funkwhale_api.music import utils as music_utils
 
 from . import stats
@@ -13,6 +13,16 @@ memo = memoize.Memoizer(store, namespace="instance:stats")
 
 def get():
     share_stats = preferences.get("instance__nodeinfo_stats_enabled")
+    allow_list_enabled = preferences.get("moderation__allow_list_enabled")
+    allow_list_public = preferences.get("moderation__allow_list_public")
+    if allow_list_enabled and allow_list_public:
+        allowed_domains = list(
+            federation_models.Domain.objects.filter(allowed=True)
+            .order_by("name")
+            .values_list("name", flat=True)
+        )
+    else:
+        allowed_domains = None
     data = {
         "version": "2.0",
         "software": {"name": "funkwhale", "version": funkwhale_api.__version__},
@@ -36,6 +46,7 @@ def get():
                 ),
             },
             "supportedUploadExtensions": music_utils.SUPPORTED_EXTENSIONS,
+            "allowList": {"enabled": allow_list_enabled, "domains": allowed_domains},
         },
     }
     if share_stats:
diff --git a/api/tests/instance/test_nodeinfo.py b/api/tests/instance/test_nodeinfo.py
index 233b388d4..211dbaa54 100644
--- a/api/tests/instance/test_nodeinfo.py
+++ b/api/tests/instance/test_nodeinfo.py
@@ -1,3 +1,5 @@
+import pytest
+
 import funkwhale_api
 from funkwhale_api.instance import nodeinfo
 from funkwhale_api.federation import actors
@@ -48,6 +50,7 @@ def test_nodeinfo_dump(preferences, mocker):
                 "listenings": {"total": stats["listenings"]},
             },
             "supportedUploadExtensions": music_utils.SUPPORTED_EXTENSIONS,
+            "allowList": {"enabled": False, "domains": None},
         },
     }
     assert nodeinfo.get() == expected
@@ -79,6 +82,25 @@ def test_nodeinfo_dump_stats_disabled(preferences, mocker):
                 ],
             },
             "supportedUploadExtensions": music_utils.SUPPORTED_EXTENSIONS,
+            "allowList": {"enabled": False, "domains": None},
         },
     }
     assert nodeinfo.get() == expected
+
+
+@pytest.mark.parametrize(
+    "enabled, public, expected",
+    [
+        (True, True, {"enabled": True, "domains": ["allowed.example"]}),
+        (True, False, {"enabled": True, "domains": None}),
+        (False, False, {"enabled": False, "domains": None}),
+    ],
+)
+def test_nodeinfo_allow_list_enabled(preferences, factories, enabled, public, expected):
+    preferences["moderation__allow_list_enabled"] = enabled
+    preferences["moderation__allow_list_public"] = public
+    factories["federation.Domain"](name="allowed.example", allowed=True)
+    factories["federation.Domain"](allowed=False)
+    factories["federation.Domain"](allowed=None)
+
+    assert nodeinfo.get()["metadata"]["allowList"] == expected
-- 
GitLab