File 106-basic-auth.diff of Package python-bugzilla
Index: python-bugzilla-2.3.0/bugzilla/base.py
===================================================================
--- python-bugzilla-2.3.0.orig/bugzilla/base.py
+++ python-bugzilla-2.3.0/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
@@ -216,13 +216,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):
@@ -235,7 +238,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
@@ -264,6 +267,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")
@@ -301,6 +305,7 @@ class Bugzilla(object):
self.cookiefile = cookiefile
self.tokenfile = tokenfile
self.configpath = configpaths
+ self._basic_auth = basic_auth
if url:
self.connect(url)
@@ -566,6 +571,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
Index: python-bugzilla-2.3.0/bugzilla/transport.py
===================================================================
--- python-bugzilla-2.3.0.orig/bugzilla/transport.py
+++ python-bugzilla-2.3.0/bugzilla/transport.py
@@ -4,15 +4,18 @@
# 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
# pylint: disable=import-error
if sys.version_info[0] >= 3:
+ PY3 = True
from configparser import ConfigParser
from urllib.parse import urlparse # pylint: disable=no-name-in-module
from xmlrpc.client import Fault, ProtocolError, ServerProxy, Transport
else:
+ PY3 = False
from ConfigParser import SafeConfigParser as ConfigParser
from urlparse import urlparse
from xmlrpclib import Fault, ProtocolError, ServerProxy, Transport
@@ -144,6 +147,19 @@ class _RequestsTransport(Transport):
if cert:
self.session.cert = cert
+ def set_basic_auth(self, user, password):
+ """
+ Set basic authentication method.
+
+ :return:
+ """
+ if PY3:
+ b64str = base64.b64encode("{}:{}".format(user, password).encode("utf-8"))
+ else:
+ b64str = base64.b64encode("{}:{}".format(user, password))
+ authstr = "Basic {}".format(b64str.decode("utf-8"))
+ self.request_defaults["headers"]["Authorization"] = authstr
+
def parse_response(self, response):
"""
Parse XMLRPC response