summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilan Crha <mcrha@redhat.com>2019-06-04 22:02:13 +0200
committerMilan Crha <mcrha@redhat.com>2019-06-04 22:02:13 +0200
commit91378c080cd8c352b56986931f9fb4bd1244ec67 (patch)
tree260288770618e7efa6026117aaa100430217e17c
parent5c77159e0cfdfc779ea85e12fa9f2eb7186336e1 (diff)
downloadevolution-data-server-91378c080cd8c352b56986931f9fb4bd1244ec67.tar.gz
I#121 - CalDAV-advertised subscribed WebCal is not imported
Closes https://gitlab.gnome.org/GNOME/evolution-data-server/issues/121
-rw-r--r--src/libebackend/e-webdav-collection-backend.c9
-rw-r--r--src/libedataserver/e-webdav-discover.c26
-rw-r--r--src/libedataserver/e-webdav-discover.h3
-rw-r--r--src/libedataserver/e-webdav-session.c29
-rw-r--r--src/libedataserver/e-webdav-session.h3
-rw-r--r--src/libedataserverui/e-webdav-discover-widget.c3
6 files changed, 54 insertions, 19 deletions
diff --git a/src/libebackend/e-webdav-collection-backend.c b/src/libebackend/e-webdav-collection-backend.c
index 26b30b2d4..d89fc737e 100644
--- a/src/libebackend/e-webdav-collection-backend.c
+++ b/src/libebackend/e-webdav-collection-backend.c
@@ -89,6 +89,7 @@ webdav_collection_add_found_source (ECollectionBackend *collection,
const gchar *display_name,
const gchar *color,
gboolean calendar_auto_schedule,
+ gboolean is_subscribed_icalendar,
GHashTable *known_sources)
{
ESourceRegistryServer *server;
@@ -135,6 +136,9 @@ webdav_collection_add_found_source (ECollectionBackend *collection,
g_return_if_fail (backend_name != NULL);
+ if (is_subscribed_icalendar && source_type != E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS)
+ provider = "webcal";
+
server = e_collection_backend_ref_server (collection);
if (!server)
return;
@@ -166,7 +170,9 @@ webdav_collection_add_found_source (ECollectionBackend *collection,
child_webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
resource = e_source_get_extension (source, E_SOURCE_EXTENSION_RESOURCE);
- e_source_authentication_set_user (child_auth, e_source_collection_get_identity (collection_extension));
+ if (!is_subscribed_icalendar)
+ e_source_authentication_set_user (child_auth, e_source_collection_get_identity (collection_extension));
+
e_source_webdav_set_soup_uri (child_webdav, uri);
e_source_resource_set_identity (resource, identity);
@@ -251,6 +257,7 @@ webdav_collection_process_discovered_sources (ECollectionBackend *collection,
webdav_collection_add_found_source (collection, source_types[ii], soup_uri,
discovered_source->display_name, discovered_source->color,
(discovered_source->supports & E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE) != 0,
+ (discovered_source->supports & E_WEBDAV_DISCOVER_SUPPORTS_SUBSCRIBED_ICALENDAR) != 0,
known_sources);
}
diff --git a/src/libedataserver/e-webdav-discover.c b/src/libedataserver/e-webdav-discover.c
index 16ac99ca6..6054b0861 100644
--- a/src/libedataserver/e-webdav-discover.c
+++ b/src/libedataserver/e-webdav-discover.c
@@ -39,6 +39,8 @@ typedef struct _WebDAVDiscoverData {
GError **error;
} WebDAVDiscoverData;
+#define CUSTOM_SUPPORTS_FLAGS (E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE | E_WEBDAV_DISCOVER_SUPPORTS_SUBSCRIBED_ICALENDAR)
+
static void
e_webdav_discover_split_resources (WebDAVDiscoverData *wdd,
const GSList *resources)
@@ -52,11 +54,12 @@ e_webdav_discover_split_resources (WebDAVDiscoverData *wdd,
if (resource && (
resource->kind == E_WEBDAV_RESOURCE_KIND_ADDRESSBOOK ||
- resource->kind == E_WEBDAV_RESOURCE_KIND_CALENDAR)) {
+ resource->kind == E_WEBDAV_RESOURCE_KIND_CALENDAR ||
+ resource->kind == E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR)) {
EWebDAVDiscoveredSource *discovered;
- if (resource->kind == E_WEBDAV_RESOURCE_KIND_CALENDAR &&
- (wdd->only_supports & (~E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE)) != E_WEBDAV_DISCOVER_SUPPORTS_NONE &&
+ if ((resource->kind == E_WEBDAV_RESOURCE_KIND_CALENDAR || resource->kind == E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR) &&
+ (wdd->only_supports & (~CUSTOM_SUPPORTS_FLAGS)) != E_WEBDAV_DISCOVER_SUPPORTS_NONE &&
(resource->supports & wdd->only_supports) == 0)
continue;
@@ -70,6 +73,9 @@ e_webdav_discover_split_resources (WebDAVDiscoverData *wdd,
if (resource->kind == E_WEBDAV_RESOURCE_KIND_ADDRESSBOOK) {
wdd->addressbooks = g_slist_prepend (wdd->addressbooks, discovered);
} else {
+ if (resource->kind == E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR)
+ discovered->supports |= E_WEBDAV_DISCOVER_SUPPORTS_SUBSCRIBED_ICALENDAR;
+
wdd->calendars = g_slist_prepend (wdd->calendars, discovered);
}
}
@@ -125,7 +131,7 @@ e_webdav_discover_traverse_propfind_response_cb (EWebDAVSession *webdav,
if (full_href && *full_href && !g_hash_table_contains (wdd->covered_hrefs, full_href) &&
e_webdav_session_list_sync (webdav, full_href, E_WEBDAV_DEPTH_THIS_AND_CHILDREN,
E_WEBDAV_LIST_SUPPORTS | E_WEBDAV_LIST_DISPLAY_NAME | E_WEBDAV_LIST_DESCRIPTION |
- E_WEBDAV_LIST_COLOR | E_WEBDAV_LIST_ONLY_ADDRESSBOOK,
+ E_WEBDAV_LIST_COLOR | E_WEBDAV_LIST_ONLY_ADDRESSBOOK | E_WEBDAV_LIST_ALL,
&resources, wdd->cancellable, &local_error)) {
e_webdav_discover_split_resources (wdd, resources);
g_slist_free_full (resources, e_webdav_resource_free);
@@ -165,7 +171,7 @@ e_webdav_discover_traverse_propfind_response_cb (EWebDAVSession *webdav,
if (full_href && *full_href && !g_hash_table_contains (wdd->covered_hrefs, full_href) &&
e_webdav_session_list_sync (webdav, full_href, E_WEBDAV_DEPTH_THIS_AND_CHILDREN,
E_WEBDAV_LIST_SUPPORTS | E_WEBDAV_LIST_DISPLAY_NAME | E_WEBDAV_LIST_DESCRIPTION |
- E_WEBDAV_LIST_COLOR | E_WEBDAV_LIST_ONLY_CALENDAR,
+ E_WEBDAV_LIST_COLOR | E_WEBDAV_LIST_ONLY_CALENDAR | E_WEBDAV_LIST_ALL,
&resources, wdd->cancellable, &local_error)) {
e_webdav_discover_split_resources (wdd, resources);
g_slist_free_full (resources, e_webdav_resource_free);
@@ -259,7 +265,7 @@ e_webdav_discover_traverse_propfind_response_cb (EWebDAVSession *webdav,
!g_cancellable_is_cancelled (wdd->cancellable) &&
e_webdav_session_list_sync (webdav, href, E_WEBDAV_DEPTH_THIS,
E_WEBDAV_LIST_SUPPORTS | E_WEBDAV_LIST_DISPLAY_NAME | E_WEBDAV_LIST_DESCRIPTION | E_WEBDAV_LIST_COLOR |
- (is_calendar ? E_WEBDAV_LIST_ONLY_CALENDAR : 0) | (is_addressbook ? E_WEBDAV_LIST_ONLY_ADDRESSBOOK : 0),
+ (is_calendar ? E_WEBDAV_LIST_ONLY_CALENDAR : 0) | (is_addressbook ? E_WEBDAV_LIST_ONLY_ADDRESSBOOK : 0) | E_WEBDAV_LIST_ALL,
&resources, wdd->cancellable, &local_error)) {
e_webdav_discover_split_resources (wdd, resources);
g_slist_free_full (resources, e_webdav_resource_free);
@@ -307,13 +313,13 @@ e_webdav_discover_propfind_uri_sync (EWebDAVSession *webdav,
e_xml_document_add_empty_element (xml, E_WEBDAV_NS_DAV, "principal-URL");
}
- if (((wdd->only_supports & (~E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
+ if (((wdd->only_supports & (~CUSTOM_SUPPORTS_FLAGS)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
(wdd->only_supports & (E_WEBDAV_DISCOVER_SUPPORTS_EVENTS | E_WEBDAV_DISCOVER_SUPPORTS_MEMOS | E_WEBDAV_DISCOVER_SUPPORTS_TASKS)) != 0)) {
e_xml_document_add_empty_element (xml, E_WEBDAV_NS_CALDAV, "calendar-home-set");
e_xml_document_add_empty_element (xml, E_WEBDAV_NS_CALDAV, "calendar-user-address-set");
}
- if (((wdd->only_supports & (~E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
+ if (((wdd->only_supports & (~CUSTOM_SUPPORTS_FLAGS)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
(wdd->only_supports & (E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS)) != 0)) {
e_xml_document_add_empty_element (xml, E_WEBDAV_NS_CARDDAV, "addressbook-home-set");
}
@@ -858,7 +864,7 @@ e_webdav_discover_sources_full_sync (ESource *source,
g_free (uri);
if (!g_cancellable_is_cancelled (cancellable) && !wdd.calendars &&
- ((only_supports & (~E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
+ ((only_supports & (~CUSTOM_SUPPORTS_FLAGS)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
(only_supports & (E_WEBDAV_DISCOVER_SUPPORTS_EVENTS | E_WEBDAV_DISCOVER_SUPPORTS_MEMOS | E_WEBDAV_DISCOVER_SUPPORTS_TASKS)) != 0) &&
(!soup_uri_get_path (soup_uri) || !strstr (soup_uri_get_path (soup_uri), "/.well-known/"))) {
gchar *saved_path;
@@ -887,7 +893,7 @@ e_webdav_discover_sources_full_sync (ESource *source,
}
if (!g_cancellable_is_cancelled (cancellable) && !wdd.addressbooks &&
- ((only_supports & (~E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
+ ((only_supports & (~CUSTOM_SUPPORTS_FLAGS)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE ||
(only_supports & (E_WEBDAV_DISCOVER_SUPPORTS_CONTACTS)) != 0) &&
(!soup_uri_get_path (soup_uri) || !strstr (soup_uri_get_path (soup_uri), "/.well-known/"))) {
gchar *saved_path;
diff --git a/src/libedataserver/e-webdav-discover.h b/src/libedataserver/e-webdav-discover.h
index a9df5c98f..623df891b 100644
--- a/src/libedataserver/e-webdav-discover.h
+++ b/src/libedataserver/e-webdav-discover.h
@@ -35,7 +35,8 @@ typedef enum {
E_WEBDAV_DISCOVER_SUPPORTS_EVENTS = E_WEBDAV_RESOURCE_SUPPORTS_EVENTS,
E_WEBDAV_DISCOVER_SUPPORTS_MEMOS = E_WEBDAV_RESOURCE_SUPPORTS_MEMOS,
E_WEBDAV_DISCOVER_SUPPORTS_TASKS = E_WEBDAV_RESOURCE_SUPPORTS_TASKS,
- E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE = E_WEBDAV_RESOURCE_SUPPORTS_LAST << 1
+ E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE = E_WEBDAV_RESOURCE_SUPPORTS_LAST << 1,
+ E_WEBDAV_DISCOVER_SUPPORTS_SUBSCRIBED_ICALENDAR = E_WEBDAV_DISCOVER_SUPPORTS_CALENDAR_AUTO_SCHEDULE << 1
} EWebDAVDiscoverSupports;
typedef struct _EWebDAVDiscoveredSource {
diff --git a/src/libedataserver/e-webdav-session.c b/src/libedataserver/e-webdav-session.c
index accf5db31..00535b9db 100644
--- a/src/libedataserver/e-webdav-session.c
+++ b/src/libedataserver/e-webdav-session.c
@@ -3367,6 +3367,12 @@ e_webdav_session_extract_kind (xmlXPathContextPtr xpath_ctx,
if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:resourcetype/C:calendar", xpath_prop_prefix))
return E_WEBDAV_RESOURCE_KIND_CALENDAR;
+ /* These are subscribed iCalendar files, aka 'On The Web' calendars */
+ if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:resourcetype/D:collection", xpath_prop_prefix) &&
+ e_xml_xpath_eval_exists (xpath_ctx, "%s/D:resourcetype/CS:subscribed", xpath_prop_prefix) &&
+ e_xml_xpath_eval_exists (xpath_ctx, "%s/CS:source/D:href", xpath_prop_prefix))
+ return E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR;
+
if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:resourcetype/D:principal", xpath_prop_prefix))
return E_WEBDAV_RESOURCE_KIND_PRINCIPAL;
@@ -3547,11 +3553,19 @@ e_webdav_session_list_cb (EWebDAVSession *webdav,
glong last_modified;
gchar *description;
gchar *color;
+ gchar *source_href = NULL;
kind = e_webdav_session_extract_kind (xpath_ctx, xpath_prop_prefix);
if (kind == E_WEBDAV_RESOURCE_KIND_UNKNOWN)
return TRUE;
+ if (kind == E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR) {
+ source_href = e_webdav_session_extract_nonempty (xpath_ctx, xpath_prop_prefix, "CS:source/D:href", NULL);
+
+ if (!source_href)
+ return TRUE;
+ }
+
supports = e_webdav_session_extract_supports (xpath_ctx, xpath_prop_prefix);
etag = e_webdav_session_extract_nonempty (xpath_ctx, xpath_prop_prefix, "D:getetag", "CS:getctag");
display_name = e_webdav_session_extract_nonempty (xpath_ctx, xpath_prop_prefix, "D:displayname", NULL);
@@ -3563,7 +3577,7 @@ e_webdav_session_list_cb (EWebDAVSession *webdav,
color = e_webdav_session_extract_nonempty (xpath_ctx, xpath_prop_prefix, "IC:calendar-color", NULL);
resource = e_webdav_resource_new (kind, supports,
- href,
+ source_href ? source_href : href,
NULL, /* etag */
NULL, /* display_name */
NULL, /* content_type */
@@ -3579,6 +3593,8 @@ e_webdav_session_list_cb (EWebDAVSession *webdav,
resource->color = color;
*out_resources = g_slist_prepend (*out_resources, resource);
+
+ g_free (source_href);
}
return TRUE;
@@ -3641,6 +3657,12 @@ e_webdav_session_list_sync (EWebDAVSession *webdav,
e_xml_document_add_empty_element (xml, NULL, "resourcetype");
+ if (calendar_props) {
+ e_xml_document_add_namespaces (xml, "CS", E_WEBDAV_NS_CALENDARSERVER, NULL);
+
+ e_xml_document_add_empty_element (xml, E_WEBDAV_NS_CALENDARSERVER, "source");
+ }
+
if (calendar_props && (
(flags & E_WEBDAV_LIST_SUPPORTS) != 0 ||
(flags & E_WEBDAV_LIST_DESCRIPTION) != 0 ||
@@ -3659,11 +3681,8 @@ e_webdav_session_list_sync (EWebDAVSession *webdav,
if ((flags & E_WEBDAV_LIST_ETAG) != 0) {
e_xml_document_add_empty_element (xml, NULL, "getetag");
- if (calendar_props) {
- e_xml_document_add_namespaces (xml, "CS", E_WEBDAV_NS_CALENDARSERVER, NULL);
-
+ if (calendar_props)
e_xml_document_add_empty_element (xml, E_WEBDAV_NS_CALENDARSERVER, "getctag");
- }
}
if ((flags & E_WEBDAV_LIST_CONTENT_TYPE) != 0) {
diff --git a/src/libedataserver/e-webdav-session.h b/src/libedataserver/e-webdav-session.h
index 397078506..a542d0d77 100644
--- a/src/libedataserver/e-webdav-session.h
+++ b/src/libedataserver/e-webdav-session.h
@@ -87,7 +87,8 @@ typedef enum {
E_WEBDAV_RESOURCE_KIND_CALENDAR,
E_WEBDAV_RESOURCE_KIND_PRINCIPAL,
E_WEBDAV_RESOURCE_KIND_COLLECTION,
- E_WEBDAV_RESOURCE_KIND_RESOURCE
+ E_WEBDAV_RESOURCE_KIND_RESOURCE,
+ E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR
} EWebDAVResourceKind;
typedef enum {
diff --git a/src/libedataserverui/e-webdav-discover-widget.c b/src/libedataserverui/e-webdav-discover-widget.c
index 83444d2db..1c5facfbd 100644
--- a/src/libedataserverui/e-webdav-discover-widget.c
+++ b/src/libedataserverui/e-webdav-discover-widget.c
@@ -473,7 +473,8 @@ e_webdav_discover_content_fill_discovered_sources (GtkTreeView *tree_view,
gboolean show_color = FALSE;
GdkRGBA rgba;
- if (!source || (supports_filter && (source->supports & supports_filter) == 0) || !source->display_name)
+ if (!source || (supports_filter && (source->supports & supports_filter) == 0) || !source->display_name ||
+ (source->supports & E_WEBDAV_DISCOVER_SUPPORTS_SUBSCRIBED_ICALENDAR) != 0)
continue;
if (source->color && *source->color) {