summaryrefslogtreecommitdiff
path: root/pygerrit
diff options
context:
space:
mode:
Diffstat (limited to 'pygerrit')
-rw-r--r--pygerrit/rest/__init__.py49
-rw-r--r--pygerrit/rest/auth.py60
2 files changed, 74 insertions, 35 deletions
diff --git a/pygerrit/rest/__init__.py b/pygerrit/rest/__init__.py
index 0d24794..99364e1 100644
--- a/pygerrit/rest/__init__.py
+++ b/pygerrit/rest/__init__.py
@@ -23,36 +23,13 @@
""" Interface to the Gerrit REST API. """
import json
+import logging
import requests
GERRIT_MAGIC_JSON_PREFIX = ")]}\'\n"
GERRIT_AUTH_SUFFIX = "/a"
-class GerritRestAPIAuthentication(requests.auth.HTTPDigestAuth):
-
- """ HTTP Digest Auth with netrc credentials. """
-
- def __init__(self, url, username=None, password=None):
- self.username = username
- self.password = password
- if not self.has_credentials():
- (self.username, self.password) = \
- requests.utils.get_netrc_auth(url)
- if self.has_credentials():
- super(GerritRestAPIAuthentication, self).__init__(self.username,
- self.password)
-
- def __call__(self, req):
- if (self.username and self.password):
- req = super(GerritRestAPIAuthentication, self).__call__(req)
- return req
-
- def has_credentials(self):
- """ Return True if authentication credentials are present. """
- return (self.username is not None and self.password is not None)
-
-
class GerritRestAPIError(Exception):
""" Raised when an error occurs during Gerrit REST API access. """
@@ -97,33 +74,35 @@ class GerritRestAPI(object):
""" Interface to the Gerrit REST API. """
- def __init__(self, url, username=None, password=None):
+ def __init__(self, url, auth=None):
""" Constructor.
`url` is assumed to be the full URL to the server, including the
'http(s)://' prefix.
- HTTP digest authentication is used with the given `username` and
- `password`. If both are not given, an attempt is made to get them
- from the netrc file. If that fails, anonymous access is used and
- functionality is limited.
+ If `auth` is specified, it must be a derivation of the `AuthBase`
+ class from the `requests` module. The `url` will be adjusted if
+ necessary to make sure it includes Gerrit's authentication suffix.
"""
- self.kwargs = {}
- self.url = url
+ self.kwargs = {'auth': auth}
+ self.url = url.rstrip('/')
self.session = requests.session()
- self.url = url.rstrip('/')
- auth = GerritRestAPIAuthentication(url, username, password)
- if auth.has_credentials():
- self.kwargs['auth'] = auth
+ if auth:
+ if not isinstance(auth, requests.auth.AuthBase):
+ raise GerritRestAPIError('Invalid auth type; must be derived '
+ 'from requests.auth.AuthBase')
+
if not self.url.endswith(GERRIT_AUTH_SUFFIX):
self.url += GERRIT_AUTH_SUFFIX
else:
if self.url.endswith(GERRIT_AUTH_SUFFIX):
self.url = self.url[: - len(GERRIT_AUTH_SUFFIX)]
+
if not self.url.endswith('/'):
self.url += '/'
+ logging.debug("url %s", self.url)
def make_url(self, endpoint):
""" Make the necessary url from `endpoint`.
diff --git a/pygerrit/rest/auth.py b/pygerrit/rest/auth.py
new file mode 100644
index 0000000..01147af
--- /dev/null
+++ b/pygerrit/rest/auth.py
@@ -0,0 +1,60 @@
+# The MIT License
+#
+# Copyright 2013 Sony Mobile Communications. All rights reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+""" Authentication classes. """
+
+from requests.auth import HTTPDigestAuth, HTTPBasicAuth
+from requests.utils import get_netrc_auth
+
+from . import GerritRestAPIError
+
+
+class HTTPDigestAuthFromNetrc(HTTPDigestAuth):
+
+ """ HTTP Digest Auth with netrc credentials. """
+
+ def __init__(self, url):
+ auth = get_netrc_auth(url)
+ if not auth:
+ raise GerritRestAPIError("netrc missing or no credentials found "
+ "in netrc")
+ username, password = auth
+ super(HTTPDigestAuthFromNetrc, self).__init__(username, password)
+
+ def __call__(self, req):
+ return super(HTTPDigestAuthFromNetrc, self).__call__(req)
+
+
+class HTTPBasicAuthFromNetrc(HTTPBasicAuth):
+
+ """ HTTP Basic Auth with netrc credentials. """
+
+ def __init__(self, url):
+ auth = get_netrc_auth(url)
+ if not auth:
+ raise GerritRestAPIError("netrc missing or no credentials found "
+ "in netrc")
+ username, password = auth
+ super(HTTPBasicAuthFromNetrc, self).__init__(username, password)
+
+ def __call__(self, req):
+ return super(HTTPBasicAuthFromNetrc, self).__call__(req)