Browse Source

feat(api): add TokenDomainPolicy.subname and .type

Peter Thomassen 1 year ago
parent
commit
52d06b8cfb

+ 47 - 0
api/desecapi/migrations/0034_tokendomainpolicy_subname_tokendomainpolicy_type.py

@@ -0,0 +1,47 @@
+# Generated by Django 4.2.7 on 2023-11-23 13:58
+
+import desecapi.models.base
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("desecapi", "0033_alter_tokendomainpolicy_id"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="tokendomainpolicy",
+            name="subname",
+            field=models.CharField(
+                blank=True,
+                max_length=178,
+                null=True,
+                validators=[
+                    desecapi.models.base.validate_lower,
+                    django.core.validators.RegexValidator(
+                        code="invalid_subname",
+                        message="Subname can only use (lowercase) a-z, 0-9, ., -, and _, may start with a '*.', or just be '*'. Components may not exceed 63 characters.",
+                        regex="^([*]|(([*][.])?([a-z0-9_-]{1,63}[.])*[a-z0-9_-]{1,63}))$",
+                    ),
+                ],
+            ),
+        ),
+        migrations.AddField(
+            model_name="tokendomainpolicy",
+            name="type",
+            field=models.CharField(
+                max_length=10,
+                null=True,
+                validators=[
+                    desecapi.models.base.validate_upper,
+                    django.core.validators.RegexValidator(
+                        code="invalid_type",
+                        message="Type must be uppercase alphanumeric and start with a letter.",
+                        regex="^[A-Z][A-Z0-9]*$",
+                    ),
+                ],
+            ),
+        ),
+    ]

+ 11 - 0
api/desecapi/models/tokens.py

@@ -17,6 +17,8 @@ from django.utils import timezone
 from django_prometheus.models import ExportModelOperationsMixin
 from django_prometheus.models import ExportModelOperationsMixin
 from netfields import CidrAddressField, NetManager
 from netfields import CidrAddressField, NetManager
 
 
+from desecapi.models import RRset
+
 
 
 # No 0OIl characters, non-alphanumeric only (select by double-click no line-break)
 # No 0OIl characters, non-alphanumeric only (select by double-click no line-break)
 # https://github.com/bitcoin/bitcoin/blob/master/src/base58.h
 # https://github.com/bitcoin/bitcoin/blob/master/src/base58.h
@@ -146,6 +148,15 @@ class TokenDomainPolicy(ExportModelOperationsMixin("TokenDomainPolicy"), models.
     id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
     id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
     token = models.ForeignKey(Token, on_delete=models.CASCADE)
     token = models.ForeignKey(Token, on_delete=models.CASCADE)
     domain = models.ForeignKey("Domain", on_delete=models.CASCADE, null=True)
     domain = models.ForeignKey("Domain", on_delete=models.CASCADE, null=True)
+    subname = models.CharField(
+        max_length=178,
+        blank=True,
+        null=True,
+        validators=RRset.subname.field._validators,
+    )
+    type = models.CharField(
+        max_length=10, null=True, validators=RRset.type.field._validators
+    )
     perm_dyndns = models.BooleanField(default=False)
     perm_dyndns = models.BooleanField(default=False)
     perm_rrsets = models.BooleanField(default=False)
     perm_rrsets = models.BooleanField(default=False)
     # Token user, filled via trigger. Used by compound FK constraints to tie domain.owner to token.user (see migration).
     # Token user, filled via trigger. Used by compound FK constraints to tie domain.owner to token.user (see migration).