Model / settings for allow-listing

This commit is contained in:
Eliot Berriot 2019-06-17 08:48:05 +02:00
parent 1a52dfcc1d
commit 2b2b64f0a7
8 changed files with 90 additions and 1 deletions

View File

@ -26,7 +26,8 @@ redeliver_activities.short_description = "Redeliver"
@admin.register(models.Domain)
class DomainAdmin(admin.ModelAdmin):
list_display = ["name", "creation_date"]
list_display = ["name", "allowed", "creation_date"]
list_filter = ["allowed"]
search_fields = ["name"]

View File

@ -0,0 +1,19 @@
# Generated by Django 2.2.2 on 2019-06-11 08:51
import django.contrib.postgres.fields.jsonb
import django.core.serializers.json
from django.db import migrations, models
import funkwhale_api.federation.models
class Migration(migrations.Migration):
dependencies = [("federation", "0018_fetch")]
operations = [
migrations.AddField(
model_name="domain",
name="allowed",
field=models.BooleanField(default=None, null=True),
)
]

View File

@ -118,6 +118,9 @@ class Domain(models.Model):
null=True,
blank=True,
)
# are interactions with this domain allowed (only applies when allow-listing is on)
allowed = models.BooleanField(default=None, null=True)
objects = DomainQuerySet.as_manager()
def __str__(self):

View File

@ -130,6 +130,7 @@ class ManageDomainSerializer(serializers.ModelSerializer):
"nodeinfo",
"nodeinfo_fetch_date",
"instance_policy",
"allowed",
]
read_only_fields = [
"creation_date",
@ -145,6 +146,11 @@ class ManageDomainSerializer(serializers.ModelSerializer):
return getattr(o, "outbox_activities_count", 0)
class ManageDomainUpdateSerializer(ManageDomainSerializer):
class Meta(ManageDomainSerializer.Meta):
read_only_fields = ["name"] + ManageDomainSerializer.Meta.read_only_fields
class ManageDomainActionSerializer(common_serializers.ActionSerializer):
actions = [common_serializers.Action("purge", allow_all=False)]
filterset_class = filters.ManageDomainFilterSet

View File

@ -339,6 +339,7 @@ class ManageDomainViewSet(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
viewsets.GenericViewSet,
):
lookup_value_regex = r"[a-zA-Z0-9\-\.]+"
@ -361,6 +362,13 @@ class ManageDomainViewSet(
"instance_policy",
]
def get_serializer_class(self):
if self.action in ["update", "partial_update"]:
# A dedicated serializer for update
# to ensure domain name can't be changed
return serializers.ManageDomainUpdateSerializer
return super().get_serializer_class()
def perform_create(self, serializer):
domain = serializer.save()
federation_tasks.update_domain_nodeinfo(domain_name=domain.name)

View File

@ -0,0 +1,26 @@
from dynamic_preferences import types
from dynamic_preferences.registries import global_preferences_registry
moderation = types.Section("Moderation")
@global_preferences_registry.register
class AllowListEnabled(types.BooleanPreference):
section = moderation
name = "allow_list_enabled"
verbose_name = "Enable allow-listing"
help_text = "If enabled, only interactions with explicitely allowed domains will be authorized."
default = False
@global_preferences_registry.register
class AllowListPublic(types.BooleanPreference):
section = moderation
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. ",
"This is useful on open setups, to help people decide if they want to join your pod, or to "
"make your moderation policy public.",
)
default = False

View File

@ -51,6 +51,7 @@ def test_manage_domain_serializer(factories, now):
"nodeinfo": {},
"nodeinfo_fetch_date": None,
"instance_policy": None,
"allowed": None,
}
s = serializers.ManageDomainSerializer(domain)

View File

@ -73,6 +73,31 @@ def test_domain_create(superuser_api_client, mocker):
update_domain_nodeinfo.assert_called_once_with(domain_name="test.federation")
def test_domain_update_allowed(superuser_api_client, factories):
domain = factories["federation.Domain"]()
url = reverse("api:v1:manage:federation:domains-detail", kwargs={"pk": domain.name})
response = superuser_api_client.put(url, {"allowed": True})
assert response.status_code == 200
domain.refresh_from_db()
assert domain.allowed is True
def test_domain_update_cannot_change_name(superuser_api_client, factories):
domain = factories["federation.Domain"]()
old_name = domain.name
url = reverse("api:v1:manage:federation:domains-detail", kwargs={"pk": old_name})
response = superuser_api_client.put(url, {"name": "something.else"})
domain.refresh_from_db()
assert response.status_code == 200
assert domain.name == old_name
# changing the pk of a model and saving results in a new DB entry in django,
# so we check that no other entry was created
assert domain.__class__.objects.count() == 1
def test_domain_nodeinfo(factories, superuser_api_client, mocker):
domain = factories["federation.Domain"]()
url = reverse(