diff --git a/api/config/settings/common.py b/api/config/settings/common.py index fbe3b7045..6a85a934c 100644 --- a/api/config/settings/common.py +++ b/api/config/settings/common.py @@ -30,7 +30,9 @@ FUNKWHALE_HOSTNAME = urlsplit(FUNKWHALE_URL).netloc FEDERATION_ENABLED = env.bool('FEDERATION_ENABLED', default=True) FEDERATION_HOSTNAME = env('FEDERATION_HOSTNAME', default=FUNKWHALE_HOSTNAME) - +FEDERATION_MUSIC_NEEDS_APPROVAL = env.bool( + 'FEDERATION_MUSIC_NEEDS_APPROVAL', default=True +) ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS') # APP CONFIGURATION diff --git a/api/funkwhale_api/federation/actors.py b/api/funkwhale_api/federation/actors.py index a4e24912b..e29125f5b 100644 --- a/api/funkwhale_api/federation/actors.py +++ b/api/funkwhale_api/federation/actors.py @@ -47,6 +47,7 @@ def get_actor(actor_url): class SystemActor(object): additional_attributes = {} + manually_approves_followers = False def get_actor_instance(self): args = self.get_instance_argument( @@ -113,6 +114,9 @@ class LibraryActor(SystemActor): additional_attributes = { 'manually_approves_followers': True } + @property + def manually_approves_followers(self): + return settings.FEDERATION_MUSIC_NEEDS_APPROVAL class TestActor(SystemActor): @@ -125,6 +129,7 @@ class TestActor(SystemActor): additional_attributes = { 'manually_approves_followers': False } + manually_approves_followers = False def get_outbox(self, data, actor=None): return { diff --git a/api/funkwhale_api/federation/models.py b/api/funkwhale_api/federation/models.py index d76ad173b..a2cd598f7 100644 --- a/api/funkwhale_api/federation/models.py +++ b/api/funkwhale_api/federation/models.py @@ -57,3 +57,11 @@ class Actor(models.Model): setattr(self, field, v.lower()) super().save(**kwargs) + + @property + def is_system(self): + from . import actors + return all([ + settings.FEDERATION_HOSTNAME == self.domain, + self.preferred_username in actors.SYSTEM_ACTORS + ]) diff --git a/api/tests/federation/test_actors.py b/api/tests/federation/test_actors.py index 127b3c15e..8afb94ad0 100644 --- a/api/tests/federation/test_actors.py +++ b/api/tests/federation/test_actors.py @@ -197,3 +197,28 @@ def test_getting_actor_instance_persists_in_db(db): for f in test._meta.fields: assert getattr(from_db, f.name) == getattr(test, f.name) + + +@pytest.mark.parametrize('username,domain,expected', [ + ('test', 'wrongdomain.com', False), + ('notsystem', '', False), + ('test', '', True), +]) +def test_actor_is_system( + username, domain, expected, nodb_factories, settings): + if not domain: + domain = settings.FEDERATION_HOSTNAME + + actor = nodb_factories['federation.Actor']( + preferred_username=username, + domain=domain, + ) + assert actor.is_system is expected + + +@pytest.mark.parametrize('value', [False, True]) +def test_library_actor_manually_approves_based_on_setting( + value, settings): + settings.FEDERATION_MUSIC_NEEDS_APPROVAL = value + library_conf = actors.SYSTEM_ACTORS['library'] + assert library_conf.manually_approves_followers is value diff --git a/deploy/env.prod.sample b/deploy/env.prod.sample index a016b34c7..9e9938500 100644 --- a/deploy/env.prod.sample +++ b/deploy/env.prod.sample @@ -85,3 +85,12 @@ API_AUTHENTICATION_REQUIRED=True # This will help us detect and correct bugs RAVEN_ENABLED=false RAVEN_DSN=https://44332e9fdd3d42879c7d35bf8562c6a4:0062dc16a22b41679cd5765e5342f716@sentry.eliotberriot.com/5 + +# This settings enable/disable federation on the instance level +FEDERATION_ENABLED=True +# This setting decide wether music library is shared automatically +# to followers or if it requires manual approval before. +# FEDERATION_MUSIC_NEEDS_APPROVAL=False +# means anyone can subscribe to your library and import your file, +# use with caution. +FEDERATION_MUSIC_NEEDS_APPROVAL=True