Blame SOURCES/evolution-data-server-3.8.5-google-caldav-login.patch

22d06c
diff -up evolution-data-server-3.8.5/calendar/backends/caldav/e-cal-backend-caldav.c.google-caldav-login 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.google-caldav-login	2014-09-23 15:45:21.052427856 +0200
22d06c
+++ evolution-data-server-3.8.5/calendar/backends/caldav/e-cal-backend-caldav.c	2014-09-23 15:59:41.388393766 +0200
22d06c
@@ -5157,11 +5157,16 @@ caldav_source_authenticator_init (ESourc
22d06c
 /* ************************************************************************* */
22d06c
 /* ***************************** GObject Foo ******************************* */
22d06c
 
22d06c
+static void e_caldav_backend_initable_init (GInitableIface *interface);
22d06c
+
22d06c
 G_DEFINE_TYPE_WITH_CODE (
22d06c
 	ECalBackendCalDAV,
22d06c
 	e_cal_backend_caldav,
22d06c
 	E_TYPE_CAL_BACKEND_SYNC,
22d06c
 	G_IMPLEMENT_INTERFACE (
22d06c
+		G_TYPE_INITABLE,
22d06c
+		e_caldav_backend_initable_init)
22d06c
+	G_IMPLEMENT_INTERFACE (
22d06c
 		E_TYPE_SOURCE_AUTHENTICATOR,
22d06c
 		caldav_source_authenticator_init))
22d06c
 
22d06c
@@ -5244,11 +5249,82 @@ cal_backend_caldav_constructed (GObject
22d06c
 		constructed (object);
22d06c
 }
22d06c
 
22d06c
-static void
22d06c
-e_cal_backend_caldav_init (ECalBackendCalDAV *cbdav)
22d06c
+static gboolean
22d06c
+caldav_backend_initable_init (GInitable *initable,
22d06c
+			      GCancellable *cancellable,
22d06c
+			      GError **error)
22d06c
 {
22d06c
+	ECalBackendCalDAVPrivate *priv;
22d06c
 	SoupSessionFeature *feature;
22d06c
+	ESource *source;
22d06c
+	const gchar *extension_name;
22d06c
+	gchar *auth_method = NULL;
22d06c
+	gboolean success = TRUE;
22d06c
+
22d06c
+	priv = E_CAL_BACKEND_CALDAV_GET_PRIVATE (initable);
22d06c
+
22d06c
+	feature = soup_session_get_feature (
22d06c
+		priv->session, SOUP_TYPE_AUTH_MANAGER);
22d06c
+
22d06c
+	/* Add the "Bearer" auth type to support OAuth 2.0. */
22d06c
+	soup_session_feature_add_feature (feature, E_TYPE_SOUP_AUTH_BEARER);
22d06c
+
22d06c
+	/* Preload the SoupAuthManager with a valid "Bearer" token
22d06c
+	 * when using OAuth 2.0.  This avoids an extra unauthorized
22d06c
+	 * HTTP round-trip, which apparently Google doesn't like. */
22d06c
+
22d06c
+	source = e_backend_get_source (E_BACKEND (initable));
22d06c
+
22d06c
+	extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
22d06c
+	if (e_source_has_extension (source, extension_name)) {
22d06c
+		ESourceAuthentication *extension;
22d06c
+
22d06c
+		extension = e_source_get_extension (source, extension_name);
22d06c
+		auth_method = e_source_authentication_dup_method (extension);
22d06c
+	}
22d06c
+
22d06c
+	if (g_strcmp0 (auth_method, "OAuth2") == 0) {
22d06c
+		ESourceWebdav *extension;
22d06c
+		SoupAuth *soup_auth;
22d06c
+		SoupURI *soup_uri;
22d06c
+		gchar *access_token = NULL;
22d06c
+		gint expires_in_seconds = -1;
22d06c
+
22d06c
+		extension_name = E_SOURCE_EXTENSION_WEBDAV_BACKEND;
22d06c
+		extension = e_source_get_extension (source, extension_name);
22d06c
+		soup_uri = e_source_webdav_dup_soup_uri (extension);
22d06c
+
22d06c
+		soup_auth = g_object_new (
22d06c
+			E_TYPE_SOUP_AUTH_BEARER,
22d06c
+			SOUP_AUTH_HOST, soup_uri->host, NULL);
22d06c
+
22d06c
+		success = e_source_get_oauth2_access_token_sync (
22d06c
+			source, cancellable, &access_token,
22d06c
+			&expires_in_seconds, error);
22d06c
+
22d06c
+		if (success) {
22d06c
+			e_soup_auth_bearer_set_access_token (
22d06c
+				E_SOUP_AUTH_BEARER (soup_auth),
22d06c
+				access_token, expires_in_seconds);
22d06c
+
22d06c
+			soup_auth_manager_use_auth (
22d06c
+				SOUP_AUTH_MANAGER (feature),
22d06c
+				soup_uri, soup_auth);
22d06c
+		}
22d06c
 
22d06c
+		g_free (access_token);
22d06c
+		g_object_unref (soup_auth);
22d06c
+		soup_uri_free (soup_uri);
22d06c
+	}
22d06c
+
22d06c
+	g_free (auth_method);
22d06c
+
22d06c
+	return success;
22d06c
+}
22d06c
+
22d06c
+static void
22d06c
+e_cal_backend_caldav_init (ECalBackendCalDAV *cbdav)
22d06c
+{
22d06c
 	cbdav->priv = E_CAL_BACKEND_CALDAV_GET_PRIVATE (cbdav);
22d06c
 	cbdav->priv->session = soup_session_sync_new ();
22d06c
 	g_object_set (
22d06c
@@ -5258,15 +5334,6 @@ e_cal_backend_caldav_init (ECalBackendCa
22d06c
 		SOUP_SESSION_SSL_USE_SYSTEM_CA_FILE, TRUE,
22d06c
 		NULL);
22d06c
 
22d06c
-	/* XXX SoupAuthManager is public API as of libsoup 2.42, but
22d06c
-	 *     this isn't worth bumping our libsoup requirement over.
22d06c
-	 *     So get the SoupAuthManager GType by its type name. */
22d06c
-	feature = soup_session_get_feature (
22d06c
-		cbdav->priv->session,
22d06c
-		g_type_from_name ("SoupAuthManager"));
22d06c
-
22d06c
-	/* Add the "Bearer" auth type to support OAuth 2.0. */
22d06c
-	soup_session_feature_add_feature (feature, E_TYPE_SOUP_AUTH_BEARER);
22d06c
 
22d06c
 	cbdav->priv->proxy = e_proxy_new ();
22d06c
 	e_proxy_setup_proxy (cbdav->priv->proxy);
22d06c
@@ -5307,6 +5374,12 @@ e_cal_backend_caldav_init (ECalBackendCa
22d06c
 }
22d06c
 
22d06c
 static void
22d06c
+e_caldav_backend_initable_init (GInitableIface *interface)
22d06c
+{
22d06c
+	interface->init = caldav_backend_initable_init;
22d06c
+}
22d06c
+
22d06c
+static void
22d06c
 e_cal_backend_caldav_class_init (ECalBackendCalDAVClass *class)
22d06c
 {
22d06c
 	GObjectClass *object_class;
22d06c
diff -up evolution-data-server-3.8.5/libedataserver/e-source-webdav.c.google-caldav-login evolution-data-server-3.8.5/libedataserver/e-source-webdav.c
22d06c
--- evolution-data-server-3.8.5/libedataserver/e-source-webdav.c.google-caldav-login	2014-09-23 15:45:21.014427858 +0200
22d06c
+++ evolution-data-server-3.8.5/libedataserver/e-source-webdav.c	2014-09-23 15:45:21.083427855 +0200
22d06c
@@ -245,7 +245,9 @@ source_webdav_update_soup_uri_from_prope
22d06c
 
22d06c
 	soup_uri_set_user (soup_uri, user);
22d06c
 	soup_uri_set_host (soup_uri, host);
22d06c
-	soup_uri_set_port (soup_uri, port);
22d06c
+
22d06c
+	if (port > 0)
22d06c
+		soup_uri_set_port (soup_uri, port);
22d06c
 
22d06c
 	/* SoupURI doesn't like NULL paths. */
22d06c
 	soup_uri_set_path (soup_uri, (path != NULL) ? path : "");