GH-113171: Fix "private" (non-global) IP address ranges (GH-113179) · ActiveState/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'),

`