Parcourir la source

Guess the address type first, then run inet_pton

This avoids call to inet_pton call that fails when trying to translate
v6 address. It should also workaround a bug MacOS version, that
incorrectly accepts 0000.0.0.0 as an IP address.

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac353@3234 e5f2f494-b856-4b98-b285-d166d9295462
Michal Vaner il y a 14 ans
Parent
commit
5e25674ee0
1 fichiers modifiés avec 19 ajouts et 12 suppressions
  1. 19 12
      src/lib/python/isc/net/addr.py

+ 19 - 12
src/lib/python/isc/net/addr.py

@@ -15,6 +15,14 @@
 
 """Module where address representations live."""
 import socket
+import re
+
+# These regular expressions are not validating. They are supposed to
+# guess which kind of address it is and throw away just obvious nonsense.
+# It is expected that inet_pton will complain if it isn't an address, so
+# they can have false positives.
+isv4 = re.compile(r'^([0-9]{1,3}\.){3}[0-9]{1,3}$')
+isv6 = re.compile(r'^([0-9a-f]{,4}:){,7}[0-9a-f]{,4}$', re.IGNORECASE)
 
 class InvalidAddress(ValueError):
     """Exception for invalid addresses."""
@@ -31,18 +39,17 @@ class IPAddr:
         an InvalidAddr exception if the provided string isn't valid address.
         """
         try:
-            a = socket.inet_pton(socket.AF_INET, addr)
-            self.family = socket.AF_INET
-            self.addr = a
-            return
-        except:
-            pass
-
-        try:
-            a = socket.inet_pton(socket.AF_INET6, addr)
-            self.family = socket.AF_INET6
-            self.addr = a
-            return
+            if isv4.match(addr):
+                a = socket.inet_pton(socket.AF_INET, addr)
+                self.family = socket.AF_INET
+                self.addr = a
+            elif isv6.match(addr):
+                a = socket.inet_pton(socket.AF_INET6, addr)
+                self.family = socket.AF_INET6
+                self.addr = a
+            else:
+                raise InvalidAddress(addr +
+                    ' is not a valid IPv4 nor IPv6 address')
         except socket.error as e:
             raise InvalidAddress(str(e))