aboutsummaryrefslogtreecommitdiffstats
path: root/mail/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/session.c')
-rw-r--r--mail/session.c38
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);
+}