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

Reply via email to