Hello community, here is the log from the commit of package python-bugzilla for openSUSE:Factory checked in at 2019-10-17 12:22:23 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-bugzilla (Old) and /work/SRC/openSUSE:Factory/.python-bugzilla.new.2352 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-bugzilla" Thu Oct 17 12:22:23 2019 rev:28 rq:738899 version:2.3.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-bugzilla/python-bugzilla.changes 2019-09-18 13:10:42.404699152 +0200 +++ /work/SRC/openSUSE:Factory/.python-bugzilla.new.2352/python-bugzilla.changes 2019-10-17 12:22:30.743138708 +0200 @@ -1,0 +2,8 @@ +Wed Oct 16 12:51:01 UTC 2019 - Julio González Gil <jgonza...@suse.com> + +- Backport from upstream: HTTP Basic authentication feature (as used + by SUSE and openSUSE) (bsc#1098219) +- Add: + * 106-basic-auth.diff + +------------------------------------------------------------------- New: ---- 106-basic-auth.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-bugzilla.spec ++++++ --- /var/tmp/diff_new_pack.B9DcYn/_old 2019-10-17 12:22:31.319137263 +0200 +++ /var/tmp/diff_new_pack.B9DcYn/_new 2019-10-17 12:22:31.323137253 +0200 @@ -26,6 +26,7 @@ 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 @@ %prep %setup -q +%patch0 -p1 sed -i -e '1{/^#!\/usr\/bin\/env python/d}' bugzilla/_cli.py %build ++++++ 106-basic-auth.diff ++++++ --- 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