Blame SOURCES/evolution-data-server-3.8.5-claim-missing-username.patch

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
 	}