|
|
22d06c |
diff -up evolution-data-server-3.8.5/addressbook/backends/webdav/e-book-backend-webdav.c.claim-missing-username evolution-data-server-3.8.5/addressbook/backends/webdav/e-book-backend-webdav.c
|
|
|
22d06c |
--- evolution-data-server-3.8.5/addressbook/backends/webdav/e-book-backend-webdav.c.claim-missing-username 2013-07-28 15:54:19.000000000 +0200
|
|
|
22d06c |
+++ evolution-data-server-3.8.5/addressbook/backends/webdav/e-book-backend-webdav.c 2014-10-08 15:33:51.567159217 +0200
|
|
|
22d06c |
@@ -1089,7 +1089,9 @@ download_contacts (EBookBackendWebdav *w
|
|
|
22d06c |
message = send_propfind (webdav, cancellable);
|
|
|
22d06c |
status = message->status_code;
|
|
|
22d06c |
|
|
|
22d06c |
- if (status == 401 || status == 407) {
|
|
|
22d06c |
+ if (status == SOUP_STATUS_UNAUTHORIZED ||
|
|
|
22d06c |
+ status == SOUP_STATUS_PROXY_UNAUTHORIZED ||
|
|
|
22d06c |
+ status == SOUP_STATUS_FORBIDDEN) {
|
|
|
22d06c |
g_object_unref (message);
|
|
|
22d06c |
g_free (new_ctag);
|
|
|
22d06c |
if (book_view)
|
|
|
22d06c |
@@ -1422,9 +1424,10 @@ soup_authenticate (SoupSession *session,
|
|
|
22d06c |
if (retrying)
|
|
|
22d06c |
return;
|
|
|
22d06c |
|
|
|
22d06c |
- if (priv->username != NULL) {
|
|
|
22d06c |
+ if (!priv->username || !*priv->username)
|
|
|
22d06c |
+ soup_message_set_status (message, SOUP_STATUS_FORBIDDEN);
|
|
|
22d06c |
+ else
|
|
|
22d06c |
soup_auth_authenticate (auth, priv->username, priv->password);
|
|
|
22d06c |
- }
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
static void
|
|
|
22d06c |
@@ -1445,6 +1448,57 @@ proxy_settings_changed (EProxy *proxy,
|
|
|
22d06c |
g_object_set (priv->session, SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
+static gboolean
|
|
|
22d06c |
+book_backend_webdav_test_can_connect (EBookBackendWebdav *webdav,
|
|
|
22d06c |
+ GCancellable *cancellable,
|
|
|
22d06c |
+ GError **error)
|
|
|
22d06c |
+{
|
|
|
22d06c |
+ SoupMessage *message;
|
|
|
22d06c |
+ gboolean res = FALSE;
|
|
|
22d06c |
+
|
|
|
22d06c |
+ g_return_val_if_fail (E_IS_BOOK_BACKEND_WEBDAV (webdav), FALSE);
|
|
|
22d06c |
+
|
|
|
22d06c |
+ /* Send a PROPFIND to test whether user/password is correct. */
|
|
|
22d06c |
+ message = send_propfind (webdav, cancellable);
|
|
|
22d06c |
+
|
|
|
22d06c |
+ switch (message->status_code) {
|
|
|
22d06c |
+ case SOUP_STATUS_OK:
|
|
|
22d06c |
+ case SOUP_STATUS_MULTI_STATUS:
|
|
|
22d06c |
+ res = TRUE;
|
|
|
22d06c |
+ break;
|
|
|
22d06c |
+
|
|
|
22d06c |
+ case SOUP_STATUS_UNAUTHORIZED:
|
|
|
22d06c |
+ case SOUP_STATUS_PROXY_UNAUTHORIZED:
|
|
|
22d06c |
+ g_free (webdav->priv->username);
|
|
|
22d06c |
+ webdav->priv->username = NULL;
|
|
|
22d06c |
+ g_free (webdav->priv->password);
|
|
|
22d06c |
+ webdav->priv->password = NULL;
|
|
|
22d06c |
+ g_set_error_literal (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED,
|
|
|
22d06c |
+ e_client_error_to_string (E_CLIENT_ERROR_AUTHENTICATION_FAILED));
|
|
|
22d06c |
+ break;
|
|
|
22d06c |
+
|
|
|
22d06c |
+ case SOUP_STATUS_FORBIDDEN:
|
|
|
22d06c |
+ g_free (webdav->priv->username);
|
|
|
22d06c |
+ webdav->priv->username = NULL;
|
|
|
22d06c |
+ g_free (webdav->priv->password);
|
|
|
22d06c |
+ webdav->priv->password = NULL;
|
|
|
22d06c |
+ g_set_error_literal (error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_REQUIRED,
|
|
|
22d06c |
+ e_client_error_to_string (E_CLIENT_ERROR_AUTHENTICATION_REQUIRED));
|
|
|
22d06c |
+ break;
|
|
|
22d06c |
+
|
|
|
22d06c |
+ default:
|
|
|
22d06c |
+ g_set_error (
|
|
|
22d06c |
+ error, SOUP_HTTP_ERROR,
|
|
|
22d06c |
+ message->status_code,
|
|
|
22d06c |
+ "%s", message->reason_phrase);
|
|
|
22d06c |
+ break;
|
|
|
22d06c |
+ }
|
|
|
22d06c |
+
|
|
|
22d06c |
+ g_object_unref (message);
|
|
|
22d06c |
+
|
|
|
22d06c |
+ return res;
|
|
|
22d06c |
+}
|
|
|
22d06c |
+
|
|
|
22d06c |
static void
|
|
|
22d06c |
e_book_backend_webdav_open (EBookBackend *backend,
|
|
|
22d06c |
EDataBook *book,
|
|
|
22d06c |
@@ -1546,6 +1600,8 @@ e_book_backend_webdav_open (EBookBackend
|
|
|
22d06c |
E_BACKEND (backend),
|
|
|
22d06c |
E_SOURCE_AUTHENTICATOR (backend),
|
|
|
22d06c |
cancellable, &error);
|
|
|
22d06c |
+ else
|
|
|
22d06c |
+ book_backend_webdav_test_can_connect (webdav, cancellable, &error);
|
|
|
22d06c |
|
|
|
22d06c |
soup_uri_free (suri);
|
|
|
22d06c |
|
|
|
22d06c |
@@ -1647,8 +1703,8 @@ book_backend_webdav_try_password_sync (E
|
|
|
22d06c |
ESourceAuthentication *auth_extension;
|
|
|
22d06c |
ESourceAuthenticationResult result;
|
|
|
22d06c |
ESource *source;
|
|
|
22d06c |
- SoupMessage *message;
|
|
|
22d06c |
const gchar *extension_name;
|
|
|
22d06c |
+ GError *local_error = NULL;
|
|
|
22d06c |
|
|
|
22d06c |
source = e_backend_get_source (E_BACKEND (authenticator));
|
|
|
22d06c |
extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
|
|
|
22d06c |
@@ -1658,35 +1714,16 @@ book_backend_webdav_try_password_sync (E
|
|
|
22d06c |
e_source_authentication_dup_user (auth_extension);
|
|
|
22d06c |
webdav->priv->password = g_strdup (password->str);
|
|
|
22d06c |
|
|
|
22d06c |
- /* Send a PROPFIND to test whether user/password is correct. */
|
|
|
22d06c |
- message = send_propfind (webdav, cancellable);
|
|
|
22d06c |
-
|
|
|
22d06c |
- switch (message->status_code) {
|
|
|
22d06c |
- case SOUP_STATUS_OK:
|
|
|
22d06c |
- case SOUP_STATUS_MULTI_STATUS:
|
|
|
22d06c |
- result = E_SOURCE_AUTHENTICATION_ACCEPTED;
|
|
|
22d06c |
- break;
|
|
|
22d06c |
-
|
|
|
22d06c |
- case SOUP_STATUS_UNAUTHORIZED:
|
|
|
22d06c |
- case SOUP_STATUS_PROXY_UNAUTHORIZED: /* XXX really? */
|
|
|
22d06c |
- g_free (webdav->priv->username);
|
|
|
22d06c |
- webdav->priv->username = NULL;
|
|
|
22d06c |
- g_free (webdav->priv->password);
|
|
|
22d06c |
- webdav->priv->password = NULL;
|
|
|
22d06c |
- result = E_SOURCE_AUTHENTICATION_REJECTED;
|
|
|
22d06c |
- break;
|
|
|
22d06c |
-
|
|
|
22d06c |
- default:
|
|
|
22d06c |
- g_set_error (
|
|
|
22d06c |
- error, SOUP_HTTP_ERROR,
|
|
|
22d06c |
- message->status_code,
|
|
|
22d06c |
- "%s", message->reason_phrase);
|
|
|
22d06c |
- result = E_SOURCE_AUTHENTICATION_ERROR;
|
|
|
22d06c |
- break;
|
|
|
22d06c |
+ if (book_backend_webdav_test_can_connect (webdav, cancellable, &local_error)) {
|
|
|
22d06c |
+ result = E_SOURCE_AUTHENTICATION_ACCEPTED;
|
|
|
22d06c |
+ } else if (g_error_matches (local_error, E_CLIENT_ERROR, E_CLIENT_ERROR_AUTHENTICATION_FAILED)) {
|
|
|
22d06c |
+ result = E_SOURCE_AUTHENTICATION_REJECTED;
|
|
|
22d06c |
+ g_clear_error (&local_error);
|
|
|
22d06c |
+ } else {
|
|
|
22d06c |
+ result = E_SOURCE_AUTHENTICATION_ERROR;
|
|
|
22d06c |
+ g_propagate_error (error, local_error);
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
- g_object_unref (message);
|
|
|
22d06c |
-
|
|
|
22d06c |
return result;
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
diff -up evolution-data-server-3.8.5/calendar/backends/caldav/e-cal-backend-caldav.c.claim-missing-username evolution-data-server-3.8.5/calendar/backends/caldav/e-cal-backend-caldav.c
|
|
|
22d06c |
--- evolution-data-server-3.8.5/calendar/backends/caldav/e-cal-backend-caldav.c.claim-missing-username 2014-10-08 15:33:51.561159274 +0200
|
|
|
22d06c |
+++ evolution-data-server-3.8.5/calendar/backends/caldav/e-cal-backend-caldav.c 2014-10-08 15:33:51.568159208 +0200
|
|
|
22d06c |
@@ -565,18 +565,18 @@ status_code_to_result (SoupMessage *mess
|
|
|
22d06c |
priv->read_only = TRUE;
|
|
|
22d06c |
}
|
|
|
22d06c |
break;
|
|
|
22d06c |
- case 404:
|
|
|
22d06c |
+ case SOUP_STATUS_NOT_FOUND:
|
|
|
22d06c |
if (is_opening)
|
|
|
22d06c |
g_propagate_error (perror, EDC_ERROR (NoSuchCal));
|
|
|
22d06c |
else
|
|
|
22d06c |
g_propagate_error (perror, EDC_ERROR (ObjectNotFound));
|
|
|
22d06c |
break;
|
|
|
22d06c |
|
|
|
22d06c |
- case 403:
|
|
|
22d06c |
- g_propagate_error (perror, EDC_ERROR (AuthenticationFailed));
|
|
|
22d06c |
+ case SOUP_STATUS_FORBIDDEN:
|
|
|
22d06c |
+ g_propagate_error (perror, EDC_ERROR (AuthenticationRequired));
|
|
|
22d06c |
break;
|
|
|
22d06c |
|
|
|
22d06c |
- case 401:
|
|
|
22d06c |
+ case SOUP_STATUS_UNAUTHORIZED:
|
|
|
22d06c |
if (priv && priv->auth_required)
|
|
|
22d06c |
g_propagate_error (perror, EDC_ERROR (AuthenticationFailed));
|
|
|
22d06c |
else
|
|
|
22d06c |
@@ -1012,7 +1012,10 @@ soup_authenticate (SoupSession *session,
|
|
|
22d06c |
gchar *user;
|
|
|
22d06c |
|
|
|
22d06c |
user = e_source_authentication_dup_user (auth_extension);
|
|
|
22d06c |
- soup_auth_authenticate (auth, user, cbdav->priv->password);
|
|
|
22d06c |
+ if (!user || !*user)
|
|
|
22d06c |
+ soup_message_set_status (msg, SOUP_STATUS_FORBIDDEN);
|
|
|
22d06c |
+ else
|
|
|
22d06c |
+ soup_auth_authenticate (auth, user, cbdav->priv->password);
|
|
|
22d06c |
g_free (user);
|
|
|
22d06c |
}
|
|
|
22d06c |
}
|
|
|
22d06c |
@@ -2931,7 +2934,7 @@ caldav_do_open (ECalBackendSync *backend
|
|
|
22d06c |
|
|
|
22d06c |
open_calendar (cbdav, cancellable, &local_error);
|
|
|
22d06c |
|
|
|
22d06c |
- if (g_error_matches (local_error, E_DATA_CAL_ERROR, AuthenticationRequired) || g_error_matches (local_error, E_DATA_CAL_ERROR, AuthenticationFailed)) {
|
|
|
22d06c |
+ if (g_error_matches (local_error, E_DATA_CAL_ERROR, AuthenticationFailed)) {
|
|
|
22d06c |
g_clear_error (&local_error);
|
|
|
22d06c |
caldav_authenticate (
|
|
|
22d06c |
cbdav, FALSE, cancellable, perror);
|
|
|
22d06c |
diff -up evolution-data-server-3.8.5/calendar/backends/http/e-cal-backend-http.c.claim-missing-username evolution-data-server-3.8.5/calendar/backends/http/e-cal-backend-http.c
|
|
|
22d06c |
--- evolution-data-server-3.8.5/calendar/backends/http/e-cal-backend-http.c.claim-missing-username 2013-08-11 00:00:52.000000000 +0200
|
|
|
22d06c |
+++ evolution-data-server-3.8.5/calendar/backends/http/e-cal-backend-http.c 2014-10-08 15:33:51.568159208 +0200
|
|
|
22d06c |
@@ -91,6 +91,10 @@ soup_authenticate (SoupSession *session,
|
|
|
22d06c |
ESourceAuthentication *auth_extension;
|
|
|
22d06c |
ESource *source;
|
|
|
22d06c |
const gchar *extension_name;
|
|
|
22d06c |
+ gchar *user;
|
|
|
22d06c |
+
|
|
|
22d06c |
+ if (retrying)
|
|
|
22d06c |
+ return;
|
|
|
22d06c |
|
|
|
22d06c |
cbhttp = E_CAL_BACKEND_HTTP (data);
|
|
|
22d06c |
|
|
|
22d06c |
@@ -98,13 +102,14 @@ soup_authenticate (SoupSession *session,
|
|
|
22d06c |
extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
|
|
|
22d06c |
auth_extension = e_source_get_extension (source, extension_name);
|
|
|
22d06c |
|
|
|
22d06c |
- if (!retrying && cbhttp->priv->password != NULL) {
|
|
|
22d06c |
- gchar *user;
|
|
|
22d06c |
+ user = e_source_authentication_dup_user (auth_extension);
|
|
|
22d06c |
|
|
|
22d06c |
- user = e_source_authentication_dup_user (auth_extension);
|
|
|
22d06c |
+ if (!user || !*user)
|
|
|
22d06c |
+ soup_message_set_status (msg, SOUP_STATUS_FORBIDDEN);
|
|
|
22d06c |
+ else if (cbhttp->priv->password != NULL)
|
|
|
22d06c |
soup_auth_authenticate (auth, user, cbhttp->priv->password);
|
|
|
22d06c |
- g_free (user);
|
|
|
22d06c |
- }
|
|
|
22d06c |
+
|
|
|
22d06c |
+ g_free (user);
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
/* Dispose handler for the file backend */
|
|
|
22d06c |
@@ -790,6 +795,9 @@ begin_retrieval_cb (GIOSchedulerJob *job
|
|
|
22d06c |
E_BACKEND (backend),
|
|
|
22d06c |
E_SOURCE_AUTHENTICATOR (backend),
|
|
|
22d06c |
cancellable, &error);
|
|
|
22d06c |
+ } else if (g_error_matches (error, SOUP_HTTP_ERROR, SOUP_STATUS_FORBIDDEN)) {
|
|
|
22d06c |
+ g_clear_error (&error);
|
|
|
22d06c |
+ error = EDC_ERROR (AuthenticationRequired);
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
backend->priv->is_loading = FALSE;
|
|
|
22d06c |
@@ -948,8 +956,12 @@ e_cal_backend_http_open (ECalBackendSync
|
|
|
22d06c |
registry, source,
|
|
|
22d06c |
E_SOURCE_AUTHENTICATOR (backend),
|
|
|
22d06c |
cancellable, &local_error);
|
|
|
22d06c |
+ } else if (g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_FORBIDDEN)) {
|
|
|
22d06c |
+ g_clear_error (&local_error);
|
|
|
22d06c |
+ local_error = EDC_ERROR (AuthenticationRequired);
|
|
|
22d06c |
}
|
|
|
22d06c |
|
|
|
22d06c |
+
|
|
|
22d06c |
if (local_error != NULL)
|
|
|
22d06c |
g_propagate_error (perror, g_error_copy (local_error));
|
|
|
22d06c |
}
|