[evolution-data-server] google: Use CalDAV v2 if OAuth 2.0 support is available.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] google: Use CalDAV v2 if OAuth 2.0 support is available.
- Date: Tue, 9 Jul 2013 23:29:09 +0000 (UTC)
commit 13afda757c4ba8d558eaa64853849f2ad00a9806
Author: Matthew Barnes <mbarnes redhat com>
Date: Tue Jul 9 11:42:17 2013 -0400
google: Use CalDAV v2 if OAuth 2.0 support is available.
modules/google-backend/module-google-backend.c | 93 +++++++++++++++++++-----
1 files changed, 76 insertions(+), 17 deletions(-)
---
diff --git a/modules/google-backend/module-google-backend.c b/modules/google-backend/module-google-backend.c
index cbd7bd2..4ded74d 100644
--- a/modules/google-backend/module-google-backend.c
+++ b/modules/google-backend/module-google-backend.c
@@ -45,10 +45,16 @@
/* Calendar Configuration Details */
#define GOOGLE_CALENDAR_BACKEND_NAME "caldav"
-#define GOOGLE_CALENDAR_HOST "www.google.com"
-#define GOOGLE_CALENDAR_CALDAV_PATH "/calendar/dav/%s/events"
#define GOOGLE_CALENDAR_RESOURCE_ID "Calendar"
+/* CalDAV v1 Configuration Details */
+#define GOOGLE_CALDAV_V1_HOST "www.google.com"
+#define GOOGLE_CALDAV_V1_PATH "/calendar/dav/%s/events"
+
+/* CalDAV v2 Configuration Details */
+#define GOOGLE_CALDAV_V2_HOST "apidata.googleusercontent.com"
+#define GOOGLE_CALDAV_V2_PATH "/caldav/v2/%s/events"
+
/* Contacts Configuration Details */
#define GOOGLE_CONTACTS_BACKEND_NAME "google"
#define GOOGLE_CONTACTS_HOST "www.google.com"
@@ -95,6 +101,52 @@ G_DEFINE_DYNAMIC_TYPE (
E_TYPE_COLLECTION_BACKEND_FACTORY)
static void
+google_backend_calendar_update_auth_method (ESource *source)
+{
+ EOAuth2Support *oauth2_support;
+ ESourceAuthentication *auth_extension;
+ ESourceWebdav *webdav_extension;
+ const gchar *extension_name;
+ const gchar *host;
+ const gchar *method;
+ const gchar *path_format;
+ gchar *path;
+ gchar *user;
+
+ oauth2_support = e_server_side_source_ref_oauth2_support (
+ E_SERVER_SIDE_SOURCE (source));
+
+ /* The host name and WebDAV resource path depend on the
+ * authentication method used, so update those here too. */
+
+ if (oauth2_support != NULL) {
+ method = "OAuth2";
+ host = GOOGLE_CALDAV_V2_HOST;
+ path_format = GOOGLE_CALDAV_V2_PATH;
+ } else {
+ method = "plain/password";
+ host = GOOGLE_CALDAV_V1_HOST;
+ path_format = GOOGLE_CALDAV_V1_PATH;
+ }
+
+ extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
+ auth_extension = e_source_get_extension (source, extension_name);
+ e_source_authentication_set_host (auth_extension, host);
+ e_source_authentication_set_method (auth_extension, method);
+
+ extension_name = E_SOURCE_EXTENSION_WEBDAV_BACKEND;
+ webdav_extension = e_source_get_extension (source, extension_name);
+
+ user = e_source_authentication_dup_user (auth_extension);
+ path = g_strdup_printf (path_format, (user != NULL) ? user : "");
+ e_source_webdav_set_resource_path (webdav_extension, path);
+ g_free (path);
+ g_free (user);
+
+ g_clear_object (&oauth2_support);
+}
+
+static void
google_backend_contacts_update_auth_method (ESource *source)
{
EOAuth2Support *oauth2_support;
@@ -123,14 +175,16 @@ google_backend_add_calendar (ECollectionBackend *backend)
ESourceCollection *collection_extension;
const gchar *backend_name;
const gchar *extension_name;
- const gchar *identity;
const gchar *resource_id;
- gchar *path;
/* FIXME As a future enhancement, we should query Google
* for a list of user calendars and add them to the
* collection with matching display names and colors. */
+ /* NOTE: Host name and WebDAV resource path are set in
+ * google_backend_calendar_update_auth_method(),
+ * since they depend on the auth method used. */
+
collection_source = e_backend_get_source (E_BACKEND (backend));
resource_id = GOOGLE_CALENDAR_RESOURCE_ID;
@@ -153,15 +207,15 @@ google_backend_add_calendar (ECollectionBackend *backend)
extension_name = E_SOURCE_EXTENSION_AUTHENTICATION;
extension = e_source_get_extension (source, extension_name);
- e_source_authentication_set_host (
- E_SOURCE_AUTHENTICATION (extension),
- GOOGLE_CALENDAR_HOST);
-
g_object_bind_property (
collection_extension, "identity",
extension, "user",
G_BINDING_SYNC_CREATE);
+ /* Make sure the WebDAV resource path is up-to-date, since
+ * it's built from the "user" property that we just set. */
+ google_backend_calendar_update_auth_method (source);
+
extension_name = E_SOURCE_EXTENSION_SECURITY;
extension = e_source_get_extension (source, extension_name);
@@ -181,15 +235,6 @@ google_backend_add_calendar (ECollectionBackend *backend)
g_free (today);
}
- extension_name = E_SOURCE_EXTENSION_WEBDAV_BACKEND;
- extension = e_source_get_extension (source, extension_name);
-
- identity = e_source_collection_get_identity (collection_extension);
- path = g_strdup_printf (GOOGLE_CALENDAR_CALDAV_PATH, identity);
- e_source_webdav_set_resource_path (
- E_SOURCE_WEBDAV (extension), path);
- g_free (path);
-
server = e_collection_backend_ref_server (backend);
e_source_registry_server_add_source (server, source);
g_object_unref (server);
@@ -336,6 +381,20 @@ google_backend_child_added (ECollectionBackend *backend,
collection_identity);
}
+ /* Keep the calendar authentication method up-to-date.
+ *
+ * XXX Not using a property binding here in case I end up adding
+ * other "support" interfaces which influence authentication.
+ * Many-to-one property bindinds tend not to work so well. */
+ extension_name = E_SOURCE_EXTENSION_CALENDAR;
+ if (e_source_has_extension (child_source, extension_name)) {
+ google_backend_calendar_update_auth_method (child_source);
+ g_signal_connect (
+ child_source, "notify::oauth2-support",
+ G_CALLBACK (google_backend_calendar_update_auth_method),
+ NULL);
+ }
+
/* Keep the contacts authentication method up-to-date.
*
* XXX Not using a property binding here in case I end up adding
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]