Skip to content

Commit 8dafefc

Browse files
miss-islingtonJamoBox
andauthoredNov 29, 2022
gh-82836: fix private network check (GH-97733)
Fixes private checks for network objects. The previous method would incorrectly return True for a private check in cases such as "0.0.0.0/0". (cherry picked from commit ed39109) Co-authored-by: Pete Wicken <2273100+JamoBox@users.noreply.github.com>
1 parent d7c2e0a commit 8dafefc

File tree

3 files changed

+50
-4
lines changed

3 files changed

+50
-4
lines changed
 

‎Lib/ipaddress.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -1077,15 +1077,16 @@ def is_link_local(self):
10771077

10781078
@property
10791079
def is_private(self):
1080-
"""Test if this address is allocated for private networks.
1080+
"""Test if this network belongs to a private range.
10811081
10821082
Returns:
1083-
A boolean, True if the address is reserved per
1083+
A boolean, True if the network is reserved per
10841084
iana-ipv4-special-registry or iana-ipv6-special-registry.
10851085
10861086
"""
1087-
return (self.network_address.is_private and
1088-
self.broadcast_address.is_private)
1087+
return any(self.network_address in priv_network and
1088+
self.broadcast_address in priv_network
1089+
for priv_network in self._constants._private_networks)
10891090

10901091
@property
10911092
def is_global(self):
@@ -1122,6 +1123,15 @@ def is_loopback(self):
11221123
return (self.network_address.is_loopback and
11231124
self.broadcast_address.is_loopback)
11241125

1126+
1127+
class _BaseConstants:
1128+
1129+
_private_networks = []
1130+
1131+
1132+
_BaseNetwork._constants = _BaseConstants
1133+
1134+
11251135
class _BaseV4:
11261136

11271137
"""Base IPv4 object.
@@ -1561,6 +1571,7 @@ class _IPv4Constants:
15611571

15621572

15631573
IPv4Address._constants = _IPv4Constants
1574+
IPv4Network._constants = _IPv4Constants
15641575

15651576

15661577
class _BaseV6:
@@ -2285,3 +2296,4 @@ class _IPv6Constants:
22852296

22862297

22872298
IPv6Address._constants = _IPv6Constants
2299+
IPv6Network._constants = _IPv6Constants

‎Lib/test/test_ipaddress.py

+33
Original file line numberDiff line numberDiff line change
@@ -2277,6 +2277,39 @@ def testReservedIpv4(self):
22772277
self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback)
22782278
self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified)
22792279

2280+
def testPrivateNetworks(self):
2281+
self.assertEqual(False, ipaddress.ip_network("0.0.0.0/0").is_private)
2282+
self.assertEqual(False, ipaddress.ip_network("1.0.0.0/8").is_private)
2283+
2284+
self.assertEqual(True, ipaddress.ip_network("0.0.0.0/8").is_private)
2285+
self.assertEqual(True, ipaddress.ip_network("10.0.0.0/8").is_private)
2286+
self.assertEqual(True, ipaddress.ip_network("127.0.0.0/8").is_private)
2287+
self.assertEqual(True, ipaddress.ip_network("169.254.0.0/16").is_private)
2288+
self.assertEqual(True, ipaddress.ip_network("172.16.0.0/12").is_private)
2289+
self.assertEqual(True, ipaddress.ip_network("192.0.0.0/29").is_private)
2290+
self.assertEqual(True, ipaddress.ip_network("192.0.0.170/31").is_private)
2291+
self.assertEqual(True, ipaddress.ip_network("192.0.2.0/24").is_private)
2292+
self.assertEqual(True, ipaddress.ip_network("192.168.0.0/16").is_private)
2293+
self.assertEqual(True, ipaddress.ip_network("198.18.0.0/15").is_private)
2294+
self.assertEqual(True, ipaddress.ip_network("198.51.100.0/24").is_private)
2295+
self.assertEqual(True, ipaddress.ip_network("203.0.113.0/24").is_private)
2296+
self.assertEqual(True, ipaddress.ip_network("240.0.0.0/4").is_private)
2297+
self.assertEqual(True, ipaddress.ip_network("255.255.255.255/32").is_private)
2298+
2299+
self.assertEqual(False, ipaddress.ip_network("::/0").is_private)
2300+
self.assertEqual(False, ipaddress.ip_network("::ff/128").is_private)
2301+
2302+
self.assertEqual(True, ipaddress.ip_network("::1/128").is_private)
2303+
self.assertEqual(True, ipaddress.ip_network("::/128").is_private)
2304+
self.assertEqual(True, ipaddress.ip_network("::ffff:0:0/96").is_private)
2305+
self.assertEqual(True, ipaddress.ip_network("100::/64").is_private)
2306+
self.assertEqual(True, ipaddress.ip_network("2001::/23").is_private)
2307+
self.assertEqual(True, ipaddress.ip_network("2001:2::/48").is_private)
2308+
self.assertEqual(True, ipaddress.ip_network("2001:db8::/32").is_private)
2309+
self.assertEqual(True, ipaddress.ip_network("2001:10::/28").is_private)
2310+
self.assertEqual(True, ipaddress.ip_network("fc00::/7").is_private)
2311+
self.assertEqual(True, ipaddress.ip_network("fe80::/10").is_private)
2312+
22802313
def testReservedIpv6(self):
22812314

22822315
self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix :attr:`~ipaddress.IPv4Address.is_private` properties in the :mod:`ipaddress` module. Previously non-private networks (0.0.0.0/0) would return True from this method; now they correctly return False.

0 commit comments

Comments
 (0)
Please sign in to comment.