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)
@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
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')
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()