From 79d16e7e8845dd8ae9d824d511a7b9c48090bb08 Mon Sep 17 00:00:00 2001 From: Brian Wellington Date: Thu, 25 Feb 2021 12:47:02 -0800 Subject: [PATCH] Add custome exceptions. --- dns/zone.py | 28 ++++++++++++++++++++++++---- tests/test_zonedigest.py | 12 +++++++++--- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/dns/zone.py b/dns/zone.py index 3cae8025..86f12982 100644 --- a/dns/zone.py +++ b/dns/zone.py @@ -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 diff --git a/tests/test_zonedigest.py b/tests/test_zonedigest.py index 9e323a8f..f98e5f78 100644 --- a/tests/test_zonedigest.py +++ b/tests/test_zonedigest.py @@ -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): -- 2.47.3