From 44c2ef0dd9167b6789501a6a4424088dbe1c5725 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 24 Jun 2019 17:12:53 +0200 Subject: [PATCH 1/6] See #853: added support for filtering allowed domains in API --- api/funkwhale_api/manage/filters.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/api/funkwhale_api/manage/filters.py b/api/funkwhale_api/manage/filters.py index 984b83133..de12ab1ab 100644 --- a/api/funkwhale_api/manage/filters.py +++ b/api/funkwhale_api/manage/filters.py @@ -235,12 +235,23 @@ class ManageUploadFilterSet(filters.FilterSet): ] +def filter_allowed(queryset, name, value): + """ + If value=false, we want to include object with value=null as well + """ + if value: + return queryset.filter(allowed=True) + else: + return queryset.filter(Q(allowed=False) | Q(allowed__isnull=True)) + + class ManageDomainFilterSet(filters.FilterSet): q = fields.SearchFilter(search_fields=["name"]) + allowed = filters.BooleanFilter(method=filter_allowed) class Meta: model = federation_models.Domain - fields = ["name"] + fields = ["name", "allowed"] class ManageActorFilterSet(filters.FilterSet): -- GitLab From 17f516eddf8d4e0337a89f3bb98b5948239e07bb Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 24 Jun 2019 17:13:23 +0200 Subject: [PATCH 2/6] See #853: fixed typo in preference help_text --- api/funkwhale_api/moderation/dynamic_preferences_registry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/funkwhale_api/moderation/dynamic_preferences_registry.py b/api/funkwhale_api/moderation/dynamic_preferences_registry.py index 8d8237cbb..04a732f4d 100644 --- a/api/funkwhale_api/moderation/dynamic_preferences_registry.py +++ b/api/funkwhale_api/moderation/dynamic_preferences_registry.py @@ -19,8 +19,8 @@ class AllowListPublic(types.BooleanPreference): name = "allow_list_public" verbose_name = "Publish your allowed-domains list" help_text = ( - "If enabled, everyone will be able to retrieve the list of domains you allowed. ", + "If enabled, everyone will be able to retrieve the list of domains you allowed. " "This is useful on open setups, to help people decide if they want to join your pod, or to " - "make your moderation policy public.", + "make your moderation policy public." ) default = False -- GitLab From aaf090a90027e7399fa16473d82a667f3e3fcd22 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 24 Jun 2019 17:13:48 +0200 Subject: [PATCH 3/6] See #853: added quick action to batch add/remove domains from allow-list --- api/funkwhale_api/manage/serializers.py | 14 +++++++++++++- api/tests/manage/test_serializers.py | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/api/funkwhale_api/manage/serializers.py b/api/funkwhale_api/manage/serializers.py index 25f8c01db..c72e015bf 100644 --- a/api/funkwhale_api/manage/serializers.py +++ b/api/funkwhale_api/manage/serializers.py @@ -152,7 +152,11 @@ class ManageDomainUpdateSerializer(ManageDomainSerializer): class ManageDomainActionSerializer(common_serializers.ActionSerializer): - actions = [common_serializers.Action("purge", allow_all=False)] + actions = [ + common_serializers.Action("purge", allow_all=False), + common_serializers.Action("allow_list_add", allow_all=True), + common_serializers.Action("allow_list_remove", allow_all=True), + ] filterset_class = filters.ManageDomainFilterSet pk_field = "name" @@ -161,6 +165,14 @@ class ManageDomainActionSerializer(common_serializers.ActionSerializer): ids = objects.values_list("pk", flat=True) common_utils.on_commit(federation_tasks.purge_actors.delay, domains=list(ids)) + @transaction.atomic + def handle_allow_list_add(self, objects): + objects.update(allowed=True) + + @transaction.atomic + def handle_allow_list_remove(self, objects): + objects.update(allowed=False) + class ManageBaseActorSerializer(serializers.ModelSerializer): class Meta: diff --git a/api/tests/manage/test_serializers.py b/api/tests/manage/test_serializers.py index cfbb17517..c80cb5c6c 100644 --- a/api/tests/manage/test_serializers.py +++ b/api/tests/manage/test_serializers.py @@ -176,6 +176,28 @@ def test_manage_domain_action_purge(factories, mocker): ) +def test_manage_domain_action_allow_list_add(factories, mocker): + domains = factories["federation.Domain"].create_batch(size=3, allowed=False) + s = serializers.ManageDomainActionSerializer(queryset=None) + s.handle_allow_list_add(domains[0].__class__.objects.all()) + + for domain in domains: + domain.refresh_from_db() + assert domain.allowed is True + + + + +def test_manage_domain_action_allow_list_remove(factories, mocker): + domains = factories["federation.Domain"].create_batch(size=3, allowed=True) + s = serializers.ManageDomainActionSerializer(queryset=None) + s.handle_allow_list_remove(domains[0].__class__.objects.all()) + + for domain in domains: + domain.refresh_from_db() + assert domain.allowed is False + + @pytest.mark.parametrize( "param,expected_only", [("block_all", []), ("reject_media", ["media"])] ) -- GitLab From 6f5379e60e0cc41ee9646065605f55e8ea04da7e Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 24 Jun 2019 17:14:15 +0200 Subject: [PATCH 4/6] See #853: expose allow-list general settings in UI --- front/src/views/admin/Settings.vue | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/front/src/views/admin/Settings.vue b/front/src/views/admin/Settings.vue index 7102fb311..a1d03aab7 100644 --- a/front/src/views/admin/Settings.vue +++ b/front/src/views/admin/Settings.vue @@ -82,6 +82,7 @@ export default { let musicLabel = this.$pgettext('*/*/*/Noun', 'Music') let playlistsLabel = this.$pgettext('*/*/*', 'Playlists') let federationLabel = this.$pgettext('Content/Admin/Menu', 'Federation') + let moderationLabel = this.$pgettext('Content/Admin/Menu', 'Moderation') let subsonicLabel = this.$pgettext('Content/Admin/Menu', 'Subsonic') let statisticsLabel = this.$pgettext('Content/Admin/Menu', 'Statistics') let errorLabel = this.$pgettext('Content/Admin/Menu', 'Error reporting') @@ -118,6 +119,14 @@ export default { id: "playlists", settings: ["playlists__max_tracks"] }, + { + label: moderationLabel, + id: "moderation", + settings: [ + "moderation__allow_list_enabled", + "moderation__allow_list_public", + ] + }, { label: federationLabel, id: "federation", -- GitLab From e5610c65ba95ffc85bf6d2935bab79f228c460a4 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 24 Jun 2019 17:14:47 +0200 Subject: [PATCH 5/6] See #853: Added allow-list controls/status in domains admin --- .../manage/moderation/DomainsTable.vue | 49 ++++++++++++++++--- front/src/views/admin/moderation/Base.vue | 23 ++++++++- .../views/admin/moderation/DomainsDetail.vue | 49 ++++++++++++++++++- .../views/admin/moderation/DomainsList.vue | 10 +++- 4 files changed, 119 insertions(+), 12 deletions(-) diff --git a/front/src/components/manage/moderation/DomainsTable.vue b/front/src/components/manage/moderation/DomainsTable.vue index 544d91156..089b7288e 100644 --- a/front/src/components/manage/moderation/DomainsTable.vue +++ b/front/src/components/manage/moderation/DomainsTable.vue @@ -6,6 +6,14 @@ +
+ + +
+
+ + +
- + @@ -32,12 +36,14 @@ import axios from 'axios' import DomainsTable from "@/components/manage/moderation/DomainsTable" export default { + props: ['allowListEnabled'], components: { DomainsTable }, data () { return { domainName: '', + domainAllowed: this.allowListEnabled ? true : null, isCreating: false, errors: [] } @@ -54,7 +60,7 @@ export default { let self = this this.isCreating = true this.errors = [] - axios.post('manage/federation/domains/', {name: this.domainName}).then((response) => { + axios.post('manage/federation/domains/', {name: this.domainName, allowed: this.domainAllowed}).then((response) => { this.isCreating = false this.$router.push({ name: "manage.moderation.domains.detail", -- GitLab From 2072fc8bd52e9cd3e92cf97af88670f11f3e1474 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Mon, 24 Jun 2019 17:22:56 +0200 Subject: [PATCH 6/6] Linting --- api/tests/manage/test_serializers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/tests/manage/test_serializers.py b/api/tests/manage/test_serializers.py index c80cb5c6c..e621bf14c 100644 --- a/api/tests/manage/test_serializers.py +++ b/api/tests/manage/test_serializers.py @@ -186,8 +186,6 @@ def test_manage_domain_action_allow_list_add(factories, mocker): assert domain.allowed is True - - def test_manage_domain_action_allow_list_remove(factories, mocker): domains = factories["federation.Domain"].create_batch(size=3, allowed=True) s = serializers.ManageDomainActionSerializer(queryset=None) -- GitLab