]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Add dns.ipv6.is_mapped(); Reverse IPv6 mapped IPv4 into v4 space.
authorBob Halley <halley@dnspython.org>
Mon, 1 Sep 2014 00:29:41 +0000 (17:29 -0700)
committerBob Halley <halley@dnspython.org>
Mon, 1 Sep 2014 00:29:41 +0000 (17:29 -0700)
dns/ipv6.py
dns/reversename.py
tests/name.py
tests/ntoaaton.py

index 73f623201fcd13376d65fd5573fb4ad58019af0a..e2c0164093c2e7d5197800edc755e3848acaf7d6 100644 (file)
@@ -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)
index f8bd9e0ff448d73a08e6e1966caeb5775623df7e..276393c28f73ef1f99e73612955675ca4f29d8de 100644 (file)
@@ -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
index 213940932e21f927617e5e3c41966164c46533b2..c125a15677254631ca091f56f3a680d15eb368d4 100644 (file)
@@ -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')
index bef83f37fb222afae03b13b870314f59fea493b5..92ccc8177aa21f7d9a241b82a18d2803b1c874e7 100644 (file)
@@ -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()