2007-07-12 Murray Cumming <murrayc@murrayc.com>
authorMurray Cumming <murrayc@murrayc.com>
Thu, 12 Jul 2007 13:02:57 +0000 (13:02 +0000)
committerMurray Cumming <murrayc@murrayc.com>
Thu, 12 Jul 2007 13:02:57 +0000 (13:02 +0000)
* src/modest-tny-account-store.h:
* src/modest-tny-account-store.c:
Added modest_tny_account_store_forget_password_in_memory(),
(get_server_accounts): Called modest_tny_account_store_forget_password_in_memory()
when creating a new account, so that new passwords will be used, instead of
us thinking that it's a second request as a result of a failed password again.

pmo-trunk-r2725

ChangeLog2
src/modest-account-mgr.c
src/modest-account-mgr.h
src/modest-tny-account-store.c

index 409775e..9d1c67e 100644 (file)
@@ -1,5 +1,14 @@
 2007-07-12  Murray Cumming  <murrayc@murrayc.com>
 
 2007-07-12  Murray Cumming  <murrayc@murrayc.com>
 
+       * src/modest-tny-account-store.h:
+       * src/modest-tny-account-store.c: 
+       Added modest_tny_account_store_forget_password_in_memory(),
+       (get_server_accounts): Called modest_tny_account_store_forget_password_in_memory() 
+       when creating a new account, so that new passwords will be used, instead of 
+       us thinking that it's a second request as a result of a failed password again.
+
+2007-07-12  Murray Cumming  <murrayc@murrayc.com>
+
        * src/dbus_api/modest-dbus-callbacks.c:
        (on_idle_open_message): If the message is in drafts then open it 
        in an edit window instead of a view window. This fixes 
        * src/dbus_api/modest-dbus-callbacks.c:
        (on_idle_open_message): If the message is in drafts then open it 
        in an edit window instead of a view window. This fixes 
index 98a2c0a..fc53d88 100644 (file)
@@ -65,6 +65,8 @@ on_timeout_notify_changes (gpointer data)
                gchar *default_account = 
                                modest_account_mgr_get_default_account (self);
                
                gchar *default_account = 
                                modest_account_mgr_get_default_account (self);
                
+               /* printf ("DEBUG: %s: priv->changed_conf_key length=%d\n", 
+                       __FUNCTION__, g_slist_length (priv->changed_conf_keys)); */
                g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0,
                                 default_account, priv->changed_conf_keys, FALSE);
                        
                g_signal_emit (G_OBJECT(self), signals[ACCOUNT_CHANGED_SIGNAL], 0,
                                 default_account, priv->changed_conf_keys, FALSE);
                        
index b992f82..6510cf3 100644 (file)
@@ -65,7 +65,7 @@ struct _ModestAccountMgrClass {
                                    const GSList* key, 
                                    gboolean server_account,
                                    gpointer user_data);
                                    const GSList* key, 
                                    gboolean server_account,
                                    gpointer user_data);
-               void (* account_busy_changed)   (ModestAccountMgr *obj, 
+       void (* account_busy_changed)   (ModestAccountMgr *obj, 
                                    const gchar* account,
                                    gboolean busy,
                                    gpointer user_data);
                                    const gchar* account,
                                    gboolean busy,
                                    gpointer user_data);
index 94369f2..c3a0ca2 100644 (file)
@@ -376,6 +376,25 @@ on_account_removed (ModestAccountMgr *acc_mgr,
                g_printerr ("modest: cannot find server account for %s", account);
 }
 
                g_printerr ("modest: cannot find server account for %s", account);
 }
 
+/**
+ * modest_tny_account_store_forget_password_in_memory
+ * @self: a TnyAccountStore instance
+ * @account: A server account.
+ * 
+ * Forget any password stored in memory for this account.
+ * For instance, this should be called when the user has changed the password in the account settings.
+ */
+static void
+modest_tny_account_store_forget_password_in_memory (ModestTnyAccountStore *self, const gchar * server_account_name)
+{
+       /* printf ("DEBUG: %s\n", __FUNCTION__); */
+       ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+
+       if (server_account_name && priv->password_hash) {
+               g_hash_table_remove (priv->password_hash, server_account_name);
+       }
+}
+
 static void
 on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account,
                    const GSList *keys, gboolean server_account, gpointer user_data)
 static void
 on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account,
                    const GSList *keys, gboolean server_account, gpointer user_data)
@@ -383,15 +402,38 @@ on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account,
 {
        ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data);
        
 {
        ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data);
        
+       /*
+       printf ("DEBUG: %s\n", __FUNCTION__);
+       const GSList *iter = keys;
+       for (iter = keys; iter; iter = g_slist_next (iter)) {
+               printf ("  DEBUG: %s: key=%s\n", __FUNCTION__, (const gchar*)iter->data);
+       }
+       */
+       
        /* Ignore the change if it's a change in the last_updated value */
        if (g_slist_length ((GSList *)keys) == 1 &&
        /* Ignore the change if it's a change in the last_updated value */
        if (g_slist_length ((GSList *)keys) == 1 &&
-           g_str_has_suffix ((const gchar *) keys->data, MODEST_ACCOUNT_LAST_UPDATED))
+               g_str_has_suffix ((const gchar *) keys->data, MODEST_ACCOUNT_LAST_UPDATED)) {
                return;
                return;
+       }
 
        /* FIXME: make this more finegrained; changes do not really affect _all_
         * accounts
         */
        recreate_all_accounts (self);
 
        /* FIXME: make this more finegrained; changes do not really affect _all_
         * accounts
         */
        recreate_all_accounts (self);
+       
+       /* TODO: This doesn't actually work, because
+        * a) The account name is not sent correctly per key:
+        * b) We should test the end of the key, not the whole keym
+        * c) We don't seem to be getting all keys here.
+        * Instead, we just forget the password for all accounts when we create them, for now.
+        */
+       #if 0
+       /* If a password has changed, then forget the previously cached password for this account: */
+       if (server_account && keys && g_slist_find_custom ((GSList *)keys, MODEST_ACCOUNT_PASSWORD, (GCompareFunc)strcmp)) {
+               printf ("DEBUG: %s: Forgetting cached password for account ID=%s\n", __FUNCTION__, account);
+               modest_tny_account_store_forget_password_in_memory (self,  account);
+       }
+       #endif
 
        g_signal_emit (G_OBJECT(self), signals[ACCOUNT_UPDATE_SIGNAL], 0,
                       account);
 
        g_signal_emit (G_OBJECT(self), signals[ACCOUNT_UPDATE_SIGNAL], 0,
                       account);
@@ -522,7 +564,7 @@ get_password (TnyAccount *account, const gchar * prompt_not_used, gboolean *canc
        account_store = TNY_ACCOUNT_STORE(get_account_store_for_account (account));
 
        if (!server_account_name || !account_store) {
        account_store = TNY_ACCOUNT_STORE(get_account_store_for_account (account));
 
        if (!server_account_name || !account_store) {
-               g_warning ("%s: could not retrieve account_store for account %s",
+               g_warning ("modest: %s: could not retrieve account_store for account %s",
                           __FUNCTION__, server_account_name ? server_account_name : "<NULL>");
                if (cancel)
                        *cancel = TRUE;
                           __FUNCTION__, server_account_name ? server_account_name : "<NULL>");
                if (cancel)
                        *cancel = TRUE;
@@ -651,6 +693,19 @@ forget_password (TnyAccount *account)
        */
 }
 
        */
 }
 
+static void
+destroy_password_hashtable (ModestTnyAccountStore *self)
+{
+       ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+       
+       g_free (priv->cache_dir);
+       priv->cache_dir = NULL;
+       
+       if (priv->password_hash) {
+               g_hash_table_destroy (priv->password_hash);
+               priv->password_hash = NULL;
+       }
+}
 
 static void
 modest_tny_account_store_finalize (GObject *obj)
 
 static void
 modest_tny_account_store_finalize (GObject *obj)
@@ -668,10 +723,7 @@ modest_tny_account_store_finalize (GObject *obj)
                priv->password_hash = NULL;
        }
        
                priv->password_hash = NULL;
        }
        
-       if (priv->account_settings_dialog_hash) {
-               g_hash_table_destroy (priv->account_settings_dialog_hash);
-               priv->account_settings_dialog_hash = NULL;
-       }
+       destroy_password_hashtable (self);
 
        if (priv->account_mgr) {
                g_object_unref (G_OBJECT(priv->account_mgr));
 
        if (priv->account_mgr) {
                g_object_unref (G_OBJECT(priv->account_mgr));
@@ -837,6 +889,15 @@ get_server_accounts  (TnyAccountStore *self, TnyList *list, TnyAccountType type)
                                                                     get_password,
                                                                     forget_password);
                        if (tny_account) {
                                                                     get_password,
                                                                     forget_password);
                        if (tny_account) {
+                               /* Forget any cached password for the account,
+                                * so that we use a new account if any.
+                                * TODO: Really we should do this in a more precise way in 
+                                * on_account_changed().
+                                */
+                               modest_tny_account_store_forget_password_in_memory (
+                                       MODEST_TNY_ACCOUNT_STORE (self),  
+                                       tny_account_get_id (tny_account));
+                               
                                g_object_set_data (G_OBJECT(tny_account), "account_store",
                                                   (gpointer)self);
                                if (list)
                                g_object_set_data (G_OBJECT(tny_account), "account_store",
                                                   (gpointer)self);
                                if (list)