From: Arun Babu Neelicattu <abn(a)redhat.com>
---
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.'''
--
1.9.3