summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2016-10-21 12:36:55 +0200
committerMilan Crha <mcrha@redhat.com>2016-10-21 12:36:55 +0200
commit6a0d2946b6c16b8e344709bdc3172a1f092bfecd (patch)
tree5f2f19fd5d810878b67617bfb11b4f7f37ae1a4b
parentd6d8a870a9e95c44f3c60198789d0307ded16c79 (diff)
downloadevolution-data-server-6a0d2946b6c16b8e344709bdc3172a1f092bfecd.tar.gz
Bug 773248 - [CalDAV] Google OAuth authentication can fail on refresh
-rw-r--r--src/calendar/backends/caldav/e-cal-backend-caldav.c80
1 files changed, 53 insertions, 27 deletions
diff --git a/src/calendar/backends/caldav/e-cal-backend-caldav.c b/src/calendar/backends/caldav/e-cal-backend-caldav.c
index f7b69db07..ddd4296b3 100644
--- a/src/calendar/backends/caldav/e-cal-backend-caldav.c
+++ b/src/calendar/backends/caldav/e-cal-backend-caldav.c
@@ -327,6 +327,40 @@ static void put_server_comp_to_cache (ECalBackendCalDAV *cbdav, icalcomponent *i
/* ************************************************************************* */
/* Misc. utility functions */
+static void
+caldav_ensure_bearer_auth_usage (ECalBackendCalDAV *cbdav,
+ ESoupAuthBearer *bearer)
+{
+ SoupSessionFeature *feature;
+ SoupURI *soup_uri;
+ ESourceWebdav *extension;
+ ESource *source;
+
+ g_return_if_fail (E_IS_CAL_BACKEND_CALDAV (cbdav));
+
+ source = e_backend_get_source (E_BACKEND (cbdav));
+
+ /* Preload the SoupAuthManager with a valid "Bearer" token
+ * when using OAuth 2.0. This avoids an extra unauthorized
+ * HTTP round-trip, which apparently Google doesn't like. */
+
+ feature = soup_session_get_feature (cbdav->priv->session, SOUP_TYPE_AUTH_MANAGER);
+
+ if (!soup_session_feature_has_feature (feature, E_TYPE_SOUP_AUTH_BEARER)) {
+ /* Add the "Bearer" auth type to support OAuth 2.0. */
+ soup_session_feature_add_feature (feature, E_TYPE_SOUP_AUTH_BEARER);
+ }
+
+ extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
+ soup_uri = e_source_webdav_dup_soup_uri (extension);
+
+ soup_auth_manager_use_auth (
+ SOUP_AUTH_MANAGER (feature),
+ soup_uri, SOUP_AUTH (bearer));
+
+ soup_uri_free (soup_uri);
+}
+
static gboolean
caldav_setup_bearer_auth (ECalBackendCalDAV *cbdav,
ESoupAuthBearer *bearer,
@@ -346,8 +380,10 @@ caldav_setup_bearer_auth (ECalBackendCalDAV *cbdav,
success = e_util_get_source_oauth2_access_token_sync (source, cbdav->priv->credentials,
&access_token, &expires_in_seconds, cancellable, error);
- if (success)
+ if (success) {
e_soup_auth_bearer_set_access_token (bearer, access_token, expires_in_seconds);
+ caldav_ensure_bearer_auth_usage (cbdav, bearer);
+ }
g_free (access_token);
@@ -359,11 +395,7 @@ caldav_maybe_prepare_bearer_auth (ECalBackendCalDAV *cbdav,
GCancellable *cancellable,
GError **error)
{
- ESourceWebdav *extension;
ESource *source;
- SoupSessionFeature *feature;
- SoupAuth *soup_auth;
- SoupURI *soup_uri;
gchar *auth_method = NULL;
gboolean success;
@@ -387,34 +419,28 @@ caldav_maybe_prepare_bearer_auth (ECalBackendCalDAV *cbdav,
g_free (auth_method);
- /* Preload the SoupAuthManager with a valid "Bearer" token
- * when using OAuth 2.0. This avoids an extra unauthorized
- * HTTP round-trip, which apparently Google doesn't like. */
-
- feature = soup_session_get_feature (cbdav->priv->session, SOUP_TYPE_AUTH_MANAGER);
+ if (cbdav->priv->using_bearer_auth) {
+ success = caldav_setup_bearer_auth (cbdav, cbdav->priv->using_bearer_auth, cancellable, error);
+ } else {
+ ESourceWebdav *extension;
+ SoupAuth *soup_auth;
+ SoupURI *soup_uri;
- /* Add the "Bearer" auth type to support OAuth 2.0. */
- soup_session_feature_add_feature (feature, E_TYPE_SOUP_AUTH_BEARER);
+ extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
+ soup_uri = e_source_webdav_dup_soup_uri (extension);
- extension = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
- soup_uri = e_source_webdav_dup_soup_uri (extension);
-
- soup_auth = g_object_new (
- E_TYPE_SOUP_AUTH_BEARER,
- SOUP_AUTH_HOST, soup_uri->host, NULL);
+ soup_auth = g_object_new (
+ E_TYPE_SOUP_AUTH_BEARER,
+ SOUP_AUTH_HOST, soup_uri->host, NULL);
- success = caldav_setup_bearer_auth (cbdav, E_SOUP_AUTH_BEARER (soup_auth), cancellable, error);
- if (success) {
- cbdav->priv->using_bearer_auth = g_object_ref (soup_auth);
+ success = caldav_setup_bearer_auth (cbdav, E_SOUP_AUTH_BEARER (soup_auth), cancellable, error);
+ if (success)
+ cbdav->priv->using_bearer_auth = g_object_ref (soup_auth);
- soup_auth_manager_use_auth (
- SOUP_AUTH_MANAGER (feature),
- soup_uri, soup_auth);
+ g_object_unref (soup_auth);
+ soup_uri_free (soup_uri);
}
- g_object_unref (soup_auth);
- soup_uri_free (soup_uri);
-
return success;
}