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

Bug#771510: marked as done (Pre-approval for evolution-ews/3.12.9~git20141130.278fe7-1)



Your message dated Mon, 01 Dec 2014 18:57:09 +0000
with message-id <1417460229.2472.54.camel@adam-barratt.org.uk>
and subject line Re: Bug#771510: Pre-approval for evolution-ews/3.12.9~git20141130.278fe7-1
has caused the Debian Bug report #771510,
regarding Pre-approval for evolution-ews/3.12.9~git20141130.278fe7-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
771510: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771510
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Hi,

to end the series of Evolution last-minute bugfixes from git, here is 
evolution-ews. 

It also includes a packaging change, to help security support by using 
the system libmspack instead of the bundled one.

evolution-ews (3.12.9~git20141130.278fe7-1) UNRELEASED; urgency=medium

  * New upstream git snapshot from stable branch, includes only bugfixes 
    and translations.
  * Update evolution and e-d-s build-dependencies to 3.12.9~.
  * Require libmspack and stop building with the embedded code copy.

I’m attaching the upstream and Debian changes. Individual upstream 
patches can be found at:
https://git.gnome.org/browse/evolution-ews/log/?h=evolution-ews-3-12

unblock evolution-ews/3.12.9~git20141130.278fe7-1

Thanks for considering.
-- 
 .''`.        Josselin Mouette
: :' :
`. `'
  `-
diff --git a/NEWS b/NEWS
index dc05cf3..d5be244 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,13 @@
+Evolution-EWS 3.12.8 2014-11-10
+-------------------------------
+
+Bug Fixes:
+	Bug 738987 - Crash under e_ews_notification_unsubscribe_folder_sync() (Milan Crha)
+	Bug 691293 - Claim old resources in offline mode (Milan Crha)
+
+Miscellaneous:
+	Use G_IO_ERROR_CANCELLED instead of EWS_CONNECTION_ERROR_CANCELLED (Milan Crha)
+
 Evolution-EWS 3.12.7 2014-10-13
 -------------------------------
 
diff --git a/configure.ac b/configure.ac
index fd257d8..6430905 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
 dnl Evolution-EWS version
 m4_define([ews_major_version], [3])
 m4_define([ews_minor_version], [12])
-m4_define([ews_micro_version], [7])
+m4_define([ews_micro_version], [9])
 
 m4_define([ews_version],
 	[ews_major_version.ews_minor_version.ews_micro_version])
diff --git a/src/addressbook/e-book-backend-ews.c b/src/addressbook/e-book-backend-ews.c
index 1416db4..bd9ffb0 100644
--- a/src/addressbook/e-book-backend-ews.c
+++ b/src/addressbook/e-book-backend-ews.c
@@ -184,8 +184,6 @@ convert_error_to_edb_error (GError **perror)
 		case EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED:
 			error = EDB_ERROR_EX (AUTHENTICATION_FAILED, (*perror)->message);
 			break;
-		case EWS_CONNECTION_ERROR_CANCELLED:
-			break;
 		case EWS_CONNECTION_ERROR_FOLDERNOTFOUND:
 		case EWS_CONNECTION_ERROR_MANAGEDFOLDERNOTFOUND:
 		case EWS_CONNECTION_ERROR_PARENTFOLDERNOTFOUND:
@@ -3280,6 +3278,17 @@ e_book_backend_ews_start_view (EBookBackend *backend,
 			E_BACKEND (backend),
 			E_SOURCE_AUTHENTICATOR (backend),
 			cancellable, &error);
+		if (g_error_matches (error, EWS_CONNECTION_ERROR, EWS_CONNECTION_ERROR_NORESPONSE)) {
+			/* possibly server unreachable, try offline */
+			if (priv->summary)
+				e_book_sqlite_get_key_value_int (priv->summary, E_BOOK_SQL_IS_POPULATED_KEY, &is_populated, NULL);
+			if (is_populated) {
+				g_clear_error (&error);
+				fetch_from_offline (ebews, book_view, query, cancellable, &error);
+				goto out;
+			}
+		}
+
 		if (error != NULL)
 			goto out;
 	}
@@ -3861,7 +3870,7 @@ e_book_backend_ews_open_sync (EBookBackend *backend,
 	ews_settings = book_backend_ews_get_collection_settings (ebews);
 
 	PRIV_LOCK (priv);
-	need_to_authenticate = priv->cnc == NULL && e_backend_get_online (E_BACKEND (backend));
+	need_to_authenticate = priv->cnc == NULL && e_backend_is_destination_reachable (E_BACKEND (backend), cancellable, NULL);
 	PRIV_UNLOCK (priv);
 
 	if (need_to_authenticate &&
@@ -3889,11 +3898,6 @@ e_book_backend_ews_open_sync (EBookBackend *backend,
 	if (priv->listen_notifications)
 		ebews_listen_notifications_cb (ebews, NULL, ews_settings);
 
-	g_signal_connect_swapped (
-		priv->cnc,
-		"server-notification",
-		G_CALLBACK (ebews_server_notification_cb),
-		ebews);
 	PRIV_UNLOCK (priv);
 
 	g_signal_connect_swapped (
@@ -4111,6 +4115,12 @@ book_backend_ews_try_password_sync (ESourceAuthenticator *authenticator,
 		backend->priv->cnc = g_object_ref (connection);
 		backend->priv->is_writable = !backend->priv->is_gal;
 
+		g_signal_connect_swapped (
+			backend->priv->cnc,
+			"server-notification",
+			G_CALLBACK (ebews_server_notification_cb),
+			backend);
+
 		PRIV_UNLOCK (backend->priv);
 
 		e_backend_set_online (E_BACKEND (backend), TRUE);
diff --git a/src/calendar/e-cal-backend-ews-utils.c b/src/calendar/e-cal-backend-ews-utils.c
index f7e247d..8ad1229 100644
--- a/src/calendar/e-cal-backend-ews-utils.c
+++ b/src/calendar/e-cal-backend-ews-utils.c
@@ -123,13 +123,19 @@ e_cal_backend_ews_populate_windows_zones (void)
 		tokens = g_strsplit ((gchar *) ical, " ", 0);
 		tokens_len = g_strv_length (tokens);
 		if (tokens_len == 1) {
-			g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup ((gchar *) ical));
-			g_hash_table_insert (ical_to_msdn, g_strdup ((gchar *) ical), g_strdup ((gchar *) msdn));
+			if (!g_hash_table_lookup (msdn_to_ical, msdn))
+				g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup ((gchar *) ical));
+
+			if (!g_hash_table_lookup (ical_to_msdn, ical))
+				g_hash_table_insert (ical_to_msdn, g_strdup ((gchar *) ical), g_strdup ((gchar *) msdn));
 		} else {
 			gint j;
 			for (j = 0; j < tokens_len; j++) {
-				g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup (tokens[j]));
-				g_hash_table_insert (ical_to_msdn, g_strdup (tokens[j]), g_strdup ((gchar *) msdn));
+				if (!g_hash_table_lookup (msdn_to_ical, msdn))
+					g_hash_table_insert (msdn_to_ical, g_strdup ((gchar *) msdn), g_strdup (tokens[j]));
+
+				if (!g_hash_table_lookup (ical_to_msdn, tokens[j]))
+					g_hash_table_insert (ical_to_msdn, g_strdup (tokens[j]), g_strdup ((gchar *) msdn));
 			}
 		}
 
diff --git a/src/calendar/e-cal-backend-ews.c b/src/calendar/e-cal-backend-ews.c
index 69d802d..e2a6c02 100644
--- a/src/calendar/e-cal-backend-ews.c
+++ b/src/calendar/e-cal-backend-ews.c
@@ -190,8 +190,6 @@ convert_error_to_edc_error (GError **perror)
 		case EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED:
 			error = EDC_ERROR_EX (AuthenticationFailed, (*perror)->message);
 			break;
-		case EWS_CONNECTION_ERROR_CANCELLED:
-			break;
 		case EWS_CONNECTION_ERROR_FOLDERNOTFOUND:
 		case EWS_CONNECTION_ERROR_MANAGEDFOLDERNOTFOUND:
 		case EWS_CONNECTION_ERROR_PARENTFOLDERNOTFOUND:
@@ -445,6 +443,41 @@ e_cal_backend_ews_discard_alarm (ECalBackend *backend,
 		edad);
 }
 
+static gchar *
+cal_backend_ews_get_builtin_zone_object (const gchar *tzid)
+{
+	icalcomponent *icalcomp = NULL, *free_comp = NULL;
+	icaltimezone *zone;
+	gchar *object = NULL;
+
+	zone = icaltimezone_get_builtin_timezone (tzid);
+	if (!zone) {
+		icalcomp = free_comp = icaltzutil_fetch_timezone (tzid);
+	}
+
+	if (zone)
+		icalcomp = icaltimezone_get_component (zone);
+
+	if (icalcomp) {
+		icalcomponent *clone = icalcomponent_new_clone (icalcomp);
+		icalproperty *prop;
+
+		prop = icalcomponent_get_first_property (clone, ICAL_TZID_PROPERTY);
+		if (prop) {
+			/* change tzid to our, because the component has the buildin tzid */
+			icalproperty_set_tzid (prop, tzid);
+
+			object = icalcomponent_as_ical_string_r (clone);
+		}
+		icalcomponent_free (clone);
+	}
+
+	if (free_comp)
+		icalcomponent_free (free_comp);
+
+	return object;
+}
+
 static void
 e_cal_backend_ews_get_timezone (ECalBackend *backend,
                                 EDataCal *cal,
@@ -478,37 +511,21 @@ e_cal_backend_ews_get_timezone (ECalBackend *backend,
 				slashes++;
 		}
 
-		if (slashes == 1) {
-			icalcomponent *icalcomp = NULL, *free_comp = NULL;
+		if (slashes == 1)
+			object = cal_backend_ews_get_builtin_zone_object (tzid);
 
-			icaltimezone *zone = icaltimezone_get_builtin_timezone (tzid);
-			if (!zone) {
-				icalcomp = free_comp = icaltzutil_fetch_timezone (tzid);
+		if (!object) {
+			/* The timezone can be sometimes the Windows zone, try to convert it to libical */
+			const gchar *ical_location = e_cal_backend_ews_tz_util_get_ical_equivalent (tzid);
+			if (ical_location) {
+				object = cal_backend_ews_get_builtin_zone_object (ical_location);
 			}
-
-			if (zone)
-				icalcomp = icaltimezone_get_component (zone);
-
-			if (icalcomp) {
-				icalcomponent *clone = icalcomponent_new_clone (icalcomp);
-				icalproperty *prop;
-
-				prop = icalcomponent_get_first_property (clone, ICAL_TZID_PROPERTY);
-				if (prop) {
-					/* change tzid to our, because the component has the buildin tzid */
-					icalproperty_set_tzid (prop, tzid);
-
-					object = icalcomponent_as_ical_string_r (clone);
-					g_clear_error (&error);
-				}
-				icalcomponent_free (clone);
-			}
-
-			if (free_comp)
-				icalcomponent_free (free_comp);
 		}
 	}
 
+	if (!object && !error)
+		g_propagate_error (&error, e_data_cal_create_error (ObjectNotFound, NULL));
+
 	convert_error_to_edc_error (&error);
 	e_data_cal_respond_get_timezone (cal, context, error, object);
 	g_free (object);
@@ -782,7 +799,7 @@ e_cal_backend_ews_open (ECalBackend *backend,
 
 	need_to_authenticate =
 		(priv->cnc == NULL) &&
-		(e_backend_get_online (E_BACKEND (backend)));
+		(e_backend_is_destination_reachable (E_BACKEND (backend), cancellable, NULL));
 
 	PRIV_UNLOCK (priv);
 
@@ -801,12 +818,6 @@ e_cal_backend_ews_open (ECalBackend *backend,
 
 			if (priv->listen_notifications)
 				cbews_listen_notifications_cb (cbews, NULL, ews_settings);
-
-			g_signal_connect_swapped (
-				priv->cnc,
-				"server-notification",
-				G_CALLBACK (cbews_server_notification_cb),
-				cbews);
 		}
 		PRIV_UNLOCK (priv);
 	}
@@ -1308,6 +1319,8 @@ ews_create_attachments_cb (GObject *object,
 		if (error != NULL)
 			g_clear_error (&error);
 
+		e_cal_backend_ews_async_data_free (create_data);
+
 		return;
 	}
 
@@ -1353,7 +1366,7 @@ ews_create_attachments_cb (GObject *object,
 		modify_data->extra_comp = g_object_ref (create_data->extra_comp);
 		modify_data->cal = g_object_ref (create_data->cal);
 		modify_data->context = create_data->context;
-		modify_data->item_id = create_data->item_id;
+		modify_data->item_id = g_strdup (create_data->item_id);
 
 		convert_data.connection = create_data->cbews->priv->cnc;
 		convert_data.user_email = create_data->cbews->priv->user_email;
@@ -4249,6 +4262,12 @@ cal_backend_ews_try_password_sync (ESourceAuthenticator *authenticator,
 			g_object_unref (backend->priv->cnc);
 		backend->priv->cnc = g_object_ref (connection);
 
+		g_signal_connect_swapped (
+			backend->priv->cnc,
+			"server-notification",
+			G_CALLBACK (cbews_server_notification_cb),
+			backend);
+
 		PRIV_UNLOCK (backend->priv);
 
 		ews_start_sync (backend);
diff --git a/src/calendar/windowsZones.xml b/src/calendar/windowsZones.xml
index ce1fdc4..d3d197d 100644
--- a/src/calendar/windowsZones.xml
+++ b/src/calendar/windowsZones.xml
@@ -471,7 +471,7 @@ For terms of use, see http://www.unicode.org/copyright.html
 			<mapZone other="Pakistan Standard Time" territory="PK" type="Asia/Karachi"/>
 
 			<!-- (UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi -->
-			<mapZone other="India Standard Time" territory="001" type="Asia/Calcutta"/>
+			<mapZone other="India Standard Time" territory="001" type="Asia/Kolkata"/>
 			<mapZone other="India Standard Time" territory="IN" type="Asia/Calcutta"/>
 
 			<!-- (UTC+05:30) Sri Jayawardenepura -->
@@ -648,13 +648,6 @@ For terms of use, see http://www.unicode.org/copyright.html
 			<!-- (UTC+13:00) Samoa -->
 			<mapZone other="Samoa Standard Time" territory="001" type="Pacific/Apia"/>
 			<mapZone other="Samoa Standard Time" territory="WS" type="Pacific/Apia"/>
-
-			<!-- Internal fixes -->
-			<mapZone other="Argentina Standard Time" territory="AR" type="America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Jujuy America/Argentina/Catamarca America/Argentina/Mendoza"/>
-			<mapZone other="India Standard Time" territory="IN" type="Asia/Kolkata"/>
-			<mapZone other="Nepal Standard Time" territory="NP" type="Asia/Kathmandu"/>
-			<mapZone other="Eastern Standard Time" territory="US" type="America/Kentucky/Louisville"/>
-			<mapZone other="US Eastern Standard Time" territory="US" type="America/Indiana/Indianapolis"/>
 		</mapTimezones>
 	</windowsZones>
 </supplementalData>
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index f02a3ba..0e964bb 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -1884,7 +1884,18 @@ ews_append_message_sync (CamelFolder *folder,
 	e_ews_folder_id_free (fid);
 	g_free (folder_id);
 
-	camel_ews_summary_add_message (folder->summary, itemid, changekey, info, message);
+	if (camel_ews_summary_add_message (folder->summary, itemid, changekey, info, message)) {
+		CamelFolderChangeInfo *changes;
+
+		changes = camel_folder_change_info_new ();
+
+		camel_folder_change_info_add_uid (changes, itemid);
+
+		if (camel_folder_change_info_changed (changes))
+			camel_folder_changed (folder, changes);
+
+		camel_folder_change_info_free (changes);
+	}
 
 	if (appended_uid)
 		*appended_uid = itemid;
@@ -2008,8 +2019,8 @@ ews_transfer_messages_to_sync (CamelFolder *source,
 
 			clone = camel_message_info_clone (info);
 
-			camel_ews_summary_add_message (destination->summary, id->id, id->change_key, clone, message);
-			camel_folder_change_info_add_uid (changes, id->id);
+			if (camel_ews_summary_add_message (destination->summary, id->id, id->change_key, clone, message))
+				camel_folder_change_info_add_uid (changes, id->id);
 
 			camel_message_info_unref (clone);
 			camel_message_info_unref (info);
diff --git a/src/camel/camel-ews-store-summary.c b/src/camel/camel-ews-store-summary.c
index f5a999a..413a40d 100644
--- a/src/camel/camel-ews-store-summary.c
+++ b/src/camel/camel-ews-store-summary.c
@@ -14,7 +14,7 @@
 #define S_UNLOCK(x) (g_rec_mutex_unlock(&(x)->priv->s_lock))
 
 #define STORE_GROUP_NAME "##storepriv"
-#define CURRENT_SUMMARY_VERSION 1
+#define CURRENT_SUMMARY_VERSION 2
 
 struct _CamelEwsStoreSummaryPrivate {
 	GKeyFile *key_file;
diff --git a/src/camel/camel-ews-store.c b/src/camel/camel-ews-store.c
index 3029665..ad82405 100644
--- a/src/camel/camel-ews-store.c
+++ b/src/camel/camel-ews-store.c
@@ -1982,7 +1982,7 @@ get_public_folder_full_name (EEwsFolder *folder,
 	g_return_val_if_fail (folder != NULL, NULL);
 	g_return_val_if_fail (folders_by_id != NULL, NULL);
 
-	full_name = g_string_new (e_ews_folder_get_name (folder));
+	full_name = g_string_new (e_ews_folder_get_escaped_name (folder));
 	while (folder) {
 		parent_fid = e_ews_folder_get_parent_id (folder);
 		if (!parent_fid || !parent_fid->id)
@@ -1991,7 +1991,7 @@ get_public_folder_full_name (EEwsFolder *folder,
 		folder = g_hash_table_lookup (folders_by_id, parent_fid->id);
 		if (folder) {
 			g_string_prepend (full_name, "/");
-			g_string_prepend (full_name, e_ews_folder_get_name (folder));
+			g_string_prepend (full_name, e_ews_folder_get_escaped_name (folder));
 		}
 	}
 
@@ -3248,10 +3248,10 @@ ews_store_subscribe_folder_sync (CamelSubscribable *subscribable,
 
 		g_return_val_if_fail (parent_name != NULL, FALSE);
 
-		tmp = g_strconcat (parent_name, "/", e_ews_folder_get_name (folder), NULL);
+		tmp = g_strconcat (parent_name, "/", e_ews_folder_get_escaped_name (folder), NULL);
 		g_free (parent_name);
 	} else {
-		tmp = g_strconcat (EWS_PUBLIC_FOLDER_ROOT_DISPLAY_NAME, "/", e_ews_folder_get_name (folder), NULL);
+		tmp = g_strconcat (EWS_PUBLIC_FOLDER_ROOT_DISPLAY_NAME, "/", e_ews_folder_get_escaped_name (folder), NULL);
 	}
 
 	if (e_ews_folder_get_folder_type (folder) != E_EWS_FOLDER_TYPE_MAILBOX) {
diff --git a/src/camel/camel-ews-summary.c b/src/camel/camel-ews-summary.c
index 971e902..1f10cb2 100644
--- a/src/camel/camel-ews-summary.c
+++ b/src/camel/camel-ews-summary.c
@@ -273,7 +273,7 @@ ews_info_set_flags (CamelMessageInfo *info,
 	return CAMEL_FOLDER_SUMMARY_CLASS (camel_ews_summary_parent_class)->info_set_flags (info, flags, set);
 }
 
-void
+gboolean
 camel_ews_summary_add_message (CamelFolderSummary *summary,
                                const gchar *uid,
 			       const gchar *change_key,
@@ -284,13 +284,13 @@ camel_ews_summary_add_message (CamelFolderSummary *summary,
 	const CamelFlag *flag;
 	const CamelTag *tag;
 
-	g_return_if_fail (uid != NULL);
-	g_return_if_fail (info != NULL);
-	g_return_if_fail (message != NULL);
+	g_return_val_if_fail (uid != NULL, FALSE);
+	g_return_val_if_fail (info != NULL, FALSE);
+	g_return_val_if_fail (message != NULL, FALSE);
 
 	/* Create summary entry */
 	mi = (CamelEwsMessageInfo *) camel_folder_summary_info_new_from_message (summary, message, NULL);
-	g_return_if_fail (mi != NULL);
+	g_return_val_if_fail (mi != NULL, FALSE);
 
 	/* Set the change_key */
 	mi->change_key = g_strdup (change_key);
@@ -317,6 +317,8 @@ camel_ews_summary_add_message (CamelFolderSummary *summary,
 	camel_folder_summary_add (summary, (CamelMessageInfo *) mi);
 	camel_folder_summary_touch (summary);
 	camel_folder_summary_save_to_db (summary, NULL);
+
+	return TRUE;
 }
 
 static gboolean
diff --git a/src/camel/camel-ews-summary.h b/src/camel/camel-ews-summary.h
index b28d4e1..2d6cee1 100644
--- a/src/camel/camel-ews-summary.h
+++ b/src/camel/camel-ews-summary.h
@@ -88,7 +88,8 @@ gboolean
 					 CamelMessageInfo *info,
 					 guint32 server_flags,
 					 CamelFlag *server_user_flags);
-void	camel_ews_summary_add_message	(CamelFolderSummary *summary,
+gboolean
+	camel_ews_summary_add_message	(CamelFolderSummary *summary,
 					 const gchar *uid,
 					 const gchar *change_key,
 					 CamelMessageInfo *info,
diff --git a/src/camel/camel-ews-utils.c b/src/camel/camel-ews-utils.c
index c6996fd..8f3d7e1 100644
--- a/src/camel/camel-ews-utils.c
+++ b/src/camel/camel-ews-utils.c
@@ -48,6 +48,7 @@ camel_ews_utils_build_folder_info (CamelEwsStore *store,
 {
 	CamelEwsStoreSummary *ews_summary = store->summary;
 	CamelFolderInfo *fi;
+	gchar *folder_name;
 
 	fi = camel_folder_info_new ();
 	fi->full_name = camel_ews_store_summary_get_folder_full_name (
@@ -60,14 +61,14 @@ camel_ews_utils_build_folder_info (CamelEwsStore *store,
 		return NULL;
 	}
 
-	fi->display_name = camel_ews_store_summary_get_folder_name (
-		ews_summary, fid, NULL);
-	fi->flags = camel_ews_store_summary_get_folder_flags (
-		ews_summary, fid, NULL);
-	fi->unread = camel_ews_store_summary_get_folder_unread (
-		ews_summary, fid, NULL);
-	fi->total = camel_ews_store_summary_get_folder_total (
-		ews_summary, fid, NULL);
+	folder_name = camel_ews_store_summary_get_folder_name (ews_summary, fid, NULL);
+
+	fi->display_name = e_ews_folder_utils_unescape_name (folder_name);
+	fi->flags = camel_ews_store_summary_get_folder_flags (ews_summary, fid, NULL);
+	fi->unread = camel_ews_store_summary_get_folder_unread (ews_summary, fid, NULL);
+	fi->total = camel_ews_store_summary_get_folder_total (ews_summary, fid, NULL);
+
+	g_free (folder_name);
 
 	if (!(fi->flags & CAMEL_FOLDER_TYPE_MASK)) {
 		switch (camel_ews_store_summary_get_folder_type (ews_summary, fid, NULL)) {
diff --git a/src/collection/e-ews-backend.c b/src/collection/e-ews-backend.c
index 386e41d..42791e5 100644
--- a/src/collection/e-ews-backend.c
+++ b/src/collection/e-ews-backend.c
@@ -394,6 +394,7 @@ ews_backend_add_gal_source (EEwsBackend *backend)
 		g_object_unref (server);
 
 		if (source != NULL) {
+			e_source_set_enabled (source, TRUE);
 			g_object_unref (source);
 			return;
 		}
@@ -430,6 +431,7 @@ ews_backend_add_gal_source (EEwsBackend *backend)
 
 	source = e_collection_backend_new_child (
 		collection_backend, oal_id);
+	e_source_set_enabled (source, TRUE);
 
 	e_source_set_display_name (source, display_name);
 
@@ -463,48 +465,21 @@ ews_backend_add_gal_source (EEwsBackend *backend)
 	g_object_unref (source);
 }
 
+static void ews_backend_populate (ECollectionBackend *backend);
+
 static void
 ews_backend_source_changed_cb (ESource *source,
                                EEwsBackend *backend)
 {
-	CamelEwsSettings *settings;
-	const gchar *oal_selected;
-	const gchar *gal_uid;
-
 	if (!e_source_get_enabled (source)) {
 		backend->priv->need_update_folders = TRUE;
 		return;
 	}
 
-	if (!e_backend_get_online (E_BACKEND (backend)) ||
-	    !backend->priv->need_update_folders)
-		return;
-
-	settings = ews_backend_get_settings (backend);
-	gal_uid = camel_ews_settings_get_gal_uid (settings);
-	oal_selected = camel_ews_settings_get_oal_selected (settings);
-
-	if (g_strcmp0 (oal_selected, backend->priv->oal_selected) == 0)
+	if (!backend->priv->need_update_folders)
 		return;
 
-	/* Remove the old Global Address List source if present. */
-	if (gal_uid != NULL) {
-		ECollectionBackend *collection_backend;
-		ESourceRegistryServer *server;
-
-		collection_backend = E_COLLECTION_BACKEND (backend);
-		server = e_collection_backend_ref_server (collection_backend);
-		source = e_source_registry_server_ref_source (server, gal_uid);
-
-		if (source != NULL) {
-			e_source_registry_server_remove_source (server, source);
-			g_object_unref (source);
-		}
-
-		camel_ews_settings_set_gal_uid (settings, NULL);
-	}
-
-	ews_backend_add_gal_source (backend);
+	ews_backend_populate (E_COLLECTION_BACKEND (backend));
 }
 
 static void
@@ -652,6 +627,43 @@ ews_backend_constructed (GObject *object)
 }
 
 static void
+ews_backend_claim_old_resources (ECollectionBackend *backend)
+{
+	ESourceRegistryServer *registry;
+	GList *old_resources, *iter;
+
+	g_return_if_fail (E_IS_COLLECTION_BACKEND (backend));
+
+	registry = e_collection_backend_ref_server (backend);
+	old_resources = e_collection_backend_claim_all_resources (backend);
+
+	for (iter = old_resources; iter; iter = g_list_next (iter)) {
+		ESource *source = iter->data;
+
+		e_source_set_enabled (source, TRUE);
+		e_source_registry_server_add_source (registry, source);
+	}
+
+	g_list_free_full (old_resources, g_object_unref);
+	g_clear_object (&registry);
+}
+
+static void
+ews_backend_folders_synced_cb (GObject *source,
+			       GAsyncResult *result,
+			       gpointer user_data)
+{
+	EEwsBackend *ews_backend;
+
+	g_return_if_fail (E_IS_EWS_BACKEND (source));
+
+	ews_backend = E_EWS_BACKEND (source);
+
+	if (!e_ews_backend_sync_folders_finish (ews_backend, result, NULL))
+		ews_backend_claim_old_resources (E_COLLECTION_BACKEND (ews_backend));
+}
+
+static void
 ews_backend_populate (ECollectionBackend *backend)
 {
 	ESource *source;
@@ -661,20 +673,21 @@ ews_backend_populate (ECollectionBackend *backend)
 
 	ews_backend->priv->need_update_folders = TRUE;
 
-	/* do not do anything, if account is disabled */
-	if (!e_source_get_enabled (source))
-		return;
-
 	if (!ews_backend->priv->notify_online_id)
 		ews_backend->priv->notify_online_id = g_signal_connect (
 			backend, "notify::online",
 			G_CALLBACK (ews_backend_populate), NULL);
 
-	/* For now at least, we don't need to know the
-	 * results, so no callback function is needed. */
-	e_ews_backend_sync_folders (ews_backend, NULL, NULL, NULL);
+	/* do not do anything, if account is disabled */
+	if (!e_source_get_enabled (source))
+		return;
 
 	ews_backend_add_gal_source (ews_backend);
+
+	if (e_backend_get_online (E_BACKEND (backend)))
+		e_ews_backend_sync_folders (ews_backend, NULL, ews_backend_folders_synced_cb, NULL);
+	else
+		ews_backend_claim_old_resources (backend);
 }
 
 static gchar *
diff --git a/src/configuration/e-ews-subscribe-foreign-folder.c b/src/configuration/e-ews-subscribe-foreign-folder.c
index 2f6fba8..feeea71 100644
--- a/src/configuration/e-ews-subscribe-foreign-folder.c
+++ b/src/configuration/e-ews-subscribe-foreign-folder.c
@@ -124,8 +124,11 @@ add_foreign_folder_to_camel (CamelEwsStore *ews_store,
 			CAMEL_FOLDER_SUBSCRIBED, e_ews_folder_get_total_count (folder), TRUE, FALSE);
 	} else {
 		const gchar *displayname;
+		gchar *escaped_name;
 
-		fullname = g_strdup_printf ("%s/%s/%s", EWS_FOREIGN_FOLDER_ROOT_DISPLAY_NAME, mailbox, display_foldername);
+		escaped_name = e_ews_folder_utils_escape_name (display_foldername);
+		fullname = g_strdup_printf ("%s/%s/%s", EWS_FOREIGN_FOLDER_ROOT_DISPLAY_NAME, mailbox, escaped_name);
+		g_free (escaped_name);
 
 		/* make sure the path is unique */
 		camel_ews_store_ensure_unique_path (ews_store, &fullname);
diff --git a/src/configuration/e-mail-config-ews-delegates-page.c b/src/configuration/e-mail-config-ews-delegates-page.c
index ced835b..e837c25 100644
--- a/src/configuration/e-mail-config-ews-delegates-page.c
+++ b/src/configuration/e-mail-config-ews-delegates-page.c
@@ -1123,6 +1123,7 @@ mail_config_ews_delegates_page_constructed (GObject *object)
 		"responding to meeting requests. If you want to grant folder "
 		"permissions without giving send-on-behalf-of permissions, close this "
 		"dialog box, right-click the folder, click Permissions and change the options there."));
+	gtk_label_set_max_width_chars (GTK_LABEL (widget), 80);
 	gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
 	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
 	gtk_grid_attach (grid, widget, 0, row, 2, 1);
@@ -1170,6 +1171,7 @@ mail_config_ews_delegates_page_constructed (GObject *object)
 	widget = gtk_label_new (
 		_("Deliver meeting requests addressed to me and responses to meeting "
 		"requests where I am the organizer to:"));
+	gtk_label_set_max_width_chars (GTK_LABEL (widget), 80);
 	gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
 	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
 	gtk_grid_attach (grid, widget, 0, row, 2, 1);
diff --git a/src/configuration/e-mail-config-ews-ooo-page.c b/src/configuration/e-mail-config-ews-ooo-page.c
index a4a84e4..e882654 100644
--- a/src/configuration/e-mail-config-ews-ooo-page.c
+++ b/src/configuration/e-mail-config-ews-ooo-page.c
@@ -448,6 +448,7 @@ mail_config_ews_ooo_page_constructed (GObject *object)
 	text = _("The messages specified below will be automatically sent to "
 		 "each internal and external person who sends a mail to you.");
 	widget = gtk_label_new (text);
+	gtk_label_set_max_width_chars (GTK_LABEL (widget), 80);
 	gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
 	gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5);
 	gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 117f3bb..ad14f92 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -736,8 +736,8 @@ ews_cancel_request (GCancellable *cancellable,
 
 	g_simple_async_result_set_error (
 		simple,
-		EWS_CONNECTION_ERROR,
-		EWS_CONNECTION_ERROR_CANCELLED,
+		G_IO_ERROR,
+		G_IO_ERROR_CANCELLED,
 		_("Operation Cancelled"));
 	if (found) {
 		ews_connection_schedule_cancel_message (cnc, SOUP_MESSAGE (msg));
@@ -9403,14 +9403,15 @@ e_ews_connection_disable_notifications_sync (EEwsConnection *cnc,
 
 	e_ews_notification_stop_listening_sync (cnc->priv->notification);
 
-	g_clear_object (&cnc->priv->notification);
-
 	g_slist_free_full (cnc->priv->subscribed_folders, g_free);
 	cnc->priv->subscribed_folders = NULL;
 
 	g_hash_table_foreach (cnc->priv->subscriptions, ews_connection_build_subscribed_folders_list, cnc);
-	if (cnc->priv->subscribed_folders != NULL)
+	if (cnc->priv->subscribed_folders != NULL) {
 		e_ews_notification_start_listening_sync (cnc->priv->notification, cnc->priv->subscribed_folders);
+	} else {
+		g_clear_object (&cnc->priv->notification);
+	}
 
 exit:
 	NOTIFICATION_UNLOCK (cnc);
diff --git a/src/server/e-ews-folder.c b/src/server/e-ews-folder.c
index b4960c4..3a7e42c 100644
--- a/src/server/e-ews-folder.c
+++ b/src/server/e-ews-folder.c
@@ -38,6 +38,7 @@ G_DEFINE_TYPE (EEwsFolder, e_ews_folder, G_TYPE_OBJECT)
 struct _EEwsFolderPrivate {
 	GError *error;
 	gchar *name;
+	gchar *escaped_name;
 	EwsFolderId *fid;
 	EwsFolderId *parent_fid;
 	EEwsFolderType folder_type;
@@ -75,6 +76,9 @@ e_ews_folder_finalize (GObject *object)
 		priv->name = NULL;
 	}
 
+	g_free (priv->escaped_name);
+	priv->escaped_name = NULL;
+
 	if (priv->fid) {
 		g_free (priv->fid->id);
 		g_free (priv->fid->change_key);
@@ -184,8 +188,10 @@ e_ews_folder_set_from_soap_parameter (EEwsFolder *folder,
 	}
 
 	subparam = e_soap_parameter_get_first_child_by_name (node, "DisplayName");
-	if (subparam)
+	if (subparam) {
 		priv->name = e_soap_parameter_get_string_value (subparam);
+		priv->escaped_name = e_ews_folder_utils_escape_name (priv->name);
+	}
 
 	subparam = e_soap_parameter_get_first_child_by_name (node, "UnreadCount");
 	if (subparam)
@@ -381,7 +387,18 @@ e_ews_folder_set_name (EEwsFolder *folder,
 	priv = folder->priv;
 
 	g_free (priv->name);
+	g_free (priv->escaped_name);
+
 	priv->name = g_strdup (new_name);
+	priv->escaped_name = e_ews_folder_utils_escape_name (priv->name);
+}
+
+const gchar *
+e_ews_folder_get_escaped_name (const EEwsFolder *folder)
+{
+	g_return_val_if_fail (E_IS_EWS_FOLDER (folder), NULL);
+
+	return folder->priv->escaped_name;
 }
 
 const EwsFolderId *
@@ -486,6 +503,70 @@ e_ews_folder_set_foreign (EEwsFolder *folder,
 	folder->priv->foreign = is_foreign;
 }
 
+/* escapes backslashes with \5C and forward slashes with \2F */
+gchar *
+e_ews_folder_utils_escape_name (const gchar *folder_name)
+{
+	gint ii, jj, count = 0;
+	gchar *res;
+
+	if (!folder_name)
+		return NULL;
+
+	for (ii = 0; folder_name[ii]; ii++) {
+		if (folder_name[ii] == '\\' || folder_name[ii] == '/')
+			count++;
+	}
+
+	if (!count)
+		return g_strdup (folder_name);
+
+	res = g_malloc0 (sizeof (gchar *) * (1 + ii + (2 * count)));
+	for (ii = 0, jj = 0; folder_name[ii]; ii++, jj++) {
+		if (folder_name[ii] == '\\') {
+			res[jj] = '\\';
+			res[jj + 1] = '5';
+			res[jj + 2] = 'C';
+			jj += 2;
+		} else if (folder_name[ii] == '/') {
+			res[jj] = '\\';
+			res[jj + 1] = '2';
+			res[jj + 2] = 'F';
+			jj += 2;
+		} else {
+			res[jj] = folder_name[ii];
+		}
+	}
+
+	res[jj] = '\0';
+
+	return res;
+}
+
+/* reverses e_ews_folder_utils_escape_name() processing */
+gchar *
+e_ews_folder_utils_unescape_name (const gchar *escaped_folder_name)
+{
+	gchar *res = g_strdup (escaped_folder_name);
+	gint ii, jj;
+
+	if (!res)
+		return res;
+
+	for (ii = 0, jj = 0; res[ii]; ii++, jj++) {
+		if (res[ii] == '\\' && g_ascii_isxdigit (res[ii + 1]) && g_ascii_isxdigit (res[ii + 2])) {
+			res[jj] = ((g_ascii_xdigit_value (res[ii + 1]) & 0xF) << 4) | (g_ascii_xdigit_value (res[ii + 2]) & 0xF);
+			ii += 2;
+		} else if (ii != jj) {
+			res[jj] = res[ii];
+		}
+	}
+
+	res[jj] = '\0';
+
+	return res;
+}
+
 gchar *
 e_ews_folder_utils_pick_color_spec (gint move_by,
                                     gboolean around_middle)
diff --git a/src/server/e-ews-folder.h b/src/server/e-ews-folder.h
index 8bf4b41..21e9a58 100644
--- a/src/server/e-ews-folder.h
+++ b/src/server/e-ews-folder.h
@@ -63,6 +63,7 @@ gboolean	e_ews_folder_is_error (EEwsFolder *folder);
 const GError *	e_ews_folder_get_error (const EEwsFolder *folder);
 const gchar *	e_ews_folder_get_name (const EEwsFolder *folder);
 void		e_ews_folder_set_name (EEwsFolder *folder, const gchar *new_name);
+const gchar *	e_ews_folder_get_escaped_name (const EEwsFolder *folder);
 void		e_ews_folder_set_parent_id (EEwsFolder *folder, EwsFolderId *fid);
 const EwsFolderId *
 		e_ews_folder_get_parent_id (const EEwsFolder *folder);
@@ -87,6 +88,9 @@ gboolean	e_ews_folder_id_is_equal (const EwsFolderId *a,
 					  const EwsFolderId *b,
 					  gboolean check_change_key);
 
+gchar *		e_ews_folder_utils_escape_name			(const gchar *folder_name);
+gchar *		e_ews_folder_utils_unescape_name		(const gchar *escaped_folder_name);
+
 typedef enum {
 	E_EWS_ESOURCE_FLAG_NONE			= 0,
 	E_EWS_ESOURCE_FLAG_INCLUDE_SUBFOLDERS	= 1 << 0,
diff --git a/src/server/e-ews-notification.c b/src/server/e-ews-notification.c
index 1b5e37f..6e73ccf 100644
--- a/src/server/e-ews-notification.c
+++ b/src/server/e-ews-notification.c
@@ -202,6 +202,7 @@ ews_notification_dispose (GObject *object)
 		g_signal_handlers_disconnect_by_func (
 			priv->soup_session,
 			ews_notification_authenticate, object);
+		g_clear_object (&priv->soup_session);
 	}
 
 	if (priv->cancellable != NULL)
@@ -318,6 +319,10 @@ e_ews_notification_subscribe_folder_sync (EEwsNotification *notification,
 	g_return_val_if_fail (notification != NULL, FALSE);
 	g_return_val_if_fail (notification->priv != NULL, FALSE);
 
+	/* Can happen during process shutdown */
+	if (!notification->priv->connection)
+		return FALSE;
+
 	msg = e_ews_message_new_with_header (
 		e_ews_connection_get_uri (notification->priv->connection),
 		e_ews_connection_get_impersonate_user (notification->priv->connection),
@@ -435,6 +440,10 @@ e_ews_notification_unsubscribe_folder_sync (EEwsNotification *notification,
 	g_return_val_if_fail (notification != NULL, FALSE);
 	g_return_val_if_fail (notification->priv != NULL, FALSE);
 
+	/* Can happen during process shutdown */
+	if (!notification->priv->connection)
+		return FALSE;
+
 	msg = e_ews_message_new_with_header (
 		e_ews_connection_get_uri (notification->priv->connection),
 		e_ews_connection_get_impersonate_user (notification->priv->connection),
@@ -616,7 +625,8 @@ ews_notification_fire_events_from_response (EEwsNotification *notification,
 	}
 
 	if (events != NULL) {
-		g_signal_emit_by_name (notification->priv->connection, "server-notification", events);
+		if (notification->priv->connection)
+			g_signal_emit_by_name (notification->priv->connection, "server-notification", events);
 		g_slist_free_full (events, (GDestroyNotify) e_ews_notification_event_free);
 	}
 }
diff --git a/src/server/ews-errors.h b/src/server/ews-errors.h
index 93a3331..fc48ead 100644
--- a/src/server/ews-errors.h
+++ b/src/server/ews-errors.h
@@ -299,7 +299,6 @@ enum {
 	EWS_CONNECTION_ERROR_WIN32INTEROPERROR,
 	/* Below this point are no longer direct translations of EWS errors */
 	EWS_CONNECTION_ERROR_NORESPONSE,
-	EWS_CONNECTION_ERROR_CANCELLED,
 	EWS_CONNECTION_ERROR_AUTHENTICATION_FAILED,
 	EWS_CONNECTION_ERROR_UNKNOWN
 };
Index: debian/changelog
===================================================================
--- debian/changelog	(révision 2640)
+++ debian/changelog	(copie de travail)
@@ -1,3 +1,12 @@
+evolution-ews (3.12.9~git20141130.278fe7-1) UNRELEASED; urgency=medium
+
+  * New upstream git snapshot from stable branch, includes only bugfixes 
+    and translations.
+  * Update evolution and e-d-s build-dependencies to 3.12.9~.
+  * Require libmspack and stop building with the embedded code copy.
+
+ -- Josselin Mouette <joss@debian.org>  Sun, 30 Nov 2014 10:53:34 +0100
+
 evolution-ews (3.12.7-1) unstable; urgency=medium
 
   * Make sure to not build with -Bsymbolic-functions in LDFLAGS - this causes
Index: debian/rules
===================================================================
--- debian/rules	(révision 2640)
+++ debian/rules	(copie de travail)
@@ -14,8 +14,7 @@
 endif
 
 DEB_CONFIGURE_EXTRA_FLAGS += --with-krb5 \
-			     --enable-gtk-doc \
-			     --with-internal-lzx
+			     --enable-gtk-doc
 
 binary-install/evolution-ews::
 	find debian/evolution-ews -name \*.la -delete
Index: debian/control
===================================================================
--- debian/control	(révision 2640)
+++ debian/control	(copie de travail)
@@ -19,18 +19,19 @@
                cdbs (>= 0.4.37),
                gnome-pkg-tools,
                gtk-doc-tools (>= 1.9),
-               evolution-dev (>= 3.12.7),
-               evolution-data-server-dev (>= 3.12.7),
-               libcamel1.2-dev (>= 3.12.7),
-               libedataserver1.2-dev (>= 3.12.7),
-               libebackend1.2-dev (>= 3.12.7),
-               libecal1.2-dev (>= 3.12.7),
-               libedata-cal1.2-dev (>= 3.12.7),
-               libebook1.2-dev (>= 3.12.7),
-               libedata-book1.2-dev (>= 3.12.7),
+               evolution-dev (>= 3.12.9~),
+               evolution-data-server-dev (>= 3.12.9~),
+               libcamel1.2-dev (>= 3.12.9~),
+               libedataserver1.2-dev (>= 3.12.9~),
+               libebackend1.2-dev (>= 3.12.9~),
+               libecal1.2-dev (>= 3.12.9~),
+               libedata-cal1.2-dev (>= 3.12.9~),
+               libebook1.2-dev (>= 3.12.9~),
+               libedata-book1.2-dev (>= 3.12.9~),
                libglib2.0-dev (>= 2.32),
                libgtk-3-dev (>= 3.0),
                libical-dev,
+               libmspack-dev (>= 0.4),
                libkrb5-dev,
                libsoup2.4-dev (>= 2.42),
                intltool (>= 0.35.5),

--- End Message ---
--- Begin Message ---
On Mon, 2014-12-01 at 19:33 +0100, Josselin Mouette wrote:
> Control: tags -1 -moreinfo
> 
> Le dimanche 30 novembre 2014 à 16:44 +0000, Adam D. Barratt a écrit : 
> > > evolution-ews (3.12.9~git20141130.278fe7-1) UNRELEASED; urgency=medium
> > > 
> > >   * New upstream git snapshot from stable branch, includes only bugfixes 
> > >     and translations.
> > >   * Update evolution and e-d-s build-dependencies to 3.12.9~.
> > >   * Require libmspack and stop building with the embedded code copy.
> > 
> > Please go ahead, and ensure that the upload is in unstable before
> > December 5th, removing the "moreinfo" tag once the package has been
> > accepted.
> 
> There yo go.

Unblocked.

Regards,

Adam

--- End Message ---

Reply to: