diff options
| author | Bob Halley <halley@dnspython.org> | 2014-08-31 17:29:41 -0700 |
|---|---|---|
| committer | Bob Halley <halley@dnspython.org> | 2014-08-31 17:29:41 -0700 |
| commit | 889e1e7342b54687f491c4521c4329ef1feb8b8f (patch) | |
| tree | a727beba392273c5f127a394041f3002419178ed | |
| parent | 7d2a4209846ded302b78985d6f53e7f791cabab8 (diff) | |
| download | dnspython-889e1e7342b54687f491c4521c4329ef1feb8b8f.tar.gz | |
Add dns.ipv6.is_mapped(); Reverse IPv6 mapped IPv4 into v4 space.
| -rw-r--r-- | dns/ipv6.py | 5 | ||||
| -rw-r--r-- | dns/reversename.py | 9 | ||||
| -rw-r--r-- | tests/name.py | 5 | ||||
| -rw-r--r-- | tests/ntoaaton.py | 8 |
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() |
