summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormshields@google.com <mshields@google.com@09200d28-7f98-11dd-ad27-0f66e57d2035>2010-08-17 00:01:59 +0000
committermshields@google.com <mshields@google.com@09200d28-7f98-11dd-ad27-0f66e57d2035>2010-08-17 00:01:59 +0000
commit1a4dceca13979f9e090f6c5b87ca74ecdad47dcc (patch)
tree348d3d5267a0b0d766dda77c2e513974384eb3ce
parentd975acce77c2e9077af0e0d8023d167f5f825878 (diff)
downloadipaddr-py-1a4dceca13979f9e090f6c5b87ca74ecdad47dcc.tar.gz
Merge through r181
git-svn-id: https://ipaddr-py.googlecode.com/svn@182 09200d28-7f98-11dd-ad27-0f66e57d2035
-rw-r--r--branches/2.1.x/ipaddr.py34
-rwxr-xr-xbranches/2.1.x/ipaddr_test.py6
2 files changed, 25 insertions, 15 deletions
diff --git a/branches/2.1.x/ipaddr.py b/branches/2.1.x/ipaddr.py
index ad8471c..d4dbdb1 100644
--- a/branches/2.1.x/ipaddr.py
+++ b/branches/2.1.x/ipaddr.py
@@ -26,6 +26,9 @@ __version__ = '2.1.3'
import struct
+IPV4LENGTH = 32
+IPV6LENGTH = 128
+
class AddressValueError(ValueError):
"""A Value Error related to the address."""
@@ -907,7 +910,7 @@ class _BaseNet(_IPAddrBase):
"""Return the network object with the host bits masked out."""
return IPNetwork('%s/%d' % (self.network, self._prefixlen),
version=self._version)
-
+
def subnet(self, prefixlen_diff=1, new_prefix=None):
"""Return a list of subnets, rather than an interator."""
return list(self.iter_subnets(prefixlen_diff, new_prefix))
@@ -970,11 +973,11 @@ class _BaseV4(object):
"""
# Equivalent to 255.255.255.255 or 32 bits of 1's.
- _ALL_ONES = (2**32) - 1
+ _ALL_ONES = (2**IPV4LENGTH) - 1
def __init__(self, address):
self._version = 4
- self._max_prefixlen = 32
+ self._max_prefixlen = IPV4LENGTH
def _explode_shorthand_ip_string(self, ip_str=None):
if not ip_str:
@@ -1242,7 +1245,7 @@ class IPv4Network(_BaseV4, _BaseNet):
if isinstance(address, (int, long)):
self._ip = address
self.ip = IPv4Address(self._ip)
- self._prefixlen = 32
+ self._prefixlen = self._max_prefixlen
self.netmask = IPv4Address(self._ALL_ONES)
if address < 0 or address > self._ALL_ONES:
raise AddressValueError(address)
@@ -1253,7 +1256,7 @@ class IPv4Network(_BaseV4, _BaseNet):
if isinstance(address, bytes) and len(address) == 4:
self._ip = struct.unpack('!I', address)[0]
self.ip = IPv4Address(self._ip)
- self._prefixlen = 32
+ self._prefixlen = self._max_prefixlen
self.netmask = IPv4Address(self._ALL_ONES)
return
@@ -1293,7 +1296,7 @@ class IPv4Network(_BaseV4, _BaseNet):
self.netmask = IPv4Address(self._ip_int_from_prefix(
self._prefixlen))
else:
- self._prefixlen = 32
+ self._prefixlen = self._max_prefixlen
self.netmask = IPv4Address(self._ip_int_from_prefix(
self._prefixlen))
if strict:
@@ -1321,7 +1324,7 @@ class IPv4Network(_BaseV4, _BaseNet):
if parts[0] < parts[-1]:
return True
return False
-
+
def _is_valid_netmask(self, netmask):
"""Verify that the netmask is valid.
@@ -1346,7 +1349,7 @@ class IPv4Network(_BaseV4, _BaseNet):
netmask = int(netmask)
except ValueError:
return False
- return 0 <= netmask <= 32
+ return 0 <= netmask <= self._max_prefixlen
# backwards compatibility
IsRFC1918 = lambda self: self.is_private
@@ -1364,11 +1367,11 @@ class _BaseV6(object):
"""
- _ALL_ONES = (2**128) - 1
+ _ALL_ONES = (2**IPV6LENGTH) - 1
def __init__(self, address):
self._version = 6
- self._max_prefixlen = 128
+ self._max_prefixlen = IPV6LENGTH
def _ip_int_from_string(self, ip_str=None):
"""Turn an IPv6 ip_str into an integer.
@@ -1758,6 +1761,9 @@ class IPv6Address(_BaseV6, _BaseIP):
if not addr_str:
raise AddressValueError('')
+ if not self._is_valid_ip(addr_str):
+ raise AddressValueError(addr_str)
+
self._ip = self._ip_int_from_string(addr_str)
@@ -1815,7 +1821,7 @@ class IPv6Network(_BaseV6, _BaseNet):
if isinstance(address, (int, long)):
self._ip = address
self.ip = IPv6Address(self._ip)
- self._prefixlen = 128
+ self._prefixlen = self._max_prefixlen
self.netmask = IPv6Address(self._ALL_ONES)
if address < 0 or address > self._ALL_ONES:
raise AddressValueError(address)
@@ -1827,7 +1833,7 @@ class IPv6Network(_BaseV6, _BaseNet):
tmp = struct.unpack('!QQ', address)
self._ip = (tmp[0] << 64) | tmp[1]
self.ip = IPv6Address(self._ip)
- self._prefixlen = 128
+ self._prefixlen = self._max_prefixlen
self.netmask = IPv6Address(self._ALL_ONES)
return
@@ -1847,7 +1853,7 @@ class IPv6Network(_BaseV6, _BaseNet):
else:
raise NetmaskValueError(addr[1])
else:
- self._prefixlen = 128
+ self._prefixlen = self._max_prefixlen
self.netmask = IPv6Address(self._ip_int_from_prefix(self._prefixlen))
@@ -1875,7 +1881,7 @@ class IPv6Network(_BaseV6, _BaseNet):
prefixlen = int(prefixlen)
except ValueError:
return False
- return 0 <= prefixlen <= 128
+ return 0 <= prefixlen <= self._max_prefixlen
@property
def with_netmask(self):
diff --git a/branches/2.1.x/ipaddr_test.py b/branches/2.1.x/ipaddr_test.py
index 61ac4b0..7d7ed0e 100755
--- a/branches/2.1.x/ipaddr_test.py
+++ b/branches/2.1.x/ipaddr_test.py
@@ -103,6 +103,10 @@ class IpaddrUnitTest(unittest.TestCase):
'1234:axy::b')
self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Address,
'1234:axy::b')
+ self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Address,
+ '2001:db8:::1')
+ self.assertRaises(ipaddr.AddressValueError, ipaddr.IPv6Address,
+ '2001:888888::1')
self.assertRaises(ipaddr.AddressValueError,
ipaddr.IPv4Address(1)._ip_int_from_string,
'1.a.2.3')
@@ -158,7 +162,7 @@ class IpaddrUnitTest(unittest.TestCase):
key=ipaddr.get_mixed_type_key))
self.assertEqual([v6addr, v6net], sorted([v6net, v6addr],
key=ipaddr.get_mixed_type_key))
-
+
def testIpFromInt(self):
self.assertEqual(self.ipv4.ip, ipaddr.IPv4Network(16909060).ip)
self.assertRaises(ipaddr.AddressValueError,