mirror of
https://github.com/python/cpython.git
synced 2025-08-02 08:02:56 +00:00
[3.11] gh-103848: Adds checks to ensure that bracketed hosts found by urlsplit are of IPv6 or IPvFuture format (GH-103849) (#104349)
gh-103848: Adds checks to ensure that bracketed hosts found by urlsplit are of IPv6 or IPvFuture format (GH-103849)
* Adds checks to ensure that bracketed hosts found by urlsplit are of IPv6 or IPvFuture format
---------
(cherry picked from commit 29f348e232
)
Co-authored-by: JohnJamesUtley <81572567+JohnJamesUtley@users.noreply.github.com>
Co-authored-by: Gregory P. Smith <greg@krypto.org>
This commit is contained in:
parent
2fa14d47af
commit
b2171a2fd4
3 changed files with 43 additions and 1 deletions
|
@ -33,6 +33,7 @@ import re
|
|||
import sys
|
||||
import types
|
||||
import warnings
|
||||
import ipaddress
|
||||
|
||||
__all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag",
|
||||
"urlsplit", "urlunsplit", "urlencode", "parse_qs",
|
||||
|
@ -427,6 +428,17 @@ def _checknetloc(netloc):
|
|||
raise ValueError("netloc '" + netloc + "' contains invalid " +
|
||||
"characters under NFKC normalization")
|
||||
|
||||
# Valid bracketed hosts are defined in
|
||||
# https://www.rfc-editor.org/rfc/rfc3986#page-49 and https://url.spec.whatwg.org/
|
||||
def _check_bracketed_host(hostname):
|
||||
if hostname.startswith('v'):
|
||||
if not re.match(r"\Av[a-fA-F0-9]+\..+\Z", hostname):
|
||||
raise ValueError(f"IPvFuture address is invalid")
|
||||
else:
|
||||
ip = ipaddress.ip_address(hostname) # Throws Value Error if not IPv6 or IPv4
|
||||
if isinstance(ip, ipaddress.IPv4Address):
|
||||
raise ValueError(f"An IPv4 address cannot be in brackets")
|
||||
|
||||
# typed=True avoids BytesWarnings being emitted during cache key
|
||||
# comparison since this API supports both bytes and str input.
|
||||
@functools.lru_cache(typed=True)
|
||||
|
@ -466,12 +478,14 @@ def urlsplit(url, scheme='', allow_fragments=True):
|
|||
break
|
||||
else:
|
||||
scheme, url = url[:i].lower(), url[i+1:]
|
||||
|
||||
if url[:2] == '//':
|
||||
netloc, url = _splitnetloc(url, 2)
|
||||
if (('[' in netloc and ']' not in netloc) or
|
||||
(']' in netloc and '[' not in netloc)):
|
||||
raise ValueError("Invalid IPv6 URL")
|
||||
if '[' in netloc and ']' in netloc:
|
||||
bracketed_host = netloc.partition('[')[2].partition(']')[0]
|
||||
_check_bracketed_host(bracketed_host)
|
||||
if allow_fragments and '#' in url:
|
||||
url, fragment = url.split('#', 1)
|
||||
if '?' in url:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue