| Index: gerrit_util.py
|
| diff --git a/gerrit_util.py b/gerrit_util.py
|
| index 691daf9182989a93339e8ed4245b4e8f326713e1..bafd60a178acb0860ffb763237feb7df3208feff 100755
|
| --- a/gerrit_util.py
|
| +++ b/gerrit_util.py
|
| @@ -9,6 +9,7 @@ https://gerrit-review.googlesource.com/Documentation/rest-api.html
|
| """
|
|
|
| import base64
|
| +import cookielib
|
| import httplib
|
| import json
|
| import logging
|
| @@ -91,6 +92,7 @@ class NetrcAuthenticator(Authenticator):
|
|
|
| def __init__(self):
|
| self.netrc = self._get_netrc()
|
| + self.gitcookies = self._get_gitcookies()
|
|
|
| @staticmethod
|
| def _get_netrc():
|
| @@ -114,8 +116,39 @@ class NetrcAuthenticator(Authenticator):
|
| raise
|
| return netrc.netrc(os.devnull)
|
|
|
| + @staticmethod
|
| + def _get_gitcookies():
|
| + gitcookies = {}
|
| + path = os.path.join(os.environ['HOME'], '.gitcookies')
|
| + try:
|
| + f = open(path, 'rb')
|
| + except IOError:
|
| + return gitcookies
|
| +
|
| + with f:
|
| + for line in f:
|
| + try:
|
| + fields = line.strip().split('\t')
|
| + if line.strip().startswith('#') or len(fields) != 7:
|
| + continue
|
| + domain, xpath, key, value = fields[0], fields[2], fields[5], fields[6]
|
| + if xpath == '/' and key == 'o':
|
| + login, secret_token = value.split('=', 1)
|
| + gitcookies[domain] = (login, secret_token)
|
| + except (IndexError, ValueError, TypeError) as exc:
|
| + logging.warning(exc)
|
| +
|
| + return gitcookies
|
| +
|
| def get_auth_header(self, host):
|
| - auth = self.netrc.authenticators(host)
|
| + auth = None
|
| + for domain, creds in self.gitcookies.iteritems():
|
| + if cookielib.domain_match(host, domain):
|
| + auth = (creds[0], None, creds[1])
|
| + break
|
| +
|
| + if not auth:
|
| + auth = self.netrc.authenticators(host)
|
| if auth:
|
| return 'Basic %s' % (base64.b64encode('%s:%s' % (auth[0], auth[2])))
|
| return None
|
|
|