Commit 5e25674e authored by Michal Vaner's avatar Michal Vaner
Browse files

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:// e5f2f494-b856-4b98-b285-d166d9295462
parent fa4668e3
...@@ -15,6 +15,14 @@ ...@@ -15,6 +15,14 @@
"""Module where address representations live.""" """Module where address representations live."""
import socket 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): class InvalidAddress(ValueError):
"""Exception for invalid addresses.""" """Exception for invalid addresses."""
...@@ -31,18 +39,17 @@ class IPAddr: ...@@ -31,18 +39,17 @@ class IPAddr:
an InvalidAddr exception if the provided string isn't valid address. an InvalidAddr exception if the provided string isn't valid address.
""" """
try: try:
if isv4.match(addr):
a = socket.inet_pton(socket.AF_INET, addr) a = socket.inet_pton(socket.AF_INET, addr) = socket.AF_INET = socket.AF_INET
self.addr = a self.addr = a
return elif isv6.match(addr):
a = socket.inet_pton(socket.AF_INET6, addr) a = socket.inet_pton(socket.AF_INET6, addr) = socket.AF_INET6 = socket.AF_INET6
self.addr = a self.addr = a
return else:
raise InvalidAddress(addr +
' is not a valid IPv4 nor IPv6 address')
except socket.error as e: except socket.error as e:
raise InvalidAddress(str(e)) raise InvalidAddress(str(e))
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment