File fix-bnc-pwd-reset-211520-eds.diff of Package evolution-data-server-2.6
Index: servers/groupwise/e-gw-connection.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/servers/groupwise/e-gw-connection.c,v
retrieving revision 1.148
diff -u -p -r1.148 e-gw-connection.c
--- servers/groupwise/e-gw-connection.c 4 Dec 2006 09:16:47 -0000 1.148
+++ servers/groupwise/e-gw-connection.c 27 Dec 2006 08:29:35 -0000
@@ -62,6 +62,10 @@ struct _EGwConnectionPrivate {
EGwSendOptions *opts;
GMutex *reauth_mutex;
EProxy *proxy;
+
+ /* Every function exposed through e-gw-connection.h should make use of these two members to handle errors. */
+ int error_code;
+ char *error_description;
};
static void
@@ -319,6 +323,9 @@ e_gw_connection_dispose (GObject *object
g_free (priv->server_time) ;
priv->server_time = NULL ;
}
+
+ if (priv->error_description)
+ g_free (priv->error_description);
}
if (parent_class->dispose)
@@ -377,6 +384,9 @@ e_gw_connection_init (EGwConnection *cnc
priv->categories_by_name = NULL;
priv->book_list = NULL;
priv->opts = NULL;
+ priv->error_code = 0;
+ priv->error_description = NULL;
+ priv->session_id = NULL;
}
GType
@@ -492,6 +502,21 @@ e_gw_connection_new (const char *uri, co
}
}
+
+ if (status != E_GW_CONNECTION_STATUS_OK) {
+
+ param = soup_soap_response_get_first_parameter_by_name (response, "code");
+ if (param) {
+ cnc->priv->error_code = soup_soap_parameter_get_int_value (param);
+ param = soup_soap_response_get_first_parameter_by_name (response, "description");
+ if (param)
+ cnc->priv->error_description = soup_soap_parameter_get_string_value (param);
+ g_object_unref (response);
+ g_object_unref (msg);
+ g_static_mutex_unlock (&connecting);
+ return cnc;
+ }
+ }
param = soup_soap_response_get_first_parameter_by_name (response, "session");
if (!param) {
g_object_unref (response);
@@ -4045,4 +4070,20 @@ e_gw_connection_get_proxy_connection (EG
g_free (name);
g_static_mutex_unlock (&connecting);
return cnc;
+}
+
+int e_gw_connection_get_error_code (EGwConnection *cnc)
+{
+ return cnc->priv->error_code;
+}
+
+const char *e_gw_connection_get_error_description (EGwConnection *cnc)
+{
+ return cnc->priv->error_description;
+}
+
+void e_gw_connection_clear_errors (EGwConnection *cnc)
+{
+ cnc->priv->error_code = 0;
+ g_free (cnc->priv->error_description);
}
Index: servers/groupwise/e-gw-connection.h
===================================================================
RCS file: /cvs/gnome/evolution-data-server/servers/groupwise/e-gw-connection.h,v
retrieving revision 1.71
diff -u -p -r1.71 e-gw-connection.h
--- servers/groupwise/e-gw-connection.h 12 Jun 2006 09:19:40 -0000 1.71
+++ servers/groupwise/e-gw-connection.h 27 Dec 2006 08:29:35 -0000
@@ -79,7 +79,8 @@ typedef enum {
E_GW_CONNECTION_STATUS_ITEM_ALREADY_ACCEPTED,
E_GW_CONNECTION_STATUS_REDIRECT,
E_GW_CONNECTION_STATUS_OTHER,
- E_GW_CONNECTION_STATUS_UNKNOWN
+ E_GW_CONNECTION_STATUS_UNKNOWN,
+ E_GW_CONNECTION_STATUS_INVALID_PASSWORD = 53273
} EGwConnectionStatus;
#define E_GW_CURSOR_POSITION_CURRENT "current"
@@ -176,6 +177,13 @@ EGwConnectionStatus e_gw_connection_get_
EGwConnection *e_gw_connection_get_proxy_connection (EGwConnection *cnc1, char *username, const char *password, const char *proxy, int* permissions);
EGwConnectionStatus e_gw_connection_get_all_mail_uids (EGwConnection *cnc, const char *container, int cursor, gboolean forward, int count, const char *cursor_seek, GList **list);
+int e_gw_connection_get_error_code (EGwConnection *cnc);
+const char *e_gw_connection_get_error_description (EGwConnection *cnc);
+
+/* Call this function once you have made use of the error description. Otherwise, the description
+string's memory will not be freed until the next SOAP call */
+void e_gw_connection_clear_errors (EGwConnection *cnc);
+
G_END_DECLS
#endif
Index: camel/providers/groupwise/camel-groupwise-store.c
===================================================================
RCS file: /cvs/gnome/evolution-data-server/camel/providers/groupwise/camel-groupwise-store.c,v
retrieving revision 1.105
diff -u -p -r1.105 camel-groupwise-store.c
--- camel/providers/groupwise/camel-groupwise-store.c 7 Dec 2006 12:48:31 -0000 1.105
+++ camel/providers/groupwise/camel-groupwise-store.c 27 Dec 2006 08:29:36 -0000
@@ -178,9 +178,10 @@ groupwise_auth_loop (CamelService *servi
CamelStore *store = CAMEL_STORE (service);
CamelGroupwiseStore *groupwise_store = CAMEL_GROUPWISE_STORE (store);
CamelGroupwiseStorePrivate *priv = groupwise_store->priv;
- char *errbuf = NULL;
gboolean authenticated = FALSE;
char *uri;
+ int connection_errors;
+ gboolean forget_passwd = FALSE;
CAMEL_SERVICE_ASSERT_LOCKED (groupwise_store, connect_lock);
if (priv->use_ssl && !g_str_equal (priv->use_ssl, "never"))
@@ -192,7 +192,7 @@ groupwise_auth_loop (CamelService *servi
while (!authenticated) {
- if (errbuf) {
+ if (forget_passwd) {
/* We need to un-cache the password before prompting again */
camel_session_forget_password (session, service, "Groupwise", "password", ex);
g_free (service->url->passwd);
@@ -202,18 +202,16 @@ groupwise_auth_loop (CamelService *servi
if (!service->url->passwd && !(store->flags & CAMEL_STORE_PROXY)) {
char *prompt;
+
+ prompt = g_strdup_printf (_("Please enter the GroupWise "
+ "password for %s@%s"),
+ service->url->user,
+ service->url->host);
- prompt = g_strdup_printf (_("%sPlease enter the GroupWise "
- "password for %s@%s"),
- errbuf ? errbuf : "",
- service->url->user,
- service->url->host);
service->url->passwd =
camel_session_get_password (session, service, "Groupwise",
prompt, "password", CAMEL_SESSION_PASSWORD_SECRET, ex);
g_free (prompt);
- g_free (errbuf);
- errbuf = NULL;
if (!service->url->passwd) {
camel_exception_set (ex, CAMEL_EXCEPTION_USER_CANCEL,
@@ -228,14 +226,30 @@ groupwise_auth_loop (CamelService *servi
priv->cnc = e_gw_connection_new (http_uri, priv->user, service->url->passwd);
g_free (http_uri);
}
- if (!E_IS_GW_CONNECTION(priv->cnc)) {
- errbuf = g_strdup_printf (_("Unable to authenticate "
- "to GroupWise server. "));
-
- camel_exception_clear (ex);
- } else
- authenticated = TRUE;
-
+
+ if (E_IS_GW_CONNECTION(priv->cnc)) {
+ connection_errors = e_gw_connection_get_error_code (priv->cnc);
+ if ( connection_errors & E_GW_CONNECTION_STATUS_INVALID_PASSWORD ) {
+ e_gw_connection_clear_errors (priv->cnc);
+ /* This connection object should be reusable. */
+ g_object_unref (priv->cnc);
+ forget_passwd = TRUE;
+ continue;
+ } else if (connection_errors) {
+ char *error_description ;
+ error_description = g_strdup_printf ("Connection Failed : %s", e_gw_connection_get_error_description (priv->cnc));
+ camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _(error_description));
+ e_gw_connection_clear_errors (priv->cnc);
+ /* This connection object should be reusable. */
+ g_object_unref (priv->cnc);
+ g_free (error_description);
+ return FALSE;
+ } else
+ authenticated = TRUE;
+ } else {
+ camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Authentication Failed"));
+ return FALSE;
+ }
}
return TRUE;
@@ -582,7 +597,6 @@ groupwise_get_folder (CamelStore *store,
if (!E_IS_GW_CONNECTION( priv->cnc)) {
if (!groupwise_connect (CAMEL_SERVICE(store), ex)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Authentication failed"));
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
return NULL;
}
@@ -708,7 +722,6 @@ gw_store_reload_folder (CamelGroupwiseSt
if (!E_IS_GW_CONNECTION( priv->cnc)) {
if (!groupwise_connect (CAMEL_SERVICE((CamelStore*)gw_store), ex)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Authentication failed"));
CAMEL_SERVICE_UNLOCK (gw_store, connect_lock);
return;
}
@@ -1252,7 +1265,6 @@ groupwise_create_folder(CamelStore *stor
if (!E_IS_GW_CONNECTION( priv->cnc)) {
if (!groupwise_connect (CAMEL_SERVICE(store), ex)) {
- camel_exception_set (ex, CAMEL_EXCEPTION_SERVICE_CANT_AUTHENTICATE, _("Authentication failed"));
return NULL;
}
}