summaryrefslogtreecommitdiff
path: root/extra/evolution-data-server/fix-google-2fa-2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extra/evolution-data-server/fix-google-2fa-2.patch')
-rw-r--r--extra/evolution-data-server/fix-google-2fa-2.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/extra/evolution-data-server/fix-google-2fa-2.patch b/extra/evolution-data-server/fix-google-2fa-2.patch
new file mode 100644
index 000000000..d178cd0af
--- /dev/null
+++ b/extra/evolution-data-server/fix-google-2fa-2.patch
@@ -0,0 +1,86 @@
+From 54e876d3fc25ec59c58beda915a8c9d1f8d5f101 Mon Sep 17 00:00:00 2001
+From: Matthew Barnes <mbarnes@redhat.com>
+Date: Tue, 09 Jul 2013 21:06:16 +0000
+Subject: CalDAV: Add support for OAuth 2.0 authentication.
+
+---
+diff --git a/calendar/backends/caldav/e-cal-backend-caldav.c b/calendar/backends/caldav/e-cal-backend-caldav.c
+index 58c70b6..58f0654 100644
+--- a/calendar/backends/caldav/e-cal-backend-caldav.c
++++ b/calendar/backends/caldav/e-cal-backend-caldav.c
+@@ -968,6 +968,32 @@ parse_propfind_response (SoupMessage *message,
+ /* Authentication helpers for libsoup */
+
+ static void
++soup_authenticate_bearer (SoupSession *session,
++ SoupMessage *message,
++ SoupAuth *auth,
++ ESource *source)
++{
++ gchar *access_token = NULL;
++ gint expires_in_seconds = -1;
++ GError *local_error = NULL;
++
++ e_source_get_oauth2_access_token_sync (
++ source, NULL, &access_token,
++ &expires_in_seconds, &local_error);
++
++ e_soup_auth_bearer_set_access_token (
++ E_SOUP_AUTH_BEARER (auth),
++ access_token, expires_in_seconds);
++
++ if (local_error != NULL) {
++ g_warning ("%s: %s", G_STRFUNC, local_error->message);
++ g_error_free (local_error);
++ }
++
++ g_free (access_token);
++}
++
++static void
+ soup_authenticate (SoupSession *session,
+ SoupMessage *msg,
+ SoupAuth *auth,
+@@ -985,8 +1011,14 @@ soup_authenticate (SoupSession *session,
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+ auth_extension = e_source_get_extension (source, extension_name);
+
++ if (retrying)
++ return;
++
++ if (E_IS_SOUP_AUTH_BEARER (auth)) {
++ soup_authenticate_bearer (session, msg, auth, source);
++
+ /* do not send same password twice, but keep it for later use */
+- if (!retrying && cbdav->priv->password != NULL) {
++ } else if (cbdav->priv->password != NULL) {
+ gchar *user;
+
+ user = e_source_authentication_dup_user (auth_extension);
+@@ -5194,6 +5226,8 @@ cal_backend_caldav_constructed (GObject *object)
+ static void
+ e_cal_backend_caldav_init (ECalBackendCalDAV *cbdav)
+ {
++ SoupSessionFeature *feature;
++
+ cbdav->priv = E_CAL_BACKEND_CALDAV_GET_PRIVATE (cbdav);
+ cbdav->priv->session = soup_session_sync_new ();
+ g_object_set (
+@@ -5203,6 +5237,16 @@ e_cal_backend_caldav_init (ECalBackendCalDAV *cbdav)
+ SOUP_SESSION_SSL_USE_SYSTEM_CA_FILE, TRUE,
+ NULL);
+
++ /* XXX SoupAuthManager is public API as of libsoup 2.42, but
++ * this isn't worth bumping our libsoup requirement over.
++ * So get the SoupAuthManager GType by its type name. */
++ feature = soup_session_get_feature (
++ cbdav->priv->session,
++ g_type_from_name ("SoupAuthManager"));
++
++ /* Add the "Bearer" auth type to support OAuth 2.0. */
++ soup_session_feature_add_feature (feature, E_TYPE_SOUP_AUTH_BEARER);
++
+ cbdav->priv->proxy = e_proxy_new ();
+ e_proxy_setup_proxy (cbdav->priv->proxy);
+ g_signal_connect (cbdav->priv->proxy, "changed", G_CALLBACK (proxy_settings_changed), cbdav->priv);
+