Skip to content

Commit 8dafefc

Browse files
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

Lines changed: 16 additions & 4 deletions
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

Lines changed: 33 additions & 0 deletions
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)
Lines changed: 1 addition & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy