浏览代码

feat(api): case-insensitive DynDNS12 interface

Nils Wisiol 6 年之前
父节点
当前提交
95d0c05661
共有 3 个文件被更改,包括 34 次插入4 次删除
  1. 10 1
      api/desecapi/tests/base.py
  2. 23 2
      api/desecapi/tests/testdyndns12update.py
  3. 1 1
      api/desecapi/views.py

+ 10 - 1
api/desecapi/tests/base.py

@@ -686,6 +686,14 @@ class LockedDomainOwnerTestCase(DomainOwnerTestCase):
 class DynDomainOwnerTestCase(DomainOwnerTestCase):
     DYN = True
 
+    @classmethod
+    def request_pdns_zone_notify(cls, name=None):
+        return super().request_pdns_zone_notify(name.lower() if name else None)
+
+    @classmethod
+    def request_pdns_zone_update(cls, name=None):
+        return super().request_pdns_zone_update(name.lower() if name else None)
+
     def _assertDynDNS12Update(self, requests, mock_remote_addr='', **kwargs):
         with self.assertPdnsRequests(requests):
             if mock_remote_addr:
@@ -694,8 +702,9 @@ class DynDomainOwnerTestCase(DomainOwnerTestCase):
                 return self.client.get(self.reverse('v1:dyndns12update'), kwargs)
 
     def assertDynDNS12Update(self, domain_name=None, mock_remote_addr='', **kwargs):
+        pdns_name = self._normalize_name(domain_name).lower() if domain_name else None
         return self._assertDynDNS12Update(
-            [self.request_pdns_zone_update(name=domain_name), self.request_pdns_zone_notify(name=domain_name)],
+            [self.request_pdns_zone_update(name=pdns_name), self.request_pdns_zone_notify(name=pdns_name)],
             mock_remote_addr,
             **kwargs
         )

+ 23 - 2
api/desecapi/tests/testdyndns12update.py

@@ -1,3 +1,5 @@
+import random
+
 from rest_framework import status
 
 from desecapi.tests.base import DynDomainOwnerTestCase
@@ -16,7 +18,7 @@ class DynDNS12UpdateTest(DynDomainOwnerTestCase):
             self.assertStatus(response, status.HTTP_404_NOT_FOUND)
 
     def assertIP(self, ipv4=None, ipv6=None, name=None):
-        name = name or self.my_domain.name
+        name = name or self.my_domain.name.lower()
         self.assertRRSet(name, '', 'A', ipv4)
         self.assertRRSet(name, '', 'AAAA', ipv6)
 
@@ -43,7 +45,8 @@ class DynDNS12UpdateTest(DynDomainOwnerTestCase):
             self.request_pdns_zone_update(self.my_domain.name),
             self.request_pdns_zone_notify(self.my_domain.name),
         ):
-            response = self.client_token_authorized.patch_rr_set(self.my_domain.name, subname='', type_='A', ttl=3600)
+            response = self.client_token_authorized.patch_rr_set(
+                self.my_domain.name.lower(), subname='', type_='A', ttl=3600)
             self.assertStatus(response, status.HTTP_200_OK)
 
         response = self.assertDynDNS12Update(self.my_domain.name)
@@ -150,3 +153,21 @@ class MultipleDomainDynDNS12UpdateTest(DynDNS12UpdateTest):
         self.client.set_credentials_basic_auth('', self.token.key)
         response = self.client.get(self.reverse('v1:dyndns12update'), REMOTE_ADDR='10.5.5.7')
         self.assertStatus(response, status.HTTP_409_CONFLICT)
+
+
+class MixedCaseDynDNS12UpdateTestCase(DynDNS12UpdateTest):
+
+    @staticmethod
+    def random_casing(s):
+        return ''.join([c.lower() if random.choice([True, False]) else c.upper() for c in s])
+
+    def setUp(self):
+        super().setUp()
+        self.my_domain.name = self.random_casing(self.my_domain.name)
+
+
+class UppercaseDynDNS12UpdateTestCase(DynDNS12UpdateTest):
+
+    def setUp(self):
+        super().setUp()
+        self.my_domain.name = self.my_domain.name.upper()

+ 1 - 1
api/desecapi/views.py

@@ -399,7 +399,7 @@ class DynDNS12Update(APIView):
 
             return None
 
-        name = findDomainname(request)
+        name = findDomainname(request).lower()
 
         try:
             return self.request.user.domains.get(name=name)