[evolution-data-server/gnome-3-26] Bug 793779 - Forward slash in UID breaks CardDAV backend



commit 37bf8a99c2bb89c50c74d77f3b962217ce07b5e8
Author: Milan Crha <mcrha redhat com>
Date:   Wed Feb 28 17:15:04 2018 +0100

    Bug 793779 - Forward slash in UID breaks CardDAV backend

 .../backends/webdav/e-book-backend-webdav.c        |   14 +++++++++++++-
 .../backends/caldav/e-cal-backend-caldav.c         |   13 ++++++++++++-
 2 files changed, 25 insertions(+), 2 deletions(-)
---
diff --git a/src/addressbook/backends/webdav/e-book-backend-webdav.c 
b/src/addressbook/backends/webdav/e-book-backend-webdav.c
index b4c3ecf..cf96393 100644
--- a/src/addressbook/backends/webdav/e-book-backend-webdav.c
+++ b/src/addressbook/backends/webdav/e-book-backend-webdav.c
@@ -787,7 +787,7 @@ ebb_webdav_uid_to_uri (EBookBackendWebDAV *bbdav,
 {
        ESourceWebdav *webdav_extension;
        SoupURI *soup_uri;
-       gchar *uri, *tmp, *filename;
+       gchar *uri, *tmp, *filename, *uid_hash = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_BACKEND_WEBDAV (bbdav), NULL);
        g_return_val_if_fail (uid != NULL, NULL);
@@ -796,6 +796,17 @@ ebb_webdav_uid_to_uri (EBookBackendWebDAV *bbdav,
        soup_uri = e_source_webdav_dup_soup_uri (webdav_extension);
        g_return_val_if_fail (soup_uri != NULL, NULL);
 
+       /* UIDs with forward slashes can cause trouble, because the destination server
+          can consider them as a path delimiter. For example Google book backend uses
+          URL as the contact UID. Double-encode the URL doesn't always work, thus
+          rather cause a mismatch between stored UID and its href on the server. */
+       if (strchr (uid, '/')) {
+               uid_hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, uid, -1);
+
+               if (uid_hash)
+                       uid = uid_hash;
+       }
+
        if (extension) {
                tmp = g_strconcat (uid, extension, NULL);
                filename = soup_uri_encode (tmp, NULL);
@@ -822,6 +833,7 @@ ebb_webdav_uid_to_uri (EBookBackendWebDAV *bbdav,
 
        soup_uri_free (soup_uri);
        g_free (filename);
+       g_free (uid_hash);
 
        return uri;
 }
diff --git a/src/calendar/backends/caldav/e-cal-backend-caldav.c 
b/src/calendar/backends/caldav/e-cal-backend-caldav.c
index 90b2bb0..de4f93d 100644
--- a/src/calendar/backends/caldav/e-cal-backend-caldav.c
+++ b/src/calendar/backends/caldav/e-cal-backend-caldav.c
@@ -918,7 +918,7 @@ ecb_caldav_uid_to_uri (ECalBackendCalDAV *cbdav,
 {
        ESourceWebdav *webdav_extension;
        SoupURI *soup_uri;
-       gchar *uri, *tmp, *filename;
+       gchar *uri, *tmp, *filename, *uid_hash = NULL;
 
        g_return_val_if_fail (E_IS_CAL_BACKEND_CALDAV (cbdav), NULL);
        g_return_val_if_fail (uid != NULL, NULL);
@@ -927,6 +927,16 @@ ecb_caldav_uid_to_uri (ECalBackendCalDAV *cbdav,
        soup_uri = e_source_webdav_dup_soup_uri (webdav_extension);
        g_return_val_if_fail (soup_uri != NULL, NULL);
 
+       /* UIDs with forward slashes can cause trouble, because the destination server can
+          consider them as a path delimiter. Double-encode the URL doesn't always work,
+          thus rather cause a mismatch between stored UID and its href on the server. */
+       if (strchr (uid, '/')) {
+               uid_hash = g_compute_checksum_for_string (G_CHECKSUM_SHA1, uid, -1);
+
+               if (uid_hash)
+                       uid = uid_hash;
+       }
+
        if (extension) {
                tmp = g_strconcat (uid, extension, NULL);
                filename = soup_uri_encode (tmp, NULL);
@@ -953,6 +963,7 @@ ecb_caldav_uid_to_uri (ECalBackendCalDAV *cbdav,
 
        soup_uri_free (soup_uri);
        g_free (filename);
+       g_free (uid_hash);
 
        return uri;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]