From c9f6c8193f4812878ca971a0622d038ddb05cf44 Mon Sep 17 00:00:00 2001 From: Nils Wisiol Date: Mon, 1 Jun 2020 16:12:28 +0200 Subject: [PATCH] Lowercase SRV records in to_digestable(), fixes #496 --- dns/rdtypes/IN/SRV.py | 8 ++++++++ tests/test_bugs.py | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/dns/rdtypes/IN/SRV.py b/dns/rdtypes/IN/SRV.py index f8598e9d..bfd25ea6 100644 --- a/dns/rdtypes/IN/SRV.py +++ b/dns/rdtypes/IN/SRV.py @@ -15,6 +15,7 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +import io import struct import dns.exception @@ -57,6 +58,13 @@ class SRV(dns.rdata.Rdata): file.write(three_ints) self.target.to_wire(file, compress, origin) + def to_digestable(self, origin=None): + # TODO how to avoid code duplication here? This is mostly identical to self.to_wire. + f = io.BytesIO() + f.write(struct.pack("!HHH", self.priority, self.weight, self.port)) + f.write(self.target.to_digestable(origin)) + return f.getvalue() + @classmethod def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin=None): (priority, weight, port) = struct.unpack('!HHH', diff --git a/tests/test_bugs.py b/tests/test_bugs.py index 59e5f0eb..e10f8268 100644 --- a/tests/test_bugs.py +++ b/tests/test_bugs.py @@ -25,6 +25,8 @@ import dns.rdataclass import dns.rdatatype import dns.rdtypes.ANY.TXT import dns.ttl +from dns import rdata, rdataclass, rdatatype + class BugsTestCase(unittest.TestCase): @@ -95,5 +97,26 @@ class BugsTestCase(unittest.TestCase): self.assertEqual(t1, t2) self.assertEqual(t1, t4) + def test_lowercase_canonicals(self): + for t, presentation_format in [ + ('SRV', '100 1 5061 EXAMPLE.com.'), + # TODO also check NS, MD, MF, CNAME, SOA, MB, MG, MR, PTR, + # HINFO, MINFO, MX, HINFO, RP, AFSDB, RT, SIG, PX, NXT, + # NAPTR, KX, SRV, DNAME, A6, RRSIG, or NSEC + ]: + canonical_format = rdata.from_text( + rdclass=rdataclass.IN, + rdtype=rdatatype.from_text(t), + tok=presentation_format, + relativize=False + ).to_digestable() + self.assertIn( + b'example', + canonical_format, + f'Expected canonical format of {t} record type to have ' + f'lowercase DNS names, but saw {canonical_format}.' + ) + + if __name__ == '__main__': unittest.main() -- 2.47.3