]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
_validate_name now handles relative names in an absolute zone.
authorBob Halley <halley@play-bow.org>
Sun, 6 Mar 2022 17:50:46 +0000 (09:50 -0800)
committerBob Halley <halley@play-bow.org>
Sun, 6 Mar 2022 17:50:46 +0000 (09:50 -0800)
dns/zone.py
tests/test_zone.py

index 69c3a73843afec52f3ca0bf0731c216201d4c80f..5a649404f791c31fe0111fcc77536165a5b30ea7 100644 (file)
@@ -183,6 +183,11 @@ class Zone(dns.transaction.TransactionManager):
                     "name parameter must be a subdomain of the zone origin")
             if self.relativize:
                 name = name.relativize(self.origin)
+        elif not self.relativize:
+            # We have a relative name in a non-relative zone, so derelativize.
+            if self.origin is None:
+                raise KeyError('no zone origin is defined')
+            name = name.derelativize(self.origin)
         return name
 
     def __getitem__(self, key):
@@ -879,6 +884,11 @@ class Version:
                 raise KeyError("name is not a subdomain of the zone origin")
             if self.zone.relativize:
                 name = name.relativize(self.origin)
+        elif not self.zone.relativize:
+            # We have a relative name in a non-relative zone, so derelativize.
+            if self.origin is None:
+                raise KeyError('no zone origin is defined')
+            name = name.derelativize(self.origin)
         return name
 
     def get_node(self, name):
index 4b5272da04cd6fd4ba6911a18218f57ee112c377..45fa27239740ad45aaaa5f5863d293d36ab0d0d5 100644 (file)
@@ -499,6 +499,13 @@ class ZoneTestCase(unittest.TestCase):
         rds = z.get_rdataset('@', 'loc')
         self.assertTrue(rds is None)
 
+    def testGetRdatasetWithRelativeNameFromAbsoluteZone(self):
+        z = dns.zone.from_text(example_text, 'example.', relativize=False)
+        rds = z.get_rdataset(dns.name.empty, 'soa')
+        self.assertIsNotNone(rds)
+        exrds = dns.rdataset.from_text('IN', 'SOA', 300, 'foo.example. bar.example. 1 2 3 4 5')
+        self.assertEqual(rds, exrds)
+
     def testGetRRset1(self):
         z = dns.zone.from_text(example_text, 'example.', relativize=True)
         rrs = z.get_rrset('@', 'soa')
@@ -1019,6 +1026,13 @@ class VersionedZoneTestCase(unittest.TestCase):
             rds = txn.get('example.', 'soa')
             self.assertEqual(rds[0].serial, 1)
 
+    def testNoRelativizeReaderAbsoluteGet(self):
+        z = dns.zone.from_text(example_text, 'example.', relativize=False,
+                               zone_factory=dns.versioned.Zone)
+        with z.reader(serial=1) as txn:
+            rds = txn.get(dns.name.empty, 'soa')
+            self.assertEqual(rds[0].serial, 1)
+
     def testCnameAndOtherDataAddOther(self):
         z = dns.zone.from_text(example_cname, 'example.', relativize=True,
                                zone_factory=dns.versioned.Zone)