Bladeren bron

feat(api): allow unsetting dynamic IPs

Peter Thomassen 7 jaren geleden
bovenliggende
commit
dd04336b67
2 gewijzigde bestanden met toevoegingen van 31 en 13 verwijderingen
  1. 26 11
      api/desecapi/tests/testdyndns12update.py
  2. 5 2
      api/desecapi/views.py

+ 26 - 11
api/desecapi/tests/testdyndns12update.py

@@ -52,18 +52,19 @@ class DynDNS12UpdateTest(APITestCase):
         self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.password)
         name = name or self.username
 
-        if ipv4 is not None:
-            url = reverse('rrset', args=(name, '', 'A',))
+        def verify_response(type_, ip):
+            url = reverse('rrset', args=(name, '', type_,))
             response = self.client.get(url)
-            self.assertEqual(response.data['records'][0], ipv4)
 
-        if ipv6 is not None:
-            url = reverse('rrset', args=(name, '', 'AAAA',))
-            response = self.client.get(url)
-            self.assertEqual(response.data['records'][0], ipv6)
+            if ip is not None:
+                self.assertEqual(response.data['records'][0], ip)
+                self.assertEqual(response.status_code, status.HTTP_200_OK)
+                self.assertEqual(response.data['ttl'], 60)
+            else:
+                self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
 
-        self.assertEqual(response.status_code, status.HTTP_200_OK)
-        self.assertEqual(response.data['ttl'], 60)
+        verify_response('A', ipv4)
+        verify_response('AAAA', ipv6)
 
         self.client.credentials(HTTP_AUTHORIZATION=old_credentials)
 
@@ -95,7 +96,7 @@ class DynDNS12UpdateTest(APITestCase):
                                    })
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.assertEqual(response.data, 'good')
-        self.assertIP(ipv6='::1337')
+        self.assertIP(ipv4='127.0.0.1', ipv6='::1337')
 
     def testDynDNS2UpdateDDClientIPv4Success(self):
         #/nic/update?system=dyndns&hostname=foobar.dedyn.io&myip=10.2.3.4
@@ -121,7 +122,7 @@ class DynDNS12UpdateTest(APITestCase):
                                    })
         self.assertEqual(response.status_code, status.HTTP_200_OK)
         self.assertEqual(response.data, 'good')
-        self.assertIP(ipv6='::1338')
+        self.assertIP(ipv4='127.0.0.1', ipv6='::1338')
 
     def testFritzBoxIPv6(self):
         #/
@@ -131,6 +132,20 @@ class DynDNS12UpdateTest(APITestCase):
         self.assertEqual(response.data, 'good')
         self.assertIP(ipv4='127.0.0.1')
 
+    def testUnsetIP(self):
+        url = reverse('dyndns12update')
+
+        def testVariant(params, **kwargs):
+            response = self.client.get(url, params)
+            self.assertEqual(response.status_code, status.HTTP_200_OK)
+            self.assertEqual(response.data, 'good')
+            self.assertIP(**kwargs)
+
+        testVariant({'ipv6': '::1337'}, ipv4='127.0.0.1', ipv6='::1337')
+        testVariant({'ipv6': '::1337', 'myip': ''}, ipv4=None, ipv6='::1337')
+        testVariant({'ipv6': '', 'ip': '1.2.3.4'}, ipv4='1.2.3.4', ipv6=None)
+        testVariant({'ipv6': '', 'myipv4': ''}, ipv4=None, ipv6=None)
+
     def testIdentificationByUsernameDomainname(self):
         # To force identification by the provided username (which is the domain name)
         # we add a second domain for the current user.

+ 5 - 2
api/desecapi/views.py

@@ -337,8 +337,11 @@ class DynDNS12Update(APIView):
 
         # Check URL parameters
         for p in params:
-            if p in request.query_params and lookfor in request.query_params[p]:
-                return request.query_params[p]
+            if p in request.query_params:
+                if not len(request.query_params[p]):
+                    return None
+                if lookfor in request.query_params[p]:
+                    return request.query_params[p]
 
         # Check remote IP address
         client_ip = get_client_ip(request)