diff --git a/106-basic-auth.diff b/106-basic-auth.diff new file mode 100644 index 0000000..b1ddac9 --- /dev/null +++ b/106-basic-auth.diff @@ -0,0 +1,104 @@ +--- a/bugzilla/base.py ++++ b/bugzilla/base.py +@@ -24,13 +24,13 @@ if sys.version_info[0] >= 3: + from collections.abc import Mapping + from configparser import ConfigParser + from http.cookiejar import LoadError, MozillaCookieJar +- from urllib.parse import urlparse, parse_qsl ++ from urllib.parse import urlparse, urlunparse, parse_qsl + from xmlrpc.client import Binary, Fault + else: + from collections import Mapping + from ConfigParser import SafeConfigParser as ConfigParser + from cookielib import LoadError, MozillaCookieJar +- from urlparse import urlparse, parse_qsl ++ from urlparse import urlparse, urlunparse, parse_qsl + from xmlrpclib import Binary, Fault + # pylint: enable=import-error + +@@ -215,13 +215,16 @@ class Bugzilla(object): + """ + Turn passed url into a bugzilla XMLRPC web url + """ +- if '://' not in url: ++ scheme, netloc, path, params, query, fragment = urlparse(url) ++ if not scheme: + log.debug('No scheme given for url, assuming https') +- url = 'https://' + url +- if url.count('/') < 3: ++ scheme = 'https' ++ ++ if not path: + log.debug('No path given for url, assuming /xmlrpc.cgi') +- url = url + '/xmlrpc.cgi' +- return url ++ path = 'xmlrpc.cgi' ++ ++ return urlunparse((scheme, netloc, path, params, query, fragment)) + + @staticmethod + def _listify(val): +@@ -234,7 +237,7 @@ class Bugzilla(object): + + def __init__(self, url=-1, user=None, password=None, cookiefile=-1, + sslverify=True, tokenfile=-1, use_creds=True, api_key=None, +- cert=None, configpaths=-1): ++ cert=None, configpaths=-1, basic_auth=False): + """ + :param url: The bugzilla instance URL, which we will connect + to immediately. Most users will want to specify this at +@@ -263,6 +266,7 @@ class Bugzilla(object): + to file or directory for custom certs. + :param api_key: A bugzilla5+ API key + :param configpaths: A list of possible bugzillarc locations. ++ :param basic_auth: Use headers with HTTP Basic authentication + """ + if url == -1: + raise TypeError("Specify a valid bugzilla url, or pass url=None") +@@ -300,6 +304,7 @@ class Bugzilla(object): + self.cookiefile = cookiefile + self.tokenfile = tokenfile + self.configpath = configpaths ++ self._basic_auth = basic_auth + + if url: + self.connect(url) +@@ -564,6 +569,9 @@ class Bugzilla(object): + """ + Backend login method for Bugzilla3 + """ ++ if self._basic_auth: ++ self._transport.set_basic_auth(user, password) ++ + payload = {'login': user, 'password': password} + if restrict_login: + payload['restrict_login'] = True +diff --git a/bugzilla/transport.py b/bugzilla/transport.py +index 12422bb..d750202 100644 +--- a/bugzilla/transport.py ++++ b/bugzilla/transport.py +@@ -4,6 +4,7 @@ + # option) any later version. See http://www.gnu.org/copyleft/gpl.html for + # the full text of the license. + ++import base64 + from logging import getLogger + import sys + +@@ -143,6 +144,16 @@ class _RequestsTransport(Transport): + if cert: + self.session.cert = cert + ++ def set_basic_auth(self, user, password): ++ """ ++ Set basic authentication method. ++ ++ :return: ++ """ ++ b64str = str(base64.b64encode("{}:{}".format(user, password))) ++ authstr = "Basic {}".format(b64str.encode("utf-8").decode("utf-8")) ++ self.request_defaults["headers"]["Authorization"] = authstr ++ + def parse_response(self, response): + """ + Parse XMLRPC response diff --git a/python-bugzilla.changes b/python-bugzilla.changes index 9e58cd2..ffb502e 100644 --- a/python-bugzilla.changes +++ b/python-bugzilla.changes @@ -1,3 +1,11 @@ +------------------------------------------------------------------- +Wed Oct 16 12:51:01 UTC 2019 - Julio González Gil + +- Backport from upstream: HTTP Basic authentication feature (as used + by SUSE and openSUSE) (bsc#1098219) +- Add: + * 106-basic-auth.diff + ------------------------------------------------------------------- Sun Sep 15 13:41:23 UTC 2019 - John Vandenberg diff --git a/python-bugzilla.spec b/python-bugzilla.spec index 3a9d9ec..a24fafb 100644 --- a/python-bugzilla.spec +++ b/python-bugzilla.spec @@ -26,6 +26,7 @@ License: GPL-2.0-or-later Group: Development/Libraries/Python URL: https://github.com/python-bugzilla/python-bugzilla Source: https://files.pythonhosted.org/packages/source/p/python-bugzilla/python-bugzilla-%{version}.tar.gz +Patch0: 106-basic-auth.diff BuildRequires: %{python_module pytest} BuildRequires: %{python_module requests} BuildRequires: %{python_module setuptools} @@ -49,6 +50,7 @@ ad-hoc bugzilla jiggery-pokery. %prep %setup -q +%patch0 -p1 sed -i -e '1{/^#!\/usr\/bin\/env python/d}' bugzilla/_cli.py %build