]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Fix a DSYNC type issue, harmonize its scheme type, and increase coverage.
authorBob Halley <halley@dnspython.org>
Sun, 30 Mar 2025 19:09:36 +0000 (12:09 -0700)
committerBob Halley <halley@dnspython.org>
Sun, 30 Mar 2025 19:09:36 +0000 (12:09 -0700)
dns/rdtypes/ANY/DSYNC.py
tests/test_rdata.py

index 26b740f1a939f3a9ae1aa2b63e879238a895085b..42e4476c0038142b7d53683e9802bb43841e304d 100644 (file)
@@ -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)
index 061e7b700783e0360aadbe0565069035e3fdf723..6691fa7c7d347dde9dcaeea20be72c29865e6a43 100644 (file)
@@ -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