diff options
Diffstat (limited to 'mail/session.c')
-rw-r--r-- | mail/session.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/mail/session.c b/mail/session.c index b7b24920b0..c9dbb0b1ae 100644 --- a/mail/session.c +++ b/mail/session.c @@ -12,6 +12,7 @@ #include "e-util/e-setup.h" CamelSession *session; +GHashTable *passwords; static void request_callback (gchar *string, gpointer data) @@ -30,9 +31,20 @@ evolution_auth_callback (char *prompt, gboolean secret, CamelException *ex) { GtkWidget *dialog; - char *ans; + char *key = NULL, *ans; - /* XXX look up stored passwords */ + if (service && item) { + key = g_strdup_printf ("%s:%s", camel_url_to_string (service->url, FALSE), item); + + if (passwords) { + ans = g_hash_table_lookup (passwords, key); + if (ans) { + g_free (key); + return g_strdup (ans); + } + } else + passwords = g_hash_table_new (g_str_hash, g_str_equal); + } /* XXX parent window? */ dialog = gnome_request_dialog (secret, prompt, NULL, 0, @@ -40,15 +52,22 @@ evolution_auth_callback (char *prompt, gboolean secret, if (!dialog) { camel_exception_set (ex, CAMEL_EXCEPTION_SYSTEM, "Could not create dialog box."); + g_free (key); return NULL; } if (gnome_dialog_run_and_close (GNOME_DIALOG (dialog)) == -1 || ans == NULL) { camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL, "User cancelled query."); + g_free (key); return NULL; } + if (service && item) + g_hash_table_insert (passwords, key, g_strdup (ans)); + else + g_free (key); + return ans; } @@ -60,3 +79,18 @@ session_init (void) session = camel_session_new (evolution_auth_callback); } + +static gboolean +free_entry (gpointer key, gpointer value, gpointer user_data) +{ + g_free (key); + memset (value, 0, strlen (value)); + g_free (value); + return TRUE; +} + +void +forget_passwords (BonoboUIHandler *uih, void *user_data, const char *path) +{ + g_hash_table_foreach_remove (passwords, free_entry, NULL); +} |