From: Bob Halley Date: Sun, 6 Mar 2022 17:50:46 +0000 (-0800) Subject: _validate_name now handles relative names in an absolute zone. X-Git-Tag: v2.2.1~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f45c7ec04726d882e68cc1b04b8ef86715adc50d;p=thirdparty%2Fdnspython.git _validate_name now handles relative names in an absolute zone. --- diff --git a/dns/zone.py b/dns/zone.py index 69c3a738..5a649404 100644 --- a/dns/zone.py +++ b/dns/zone.py @@ -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): diff --git a/tests/test_zone.py b/tests/test_zone.py index 4b5272da..45fa2723 100644 --- a/tests/test_zone.py +++ b/tests/test_zone.py @@ -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)