Quellcode durchsuchen

refactor(api): separate domain regex from lowercase rule

Peter Thomassen vor 5 Jahren
Ursprung
Commit
862a69bd9f

+ 6 - 5
api/desecapi/models.py

@@ -2,6 +2,7 @@ from __future__ import annotations
 
 import json
 import logging
+import re
 import secrets
 import string
 import time
@@ -194,12 +195,12 @@ class Token(ExportModelOperationsMixin('Token'), rest_framework.authtoken.models
 validate_domain_name = [
     validate_lower,
     RegexValidator(
-        # TODO See how far this validation can be relaxed
+        # TODO See how far this validation can be relaxed (allow for non-hostname domains?)
         regex=r'^(([a-z0-9][a-z0-9-]{0,61}[a-z0-9]|[a-z0-9])\.)*[a-z]{1,63}$',
-        message='Domain names must be labels separated dots. Labels may only use hyphens, digits, and lowercase '
-                'letters, must not start or end with a hyphen, and must not exceed 63 byte. The last label may only '
-                'have lowercase letters.',
-        code='invalid_domain_name'
+        message='Domain names must be labels separated by dots. Labels may consist of up to 63 hyphens, digits, and '
+                'letters, and must not start or end with a hyphen. The last label may only contain letters.',
+        code='invalid_domain_name',
+        flags=re.IGNORECASE
     )
 ]
 

+ 4 - 2
api/desecapi/tests/test_domains.py

@@ -250,7 +250,7 @@ class DomainOwnerTestCase1(DomainOwnerTestCase):
         ]:
             response = self.client.post(self.reverse('v1:domain-list'), {'name': name})
             self.assertStatus(response, status.HTTP_400_BAD_REQUEST)
-            self.assertTrue("Domain names must be labels separated dots. Labels" in response.data['name'][0])
+            self.assertTrue("Domain names must be labels separated by dots. Labels" in response.data['name'][0])
 
     def test_create_public_suffixes(self):
         for name in self.PUBLIC_SUFFIXES:
@@ -290,7 +290,7 @@ class DomainOwnerTestCase1(DomainOwnerTestCase):
         for name in ['1.2.3..4.test.dedyn.io', 'test..de', '*.' + self.random_domain_name(), 'a' * 64 + '.bla.test']:
             response = self.client.post(self.reverse('v1:domain-list'), {'name': name})
             self.assertStatus(response, status.HTTP_400_BAD_REQUEST)
-            self.assertTrue("Domain names must be labels separated dots. Labels" in response.data['name'][0])
+            self.assertTrue("Domain names must be labels separated by dots. Labels" in response.data['name'][0])
 
     def test_create_domain_other_parent(self):
         name = 'something.' + self.other_domain.name
@@ -332,6 +332,8 @@ class DomainOwnerTestCase1(DomainOwnerTestCase):
             'backslash\\inthemiddle.at',
             '@atsign.com',
             'at@sign.com',
+            'UPPER.case',
+            'case.UPPER',
         ]:
             response = self.client.post(self.reverse('v1:domain-list'), {'name': name})
             self.assertStatus(response, status.HTTP_400_BAD_REQUEST)

+ 1 - 1
api/desecapi/tests/test_user_management.py

@@ -261,7 +261,7 @@ class UserManagementTestCase(DesecTestCase, PublicSuffixMockMixin):
     def assertRegistrationFailureDomainInvalidResponse(self, response, domain):
         self.assertContains(
             response=response,
-            text="Domain names must be labels separated dots. Labels",
+            text="Domain names must be labels separated by dots. Labels",
             status_code=status.HTTP_400_BAD_REQUEST,
             msg_prefix=str(response.data)
         )