Adding persisting of credentials
[doneit] / src / gtk_rtmilk.py
index 54508e7..bab46aa 100644 (file)
@@ -1,6 +1,7 @@
 import webbrowser
 import datetime
 import urlparse
+import base64
 
 import gobject
 import gtk
@@ -54,11 +55,11 @@ def get_token(username, apiKey, secret):
        return token
 
 
-def start_session(credentialsDialog):
+def get_credentials(credentialsDialog):
        # @todo Figure out storage of credentials
        username, password = credentialsDialog.request_credentials()
        token = get_token(username, rtmilk.RtMilkManager.API_KEY, rtmilk.RtMilkManager.SECRET)
-       return rtmilk.RtMilkManager(username, password, token)
+       return username, password, token
 
 
 class GtkRtMilk(object):
@@ -138,19 +139,61 @@ class GtkRtMilk(object):
                self._onClearId = None
                self._onPasteId = None
 
-               self._credentials = gtk_toolbox.LoginWindow(widgetTree)
+               self._credentialsDialog = gtk_toolbox.LoginWindow(widgetTree)
+               self._credentials = "", "", ""
                self._manager = None
 
        @staticmethod
        def name():
                return "Remember The Milk"
 
-       def enable(self):
+       def load_settings(self, config):
+               """
+               @note Thread Agnostic
+               """
+               username = config.get(self.name(), "username")
+               password = None
+               blobbedToken = config.get(self.name(), "bin_blob")
+               token = base64.b64decode(blobbedToken)
+               self._credentials = username, password, token
+
+       def save_settings(self, config):
+               """
+               @note Thread Agnostic
+               """
+               config.add_section(self.name())
+               config.set(self.name(), "username", self._credentials[0])
+               blobbedToken = base64.b64encode(self._credentials[2])
+               config.set(self.name(), "bin_blob", blobbedToken)
+
+       def login(self):
                """
                @note UI Thread
                """
-               self._manager = start_session(self._credentials)
+               if self._manager is not None:
+                       return
+
+               credentials = self._credentials
+               while True:
+                       try:
+                               self._manager = rtmilk.RtMilkManager(*credentials)
+                               self._credentials = credentials
+                               return # Login succeeded
+                       except rtmapi.AuthStateMachine.NoData:
+                               # Login failed, grab new credentials
+                               credentials = get_credentials(self._credentialsDialog)
+
+       def logout(self):
+               """
+               @note Thread Agnostic
+               """
+               self._credentials = "", "", ""
+               self._manager = None
 
+       def enable(self):
+               """
+               @note UI Thread
+               """
                self._projectsList.clear()
                self._populate_projects()