From d03f907888ccdb6d1d0b0ce459f7ee9132ad57033756a65d2a64f34bd2c61c92 Mon Sep 17 00:00:00 2001 From: Matej Cepl Date: Tue, 4 Jul 2023 22:28:39 +0000 Subject: [PATCH] - Add 165-use-ipaddress-library.patch to use standard ipaddress library to parse IP addresses (gh#gruns/furl#164). OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-furl?expand=0&rev=20 --- 165-use-ipaddress-library.patch | 145 ++++++++++++++++++++++++++++++++ python-furl.changes | 6 ++ python-furl.spec | 13 +-- 3 files changed, 159 insertions(+), 5 deletions(-) create mode 100644 165-use-ipaddress-library.patch diff --git a/165-use-ipaddress-library.patch b/165-use-ipaddress-library.patch new file mode 100644 index 0000000..40e9f45 --- /dev/null +++ b/165-use-ipaddress-library.patch @@ -0,0 +1,145 @@ +From 38587f3dca7e2f75b04cb0d80e4fc30ea6e139dc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?=C3=89loi=20Rivard?= +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 == '//' diff --git a/python-furl.changes b/python-furl.changes index 822675a..e2dcd46 100644 --- a/python-furl.changes +++ b/python-furl.changes @@ -1,3 +1,9 @@ +------------------------------------------------------------------- +Tue Jul 4 22:28:07 UTC 2023 - Matej Cepl + +- Add 165-use-ipaddress-library.patch to use standard ipaddress + library to parse IP addresses (gh#gruns/furl#164). + ------------------------------------------------------------------- Fri Apr 21 12:24:55 UTC 2023 - Dirk Müller diff --git a/python-furl.spec b/python-furl.spec index b637dc5..e731c16 100644 --- a/python-furl.spec +++ b/python-furl.spec @@ -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 @@ License: Unlicense 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 mcepl@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 @@ furl is a Python library for parsing and manipulating URLs. chmod -x *.md furl.egg-info/* %build -%python_build +%pyproject_wheel %install -%python_install +%pyproject_install %python_expand %fdupes %{buildroot}%{$python_sitelib} %check