Speeding up login through cookies
authorEd Page <eopage@byu.net>
Sat, 19 Jun 2010 18:28:35 +0000 (13:28 -0500)
committerEd Page <eopage@byu.net>
Sat, 19 Jun 2010 20:34:34 +0000 (15:34 -0500)
src/connection.py
src/gvoice/backend.py
src/gvoice/browser_emu.py
src/gvoice/session.py

index 1ad2487..080c621 100644 (file)
@@ -98,7 +98,7 @@ class TheOneRingConnection(
                # Connection init must come first
                self.__options = TheOneRingOptions(parameters)
                self.__session = gvoice.session.Session(
-                       cookiePath = None,
+                       cookiePath = os.path.join(constants._data_path_, "%s.cookies" % account),
                        defaults = {
                                "contacts": (self.__options.contactsPollPeriodInHours, "hours"),
                                "voicemail": (self.__options.voicemailPollPeriodInMinutes, "minutes"),
@@ -331,7 +331,7 @@ class TheOneRingConnection(
                self.manager.disconnected(self)
 
                self.session.save(self.__cachePath)
-               self.session.logout()
+               self.session.shutdown()
                self.session.close()
 
                # In case one of the above items takes too long (which it should never
index 72eda38..0661d0c 100755 (executable)
@@ -304,6 +304,11 @@ class GVoiceBackend(object):
                self._lastAuthed = time.time()
                return True
 
+       def shutdown(self):
+               self._browser.save_cookies()
+               self._token = None
+               self._lastAuthed = 0.0
+
        def logout(self):
                self._browser.clear_cookies()
                self._browser.save_cookies()
index 1ef4b2a..9617f78 100644 (file)
@@ -48,10 +48,11 @@ class MozillaEmulator(object):
                self.trycount = trycount
                self._cookies = cookielib.LWPCookieJar()
                self._loadedFromCookies = False
+               self._usingCookies = False
 
        def load_cookies(self, path):
                assert not self._loadedFromCookies, "Load cookies only once"
-               if path is None:
+               if not path:
                        return
 
                self._cookies.filename = path
@@ -66,14 +67,15 @@ class MozillaEmulator(object):
                else:
                        self._loadedFromCookies = True
 
+               self._usingCookies = True
                return self._loadedFromCookies
 
        def save_cookies(self):
-               if self._loadedFromCookies:
+               if self._usingCookies:
                        self._cookies.save()
 
        def clear_cookies(self):
-               if self._loadedFromCookies:
+               if self._usingCookies:
                        self._cookies.clear()
 
        def download(self, url,
index 8151c05..5a825f0 100644 (file)
@@ -159,19 +159,46 @@ class Session(object):
        def _login(self, username, password, on_success, on_error):
                self._username = username
                self._password = password
-               try:
-                       isLoggedIn = yield (
-                               self._backend.login,
-                               (self._username, self._password),
-                               {},
-                       )
-               except Exception, e:
-                       on_error(e)
-                       return
+
+               isLoggedIn = False
+
+               if not isLoggedIn and self._backend.is_quick_login_possible():
+                       try:
+                               isLoggedIn = yield (
+                                       self._backend.is_authed,
+                                       (),
+                                       {},
+                               )
+                       except Exception, e:
+                               on_error(e)
+                               return
+                       if isLoggedIn:
+                               _moduleLogger.info("Logged in through cookies")
+
+               if not isLoggedIn:
+                       try:
+                               isLoggedIn = yield (
+                                       self._backend.login,
+                                       (self._username, self._password),
+                                       {},
+                               )
+                       except Exception, e:
+                               on_error(e)
+                               return
+                       if isLoggedIn:
+                               _moduleLogger.info("Logged in through credentials")
 
                self._masterStateMachine.start()
                on_success(isLoggedIn)
 
+       def shutdown(self):
+               self._asyncPool.stop()
+               self._masterStateMachine.stop()
+               self._backend.shutdown()
+
+               self._username = None
+               self._password = None
+
        def logout(self):
                self._asyncPool.stop()
                self._masterStateMachine.stop()