Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-furl for openSUSE:Factory checked in at 2023-07-06 18:27:48 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-furl (Old) and /work/SRC/openSUSE:Factory/.python-furl.new.23466 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-furl" Thu Jul 6 18:27:48 2023 rev:10 rq:1096865 version:2.1.3 Changes: -------- --- /work/SRC/openSUSE:Factory/python-furl/python-furl.changes 2023-04-28 16:22:16.481627221 +0200 +++ /work/SRC/openSUSE:Factory/.python-furl.new.23466/python-furl.changes 2023-07-06 18:27:49.746834939 +0200 @@ -1,0 +2,6 @@ +Tue Jul 4 22:28:07 UTC 2023 - Matej Cepl <mc...@suse.com> + +- Add 165-use-ipaddress-library.patch to use standard ipaddress + library to parse IP addresses (gh#gruns/furl#164). + +------------------------------------------------------------------- New: ---- 165-use-ipaddress-library.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-furl.spec ++++++ --- /var/tmp/diff_new_pack.IGC1x9/_old 2023-07-06 18:27:51.030842822 +0200 +++ /var/tmp/diff_new_pack.IGC1x9/_new 2023-07-06 18:27:51.038842871 +0200 @@ -16,9 +16,8 @@ # -%{?!python_module:%define python_module() python-%{**} python3-%{**}} -%define skip_python2 1 %{?sle15_python_module_pythons} +%define skip_python2 1 Name: python-furl Version: 2.1.3 Release: 0 @@ -27,7 +26,11 @@ Group: Development/Languages/Python URL: https://github.com/gruns/furl Source: https://files.pythonhosted.org/packages/source/f/furl/furl-%{version}.tar.gz -BuildRequires: %{python_module setuptools} +# PATCH-FIX-UPSTREAM 165-use-ipaddress-library.patch gh#gruns/furl#164 mc...@suse.com +# use ipaddress to parse IP addresses +Patch0: 165-use-ipaddress-library.patch +BuildRequires: %{python_module pip} +BuildRequires: %{python_module wheel} BuildRequires: fdupes BuildRequires: python-rpm-macros Requires: python-orderedmultidict >= 1.0.1 @@ -48,10 +51,10 @@ chmod -x *.md furl.egg-info/* %build -%python_build +%pyproject_wheel %install -%python_install +%pyproject_install %python_expand %fdupes %{buildroot}%{$python_sitelib} %check ++++++ 165-use-ipaddress-library.patch ++++++ >From 38587f3dca7e2f75b04cb0d80e4fc30ea6e139dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89loi=20Rivard?= <eloi.riv...@aquilenet.fr> Date: Sat, 24 Sep 2022 15:40:59 +0200 Subject: [PATCH] Use ipaddress to detect valid and invalid IPs --- furl/furl.py | 47 +++++++++++++++++++++++++++++++++++++--------- setup.py | 1 + tests/test_furl.py | 21 +++++++++++---------- 3 files changed, 50 insertions(+), 19 deletions(-) diff --git a/furl/furl.py b/furl/furl.py index cd6d710..451767f 100644 --- a/furl/furl.py +++ b/furl/furl.py @@ -12,6 +12,7 @@ import re import abc +import ipaddress import warnings from copy import deepcopy from posixpath import normpath @@ -241,6 +242,37 @@ def is_valid_host(hostname): return '' not in toks # Adjacent periods aren't allowed. +def is_valid_ipv4(ip): + if isinstance(ip, six.binary_type): + ip = ip.decode() + + try: + ipaddress.IPv4Address(ip) + return True + except ValueError: + return False + + +def is_valid_ipv6(ip): + if isinstance(ip, six.binary_type): + ip = ip.decode() + + # ipaddress handle IPs without brackets + if ( + callable_attr(ip, 'startswith') + and callable_attr(ip, 'endswith') + and ip.startswith("[") + and ip.endswith("]") + ): + ip = ip[1:-1] + + try: + ipaddress.IPv6Address(ip) + return True + except ValueError: + return False + + def get_scheme(url): if url.startswith(':'): return '' @@ -1434,15 +1466,12 @@ def host(self, host): """ Raises: ValueError on invalid host or malformed IPv6 address. """ - # Invalid IPv6 literal. - urllib.parse.urlsplit('http://%s/' % host) # Raises ValueError. - - # Invalid host string. - resembles_ipv6_literal = ( - host is not None and lget(host, 0) == '[' and ':' in host and - lget(host, -1) == ']') - if (host is not None and not resembles_ipv6_literal and - not is_valid_host(host)): + if ( + host + and not is_valid_host(host) + and not is_valid_ipv4(host) + and not is_valid_ipv6(host) + ): errmsg = ( "Invalid host '%s'. Host strings must have at least one " "non-period character, can't contain any of '%s', and can't " diff --git a/setup.py b/setup.py index 8322619..887ca2e 100644 --- a/setup.py +++ b/setup.py @@ -114,6 +114,7 @@ def run_tests(self): install_requires=[ 'six>=1.8.0', 'orderedmultidict>=1.0.1', + 'ipaddress>=1.0.23; python_version < "3.3"', ], cmdclass={ 'test': RunTests, diff --git a/tests/test_furl.py b/tests/test_furl.py index bc268c8..5666be7 100644 --- a/tests/test_furl.py +++ b/tests/test_furl.py @@ -1655,10 +1655,10 @@ def test_hosts(self): # addresses. f = furl.furl('http://1.2.3.4.5.6/') - # Invalid, but well-formed, IPv6 addresses shouldn't raise an - # exception because urlparse.urlsplit() doesn't raise an - # exception on invalid IPv6 addresses. - furl.furl('http://[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]/') + # Invalid, but well-formed, IPv6 addresses should raise an + # exception. + with self.assertRaises(ValueError): + furl.furl('http://[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]/') # Malformed IPv6 should raise an exception because urlparse.urlsplit() # raises an exception on malformed IPv6 addresses. @@ -1684,12 +1684,17 @@ def test_netloc(self): assert f.host == '1.2.3.4.5.6' assert f.port == 999 - netloc = '[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]:888' + netloc = '[1:2:3:4:5:6:7:8]:888' f.netloc = netloc assert f.netloc == netloc - assert f.host == '[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]' + assert f.host == '[1:2:3:4:5:6:7:8]' assert f.port == 888 + # Well-formed but invalid IPv6 should raise an exception + netloc = '[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]:888' + with self.assertRaises(ValueError): + f.netloc = netloc + # Malformed IPv6 should raise an exception because # urlparse.urlsplit() raises an exception with self.assertRaises(ValueError): @@ -1703,10 +1708,6 @@ def test_netloc(self): with self.assertRaises(ValueError): f.netloc = 'pump2pump.org:777777777777' - # No side effects. - assert f.host == '[0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999]' - assert f.port == 888 - # Empty netloc. f = furl.furl('//') assert f.scheme is None and f.netloc == '' and f.url == '//'