GH-113171: Fix "private" (non-global) IP address ranges (GH-113179) · python/cpython@40d75c2 (original) (raw)
`@@ -1086,7 +1086,11 @@ def is_private(self):
`
1086
1086
` """
`
1087
1087
`return any(self.network_address in priv_network and
`
1088
1088
`self.broadcast_address in priv_network
`
1089
``
`-
for priv_network in self._constants._private_networks)
`
``
1089
`+
for priv_network in self._constants._private_networks) and all(
`
``
1090
`+
self.network_address not in network and
`
``
1091
`+
self.broadcast_address not in network
`
``
1092
`+
for network in self._constants._private_networks_exceptions
`
``
1093
`+
)
`
1090
1094
``
1091
1095
`@property
`
1092
1096
`def is_global(self):
`
`@@ -1347,7 +1351,10 @@ def is_private(self):
`
1347
1351
``` is_private
has value opposite to :attr:is_global
, except for the 100.64.0.0/10
`1348`
`1352`
``` IPv4 range where they are both ``False``.
1349
1353
` """
`
1350
``
`-
return any(self in net for net in self._constants._private_networks)
`
``
1354
`+
return (
`
``
1355
`+
any(self in net for net in self._constants._private_networks)
`
``
1356
`+
and all(self not in net for net in self._constants._private_networks_exceptions)
`
``
1357
`+
)
`
1351
1358
``
1352
1359
`@property
`
1353
1360
`@functools.lru_cache()
`
`@@ -1578,13 +1585,15 @@ class _IPv4Constants:
`
1578
1585
``
1579
1586
`_public_network = IPv4Network('100.64.0.0/10')
`
1580
1587
``
``
1588
`+
Not globally reachable address blocks listed on
`
``
1589
`+
https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
`
1581
1590
`_private_networks = [
`
1582
1591
`IPv4Network('0.0.0.0/8'),
`
1583
1592
`IPv4Network('10.0.0.0/8'),
`
1584
1593
`IPv4Network('127.0.0.0/8'),
`
1585
1594
`IPv4Network('169.254.0.0/16'),
`
1586
1595
`IPv4Network('172.16.0.0/12'),
`
1587
``
`-
IPv4Network('192.0.0.0/29'),
`
``
1596
`+
IPv4Network('192.0.0.0/24'),
`
1588
1597
`IPv4Network('192.0.0.170/31'),
`
1589
1598
`IPv4Network('192.0.2.0/24'),
`
1590
1599
`IPv4Network('192.168.0.0/16'),
`
`@@ -1595,6 +1604,11 @@ class _IPv4Constants:
`
1595
1604
`IPv4Network('255.255.255.255/32'),
`
1596
1605
` ]
`
1597
1606
``
``
1607
`+
_private_networks_exceptions = [
`
``
1608
`+
IPv4Network('192.0.0.9/32'),
`
``
1609
`+
IPv4Network('192.0.0.10/32'),
`
``
1610
`+
]
`
``
1611
+
1598
1612
`_reserved_network = IPv4Network('240.0.0.0/4')
`
1599
1613
``
1600
1614
`_unspecified_address = IPv4Address('0.0.0.0')
`
`@@ -2086,7 +2100,10 @@ def is_private(self):
`
2086
2100
`ipv4_mapped = self.ipv4_mapped
`
2087
2101
`if ipv4_mapped is not None:
`
2088
2102
`return ipv4_mapped.is_private
`
2089
``
`-
return any(self in net for net in self._constants._private_networks)
`
``
2103
`+
return (
`
``
2104
`+
any(self in net for net in self._constants._private_networks)
`
``
2105
`+
and all(self not in net for net in self._constants._private_networks_exceptions)
`
``
2106
`+
)
`
2090
2107
``
2091
2108
`@property
`
2092
2109
`def is_global(self):
`
`@@ -2342,19 +2359,31 @@ class _IPv6Constants:
`
2342
2359
``
2343
2360
`_multicast_network = IPv6Network('ff00::/8')
`
2344
2361
``
``
2362
`+
Not globally reachable address blocks listed on
`
``
2363
`+
https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
`
2345
2364
`_private_networks = [
`
2346
2365
`IPv6Network('::1/128'),
`
2347
2366
`IPv6Network('::/128'),
`
2348
2367
`IPv6Network('::ffff:0:0/96'),
`
``
2368
`+
IPv6Network('64:ff9b:1::/48'),
`
2349
2369
`IPv6Network('100::/64'),
`
2350
2370
`IPv6Network('2001::/23'),
`
2351
``
`-
IPv6Network('2001:2::/48'),
`
2352
2371
`IPv6Network('2001:db8::/32'),
`
2353
``
`-
IPv6Network('2001:10::/28'),
`
``
2372
`+
IANA says N/A, let's consider it not globally reachable to be safe
`
``
2373
`+
IPv6Network('2002::/16'),
`
2354
2374
`IPv6Network('fc00::/7'),
`
2355
2375
`IPv6Network('fe80::/10'),
`
2356
2376
` ]
`
2357
2377
``
``
2378
`+
_private_networks_exceptions = [
`
``
2379
`+
IPv6Network('2001:1::1/128'),
`
``
2380
`+
IPv6Network('2001:1::2/128'),
`
``
2381
`+
IPv6Network('2001:3::/32'),
`
``
2382
`+
IPv6Network('2001:4:112::/48'),
`
``
2383
`+
IPv6Network('2001:20::/28'),
`
``
2384
`+
IPv6Network('2001:30::/28'),
`
``
2385
`+
]
`
``
2386
+
2358
2387
`_reserved_networks = [
`
2359
2388
`IPv6Network('::/8'), IPv6Network('100::/8'),
`
2360
2389
`IPv6Network('200::/7'), IPv6Network('400::/6'),
`