From 9b1050da738d429fd77a205f3d430169b7eaf8b5 Mon Sep 17 00:00:00 2001 From: Bob Halley Date: Sun, 30 Mar 2025 12:09:36 -0700 Subject: [PATCH] Fix a DSYNC type issue, harmonize its scheme type, and increase coverage. --- dns/rdtypes/ANY/DSYNC.py | 31 ++++++++++++++++++------------- tests/test_rdata.py | 9 +++++++++ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/dns/rdtypes/ANY/DSYNC.py b/dns/rdtypes/ANY/DSYNC.py index 26b740f1..42e4476c 100644 --- a/dns/rdtypes/ANY/DSYNC.py +++ b/dns/rdtypes/ANY/DSYNC.py @@ -2,25 +2,30 @@ import struct +import dns.enum +import dns.exception import dns.immutable import dns.rdata import dns.rdatatype import dns.rdtypes.util -schemes = {1: "NOTIFY"} -schemes_by_mnemonic = {v: k for k, v in schemes.items()} +class UnknownScheme(dns.exception.DNSException): + """Unknown DSYNC scheme""" -def _scheme_from_text(scheme): - try: - return int(scheme) - except ValueError: - return schemes_by_mnemonic[scheme] +class Scheme(dns.enum.IntEnum): + """DSYNC SCHEME""" + NOTIFY = 1 -def _scheme_to_text(scheme): - return schemes.get(scheme, str(scheme)) + @classmethod + def _maximum(cls): + return 255 + + @classmethod + def _unknown_exception_class(cls): + return UnknownScheme @dns.immutable.immutable @@ -33,8 +38,8 @@ class DSYNC(dns.rdata.Rdata): def __init__(self, rdclass, rdtype, rrtype, scheme, port, target): super().__init__(rdclass, rdtype) - self.rrtype = self._as_uint16(rrtype) - self.scheme = self._as_uint8(scheme) + self.rrtype = self._as_rdatatype(rrtype) + self.scheme = Scheme.make(scheme) self.port = self._as_uint16(port) self.target = self._as_name(target) @@ -42,7 +47,7 @@ class DSYNC(dns.rdata.Rdata): target = self.target.choose_relativity(origin, relativize) return "%s %s %d %s" % ( dns.rdatatype.to_text(self.rrtype), - _scheme_to_text(self.scheme), + Scheme.to_text(self.scheme), self.port, target, ) @@ -52,7 +57,7 @@ class DSYNC(dns.rdata.Rdata): cls, rdclass, rdtype, tok, origin=None, relativize=True, relativize_to=None ): rrtype = dns.rdatatype.from_text(tok.get_string()) - scheme = _scheme_from_text(tok.get_string()) + scheme = Scheme.make(tok.get_string()) port = tok.get_uint16() target = tok.get_name(origin, relativize, relativize_to) return cls(rdclass, rdtype, rrtype, scheme, port, target) diff --git a/tests/test_rdata.py b/tests/test_rdata.py index 061e7b70..6691fa7c 100644 --- a/tests/test_rdata.py +++ b/tests/test_rdata.py @@ -1031,6 +1031,15 @@ class UtilTestCase(unittest.TestCase): dns.rdatatype.RdataType.make("NSAP-PTR"), dns.rdatatype.NSAP_PTR ) + def test_bad_DSYNC_text(self): + bad_dsync = [ + "DSYNC CDS NOTIFY 5300 notify-endpoint.parent.net." + "DSYNC CDS 256 5300 notify-endpoint.parent.net." + ] + for text in bad_dsync: + with self.assertRaises(dns.exception.SyntaxError): + dns.rdata.from_text("in", "dsync", text) + Rdata = dns.rdata.Rdata -- 2.47.3