diff options
author | Brian Wellington <bwelling@xbill.org> | 2020-03-18 14:56:58 -0700 |
---|---|---|
committer | Brian Wellington <bwelling@xbill.org> | 2020-03-18 14:57:29 -0700 |
commit | 41ca1be22dad341709a3856f34fe63aa46da1d1b (patch) | |
tree | 596023cb268a72eaa402fb4e2d6d622cabce25ab | |
parent | e6798e58b4555740db4cfb43c8b9ce0d7d3416f1 (diff) | |
download | dnspython-41ca1be22dad341709a3856f34fe63aa46da1d1b.tar.gz |
Remove choose_relativity() from zone.from_xfr()
The comment states that relativize must be consistent between
dns.query.xfr() and dns.zone.from_xfr(), and the code fails if they're
not (if check_origin is True, at least). This means that the rdata is
already correctly relativized (or not).
This also adds a test of creating zones from xfrs, both relativized and
not.
-rw-r--r-- | dns/zone.py | 1 | ||||
-rw-r--r-- | tests/test_zone.py | 33 |
2 files changed, 33 insertions, 1 deletions
diff --git a/dns/zone.py b/dns/zone.py index 542ec7e..0da4d89 100644 --- a/dns/zone.py +++ b/dns/zone.py @@ -1117,7 +1117,6 @@ def from_xfr(xfr, zone_factory=Zone, relativize=True, check_origin=True): rrset.covers, True) zrds.update_ttl(rrset.ttl) for rd in rrset: - rd.choose_relativity(z.origin, relativize) zrds.add(rd) if check_origin: z.check_origin() diff --git a/tests/test_zone.py b/tests/test_zone.py index 0fae704..7e4a4d8 100644 --- a/tests/test_zone.py +++ b/tests/test_zone.py @@ -22,6 +22,7 @@ import unittest from typing import cast import dns.exception +import dns.message import dns.rdata import dns.rdataset import dns.rdataclass @@ -135,6 +136,29 @@ _keep_output = True def _rdata_sort(a): return (a[0], a[2].rdclass, a[2].to_text()) +def add_rdataset(msg, name, rds): + rrset = msg.get_rrset(msg.answer, name, rds.rdclass, rds.rdtype, + create=True, force_unique=True) + for rd in rds: + rrset.add(rd, ttl=rds.ttl) + +def make_xfr(zone): + q = dns.message.make_query(zone.origin, 'AXFR') + msg = dns.message.make_response(q) + if zone.relativize: + msg.origin = zone.origin + soa_name = dns.name.empty + else: + soa_name = zone.origin + soa = zone.find_rdataset(soa_name, 'SOA') + add_rdataset(msg, soa_name, soa) + for (name, rds) in zone.iterate_rdatasets(): + if rds.rdtype == dns.rdatatype.SOA: + continue + add_rdataset(msg, name, rds) + add_rdataset(msg, soa_name, soa) + return [msg] + class ZoneTestCase(unittest.TestCase): def testFromFile1(self): # type: () -> None @@ -544,5 +568,14 @@ class ZoneTestCase(unittest.TestCase): def testZoneOriginNone(self): # type: () -> None dns.zone.Zone(cast(str, None)) + def testZoneFromXFR(self): # type: () -> None + z1_abs = dns.zone.from_text(example_text, 'example.', relativize=False) + z2_abs = dns.zone.from_xfr(make_xfr(z1_abs), relativize=False) + self.assertEqual(z1_abs, z2_abs) + + z1_rel = dns.zone.from_text(example_text, 'example.', relativize=True) + z2_rel = dns.zone.from_xfr(make_xfr(z1_rel), relativize=True) + self.assertEqual(z1_rel, z2_rel) + if __name__ == '__main__': unittest.main() |