From: Nils Wisiol Date: Mon, 1 Jun 2020 14:12:28 +0000 (+0200) Subject: Lowercase SRV records in to_digestable(), fixes #496 X-Git-Tag: v2.0.0rc1~137^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c9f6c8193f4812878ca971a0622d038ddb05cf44;p=thirdparty%2Fdnspython.git Lowercase SRV records in to_digestable(), fixes #496 --- 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()