[python-bugzilla] [PATCH] Add support for Bugzilla Tokens
Don Zickus
dzickus at redhat.com
Wed Apr 23 19:07:41 UTC 2014
On Thu, Apr 24, 2014 at 04:30:15AM +1000, abn at redhat.com wrote:
> From: Arun Babu Neelicattu <abn at redhat.com>
>
> - if login provides a token, reuse it for all subsequent requests sent
> to that domain
> - changes are transparent to user
> - persist tokens in ~/.bugzillatoken
> - ensure test cases are aware of tokens
Thanks for the patch. I can't seem to make this work for some reason. I
am using a bz that I can see on redhat.com but is not visible to me using
our internal RH staging server partner-bugzilla. Not sure what is going
wrong. Thoughts?
Cheers,
Don
> ---
> bugzilla/base.py | 60 +++++++++++++++++++++++++++++++++++++++++++++++++-
> tests/rw_functional.py | 16 ++++++++++----
> 2 files changed, 71 insertions(+), 5 deletions(-)
>
> diff --git a/bugzilla/base.py b/bugzilla/base.py
> index f69abd5..a1cc239 100644
> --- a/bugzilla/base.py
> +++ b/bugzilla/base.py
> @@ -105,6 +105,64 @@ def _build_cookiejar(cookiefile):
> return retcj
>
>
> +class BugzillaToken(object):
> +
> + def __init__(self, uri, tokenfile=None):
> + self.tokenfilename = tokenfile if tokenfile is not None else \
> + os.path.expanduser('~/.bugzillatoken')
> + self.tokenfile = SafeConfigParser()
> + self.tokenfile.read(self.tokenfilename)
> +
> + self.domain = urlparse(uri)[1]
> + if self.domain not in self.tokenfile.sections():
> + self.tokenfile.add_section(self.domain)
> +
> + @property
> + def value(self):
> + if self.tokenfile.has_option(self.domain, 'token'):
> + return self.tokenfile.get(self.domain, 'token')
> + else:
> + return None
> +
> + @value.setter
> + def value(self, value):
> + if self.value != value:
> + if value is None:
> + self.tokenfile.remove_option(self.domain, 'token')
> + else:
> + self.tokenfile.set(self.domain, 'token', value)
> +
> + with open(self.tokenfilename, 'wb') as tokenfile:
> + self.tokenfile.write(tokenfile)
> +
> + def __eq__(self, other):
> + if isinstance(BugzillaToken, other):
> + return self.value == other.value
> + return self.value == other
> +
> + def __repr__(self):
> + return '<Bugzilla Token :: %s>' % (self.value)
> +
> +
> +class BugzillaServerProxy(ServerProxy):
> +
> + def __init__(self, uri, *args, **kwargs):
> + ServerProxy.__init__(self, uri, *args, **kwargs)
> + self.token = BugzillaToken(uri)
> +
> + def clear_token(self):
> + self.token.value = None
> +
> + def _ServerProxy__request(self, methodname, params):
> + if self.token.value is not None \
> + and len(params) == 1 and 'token' not in params[0]:
> + params[0]['token'] = self.token.value
> + ret = ServerProxy._ServerProxy__request(self, methodname, params)
> + if isinstance(ret, dict) and 'token' in ret.keys():
> + self.token.value = ret.get('token')
> + return ret
> +
> +
> class RequestsTransport(Transport):
> user_agent = 'Python/Bugzilla'
>
> @@ -514,7 +572,7 @@ class BugzillaBase(object):
> self._transport = RequestsTransport(
> url, self._cookiejar, sslverify=self._sslverify)
> self._transport.user_agent = self.user_agent
> - self._proxy = ServerProxy(url, self._transport)
> + self._proxy = BugzillaServerProxy(url, self._transport)
>
>
> self.url = url
> diff --git a/tests/rw_functional.py b/tests/rw_functional.py
> index 045c832..7e0a9aa 100644
> --- a/tests/rw_functional.py
> +++ b/tests/rw_functional.py
> @@ -25,10 +25,12 @@ else:
>
> import bugzilla
> from bugzilla import Bugzilla
> +from bugzilla.base import BugzillaToken
>
> import tests
>
> cf = os.path.expanduser("~/.bugzillacookies")
> +tf = os.path.expanduser("~/.bugzillatoken")
>
>
> def _split_int(s):
> @@ -43,7 +45,7 @@ class BaseTest(unittest.TestCase):
> bz = Bugzilla(url=self.url, cookiefile=None)
> self.assertTrue(bz.__class__ is self.bzclass)
>
> - def _testCookie(self):
> + def _testCookieOrToken(self):
> cookiefile = cf
> domain = urlparse(self.url)[1]
> if os.path.exists(cookiefile):
> @@ -51,8 +53,14 @@ class BaseTest(unittest.TestCase):
> if domain in out:
> return
>
> - raise RuntimeError("%s must exist and contain domain '%s'" %
> - (cookiefile, domain))
> + tokenfile = tf
> + if os.path.exists(tokenfile):
> + token = BugzillaToken(self.url)
> + if token.value is not None:
> + return
> +
> + raise RuntimeError("%s or %s must exist and contain domain '%s'" %
> + (cookiefile, tokenfile, domain))
>
>
> class RHPartnerTest(BaseTest):
> @@ -80,7 +88,7 @@ class RHPartnerTest(BaseTest):
> return not noprivs
>
>
> - test1 = BaseTest._testCookie
> + test1 = BaseTest._testCookieOrToken
> test2 = BaseTest._testBZClass
>
>
> --
> 1.9.0
>
> _______________________________________________
> python-bugzilla mailing list
> python-bugzilla at lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/python-bugzilla
More information about the python-bugzilla
mailing list