summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBob Halley <halley@dnspython.org>2014-08-31 17:29:41 -0700
committerBob Halley <halley@dnspython.org>2014-08-31 17:29:41 -0700
commit889e1e7342b54687f491c4521c4329ef1feb8b8f (patch)
treea727beba392273c5f127a394041f3002419178ed
parent7d2a4209846ded302b78985d6f53e7f791cabab8 (diff)
downloaddnspython-889e1e7342b54687f491c4521c4329ef1feb8b8f.tar.gz
Add dns.ipv6.is_mapped(); Reverse IPv6 mapped IPv4 into v4 space.
-rw-r--r--dns/ipv6.py5
-rw-r--r--dns/reversename.py9
-rw-r--r--tests/name.py5
-rw-r--r--tests/ntoaaton.py8
4 files changed, 25 insertions, 2 deletions
diff --git a/dns/ipv6.py b/dns/ipv6.py
index 73f6232..e2c0164 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 f8bd9e0..276393c 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 2139409..c125a15 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 bef83f3..92ccc81 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()