]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add more tests.
authorBrian Wellington <bwelling@xbill.org>
Thu, 25 Feb 2021 18:43:05 +0000 (10:43 -0800)
committerBrian Wellington <bwelling@xbill.org>
Thu, 25 Feb 2021 18:43:05 +0000 (10:43 -0800)
zone.compute_digest() didn't actually work.  It does now.

dns/zone.py
tests/test_zonedigest.py

index b9fad66d0695eb9c220af574c8b26025ec17bc30..3cae8025df82753b6cdf56e862f954481a147ad3 100644 (file)
@@ -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,
index 47629c5353fea7b3212f4de9938f1699e67f0879..8cdedb73f6fd3fc5b6df49ac3981438dc143ed1c 100644 (file)
@@ -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)
+