]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add DSYNC rdatatype support (#1185)
authorPeter Thomassen <4242683+peterthomassen@users.noreply.github.com>
Sun, 30 Mar 2025 18:45:58 +0000 (20:45 +0200)
committerGitHub <noreply@github.com>
Sun, 30 Mar 2025 18:45:58 +0000 (11:45 -0700)
Add DSYNC rdatatype support.

dns/rdatatype.py
dns/rdtypes/ANY/DSYNC.py [new file with mode: 0644]
dns/rdtypes/ANY/__init__.py
tests/example
tests/example1.good
tests/example2.good
tests/example3.good
tests/example4.good
tests/test_rdata.py

index aa9e561c2209d4fa9834c5a7d18666278168cfe0..f2d0eef78a5381e2be1ff6e20ff8886459593cc6 100644 (file)
@@ -86,6 +86,7 @@ class RdataType(dns.enum.IntEnum):
     ZONEMD = 63
     SVCB = 64
     HTTPS = 65
+    DSYNC = 66
     SPF = 99
     UNSPEC = 103
     NID = 104
@@ -332,5 +333,6 @@ RESINFO = RdataType.RESINFO
 WALLET = RdataType.WALLET
 TA = RdataType.TA
 DLV = RdataType.DLV
+DSYNC = RdataType.DSYNC
 
 ### END generated RdataType constants
diff --git a/dns/rdtypes/ANY/DSYNC.py b/dns/rdtypes/ANY/DSYNC.py
new file mode 100644 (file)
index 0000000..26b740f
--- /dev/null
@@ -0,0 +1,69 @@
+# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
+
+import struct
+
+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()}
+
+
+def _scheme_from_text(scheme):
+    try:
+        return int(scheme)
+    except ValueError:
+        return schemes_by_mnemonic[scheme]
+
+
+def _scheme_to_text(scheme):
+    return schemes.get(scheme, str(scheme))
+
+
+@dns.immutable.immutable
+class DSYNC(dns.rdata.Rdata):
+    """DSYNC record"""
+
+    # see: draft-ietf-dnsop-generalized-notify
+
+    __slots__ = ["rrtype", "scheme", "port", "target"]
+
+    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.port = self._as_uint16(port)
+        self.target = self._as_name(target)
+
+    def to_text(self, origin=None, relativize=True, **kw):
+        target = self.target.choose_relativity(origin, relativize)
+        return "%s %s %d %s" % (
+            dns.rdatatype.to_text(self.rrtype),
+            _scheme_to_text(self.scheme),
+            self.port,
+            target,
+        )
+
+    @classmethod
+    def from_text(
+        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())
+        port = tok.get_uint16()
+        target = tok.get_name(origin, relativize, relativize_to)
+        return cls(rdclass, rdtype, rrtype, scheme, port, target)
+
+    def _to_wire(self, file, compress=None, origin=None, canonicalize=False):
+        three_ints = struct.pack("!HBH", self.rrtype, self.scheme, self.port)
+        file.write(three_ints)
+        self.target.to_wire(file, None, origin, False)
+
+    @classmethod
+    def from_wire_parser(cls, rdclass, rdtype, parser, origin=None):
+        (rrtype, scheme, port) = parser.get_struct("!HBH")
+        target = parser.get_name(origin)
+        return cls(rdclass, rdtype, rrtype, scheme, port, target)
index 647b215bc9a08cecb22c026464e31623edcb0df8..cc39f8642e87502525ddcd59673cafbb00879abd 100644 (file)
@@ -31,6 +31,7 @@ __all__ = [
     "DNAME",
     "DNSKEY",
     "DS",
+    "DSYNC",
     "EUI48",
     "EUI64",
     "GPOS",
index a0e864b997e5253dca144d40f3def0bcd02f798e..ad404fb9ce3afc17e832d87e5eca2bd01d0e82e4 100644 (file)
@@ -266,4 +266,6 @@ svcb05                  SVCB 16 foo.example.org. ohttp
 https01                 HTTPS 0 svc
 https02                 HTTPS 1 . port=8002 ech="abcd"
 resinfo                 RESINFO qnamemin exterr=15,16,17 infourl=https://resolver.example.com/guide
-wallet                                 WALLET EXAMPLE 01234567890abcdef
+wallet                  WALLET EXAMPLE 01234567890abcdef
+dsync                   DSYNC CDS NOTIFY 5300 notify-endpoint.parent.net.
+dsync                   DSYNC CSYNC 128 443 notify-endpoint.parent.net.
index 9e333c80508e4263df903054e97fab3a1b76943e..038a2c25434c8d9feacec06ac9defd218d5aed26 100644 (file)
@@ -46,6 +46,8 @@ dname03 3600 IN DNAME .
 dnskey01 3600 IN DNSKEY 512 255 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 dnskey02 3600 IN DNSKEY 257 3 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 ds01 3600 IN DS 12345 3 1 123456789abcdef67890123456789abcdef67890
+dsync 3600 IN DSYNC CDS NOTIFY 5300 notify-endpoint.parent.net.
+dsync 3600 IN DSYNC CSYNC 128 443 notify-endpoint.parent.net.
 e 300 IN MX 10 mail
 e 300 IN TXT "one"
 e 300 IN TXT "three"
index 3ba638c16f7d4154b8f07014680bca7f46901ce4..129d8cdfec6a8495da87ffb547e6a3ad145530d0 100644 (file)
@@ -46,6 +46,8 @@ dname03.example. 3600 IN DNAME .
 dnskey01.example. 3600 IN DNSKEY 512 255 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 dnskey02.example. 3600 IN DNSKEY 257 3 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 ds01.example. 3600 IN DS 12345 3 1 123456789abcdef67890123456789abcdef67890
+dsync.example. 3600 IN DSYNC CDS NOTIFY 5300 notify-endpoint.parent.net.
+dsync.example. 3600 IN DSYNC CSYNC 128 443 notify-endpoint.parent.net.
 e.example. 300 IN MX 10 mail.example.
 e.example. 300 IN TXT "one"
 e.example. 300 IN TXT "three"
index 9e333c80508e4263df903054e97fab3a1b76943e..038a2c25434c8d9feacec06ac9defd218d5aed26 100644 (file)
@@ -46,6 +46,8 @@ dname03 3600 IN DNAME .
 dnskey01 3600 IN DNSKEY 512 255 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 dnskey02 3600 IN DNSKEY 257 3 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 ds01 3600 IN DS 12345 3 1 123456789abcdef67890123456789abcdef67890
+dsync 3600 IN DSYNC CDS NOTIFY 5300 notify-endpoint.parent.net.
+dsync 3600 IN DSYNC CSYNC 128 443 notify-endpoint.parent.net.
 e 300 IN MX 10 mail
 e 300 IN TXT "one"
 e 300 IN TXT "three"
index 42d19089f6458bf800b8bfd7f300ddfa7c02b4a5..c5c0d1b6e9104851d75b6a273b88e798d88e992d 100644 (file)
@@ -47,6 +47,8 @@ dname03 3600 IN DNAME .
 dnskey01 3600 IN DNSKEY 512 255 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 dnskey02 3600 IN DNSKEY 257 3 1 AQMFD5raczCJHViKtLYhWGz8hMY9UGRu niJDBzC7w0aRyzWZriO6i2odGWWQVucZ qKVsENW91IOW4vqudngPZsY3GvQ/xVA8 /7pyFj6b7Esga60zyGW6LFe9r8n6paHr lG5ojqf0BaqHT+8=
 ds01 3600 IN DS 12345 3 1 123456789abcdef67890123456789abcdef67890
+dsync 3600 IN DSYNC CDS NOTIFY 5300 notify-endpoint.parent.net.
+dsync 3600 IN DSYNC CSYNC 128 443 notify-endpoint.parent.net.
 e 300 IN MX 10 mail
 e 300 IN TXT "one"
 e 300 IN TXT "three"
index 8c4c51048894729305a21a9717a40f29b7c41c23..061e7b700783e0360aadbe0565069035e3fdf723 100644 (file)
@@ -68,6 +68,7 @@ class RdataTestCase(unittest.TestCase):
 
     def test_class_registration(self):
         CTXT = 64003
+
         class CTXTImp(dns.rdtypes.txtbase.TXTBase):
             """Test TXT-like record"""