[python-bugzilla] [PATCH] Refactor login logic into interactive_login method in BugzillaBase
Cole Robinson
crobinso at redhat.com
Sun Sep 28 22:55:09 UTC 2014
On 09/27/2014 10:27 AM, abn at redhat.com wrote:
> From: Arun Babu Neelicattu <abn at redhat.com>
>
Thanks Arun, pushed now.
- Cole
> ---
> bin/bugzilla | 46 ++++++++++------------------------------------
> bugzilla/base.py | 37 +++++++++++++++++++++++++++++++++++++
> 2 files changed, 47 insertions(+), 36 deletions(-)
>
> diff --git a/bin/bugzilla b/bin/bugzilla
> index 14ed6b6..59f65a5 100755
> --- a/bin/bugzilla
> +++ b/bin/bugzilla
> @@ -13,7 +13,6 @@
>
> from __future__ import print_function
>
> -import getpass
> import locale
> import logging
> import optparse
> @@ -1169,7 +1168,9 @@ def main(bzinstance=None):
>
> # Handle 'login' action
> is_login_command = (action == 'login')
> - if is_login_command or global_opt.login:
> + force_login = is_login_command or global_opt.login
> +
> + if force_login:
> if is_login_command:
> if len(args) == 2:
> (global_opt.user, global_opt.password) = args
> @@ -1178,42 +1179,15 @@ def main(bzinstance=None):
> elif len(args) > 2:
> parser.error("Too many arguments for login")
>
> - if not global_opt.user:
> - sys.stdout.write('Username: ')
> - user = sys.stdin.readline()
> - global_opt.user = user.strip()
> - if not global_opt.password:
> - global_opt.password = getpass.getpass()
> - sys.stdout.write('Logging in... ')
> - sys.stdout.flush()
> -
> - try:
> - bz.login(global_opt.user, global_opt.password)
> - print('Authorization cookie received.')
> - except bugzilla.BugzillaError:
> - print(str(sys.exc_info()[1]))
> - sys.exit(1)
> -
> + try:
> + if not _is_unittest or force_login:
> + bz.interactive_login(
> + global_opt.user, global_opt.password, force_login)
> if is_login_command:
> sys.exit(0)
> -
> - # Set up authentication
> - if global_opt.user:
> - if not global_opt.password:
> - global_opt.password = getpass.getpass()
> - log.info('Using username/password for authentication')
> - bz.login(global_opt.user, global_opt.password)
> - elif not _is_unittest:
> - if ((bz.cookiefile and os.path.exists(bz.cookiefile)) or
> - (bz.tokenfile and os.path.exists(bz.tokenfile))):
> - if bz.cookiefile and os.path.exists(bz.cookiefile):
> - log.info('Using cookies in %s for authentication',
> - bz.cookiefile)
> - if bz.tokenfile and os.path.exists(bz.tokenfile):
> - log.info('Using token in %s for authentication',
> - bz.tokenfile)
> - else:
> - log.info('No authentication info provided.')
> + except bugzilla.BugzillaError:
> + print(str(sys.exc_info()[1]))
> + sys.exit(1)
>
>
> ###########################
> diff --git a/bugzilla/base.py b/bugzilla/base.py
> index 4c1630c..e06223f 100644
> --- a/bugzilla/base.py
> +++ b/bugzilla/base.py
> @@ -14,6 +14,7 @@ from logging import getLogger
> import os
> import sys
>
> +from getpass import getpass
> from io import BytesIO
>
> if hasattr(sys.version_info, "major") and sys.version_info.major >= 3:
> @@ -651,6 +652,42 @@ class BugzillaBase(object):
> e = sys.exc_info()[1]
> raise BugzillaError("Login failed: %s" % str(e.faultString))
>
> + def interactive_login(self, user=None, password=None, force=False):
> + """
> + Helper method to handle login for this bugzilla instance.
> +
> + If a 'user' is provided or 'force' is set to True; or no cookie/token
> + file exists, a username/password authentication is attempted requesting
> + any information that is not available from the user.
> +
> + If a cookie/token file exists, the call to the instance login method is
> + skipped.
> + """
> + if not force and user is None:
> + auths = {
> + 'cookies': self.cookiefile,
> + 'token': self.tokenfile,
> + }
> + for (method, source) in auths.items():
> + if source and os.path.exists(source):
> + log.info(
> + 'Using %s in %s for authentication', method, source)
> + return
> + elif not force:
> + log.error('No authentication information provided for login')
> +
> + log.info('Using username/password for authentication')
> +
> + if not user:
> + sys.stdout.write('Bugzilla Username: ')
> + user = sys.stdin.readline().strip()
> + if not password:
> + password = getpass('Bugzilla Password: ')
> +
> + log.info('Logging in... ')
> + self.login(user, password)
> + log.info('Authorization cookie received.')
> +
> def logout(self):
> '''Log out of bugzilla. Drops server connection and user info, and
> destroys authentication cookies.'''
>
More information about the python-bugzilla
mailing list