From b028f3f817b187a22ae35d6353f69f34cc8cbc1c Mon Sep 17 00:00:00 2001
From: Eliot Berriot <contact@eliotberriot.com>
Date: Fri, 28 Sep 2018 21:19:37 +0200
Subject: [PATCH] Do not deliver anything to remote instances when federation
 is disabled

---
 api/funkwhale_api/federation/tasks.py | 13 ++++++++++++-
 api/tests/federation/test_tasks.py    | 14 ++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/api/funkwhale_api/federation/tasks.py b/api/funkwhale_api/federation/tasks.py
index e5409dd3..822778f6 100644
--- a/api/funkwhale_api/federation/tasks.py
+++ b/api/funkwhale_api/federation/tasks.py
@@ -8,6 +8,7 @@ from django.utils import timezone
 from dynamic_preferences.registries import global_preferences_registry
 from requests.exceptions import RequestException
 
+from funkwhale_api.common import preferences
 from funkwhale_api.common import session
 from funkwhale_api.music import models as music_models
 from funkwhale_api.taskapp import celery
@@ -87,11 +88,16 @@ def dispatch_outbox(activity):
     Deliver a local activity to its recipients, both locally and remotely
     """
     inbox_items = activity.inbox_items.filter(is_read=False).select_related()
-    deliveries = activity.deliveries.filter(is_delivered=False)
 
     if inbox_items.exists():
         dispatch_inbox.delay(activity_id=activity.pk)
 
+    if not preferences.get("federation__enabled"):
+        # federation is disabled, we only deliver to local recipients
+        return
+
+    deliveries = activity.deliveries.filter(is_delivered=False)
+
     for id in deliveries.values_list("pk", flat=True):
         deliver_to_remote.delay(delivery_id=id)
 
@@ -109,6 +115,11 @@ def dispatch_outbox(activity):
     "delivery",
 )
 def deliver_to_remote(delivery):
+
+    if not preferences.get("federation__enabled"):
+        # federation is disabled, we only deliver to local recipients
+        return
+
     actor = delivery.activity.actor
     logger.info("Preparing activity delivery to %s", delivery.inbox_url)
     auth = signing.get_auth(actor.private_key, actor.private_key_id)
diff --git a/api/tests/federation/test_tasks.py b/api/tests/federation/test_tasks.py
index 1394b4e9..0ce00fce 100644
--- a/api/tests/federation/test_tasks.py
+++ b/api/tests/federation/test_tasks.py
@@ -87,6 +87,20 @@ def test_dispatch_outbox(factories, mocker):
     mocked_deliver_to_remote.assert_called_once_with(delivery_id=delivery.pk)
 
 
+def test_dispatch_outbox_disabled_federation(factories, mocker, preferences):
+    preferences["federation__enabled"] = False
+    mocked_inbox = mocker.patch("funkwhale_api.federation.tasks.dispatch_inbox.delay")
+    mocked_deliver_to_remote = mocker.patch(
+        "funkwhale_api.federation.tasks.deliver_to_remote.delay"
+    )
+    activity = factories["federation.Activity"](actor__local=True)
+    factories["federation.InboxItem"](activity=activity)
+    factories["federation.Delivery"](activity=activity)
+    tasks.dispatch_outbox(activity_id=activity.pk)
+    mocked_inbox.assert_called_once_with(activity_id=activity.pk)
+    mocked_deliver_to_remote.assert_not_called()
+
+
 def test_deliver_to_remote_success_mark_as_delivered(factories, r_mock, now):
     delivery = factories["federation.Delivery"]()
     r_mock.post(delivery.inbox_url)
-- 
GitLab