Browse Source

fix(api): enforce DNAME exclusivity at the same owner name, fixes #557

Peter Thomassen 4 years ago
parent
commit
480cd6e92e
2 changed files with 13 additions and 2 deletions
  1. 6 2
      api/desecapi/models.py
  2. 7 0
      api/desecapi/tests/test_rrsets.py

+ 6 - 2
api/desecapi/models.py

@@ -600,11 +600,15 @@ class RRset(ExportModelOperationsMixin('RRset'), models.Model):
         """
         errors = []
 
+        # Singletons
+        if self.type in ('CNAME', 'DNAME',):
+            if len(records_presentation_format) > 1:
+                errors.append(f'{self.type} RRset cannot have multiple records.')
+
+        # Non-apex
         if self.type == 'CNAME':
             if self.subname == '':
                 errors.append('CNAME RRset cannot have empty subname.')
-            if len(records_presentation_format) > 1:
-                errors.append('CNAME RRset cannot have multiple records.')
 
         def _error_msg(record, detail):
             return f'Record content of {self.type} {self.name} invalid: \'{record}\': {detail}'

+ 7 - 0
api/desecapi/tests/test_rrsets.py

@@ -200,6 +200,13 @@ class AuthenticatedRRSetTestCase(AuthenticatedRRSetBaseTestCase):
             self.assertContains(response, 'CNAME RRset cannot have multiple records',
                                 status_code=status.HTTP_400_BAD_REQUEST)
 
+    def test_create_my_rr_sets_dname_multiple_records(self):
+        for records in (['foobar.com.', 'foobar.com.'], ['foobar.com.', 'foobar.org.']):
+            data = {'subname': 'asdf', 'ttl': 3600, 'type': 'DNAME', 'records': records}
+            response = self.client.post_rr_set(self.my_empty_domain.name, **data)
+            self.assertContains(response, 'DNAME RRset cannot have multiple records',
+                                status_code=status.HTTP_400_BAD_REQUEST)
+
     def test_create_my_rr_sets_cname_exclusivity(self):
         self.create_rr_set(self.my_domain, ['1.2.3.4'], type='A', ttl=3600, subname='a')
         self.create_rr_set(self.my_domain, ['example.com.'], type='CNAME', ttl=3600, subname='cname')