From 2d265825401de6bc45b00a75bf20a870fc46ad53 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 12 Aug 2008 08:44:09 +0000 Subject: ** Fix for bug #547308 2008-08-12 Milan Crha ** Fix for bug #547308 * gui/component/addressbook.c: (load_source_auth_cb): Do not try to authenticate to the server more than twice when knows the password and it didn't fail because of wrong user name/password. * gui/widgets/eab-gui-util.c: (const char *status_to_string[]): New string for new status code. * gui/widgets/eab-gui-util.c: (eab_load_error_dialog): Include detailed error in generic failure error, if available and is not a repository offline error. svn path=/trunk/; revision=35964 --- addressbook/gui/component/addressbook.c | 41 +++++++++++++++++++-------------- addressbook/gui/widgets/eab-gui-util.c | 9 +++++++- 2 files changed, 32 insertions(+), 18 deletions(-) (limited to 'addressbook/gui') diff --git a/addressbook/gui/component/addressbook.c b/addressbook/gui/component/addressbook.c index ac135a0be0..132ad51cea 100644 --- a/addressbook/gui/component/addressbook.c +++ b/addressbook/gui/component/addressbook.c @@ -73,6 +73,9 @@ static void load_source_auth_cb (EBook *book, EBookStatus status, gpointer closure) { LoadSourceData *data = closure; + gboolean was_in = g_object_get_data (G_OBJECT (book), "authenticated") != NULL; + + g_object_set_data (G_OBJECT (book), "authenticated", NULL); if (data->cancelled) { free_load_source_data (data); @@ -99,38 +102,42 @@ load_source_auth_cb (EBook *book, EBookStatus status, gpointer closure) "%s", _("Accessing LDAP Server anonymously")); g_signal_connect (dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show (dialog); - if (data->cb) - data->cb (book, E_BOOK_ERROR_OK, data->closure); - free_load_source_data (data); - return; + status = E_BOOK_ERROR_OK; + + goto done; } } else if (status == E_BOOK_ERROR_INVALID_SERVER_VERSION) { e_error_run (NULL, "addressbook:server-version", NULL); status = E_BOOK_ERROR_OK; - if (data->cb) - data->cb (book, status, data->closure); - free_load_source_data (data); - return; - + goto done; + } else if (status == E_BOOK_ERROR_UNSUPPORTED_AUTHENTICATION_METHOD) { + goto done; } else { - const gchar *uri = e_book_get_uri (book); - gchar *stripped_uri = remove_parameters_from_uri (uri); - const gchar *auth_domain = e_source_get_property (data->source, "auth-domain"); - const gchar *component_name; + if (status == E_BOOK_ERROR_AUTHENTICATION_FAILED) { + const gchar *uri = e_book_get_uri (book); + gchar *stripped_uri = remove_parameters_from_uri (uri); + const gchar *auth_domain = e_source_get_property (data->source, "auth-domain"); + const gchar *component_name; - component_name = auth_domain ? auth_domain : "Addressbook"; + component_name = auth_domain ? auth_domain : "Addressbook"; - if (status == E_BOOK_ERROR_AUTHENTICATION_FAILED) { e_passwords_forget_password (component_name, stripped_uri); + + g_free (stripped_uri); + } else if (was_in) { + /* We already tried to authenticate to the server, and it failed with + other reason than with E_BOOK_ERROR_AUTHENTICATION_FAILED, thus stop + poking with the server and report error to the user. */ + goto done; } + g_object_set_data (G_OBJECT (book), "authenticated", GINT_TO_POINTER (1)); addressbook_authenticate (book, TRUE, data->source, load_source_auth_cb, closure); - - g_free (stripped_uri); return; } } +done: if (data->cb) data->cb (book, status, data->closure); diff --git a/addressbook/gui/widgets/eab-gui-util.c b/addressbook/gui/widgets/eab-gui-util.c index 1b59371935..42ce9cd8f2 100644 --- a/addressbook/gui/widgets/eab-gui-util.c +++ b/addressbook/gui/widgets/eab-gui-util.c @@ -75,7 +75,8 @@ static const char *status_to_string[] = { /* E_BOOK_ERROR_NO_SUCH_SOURCE */ N_("No such source"), /* E_BOOK_ERROR_OFFLINE_UNAVAILABLE */ N_("Not available in offline mode"), /* E_BOOK_ERROR_OTHER_ERROR */ N_("Other error"), - /* E_BOOK_ERROR_INVALID_SERVER_VERSION */ N_("Invalid server version") + /* E_BOOK_ERROR_INVALID_SERVER_VERSION */ N_("Invalid server version"), + /* E_BOOK_ERROR_UNSUPPORTED_AUTHENTICATION_METHOD */ N_("Unsupported authentication method") }; void @@ -131,6 +132,12 @@ eab_load_error_dialog (GtkWidget *parent, ESource *source, EBookStatus status) _("We were unable to open this addressbook. This either " "means you have entered an incorrect URI, or the server " "is unreachable."); + + /* do not show repository offline message, it's kind of generic error */ + if (status != E_BOOK_ERROR_REPOSITORY_OFFLINE && status > 0 && status < G_N_ELEMENTS (status_to_string) && status_to_string [status]) { + label = g_strconcat (label_string, "\n\n", _("Detailed error:"), " ", _(status_to_string [status]), NULL); + label_string = label; + } } dialog = e_error_new ((GtkWindow *) parent, "addressbook:load-error", label_string, NULL); -- cgit v1.2.3