From d39c471b188ad1302f0ef6c5f7eac4c6e0d1b742 Mon Sep 17 00:00:00 2001 From: Daniel Kimsey Date: Tue, 2 Jul 2013 15:05:18 -0400 Subject: [PATCH 1/8] Use PRIVATE-TOKEN header for passing the auth token --- gitlab.py | 55 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/gitlab.py b/gitlab.py index 71771781a..c5a5aa628 100644 --- a/gitlab.py +++ b/gitlab.py @@ -135,11 +135,11 @@ def setCredentials(self, email, password): def rawGet(self, path, with_token=False): url = '%s%s' % (self._url, path) - if with_token: - url += "?private_token=%s" % self.private_token - try: - r = requests.get(url) + if with_token: + r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token}) + else: + r = requests.get(url) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -158,11 +158,12 @@ def rawPost(self, path, data): def rawPut(self, path, with_token=False): url = '%s%s' % (self._url, path) - if with_token: - url += "?private_token=%s" % self.private_token try: - r = requests.put(url) + if with_token: + r = requests.put(url, headers={"PRIVATE-TOKEN": self.private_token}) + else: + r = requests.put(url) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -181,13 +182,13 @@ def list(self, obj_class, **kwargs): url = obj_class._url if kwargs: url = obj_class._url % kwargs - url = '%s%s?private_token=%s' % (self._url, url, self.private_token) + url = '%s%s' % (self._url, url) if kwargs: url += "&%s" % ("&".join( ["%s=%s" % (k, v) for k, v in kwargs.items()])) try: - r = requests.get(url) + r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token}) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -223,17 +224,17 @@ def get(self, obj_class, id=None, **kwargs): url = obj_class._url % kwargs if id is not None: try: - url = '%s%s/%d?private_token=%s' % \ - (self._url, url, id, self.private_token) + url = '%s%s/%d' % \ + (self._url, url, id) except TypeError: # id might be a str (ProjectBranch) - url = '%s%s/%s?private_token=%s' % \ - (self._url, url, id, self.private_token) + url = '%s%s/%s' % \ + (self._url, url, id) else: - url = '%s%s?private_token=%s' % \ - (self._url, url, self.private_token) + url = '%s%s' % \ + (self._url, url) try: - r = requests.get(url) + r = requests.get(url, headers={"PRIVATE-TOKEN": self.private_token}) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -249,11 +250,11 @@ def get(self, obj_class, id=None, **kwargs): def delete(self, obj): url = obj._url % obj.__dict__ - url = '%s%s/%d?private_token=%s' % \ - (self._url, url, obj.id, self.private_token) + url = '%s%s/%d' % \ + (self._url, url, obj.id) try: - r = requests.delete(url) + r = requests.delete(url, headers={"PRIVATE-TOKEN": self.private_token}) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -276,7 +277,7 @@ def create(self, obj): ", ".join(missing)) url = obj._url % obj.__dict__ - url = '%s%s?private_token=%s' % (self._url, url, self.private_token) + url = '%s%s' % (self._url, url) print url print obj.__dict__ @@ -284,7 +285,7 @@ def create(self, obj): try: # TODO: avoid too much work on the server side by filtering the # __dict__ keys - r = requests.post(url, obj.__dict__) + r = requests.post(url, obj.__dict__, headers={"PRIVATE-TOKEN": self.private_token}) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -298,8 +299,8 @@ def create(self, obj): def update(self, obj): url = obj._url % obj.__dict__ - url = '%s%s/%d?private_token=%s' % \ - (self._url, url, obj.id, self.private_token) + url = '%s%s/%d' % \ + (self._url, url, obj.id) # build a dict of data that can really be sent to server d = {} @@ -308,7 +309,7 @@ def update(self, obj): d[k] = str(v) try: - r = requests.put(url, d) + r = requests.put(url, d, headers={"PRIVATE-TOKEN": self.private_token}) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -576,9 +577,9 @@ class Group(GitlabObject): shortPrintAttr = 'name' def transfer_project(self, id): - url = '/groups/%d/projects/%d?private_token=%s' % \ - (self.id, id, self.gitlab.private_token) - r = self.gitlab.rawPost(url, None) + url = '/groups/%d/projects/%d' % \ + (self.id, id) + r = self.gitlab.rawPost(url, None, headers={"PRIVATE-TOKEN": self.gitlab.private_token}) if r.status_code != 201: raise GitlabTransferProjectError() From 5090ef4f8d3c83fdcb6edf51663cfed593ee8ba4 Mon Sep 17 00:00:00 2001 From: Erik Weatherwax Date: Wed, 14 Aug 2013 18:15:36 -0400 Subject: [PATCH 2/8] Correct url for merge requests API. --- gitlab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitlab.py b/gitlab.py index 106e9ff84..6f016fcad 100644 --- a/gitlab.py +++ b/gitlab.py @@ -737,7 +737,7 @@ class ProjectMergeRequestNote(GitlabObject): class ProjectMergeRequest(GitlabObject): - _url = '/projects/%(project_id)s/merge_request' + _url = '/projects/%(project_id)s/merge_requests' _constructorTypes = {'author': 'User', 'assignee': 'User'} canDelete = False requiredListAttrs = ['project_id'] From 309f1fe0fbaca19a400ed521a27362adad89b4d5 Mon Sep 17 00:00:00 2001 From: Andrew Austin Date: Mon, 26 Aug 2013 03:47:19 +0000 Subject: [PATCH 3/8] Add ssl_verify option to Gitlab object. Defauls to True --- gitlab.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/gitlab.py b/gitlab.py index 6f016fcad..3901eafd8 100644 --- a/gitlab.py +++ b/gitlab.py @@ -74,7 +74,7 @@ class GitlabAuthenticationError(Exception): class Gitlab(object): """Represents a GitLab server connection""" - def __init__(self, url, private_token=None, email=None, password=None): + def __init__(self, url, private_token=None, email=None, password=None, ssl_verify=True): """Stores informations about the server url: the URL of the Gitlab server @@ -86,6 +86,7 @@ def __init__(self, url, private_token=None, email=None, password=None): self.private_token = private_token self.email = email self.password = password + self.ssl_verify = ssl_verify def auth(self): """Performs an authentication using either the private token, or the @@ -139,7 +140,7 @@ def rawGet(self, path, with_token=False): url += "?private_token=%s" % self.private_token try: - r = requests.get(url) + r = requests.get(url, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -149,7 +150,7 @@ def rawGet(self, path, with_token=False): def rawPost(self, path, data): url = '%s%s' % (self._url, path) try: - r = requests.post(url, data) + r = requests.post(url, data, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -162,7 +163,7 @@ def rawPut(self, path, with_token=False): url += "?private_token=%s" % self.private_token try: - r = requests.put(url) + r = requests.put(url, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -187,7 +188,7 @@ def list(self, obj_class, **kwargs): ["%s=%s" % (k, v) for k, v in kwargs.items()])) try: - r = requests.get(url) + r = requests.get(url, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -233,7 +234,7 @@ def get(self, obj_class, id=None, **kwargs): (self._url, url, self.private_token) try: - r = requests.get(url) + r = requests.get(url, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -253,7 +254,7 @@ def delete(self, obj): (self._url, url, obj.id, self.private_token) try: - r = requests.delete(url) + r = requests.delete(url, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -281,7 +282,7 @@ def create(self, obj): try: # TODO: avoid too much work on the server side by filtering the # __dict__ keys - r = requests.post(url, obj.__dict__) + r = requests.post(url, obj.__dict__, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) @@ -305,7 +306,7 @@ def update(self, obj): d[k] = str(v) try: - r = requests.put(url, d) + r = requests.put(url, d, verify=self.ssl_verify) except: raise GitlabConnectionError( "Can't connect to GitLab server (%s)" % self._url) From 147a569598e0151d69a662ee7b60ce2870f49e9e Mon Sep 17 00:00:00 2001 From: Gauvain Pocentek Date: Mon, 26 Aug 2013 09:53:09 +0200 Subject: [PATCH 4/8] cli: support ssl_verify config option --- README.md | 5 +++++ gitlab | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e12ff11a2..a23517212 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ Here's an example of the syntax: ````` [global] default = local +ssl_verify = true [local] url = http://10.0.3.2:8080 @@ -77,12 +78,16 @@ private_token = vTbFeqJYCY3sibBP7BZM [distant] url = https://some.whe.re private_token = thisisaprivatetoken +ssl_verify = false ````` The [global] section define which server is accesed by default. Each other section defines how to access a server. Only private token authentication is supported (not user/password). +The `ssl_verify` option defines if the server SSL certificate should be +validated (use false for self signed certificates, only useful with https). + Choosing a different server than the default one can be done at run time: ````` diff --git a/gitlab b/gitlab index 7365003e5..370cef170 100755 --- a/gitlab +++ b/gitlab @@ -126,7 +126,7 @@ def usage(): def do_auth(): try: - gl = gitlab.Gitlab(gitlab_url, private_token=gitlab_token) + gl = gitlab.Gitlab(gitlab_url, private_token=gitlab_token, ssl_verify=ssl_verify) gl.auth() except: die("Could not connect to GitLab (%s)" % gitlab_url) @@ -204,6 +204,7 @@ def do_update(cls, d): return o +ssl_verify = True gitlab_id = None verbose = False @@ -272,6 +273,15 @@ try: except: die("Impossible to get gitlab informations from configuration (%s)" % gitlab_id) +try: + ssl_verify = config.getboolean('global', 'ssl_verify') +except: + pass +try: + ssl_verify = config.getboolean(gitlab_id, 'ssl_verify') +except: + pass + try: what = args.pop(0) action = args.pop(0) From 7c85fb7e865a648b49494add224f286e2343e9ff Mon Sep 17 00:00:00 2001 From: Gauvain Pocentek Date: Mon, 26 Aug 2013 09:57:26 +0200 Subject: [PATCH 5/8] provide a AUTHORS file --- AUTHORS | 11 +++++++++++ MANIFEST.in | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 AUTHORS diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 000000000..635ddd8d0 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,11 @@ +Author +------ + +Gauvain Pocentek + +Contributors +------------ + +Daniel Kimsey +Erik Weatherwax +Andrew Austin diff --git a/MANIFEST.in b/MANIFEST.in index b0befc4ce..f50cd784d 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1 @@ -include README.md COPYING +include README.md COPYING AUTHORS From 2d5342b54f723f621ada53acdfc5ff5d8b1b8b8b Mon Sep 17 00:00:00 2001 From: Gauvain Pocentek Date: Mon, 26 Aug 2013 10:16:47 +0200 Subject: [PATCH 6/8] provide a ChangeLog --- ChangeLog | 15 +++++++++++++++ MANIFEST.in | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 ChangeLog diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 000000000..9330c1ec5 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,15 @@ +Version 0.3 + + * provide a AUTHORS file + * cli: support ssl_verify config option + * Add ssl_verify option to Gitlab object. Defauls to True + * Correct url for merge requests API. + +Version 0.2 + + * provide a pip requirements.txt + * drop some debug statements + +Version 0.1 + + * Initial release diff --git a/MANIFEST.in b/MANIFEST.in index f50cd784d..3814b6fa6 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +1 @@ -include README.md COPYING AUTHORS +include README.md COPYING AUTHORS ChangeLog From b73c92dd022d6133c04fe98da68423ec5ae16e21 Mon Sep 17 00:00:00 2001 From: Gauvain Pocentek Date: Tue, 27 Aug 2013 16:07:03 +0200 Subject: [PATCH 7/8] doc updates --- README.md | 7 ++++++- setup.py | 11 ++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a23517212..bee94e823 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,12 @@ python-gitlab depends on: ## State -python-gitlab is a work in progress, although already usable. Changes in the API might happen. +python-gitlab >= 0.3 is considered stable. + +## Bugs reports + +Please report bugs and feature requests at +https://github.com/gpocentek/python-gitlab/issues ## ToDo diff --git a/setup.py b/setup.py index 82fe24e50..4783ffe82 100644 --- a/setup.py +++ b/setup.py @@ -21,5 +21,14 @@ def get_version(): license='LGPLv3', url='https://github.com/gpocentek/python-gitlab', py_modules=['gitlab'], - scripts=['gitlab'] + scripts=['gitlab'], + classifiers=[ + 'Development Status :: 5 - Production/Stable', + 'Environment :: Console', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'Natural Language :: English', + 'Operating System :: POSIX', + 'Operating System :: Microsoft :: Windows' + ] ) From ceda87a6cac2558caeecd9c7bc96c2a08cb36cf9 Mon Sep 17 00:00:00 2001 From: Gauvain Pocentek Date: Tue, 27 Aug 2013 16:08:28 +0200 Subject: [PATCH 8/8] version bump --- gitlab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gitlab.py b/gitlab.py index 3fd057bc8..22e5a3b26 100644 --- a/gitlab.py +++ b/gitlab.py @@ -20,7 +20,7 @@ import requests __title__ = 'python-gitlab' -__version__ = '0.2' +__version__ = '0.3' __author__ = 'Gauvain Pocentek' __email__ = 'gauvain@pocentek.net' __license__ = 'LGPL3'