From 1d40b380b95b4dd4c14f593683caaa97c897623a Mon Sep 17 00:00:00 2001 From: Murray Cumming Date: Thu, 12 Jul 2007 13:02:57 +0000 Subject: [PATCH] 2007-07-12 Murray Cumming * 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 | 9 +++++ src/modest-account-mgr.c | 2 ++ src/modest-account-mgr.h | 2 +- src/modest-tny-account-store.c | 73 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 79 insertions(+), 7 deletions(-) diff --git a/ChangeLog2 b/ChangeLog2 index 409775e..9d1c67e 100644 --- a/ChangeLog2 +++ b/ChangeLog2 @@ -1,5 +1,14 @@ 2007-07-12 Murray Cumming + * 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 + * 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 diff --git a/src/modest-account-mgr.c b/src/modest-account-mgr.c index 98a2c0a..fc53d88 100644 --- a/src/modest-account-mgr.c +++ b/src/modest-account-mgr.c @@ -65,6 +65,8 @@ on_timeout_notify_changes (gpointer data) 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); diff --git a/src/modest-account-mgr.h b/src/modest-account-mgr.h index b992f82..6510cf3 100644 --- a/src/modest-account-mgr.h +++ b/src/modest-account-mgr.h @@ -65,7 +65,7 @@ struct _ModestAccountMgrClass { 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); diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 94369f2..c3a0ca2 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -376,6 +376,25 @@ on_account_removed (ModestAccountMgr *acc_mgr, 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) @@ -383,15 +402,38 @@ on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account, { 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 && - 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; + } /* 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); @@ -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) { - 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 : ""); 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) @@ -668,10 +723,7 @@ modest_tny_account_store_finalize (GObject *obj) 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)); @@ -837,6 +889,15 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) 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) -- 1.7.9.5