]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Pass kw from dns.rdata.to_text to _hexify and _base64ify 617/head
authorPeter Thomassen <peter@desec.io>
Tue, 29 Dec 2020 17:25:22 +0000 (18:25 +0100)
committerPeter Thomassen <peter@desec.io>
Tue, 5 Jan 2021 00:29:09 +0000 (01:29 +0100)
12 files changed:
dns/rdata.py
dns/rdtypes/ANY/CERT.py
dns/rdtypes/ANY/OPENPGPKEY.py
dns/rdtypes/ANY/RRSIG.py
dns/rdtypes/ANY/SSHFP.py
dns/rdtypes/IN/DHCID.py
dns/rdtypes/IN/IPSECKEY.py
dns/rdtypes/dnskeybase.py
dns/rdtypes/dsbase.py
dns/rdtypes/euibase.py
dns/rdtypes/tlsabase.py
tests/test_rdata.py

index 78462051659c72ca298cd7a94dd1b11986e6820f..12f3b6f30b8e3af2412689fef854fc62015f9b27 100644 (file)
@@ -51,7 +51,7 @@ def _wordbreak(data, chunksize=_chunksize):
                       in range(0, len(data), chunksize)]).decode()
 
 
-def _hexify(data, chunksize=_chunksize):
+def _hexify(data, chunksize=_chunksize, **kw):
     """Convert a binary string into its hex encoding, broken up into chunks
     of chunksize characters separated by a space.
     """
@@ -59,7 +59,7 @@ def _hexify(data, chunksize=_chunksize):
     return _wordbreak(binascii.hexlify(data), chunksize)
 
 
-def _base64ify(data, chunksize=_chunksize):
+def _base64ify(data, chunksize=_chunksize, **kw):
     """Convert a binary string into its base64 encoding, broken up into chunks
     of chunksize characters separated by a space.
     """
@@ -484,7 +484,7 @@ class GenericRdata(Rdata):
         object.__setattr__(self, 'data', data)
 
     def to_text(self, origin=None, relativize=True, **kw):
-        return r'\# %d ' % len(self.data) + _hexify(self.data)
+        return r'\# %d ' % len(self.data) + _hexify(self.data, **kw)
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 6d663cc9ea0d9560ca315a294f50c1000c4e3403..5f26dde7eda78d04d7c07887f679b23a437f401c 100644 (file)
@@ -76,7 +76,7 @@ class CERT(dns.rdata.Rdata):
         certificate_type = _ctype_to_text(self.certificate_type)
         return "%s %d %s %s" % (certificate_type, self.key_tag,
                                 dns.dnssec.algorithm_to_text(self.algorithm),
-                                dns.rdata._base64ify(self.certificate))
+                                dns.rdata._base64ify(self.certificate, **kw))
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 4bed1b1b3d6487f3d666bb80ae5985518b43b345..dcfa028d048568b286a960d6e0688b1d12effb4c 100644 (file)
@@ -34,7 +34,7 @@ class OPENPGPKEY(dns.rdata.Rdata):
         self.key = self._as_bytes(key)
 
     def to_text(self, origin=None, relativize=True, **kw):
-        return dns.rdata._base64ify(self.key, None)
+        return dns.rdata._base64ify(self.key, chunksize=None, **kw)
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 93c7f105072ef369233456f620725e984241646e..d050ccc6fb79008bbc3ef12004cf48d2de3f2d2f 100644 (file)
@@ -87,7 +87,7 @@ class RRSIG(dns.rdata.Rdata):
             posixtime_to_sigtime(self.inception),
             self.key_tag,
             self.signer.choose_relativity(origin, relativize),
-            dns.rdata._base64ify(self.signature)
+            dns.rdata._base64ify(self.signature, **kw)
         )
 
     @classmethod
index 4fd917c39be4ffd4c92bb4e8f70ebfed09fdcdca..cc035195dbc43ee26d074eb4a101c68a6a014b00 100644 (file)
@@ -40,10 +40,13 @@ class SSHFP(dns.rdata.Rdata):
         self.fingerprint = self._as_bytes(fingerprint, True)
 
     def to_text(self, origin=None, relativize=True, **kw):
+        kw = kw.copy()
+        chunksize = kw.pop('chunksize', 128)
         return '%d %d %s' % (self.algorithm,
                              self.fp_type,
                              dns.rdata._hexify(self.fingerprint,
-                                               chunksize=128))
+                                               chunksize=chunksize,
+                                               **kw))
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 23f1493146bf2884d7eff72b3b1a8294f168496d..a9185989c44479fc3c6cb71b409861a435b99f60 100644 (file)
@@ -35,7 +35,7 @@ class DHCID(dns.rdata.Rdata):
         self.data = self._as_bytes(data)
 
     def to_text(self, origin=None, relativize=True, **kw):
-        return dns.rdata._base64ify(self.data)
+        return dns.rdata._base64ify(self.data, **kw)
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index ce899577174000aa9e0c3da85f809147c9cb748d..d1d394383d5fae7eba108aca00cc01b4bdd5354a 100644 (file)
@@ -50,7 +50,7 @@ class IPSECKEY(dns.rdata.Rdata):
                                                                    relativize)
         return '%d %d %d %s %s' % (self.precedence, self.gateway_type,
                                    self.algorithm, gateway,
-                                   dns.rdata._base64ify(self.key))
+                                   dns.rdata._base64ify(self.key, **kw))
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index f0ebfcc4c9f31e7b921cc8690c49db11c106066f..788bb2bf9010b18d51fc3bdc073a26f4e485cfc7 100644 (file)
@@ -49,7 +49,7 @@ class DNSKEYBase(dns.rdata.Rdata):
 
     def to_text(self, origin=None, relativize=True, **kw):
         return '%d %d %d %s' % (self.flags, self.protocol, self.algorithm,
-                                dns.rdata._base64ify(self.key))
+                                dns.rdata._base64ify(self.key, **kw))
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 19e087c8ec0c7e35fc44410f6666de9eae9db034..38c95484920778630d0dff4135075ec1f22ab822 100644 (file)
@@ -40,10 +40,13 @@ class DSBase(dns.rdata.Rdata):
         self.digest = self._as_bytes(digest)
 
     def to_text(self, origin=None, relativize=True, **kw):
+        kw = kw.copy()
+        chunksize = kw.pop('chunksize', 128)
         return '%d %d %d %s' % (self.key_tag, self.algorithm,
                                 self.digest_type,
                                 dns.rdata._hexify(self.digest,
-                                                  chunksize=128))
+                                                  chunksize=chunksize,
+                                                  **kw))
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 42b923d3a94a97ef5efa74128832f6bef8891f6d..60ab56db9a0245abb67355808e109af75b4980c1 100644 (file)
@@ -40,7 +40,7 @@ class EUIBase(dns.rdata.Rdata):
                                           % (self.byte_len * 8, self.byte_len))
 
     def to_text(self, origin=None, relativize=True, **kw):
-        return dns.rdata._hexify(self.eui, chunksize=2).replace(' ', '-')
+        return dns.rdata._hexify(self.eui, chunksize=2, **kw).replace(' ', '-')
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index a9563da9d59a95a08476988d22919223346cb94e..786fca5548f8a0d418f0a637099f923f0521f0ba 100644 (file)
@@ -41,11 +41,14 @@ class TLSABase(dns.rdata.Rdata):
         self.cert = self._as_bytes(cert)
 
     def to_text(self, origin=None, relativize=True, **kw):
+        kw = kw.copy()
+        chunksize = kw.pop('chunksize', 128)
         return '%d %d %d %s' % (self.usage,
                                 self.selector,
                                 self.mtype,
                                 dns.rdata._hexify(self.cert,
-                                                  chunksize=128))
+                                                  chunksize=chunksize,
+                                                  **kw))
 
     @classmethod
     def from_text(cls, rdclass, rdtype, tok, origin=None, relativize=True,
index 248f7247e294a075ef90583c1c4d069c94ef4a53..45ceb29b0f550237559a63e600e88600a2624c62 100644 (file)
@@ -651,6 +651,44 @@ class RdataTestCase(unittest.TestCase):
         with self.assertRaises(dns.exception.SyntaxError):
             dns.rdata.from_text(dns.rdataclass.IN, dns.rdatatype.SMIMEA, '1 1 1 aGVsbG8gd29ybGQh')
 
+    def test_DNSKEY_chunking(self):
+        inputs = (  # each with chunking as given by dig, unusual chunking, and no chunking
+            # example 1
+            (
+                '257 3 13 aCoEWYBBVsP9Fek2oC8yqU8ocKmnS1iDSFZNORnQuHKtJ9Wpyz+kNryq uB78Pyk/NTEoai5bxoipVQQXzHlzyg==',
+                '257 3 13 aCoEWYBBVsP9Fek2oC8yqU8ocK mnS1iDSFZNORnQuHKtJ9Wpyz+kNryquB78Pyk/   NTEoai5bxoipVQQXzHlzyg==',
+                '257 3 13 aCoEWYBBVsP9Fek2oC8yqU8ocKmnS1iDSFZNORnQuHKtJ9Wpyz+kNryquB78Pyk/NTEoai5bxoipVQQXzHlzyg==',
+            ),
+            # example 2
+            (
+                '257 3 8 AwEAAcw5QLr0IjC0wKbGoBPQv4qmeqHy9mvL5qGQTuaG5TSrNqEAR6b/ qvxDx6my4JmEmjUPA1JeEI9YfTUieMr2UZflu7aIbZFLw0vqiYrywCGr CHXLalOrEOmrvAxLvq4vHtuTlH7JIszzYBSes8g1vle6KG7xXiP3U5Ll 96Qiu6bZ31rlMQSPB20xbqJJh6psNSrQs41QvdcXAej+K2Hl1Wd8kPri ec4AgiBEh8sk5Pp8W9ROLQ7PcbqqttFaW2m7N/Wy4qcFU13roWKDEAst bxH5CHPoBfZSbIwK4KM6BK/uDHpSPIbiOvOCW+lvu9TAiZPc0oysY6as lO7jXv16Gws=',
+                '257 3 8 AwEAAcw5QLr0IjC0wKbGoBPQv4qmeq Hy9mvL5qGQTuaG5TSrNqEA R6b/qvxDx6my4JmEmjUPA1JeEI9Y  fTUieMr2UZflu7aIbZFLw0vqiYrywCGrC HXLalOrEOmrvAxLvq4vHtuTlH7JIszzYBSes8g1vle6KG7 xXiP3U5Ll 96Qiu6bZ31rlMQSPB20xbqJJh6psNSrQs41QvdcXAej+K2Hl1Wd8kPriec4AgiBEh8sk5Pp8W9ROLQ7PcbqqttFaW2m7N/Wy4qcFU13roWKDEAst bxH5CHPoBfZSbIwK4KM6BK/uDHpSPIbiOvOCW+lvu9TAiZPc0oysY6as lO7jXv16Gws=',
+                '257 3 8 AwEAAcw5QLr0IjC0wKbGoBPQv4qmeqHy9mvL5qGQTuaG5TSrNqEAR6b/qvxDx6my4JmEmjUPA1JeEI9YfTUieMr2UZflu7aIbZFLw0vqiYrywCGrCHXLalOrEOmrvAxLvq4vHtuTlH7JIszzYBSes8g1vle6KG7xXiP3U5Ll96Qiu6bZ31rlMQSPB20xbqJJh6psNSrQs41QvdcXAej+K2Hl1Wd8kPriec4AgiBEh8sk5Pp8W9ROLQ7PcbqqttFaW2m7N/Wy4qcFU13roWKDEAstbxH5CHPoBfZSbIwK4KM6BK/uDHpSPIbiOvOCW+lvu9TAiZPc0oysY6aslO7jXv16Gws=',
+            ),
+            # example 3
+            (
+                '256 3 8 AwEAAday3UX323uVzQqtOMQ7EHQYfD5Ofv4akjQGN2zY5AgB/2jmdR/+ 1PvXFqzKCAGJv4wjABEBNWLLFm7ew1hHMDZEKVL17aml0EBKI6Dsz6Mx t6n7ScvLtHaFRKaxT4i2JxiuVhKdQR9XGMiWAPQKrRM5SLG0P+2F+TLK l3D0L/cD',
+                '256 3 8 AwEAAday3UX323uVzQqtOMQ7EHQYfD5Ofv4akjQGN2zY5    AgB/2jmdR/+1PvXFqzKCAGJv4wjABEBNWLLFm7ew1hHMDZEKVL17aml0EBKI6Dsz6Mxt6n7ScvLtHaFRKaxT4i2JxiuVhKdQR9XGMiWAPQKrRM5SLG0P+2F+ TLKl3D0L/cD',
+                '256 3 8 AwEAAday3UX323uVzQqtOMQ7EHQYfD5Ofv4akjQGN2zY5AgB/2jmdR/+1PvXFqzKCAGJv4wjABEBNWLLFm7ew1hHMDZEKVL17aml0EBKI6Dsz6Mxt6n7ScvLtHaFRKaxT4i2JxiuVhKdQR9XGMiWAPQKrRM5SLG0P+2F+TLKl3D0L/cD',
+            ),
+        )
+        output_map = {
+            32: (
+                '257 3 13 aCoEWYBBVsP9Fek2oC8yqU8ocKmnS1iD SFZNORnQuHKtJ9Wpyz+kNryquB78Pyk/ NTEoai5bxoipVQQXzHlzyg==',
+                '257 3 8 AwEAAcw5QLr0IjC0wKbGoBPQv4qmeqHy 9mvL5qGQTuaG5TSrNqEAR6b/qvxDx6my 4JmEmjUPA1JeEI9YfTUieMr2UZflu7aI bZFLw0vqiYrywCGrCHXLalOrEOmrvAxL vq4vHtuTlH7JIszzYBSes8g1vle6KG7x XiP3U5Ll96Qiu6bZ31rlMQSPB20xbqJJ h6psNSrQs41QvdcXAej+K2Hl1Wd8kPri ec4AgiBEh8sk5Pp8W9ROLQ7PcbqqttFa W2m7N/Wy4qcFU13roWKDEAstbxH5CHPo BfZSbIwK4KM6BK/uDHpSPIbiOvOCW+lv u9TAiZPc0oysY6aslO7jXv16Gws=',
+                '256 3 8 AwEAAday3UX323uVzQqtOMQ7EHQYfD5O fv4akjQGN2zY5AgB/2jmdR/+1PvXFqzK CAGJv4wjABEBNWLLFm7ew1hHMDZEKVL1 7aml0EBKI6Dsz6Mxt6n7ScvLtHaFRKax T4i2JxiuVhKdQR9XGMiWAPQKrRM5SLG0 P+2F+TLKl3D0L/cD',
+            ),
+            56: (t[0] for t in inputs),
+            0: (t[0][:12] + t[0][12:].replace(' ', '') for t in inputs)
+        }
+
+        for chunksize, outputs in output_map.items():
+            for input, output in zip(inputs, outputs):
+                for input_variation in input:
+                    rr = dns.rdata.from_text('IN', 'DNSKEY', input_variation)
+                    new_text = rr.to_text(chunksize=chunksize)
+                    self.assertEqual(output, new_text)
+
 
 class UtilTestCase(unittest.TestCase):