From: Bob Halley Date: Mon, 1 Sep 2014 00:29:41 +0000 (-0700) Subject: Add dns.ipv6.is_mapped(); Reverse IPv6 mapped IPv4 into v4 space. X-Git-Tag: v1.12.0-py3~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=889e1e7342b54687f491c4521c4329ef1feb8b8f;p=thirdparty%2Fdnspython.git Add dns.ipv6.is_mapped(); Reverse IPv6 mapped IPv4 into v4 space. --- diff --git a/dns/ipv6.py b/dns/ipv6.py index 73f62320..e2c01640 100644 --- a/dns/ipv6.py +++ b/dns/ipv6.py @@ -155,3 +155,8 @@ def inet_aton(text): return bytes.fromhex(text) except: raise dns.exception.SyntaxError + +_mapped_prefix = b'\x00' * 10 + b'\xff\xff' + +def is_mapped(address): + return address.startswith(_mapped_prefix) diff --git a/dns/reversename.py b/dns/reversename.py index f8bd9e0f..276393c2 100644 --- a/dns/reversename.py +++ b/dns/reversename.py @@ -39,8 +39,13 @@ def from_address(text): @rtype: dns.name.Name object """ try: - parts = ['%x.%x' % (byte & 0x0f, byte >> 4) for byte in dns.ipv6.inet_aton(text)] - origin = ipv6_reverse_domain + v6 = dns.ipv6.inet_aton(text) + if dns.ipv6.is_mapped(v6): + parts = ['%d' % byte for byte in v6[12:]] + origin = ipv4_reverse_domain + else: + parts = ['%x.%x' % (byte & 0x0f, byte >> 4) for byte in v6] + origin = ipv6_reverse_domain except: parts = ['%d' % byte for byte in dns.ipv4.inet_aton(text)] origin = ipv4_reverse_domain diff --git a/tests/name.py b/tests/name.py index 21394093..c125a156 100644 --- a/tests/name.py +++ b/tests/name.py @@ -660,6 +660,11 @@ class NameTestCase(unittest.TestCase): n = dns.reversename.from_address('::1') self.assertTrue(e == n) + def testReverseIPv6MappedIpv4(self): + e = dns.name.from_text('1.0.0.127.in-addr.arpa.') + n = dns.reversename.from_address('::ffff:127.0.0.1') + self.assertTrue(e == n) + def testBadReverseIPv4(self): def bad(): n = dns.reversename.from_address('127.0.foo.1') diff --git a/tests/ntoaaton.py b/tests/ntoaaton.py index bef83f37..92ccc817 100644 --- a/tests/ntoaaton.py +++ b/tests/ntoaaton.py @@ -199,5 +199,13 @@ class NtoAAtoNTestCase(unittest.TestCase): t1 = ntoa6(b1) self.assertTrue(t1 == addr) + def test_is_mapped(self): + t1 = '2001:db8:0:1:1:1:1:1' + t2 = '::ffff:127.0.0.1' + t3 = '1::ffff:127.0.0.1' + self.assertFalse(dns.ipv6.is_mapped(aton6(t1))) + self.assertTrue(dns.ipv6.is_mapped(aton6(t2))) + self.assertFalse(dns.ipv6.is_mapped(aton6(t3))) + if __name__ == '__main__': unittest.main()