From: Brian Wellington Date: Thu, 25 Feb 2021 18:43:05 +0000 (-0800) Subject: Add more tests. X-Git-Tag: v2.2.0rc1~103^2~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2647d7037dd5b6db2a876cc157432213c779b98f;p=thirdparty%2Fdnspython.git Add more tests. zone.compute_digest() didn't actually work. It does now. --- diff --git a/dns/zone.py b/dns/zone.py index b9fad66d..3cae8025 100644 --- a/dns/zone.py +++ b/dns/zone.py @@ -680,12 +680,16 @@ class Zone(dns.transaction.TransactionManager): if scheme != DigestScheme.SIMPLE: raise ValueError("unknown digest scheme") + if self.relativize: + origin_name = dns.name.empty + else: + origin_name = self.origin hasher = hashinfo() for (name, node) in sorted(self.items()): rrnamebuf = name.to_digestable(self.origin) for rdataset in sorted(node, key=lambda rds: (rds.rdtype, rds.covers)): - if name in (self.origin, dns.name.empty) and \ + if name == origin_name and \ dns.rdatatype.ZONEMD in (rdataset.rdtype, rdataset.covers): continue rrfixed = struct.pack('!HHI', rdataset.rdtype, @@ -697,6 +701,11 @@ class Zone(dns.transaction.TransactionManager): return hasher.digest() def compute_digest(self, hash_algorithm, scheme=DigestScheme.SIMPLE): + if self.relativize: + origin_name = dns.name.empty + else: + origin_name = self.origin + serial = self.get_rdataset(origin_name, dns.rdatatype.SOA)[0].serial digest = self._compute_digest(hash_algorithm, scheme) return dns.rdtypes.ANY.ZONEMD.ZONEMD(self.rdclass, dns.rdatatype.ZONEMD, diff --git a/tests/test_zonedigest.py b/tests/test_zonedigest.py index 47629c53..8cdedb73 100644 --- a/tests/test_zonedigest.py +++ b/tests/test_zonedigest.py @@ -100,23 +100,33 @@ class ZoneDigestTestCase(unittest.TestCase): NS2.EXAMPLE. 3600 IN AAAA 2001:db8::63 ''') + def _get_zonemd(self, zone): + return zone.get_rdataset(zone.origin, 'ZONEMD') + def test_zonemd_simple(self): zone = dns.zone.from_text(self.simple_example, origin='example') zone.verify_digest() + zonemd = self._get_zonemd(zone) + self.assertEqual(zonemd[0], + zone.compute_digest(zonemd[0].hash_algorithm)) def test_zonemd_complex(self): zone = dns.zone.from_text(self.complex_example, origin='example') zone.verify_digest() + zonemd = self._get_zonemd(zone) + self.assertEqual(zonemd[0], + zone.compute_digest(zonemd[0].hash_algorithm)) def test_zonemd_multiple_digests(self): zone = dns.zone.from_text(self.multiple_digests_example, origin='example') zone.verify_digest() - zonemd = zone.get_rdataset(zone.origin, 'ZONEMD') + zonemd = self._get_zonemd(zone) for rr in zonemd: if rr.scheme == 1 and rr.hash_algorithm in (1, 2): zone.verify_digest(rr) + self.assertEqual(rr, zone.compute_digest(rr.hash_algorithm)) else: with self.assertRaises(ValueError): zone.verify_digest(rr) @@ -145,3 +155,10 @@ class ZoneDigestTestCase(unittest.TestCase): dns.rdata.from_text('IN', 'ZONEMD', '100 1 2 ' + self.sha384_hash) with self.assertRaises(dns.exception.SyntaxError): dns.rdata.from_text('IN', 'ZONEMD', '100 2 1 ' + self.sha512_hash) + + def test_zonemd_parse_rdata_reserved(self): + with self.assertRaises(dns.exception.SyntaxError): + dns.rdata.from_text('IN', 'ZONEMD', '100 0 1 ' + self.sha384_hash) + with self.assertRaises(dns.exception.SyntaxError): + dns.rdata.from_text('IN', 'ZONEMD', '100 1 0 ' + self.sha384_hash) +