+2014-05-31 Bob Halley <halley@dnspython.org>
+
+ * dns/ipv6.py: Add is_mapped()
+
+ * dns/reversename.py: Lookup IPv6 mapped IPv4 addresses in the v4
+ reverse namespace. Thanks to Devin Bayer. Yes, I finally fixed
+ this one :)
+
2014-04-11 Bob Halley <halley@dnspython.org>
* dns/zone.py: Do not put back an unescaped token. This was
return text.decode('hex_codec')
except TypeError:
raise dns.exception.SyntaxError
+
+_mapped_prefix = '\x00' * 10 + '\xff\xff'
+
+def is_mapped(address):
+ return address.startswith(_mapped_prefix)
@rtype: dns.name.Name object
"""
try:
- parts = list(dns.ipv6.inet_aton(text).encode('hex_codec'))
- origin = ipv6_reverse_domain
+ v6 = dns.ipv6.inet_aton(text)
+ if dns.ipv6.is_mapped(v6):
+ parts = ['%d' % ord(byte) for byte in v6[12:]]
+ origin = ipv4_reverse_domain
+ else:
+ parts = list(v6.encode('hex_codec'))
+ origin = ipv6_reverse_domain
except:
parts = ['%d' % ord(byte) for byte in dns.ipv4.inet_aton(text)]
origin = ipv4_reverse_domain
class NameTestCase(unittest.TestCase):
def setUp(self):
self.origin = dns.name.from_text('example.')
-
+
def testFromTextRel1(self):
n = dns.name.from_text('foo.bar')
self.failUnless(n.labels == ('foo', 'bar', ''))
n = dns.name.from_text('FOO.bar', None)
d = n.to_digestable(dns.name.root)
self.failUnless(d == '\x03foo\x03bar\x00')
-
+
def testBadDigestable(self):
def bad():
n = dns.name.from_text('FOO.bar', None)
n = dns.reversename.from_address('::1')
self.failUnless(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.failUnless(e == n)
+
def testBadReverseIPv4(self):
def bad():
n = dns.reversename.from_address('127.0.foo.1')
t1 = ntoa6(b1)
self.failUnless(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.failIf(dns.ipv6.is_mapped(aton6(t1)))
+ self.failUnless(dns.ipv6.is_mapped(aton6(t2)))
+ self.failIf(dns.ipv6.is_mapped(aton6(t3)))
+
if __name__ == '__main__':
unittest.main()