[python-bugzilla] [PATCH] Refactor login logic into interactive_login method in BugzillaBase

abn at redhat.com abn at redhat.com
Sat Sep 27 14:27:52 UTC 2014


From: Arun Babu Neelicattu <abn at 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



More information about the python-bugzilla mailing list