From c493305ed0607fab525d7c4c07db528d2eb407f3 Mon Sep 17 00:00:00 2001 From: "romain.fontugne" Date: Fri, 28 Feb 2020 16:29:49 +0900 Subject: [PATCH 1/5] Allow CIDR --- ipwhois/net.py | 39 ++++++++++++++++++++++++++++++++------- ipwhois/tests/test_net.py | 16 ++++++++++++++-- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/ipwhois/net.py b/ipwhois/net.py index 87939213..dd767c02 100644 --- a/ipwhois/net.py +++ b/ipwhois/net.py @@ -43,11 +43,15 @@ if sys.version_info >= (3, 3): # pragma: no cover from ipaddress import (ip_address, IPv4Address, - IPv6Address) + IPv6Address, + ip_network, + IPv4Network, + IPv6Network) else: # pragma: no cover from ipaddr import (IPAddress as ip_address, IPv4Address, - IPv6Address) + IPv6Address + ) try: # pragma: no cover from urllib.request import (OpenerDirector, @@ -117,10 +121,15 @@ def __init__(self, address, timeout=5, proxy_opener=None, # IPv4Address or IPv6Address if isinstance(address, IPv4Address) or isinstance( - address, IPv6Address): + address, IPv6Address) or isinstance( + address, IPv4Network) or isinstance(address, IPv6Network): self.address = address + elif isinstance(address, str) and '/' in address: + + self.address = ip_network(address) + else: # Use ipaddress package exception handling. @@ -161,8 +170,16 @@ def __init__(self, address, timeout=5, proxy_opener=None, if self.version == 4: - # Check if no ASN/whois resolution needs to occur. - is_defined = ipv4_is_defined(self.address_str) + if isinstance(self.address, IPv4Network): + + # Check if no ASN/whois resolution needs to occur with the + # first IP in the subnet. + is_defined = ipv4_is_defined(next(self.address.hosts())) + + else: + + # Check if no ASN/whois resolution needs to occur. + is_defined = ipv4_is_defined(self.address_str) if is_defined[0]: @@ -182,8 +199,16 @@ def __init__(self, address, timeout=5, proxy_opener=None, else: - # Check if no ASN/whois resolution needs to occur. - is_defined = ipv6_is_defined(self.address_str) + if isinstance(self.address, IPv6Network): + + # Check if no ASN/whois resolution needs to occur with the + # first IP in the subnet. + is_defined = ipv6_is_defined(next(self.address.hosts())) + + else: + + # Check if no ASN/whois resolution needs to occur. + is_defined = ipv6_is_defined(self.address_str) if is_defined[0]: diff --git a/ipwhois/tests/test_net.py b/ipwhois/tests/test_net.py index aedf6ac2..1b72a683 100644 --- a/ipwhois/tests/test_net.py +++ b/ipwhois/tests/test_net.py @@ -16,23 +16,35 @@ class TestNet(TestCommon): def test_ip_invalid(self): self.assertRaises(ValueError, Net, '192.168.0.256') self.assertRaises(ValueError, Net, 'fe::80::') + self.assertRaises(ValueError, Net, '192.256.0.0/16') + self.assertRaises(ValueError, Net, 'fe::80::/10') def test_ip_defined(self): if sys.version_info >= (3, 3): - from ipaddress import (IPv4Address, IPv6Address) + from ipaddress import (IPv4Address, IPv6Address, + IPv4Network, IPv6Network) else: - from ipaddr import (IPv4Address, IPv6Address) + from ipaddr import (IPv4Address, IPv6Address, + IPv4Network, IPv6Network) self.assertRaises(IPDefinedError, Net, '192.168.0.1') self.assertRaises(IPDefinedError, Net, 'fe80::') self.assertRaises(IPDefinedError, Net, IPv4Address('192.168.0.1')) self.assertRaises(IPDefinedError, Net, IPv6Address('fe80::')) + self.assertRaises(IPDefinedError, Net, '192.168.0.0/16') + self.assertRaises(IPDefinedError, Net, 'fe80::/10') + self.assertRaises(IPDefinedError, Net, IPv4Network('192.168.0.0/16')) + self.assertRaises(IPDefinedError, Net, IPv6Network('fe80::/10')) def test_ip_version(self): result = Net('74.125.225.229') self.assertEqual(result.version, 4) result = Net('2001:4860:4860::8888') self.assertEqual(result.version, 6) + result = Net('8.8.8.0/24') + self.assertEqual(result.version, 4) + result = Net('2001:4860::/32') + self.assertEqual(result.version, 6) def test_timeout(self): result = Net('74.125.225.229') From 896568ca8b90cbdff3e951d3178d665b7d7ea3a5 Mon Sep 17 00:00:00 2001 From: "romain.fontugne" Date: Fri, 28 Feb 2020 16:29:49 +0900 Subject: [PATCH 2/5] Allow CIDR --- ipwhois/net.py | 39 ++++++++++++++++++++++++++++++++------- ipwhois/tests/test_net.py | 16 ++++++++++++++-- 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/ipwhois/net.py b/ipwhois/net.py index 87939213..dd767c02 100644 --- a/ipwhois/net.py +++ b/ipwhois/net.py @@ -43,11 +43,15 @@ if sys.version_info >= (3, 3): # pragma: no cover from ipaddress import (ip_address, IPv4Address, - IPv6Address) + IPv6Address, + ip_network, + IPv4Network, + IPv6Network) else: # pragma: no cover from ipaddr import (IPAddress as ip_address, IPv4Address, - IPv6Address) + IPv6Address + ) try: # pragma: no cover from urllib.request import (OpenerDirector, @@ -117,10 +121,15 @@ def __init__(self, address, timeout=5, proxy_opener=None, # IPv4Address or IPv6Address if isinstance(address, IPv4Address) or isinstance( - address, IPv6Address): + address, IPv6Address) or isinstance( + address, IPv4Network) or isinstance(address, IPv6Network): self.address = address + elif isinstance(address, str) and '/' in address: + + self.address = ip_network(address) + else: # Use ipaddress package exception handling. @@ -161,8 +170,16 @@ def __init__(self, address, timeout=5, proxy_opener=None, if self.version == 4: - # Check if no ASN/whois resolution needs to occur. - is_defined = ipv4_is_defined(self.address_str) + if isinstance(self.address, IPv4Network): + + # Check if no ASN/whois resolution needs to occur with the + # first IP in the subnet. + is_defined = ipv4_is_defined(next(self.address.hosts())) + + else: + + # Check if no ASN/whois resolution needs to occur. + is_defined = ipv4_is_defined(self.address_str) if is_defined[0]: @@ -182,8 +199,16 @@ def __init__(self, address, timeout=5, proxy_opener=None, else: - # Check if no ASN/whois resolution needs to occur. - is_defined = ipv6_is_defined(self.address_str) + if isinstance(self.address, IPv6Network): + + # Check if no ASN/whois resolution needs to occur with the + # first IP in the subnet. + is_defined = ipv6_is_defined(next(self.address.hosts())) + + else: + + # Check if no ASN/whois resolution needs to occur. + is_defined = ipv6_is_defined(self.address_str) if is_defined[0]: diff --git a/ipwhois/tests/test_net.py b/ipwhois/tests/test_net.py index aedf6ac2..1b72a683 100644 --- a/ipwhois/tests/test_net.py +++ b/ipwhois/tests/test_net.py @@ -16,23 +16,35 @@ class TestNet(TestCommon): def test_ip_invalid(self): self.assertRaises(ValueError, Net, '192.168.0.256') self.assertRaises(ValueError, Net, 'fe::80::') + self.assertRaises(ValueError, Net, '192.256.0.0/16') + self.assertRaises(ValueError, Net, 'fe::80::/10') def test_ip_defined(self): if sys.version_info >= (3, 3): - from ipaddress import (IPv4Address, IPv6Address) + from ipaddress import (IPv4Address, IPv6Address, + IPv4Network, IPv6Network) else: - from ipaddr import (IPv4Address, IPv6Address) + from ipaddr import (IPv4Address, IPv6Address, + IPv4Network, IPv6Network) self.assertRaises(IPDefinedError, Net, '192.168.0.1') self.assertRaises(IPDefinedError, Net, 'fe80::') self.assertRaises(IPDefinedError, Net, IPv4Address('192.168.0.1')) self.assertRaises(IPDefinedError, Net, IPv6Address('fe80::')) + self.assertRaises(IPDefinedError, Net, '192.168.0.0/16') + self.assertRaises(IPDefinedError, Net, 'fe80::/10') + self.assertRaises(IPDefinedError, Net, IPv4Network('192.168.0.0/16')) + self.assertRaises(IPDefinedError, Net, IPv6Network('fe80::/10')) def test_ip_version(self): result = Net('74.125.225.229') self.assertEqual(result.version, 4) result = Net('2001:4860:4860::8888') self.assertEqual(result.version, 6) + result = Net('8.8.8.0/24') + self.assertEqual(result.version, 4) + result = Net('2001:4860::/32') + self.assertEqual(result.version, 6) def test_timeout(self): result = Net('74.125.225.229') From de596384ce43e8a8822e98874a3a37085162f9e5 Mon Sep 17 00:00:00 2001 From: "romain.fontugne" Date: Fri, 28 Feb 2020 16:52:55 +0900 Subject: [PATCH 3/5] typo --- ipwhois/net.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ipwhois/net.py b/ipwhois/net.py index dd767c02..1f1ef06c 100644 --- a/ipwhois/net.py +++ b/ipwhois/net.py @@ -50,8 +50,7 @@ else: # pragma: no cover from ipaddr import (IPAddress as ip_address, IPv4Address, - IPv6Address - ) + IPv6Address) try: # pragma: no cover from urllib.request import (OpenerDirector, From 8391fcb7e43fc6b049b4796693af27ad40fbe465 Mon Sep 17 00:00:00 2001 From: "romain.fontugne" Date: Mon, 2 Mar 2020 12:17:19 +0900 Subject: [PATCH 4/5] Make it compatible with python 2.7 (replaced ipaddr wth ipaddress) --- ipwhois/net.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/ipwhois/net.py b/ipwhois/net.py index da069158..c330009d 100644 --- a/ipwhois/net.py +++ b/ipwhois/net.py @@ -40,17 +40,12 @@ from .asn import ASN_ORIGIN_WHOIS from .utils import ipv4_is_defined, ipv6_is_defined -if sys.version_info >= (3, 3): # pragma: no cover - from ipaddress import (ip_address, - IPv4Address, - IPv6Address, - ip_network, - IPv4Network, - IPv6Network) -else: # pragma: no cover - from ipaddr import (IPAddress as ip_address, +from ipaddress import (ip_address, IPv4Address, - IPv6Address) + IPv6Address, + ip_network, + IPv4Network, + IPv6Network) try: # pragma: no cover from urllib.request import (OpenerDirector, @@ -69,6 +64,12 @@ HTTPError) from urllib import urlencode +if sys.version_info >= (3, 3): # pragma: no cover + # There is no builtin unicode function in Python3, all strings are unicode + # in Python3 + def unicode(string): + return string + log = logging.getLogger(__name__) # POSSIBLY UPDATE TO USE RDAP @@ -123,12 +124,12 @@ def __init__(self, address, timeout=5, proxy_opener=None): elif isinstance(address, str) and '/' in address: - self.address = ip_network(address) + self.address = ip_network(unicode(address)) else: # Use ipaddress package exception handling. - self.address = ip_address(address) + self.address = ip_address(unicode(address)) # Default timeout for socket connections. self.timeout = timeout From 06335b8a1695c706428415871683d4bd5c7f3581 Mon Sep 17 00:00:00 2001 From: "romain.fontugne" Date: Thu, 5 Mar 2020 16:56:51 +0900 Subject: [PATCH 5/5] Replace ipaddr with ipaddress (py2) in test_net --- ipwhois/tests/test_net.py | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ipwhois/tests/test_net.py b/ipwhois/tests/test_net.py index 1b72a683..9f7f6f90 100644 --- a/ipwhois/tests/test_net.py +++ b/ipwhois/tests/test_net.py @@ -20,21 +20,17 @@ def test_ip_invalid(self): self.assertRaises(ValueError, Net, 'fe::80::/10') def test_ip_defined(self): - if sys.version_info >= (3, 3): - from ipaddress import (IPv4Address, IPv6Address, - IPv4Network, IPv6Network) - else: - from ipaddr import (IPv4Address, IPv6Address, - IPv4Network, IPv6Network) + from ipaddress import (IPv4Address, IPv6Address, + IPv4Network, IPv6Network) self.assertRaises(IPDefinedError, Net, '192.168.0.1') self.assertRaises(IPDefinedError, Net, 'fe80::') - self.assertRaises(IPDefinedError, Net, IPv4Address('192.168.0.1')) - self.assertRaises(IPDefinedError, Net, IPv6Address('fe80::')) + self.assertRaises(IPDefinedError, Net, IPv4Address(u'192.168.0.1')) + self.assertRaises(IPDefinedError, Net, IPv6Address(u'fe80::')) self.assertRaises(IPDefinedError, Net, '192.168.0.0/16') self.assertRaises(IPDefinedError, Net, 'fe80::/10') - self.assertRaises(IPDefinedError, Net, IPv4Network('192.168.0.0/16')) - self.assertRaises(IPDefinedError, Net, IPv6Network('fe80::/10')) + self.assertRaises(IPDefinedError, Net, IPv4Network(u'192.168.0.0/16')) + self.assertRaises(IPDefinedError, Net, IPv6Network(u'fe80::/10')) def test_ip_version(self): result = Net('74.125.225.229')