]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add custome exceptions. 646/head
authorBrian Wellington <bwelling@xbill.org>
Thu, 25 Feb 2021 20:47:02 +0000 (12:47 -0800)
committerBrian Wellington <bwelling@xbill.org>
Thu, 25 Feb 2021 20:47:02 +0000 (12:47 -0800)
dns/zone.py
tests/test_zonedigest.py

index 3cae8025df82753b6cdf56e862f954481a147ad3..86f12982c2113b43580c7b4c152fa5bfe918fb1a 100644 (file)
@@ -59,6 +59,26 @@ class UnknownOrigin(BadZone):
     """The DNS zone's origin is unknown."""
 
 
+class UnsupportedDigestScheme(dns.exception.DNSException):
+
+    """The zone digest's scheme is unsupported."""
+
+
+class UnsupportedDigestHashAlgorithm(dns.exception.DNSException):
+
+    """The zone digest's origin is unsupported."""
+
+
+class NoDigest(dns.exception.DNSException):
+
+    """The DNS zone has no ZONEMD RRset at its origin."""
+
+
+class DigestVerificationFailure(dns.exception.DNSException):
+
+    """The ZONEMD digest failed to verify."""
+
+
 class DigestScheme(dns.enum.IntEnum):
     """ZONEMD Scheme"""
 
@@ -676,9 +696,9 @@ class Zone(dns.transaction.TransactionManager):
     def _compute_digest(self, hash_algorithm, scheme=DigestScheme.SIMPLE):
         hashinfo = _digest_hashers.get(hash_algorithm)
         if not hashinfo:
-            raise ValueError("unknown digest hash algorithm")
+            raise UnsupportedDigestHashAlgorithm
         if scheme != DigestScheme.SIMPLE:
-            raise ValueError("unknown digest scheme")
+            raise UnsupportedDigestScheme
 
         if self.relativize:
             origin_name = dns.name.empty
@@ -718,7 +738,7 @@ class Zone(dns.transaction.TransactionManager):
         else:
             digests = self.get_rdataset(self.origin, dns.rdatatype.ZONEMD)
             if digests is None:
-                raise ValueError("no ZONEMD records found")
+                raise NoDigest
         for digest in digests:
             try:
                 computed = self._compute_digest(digest.hash_algorithm,
@@ -727,7 +747,7 @@ class Zone(dns.transaction.TransactionManager):
                     return
             except Exception as e:
                 pass
-        raise ValueError("no digests verified")
+        raise DigestVerificationFailure
 
     # TransactionManager methods
 
index 9e323a8fe81efd6ccf37f146b1e13ccc2d56d6e5..f98e5f7804bf4e57085d3e41b782ed6c6a116f02 100644 (file)
@@ -136,9 +136,15 @@ class ZoneDigestTestCase(unittest.TestCase):
                 zone.verify_digest(rr)
                 self.assertEqual(rr, zone.compute_digest(rr.hash_algorithm))
             else:
-                with self.assertRaises(ValueError):
+                with self.assertRaises(dns.zone.DigestVerificationFailure):
                     zone.verify_digest(rr)
 
+    def test_zonemd_no_digest(self):
+        zone = dns.zone.from_text(self.simple_example, origin='example')
+        zone.delete_rdataset(dns.name.empty, 'ZONEMD')
+        with self.assertRaises(dns.zone.NoDigest):
+            zone.verify_digest()
+
     sha384_hash = 'ab' * 48
     sha512_hash = 'ab' * 64
 
@@ -150,12 +156,12 @@ class ZoneDigestTestCase(unittest.TestCase):
 
     def test_zonemd_unknown_scheme(self):
         zone = dns.zone.from_text(self.simple_example, origin='example')
-        with self.assertRaises(ValueError):
+        with self.assertRaises(dns.zone.UnsupportedDigestScheme):
             zone.compute_digest(dns.zone.DigestHashAlgorithm.SHA384, 2)
 
     def test_zonemd_unknown_hash_algorithm(self):
         zone = dns.zone.from_text(self.simple_example, origin='example')
-        with self.assertRaises(ValueError):
+        with self.assertRaises(dns.zone.UnsupportedDigestHashAlgorithm):
             zone.compute_digest(5)
 
     def test_zonemd_invalid_digest_length(self):