Hello community,

here is the log from the commit of package evolution-data-server for 
openSUSE:Factory checked in at 2019-06-24 21:50:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/evolution-data-server (Old)
 and      /work/SRC/openSUSE:Factory/.evolution-data-server.new.4615 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "evolution-data-server"

Mon Jun 24 21:50:51 2019 rev:203 rq:710950 version:3.32.3

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/evolution-data-server/evolution-data-server.changes  
    2019-05-10 09:16:15.472137047 +0200
+++ 
/work/SRC/openSUSE:Factory/.evolution-data-server.new.4615/evolution-data-server.changes
    2019-06-24 21:50:52.675990456 +0200
@@ -1,0 +2,40 @@
+Mon Jun 17 15:38:16 UTC 2019 - Bjørn Lie <[email protected]>
+
+- Update to version 3.32.3:
+  + [IMAPx]
+    - Fix a leak of CamelMessageInfo when downloading message from
+      a server.
+    - Prefer local search in folders fully synchronized for
+      offline.
+  + EDataBook/EDataCal: Flush GDBus connection on backend property
+    change.
+  + Add workaround for D-Bus property change into get-revision
+    tests.
+  + Expose E-Book/Cal-BackendSExp lock.
+  + Change buffer size argument value in call of
+    icalvalue_decode_ical_string().
+  + Update overdue time immediately after the reminders' window is
+    mapped.
+  + Correct test for file writable test in On This Computer
+    backend.
+  + CamelOperation can be used by other thread while in its
+    finalize().
+  + Change how CamelOfflineStore goes online.
+  + Bugs fixed: glgo#GNOME/evolution-data-server#108,
+    glgo#GNOME/evolution-data-server#112,
+    glgo#GNOME/evolution-data-server#114,
+    glgo#GNOME/evolution-data-server#116,
+    glgo#GNOME/evolution-data-server#123,
+    glgo#GNOME/evolution-data-server#190,
+    glgo#GNOME/evolution-data-server#479.
+- Drop eds-issue-108.patch: Fixed upstream.
+- Use modern cmake_build macro.
+
+-------------------------------------------------------------------
+Tue Jun  4 08:34:20 CEST 2019 - Matej Cepl <[email protected]>
+
+- Add eds-issue-108.patch: Folder changes could be claimed in a
+  wrong folder after APPEND, fixes glgo#GNOME/evolution#296,
+  glgo#GNOME/evolution-data-server#108.
+
+-------------------------------------------------------------------

Old:
----
  evolution-data-server-3.32.2.tar.xz

New:
----
  evolution-data-server-3.32.3.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ evolution-data-server.spec ++++++
--- /var/tmp/diff_new_pack.X1T5rn/_old  2019-06-24 21:50:53.947991445 +0200
+++ /var/tmp/diff_new_pack.X1T5rn/_new  2019-06-24 21:50:53.971991464 +0200
@@ -30,7 +30,7 @@
 %bcond_without introspection
 
 Name:           evolution-data-server
-Version:        3.32.2
+Version:        3.32.3
 Release:        0
 Summary:        Evolution Data Server
 License:        LGPL-2.0-only
@@ -285,7 +285,7 @@
     -DENABLE_INTROSPECTION=ON} \
     -DENABLE_DBUS_SESSION_TOOL=OFF \
     %{nil}
-%make_jobs
+%cmake_build
 
 %install
 %cmake_install

++++++ evolution-data-server-3.32.2.tar.xz -> 
evolution-data-server-3.32.3.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/evolution-data-server-3.32.2/CMakeLists.txt 
new/evolution-data-server-3.32.3/CMakeLists.txt
--- old/evolution-data-server-3.32.2/CMakeLists.txt     2019-05-06 
12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/CMakeLists.txt     2019-06-17 
15:21:44.000000000 +0200
@@ -4,7 +4,7 @@
 cmake_policy(VERSION 3.1)
 
 project(evolution-data-server
-       VERSION 3.32.2
+       VERSION 3.32.3
        LANGUAGES C CXX)
 set(CMAKE_CXX_STANDARD 14)
 set(PROJECT_BUGREPORT 
"https://gitlab.gnome.org/GNOME/evolution-data-server/issues/";)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/evolution-data-server-3.32.2/NEWS 
new/evolution-data-server-3.32.3/NEWS
--- old/evolution-data-server-3.32.2/NEWS       2019-05-06 12:16:15.000000000 
+0200
+++ new/evolution-data-server-3.32.3/NEWS       2019-06-17 15:21:44.000000000 
+0200
@@ -1,3 +1,27 @@
+Evolution-Data-Server 3.32.3 2019-06-17
+---------------------------------------
+
+Bug Fixes:
+       I#108 - [IMAPx] Folder changes could be claimed in a wrong folder after 
APPEND (Milan Crha)
+       I#112 - Credentials prompter re-asks for credentials of disabled 
accounts (Milan Crha)
+       I#114 - [IMAPx] Option to enable full folder update on metered networks 
(Milan Crha)
+       I#116 - [IMAPx] Correct handling of mailbox names (with RFC 6855 
extension) (Milan Crha)
+       I#123 - [SMTP] Ignore 8BITMIME extension for Yahoo! servers (Milan Crha)
+       I#190 - Does not show reminders after resume from suspend (Milan Crha)
+       evo-I#479 - Call mail account refresh also after going online (Milan 
Crha)
+
+Miscellaneous:
+       [IMAPx] Fix a leak of CamelMessageInfo when downloading message from a 
server (Milan Crha)
+       EDataBook/EDataCal: Flush GDBus connection on backend property change 
(Milan Crha)
+       Add workaround for D-Bus property change into get-revision tests (Milan 
Crha)
+       Expose E-Book/Cal-BackendSExp lock (Milan Crha)
+       Change buffer size argument value in call of 
icalvalue_decode_ical_string() (Milan Crha)
+       Update overdue time immediately after the reminders' window is mapped 
(Milan Crha)
+       Correct test for file writable test in On This Computer backend (Milan 
Crha)
+       CamelOperation can be used by other thread while in its finalize() 
(Milan Crha)
+       Change how CamelOfflineStore goes online (Milan Crha)
+       [IMAPx] Prefer local search in folders fully synchronized for offline 
(Milan Crha)
+
 Evolution-Data-Server 3.32.2 2019-05-06
 ---------------------------------------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/addressbook/backends/ldap/e-book-backend-ldap.c
 
new/evolution-data-server-3.32.3/src/addressbook/backends/ldap/e-book-backend-ldap.c
--- 
old/evolution-data-server-3.32.2/src/addressbook/backends/ldap/e-book-backend-ldap.c
        2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/addressbook/backends/ldap/e-book-backend-ldap.c
        2019-06-17 15:21:44.000000000 +0200
@@ -2291,8 +2291,6 @@
                if (ldap_error_msg)
                        ldap_memfree (ldap_error_msg);
 
-               g_warning ("search returned %d\n", ldap_error);
-
                if (ldap_error == LDAP_TIMELIMIT_EXCEEDED)
                        e_data_book_respond_get_contact_list (
                                op->book,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-book-backend-sexp.c
 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-book-backend-sexp.c
--- 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-book-backend-sexp.c
        2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-book-backend-sexp.c
        2019-06-17 15:21:44.000000000 +0200
@@ -45,6 +45,7 @@
        ESExp *search_sexp;
        gchar *text;
        SearchContext *search_context;
+       GRecMutex search_context_lock;
 };
 
 struct _SearchContext {
@@ -1090,6 +1091,8 @@
        g_free (priv->text);
        g_free (priv->search_context);
 
+       g_rec_mutex_clear (&priv->search_context_lock);
+
        /* Chain up to parent's finalize() method. */
        G_OBJECT_CLASS (e_book_backend_sexp_parent_class)->finalize (object);
 }
@@ -1110,6 +1113,8 @@
 {
        sexp->priv = E_BOOK_BACKEND_SEXP_GET_PRIVATE (sexp);
        sexp->priv->search_context = g_new (SearchContext, 1);
+
+       g_rec_mutex_init (&sexp->priv->search_context_lock);
 }
 
 /* 'builtin' functions */
@@ -1218,6 +1223,8 @@
        g_return_val_if_fail (E_IS_BOOK_BACKEND_SEXP (sexp), FALSE);
        g_return_val_if_fail (E_IS_CONTACT (contact), FALSE);
 
+       e_book_backend_sexp_lock (sexp);
+
        sexp->priv->search_context->contact = g_object_ref (contact);
 
        r = e_sexp_eval (sexp->priv->search_sexp);
@@ -1228,6 +1235,8 @@
 
        e_sexp_result_free (sexp->priv->search_sexp, r);
 
+       e_book_backend_sexp_unlock (sexp);
+
        return retval;
 }
 
@@ -1259,3 +1268,35 @@
        return retval;
 }
 
+/**
+ * e_book_backend_sexp_lock:
+ * @sexp: an #EBookBackendSExp
+ *
+ * Locks the @sexp. Other threads cannot use it until
+ * it's unlocked with e_book_backend_sexp_unlock().
+ *
+ * Since: 3.32.3
+ **/
+void
+e_book_backend_sexp_lock (EBookBackendSExp *sexp)
+{
+       g_return_if_fail (E_IS_BOOK_BACKEND_SEXP (sexp));
+
+       g_rec_mutex_lock (&sexp->priv->search_context_lock);
+}
+
+/**
+ * e_book_backend_sexp_unlock:
+ * @sexp: an #EBookBackendSExp
+ *
+ * Unlocks the @sexp, previously locked by e_book_backend_sexp_lock().
+ *
+ * Since: 3.32.3
+ **/
+void
+e_book_backend_sexp_unlock (EBookBackendSExp *sexp)
+{
+       g_return_if_fail (E_IS_BOOK_BACKEND_SEXP (sexp));
+
+       g_rec_mutex_unlock (&sexp->priv->search_context_lock);
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-book-backend-sexp.h
 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-book-backend-sexp.h
--- 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-book-backend-sexp.h
        2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-book-backend-sexp.h
        2019-06-17 15:21:44.000000000 +0200
@@ -84,6 +84,8 @@
 gboolean       e_book_backend_sexp_match_contact
                                                (EBookBackendSExp *sexp,
                                                 EContact *contact);
+void           e_book_backend_sexp_lock        (EBookBackendSExp *sexp);
+void           e_book_backend_sexp_unlock      (EBookBackendSExp *sexp);
 
 G_END_DECLS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-data-book-view.c
 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-data-book-view.c
--- 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-data-book-view.c
   2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-data-book-view.c
   2019-06-17 15:21:44.000000000 +0200
@@ -223,8 +223,16 @@
 {
        EDataBookView *view = data;
 
-       if (view->priv->running)
+       if (view->priv->running) {
+               /* To avoid race condition when one thread is starting the 
view, while
+                  another thread wants to notify about 
created/modified/removed objects. */
+               e_book_backend_sexp_lock (view->priv->sexp);
+
                e_book_backend_start_view (view->priv->backend, view);
+
+               e_book_backend_sexp_unlock (view->priv->sexp);
+       }
+
        g_object_unref (view);
 
        return NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-data-book.c 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-data-book.c
--- 
old/evolution-data-server-3.32.2/src/addressbook/libedata-book/e-data-book.c    
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/addressbook/libedata-book/e-data-book.c    
    2019-06-17 15:21:44.000000000 +0200
@@ -1856,6 +1856,12 @@
                g_strfreev (strv);
        }
 
+       /* Ensure the property change signal on the D-Bus is invoked 
immediately, not on idle */
+       g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON 
(dbus_interface));
+
+       if (book->priv->connection && !g_dbus_connection_is_closed 
(book->priv->connection))
+               g_dbus_connection_flush_sync (book->priv->connection, NULL, 
NULL);
+
        /* Disregard anything else. */
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/backends/file/e-cal-backend-file.c
 
new/evolution-data-server-3.32.3/src/calendar/backends/file/e-cal-backend-file.c
--- 
old/evolution-data-server-3.32.2/src/calendar/backends/file/e-cal-backend-file.c
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/calendar/backends/file/e-cal-backend-file.c
    2019-06-17 15:21:44.000000000 +0200
@@ -1380,7 +1380,7 @@
 
                        g_return_if_fail (str_uri != NULL);
 
-                       backend_writable = (g_access (str_uri, W_OK) != 0);
+                       backend_writable = (g_access (str_uri, W_OK) == 0);
 
                        g_free (str_uri);
                }
@@ -1772,7 +1772,7 @@
                                gsize buf_size;
                                gchar *buf;
 
-                               buf_size = strlen (url);
+                               buf_size = strlen (url) + 1;
                                buf = g_malloc0 (buf_size + 1);
 
                                icalvalue_decode_ical_string (url, buf, 
buf_size);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libecal/e-cal-component.c 
new/evolution-data-server-3.32.3/src/calendar/libecal/e-cal-component.c
--- old/evolution-data-server-3.32.2/src/calendar/libecal/e-cal-component.c     
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/calendar/libecal/e-cal-component.c     
2019-06-17 15:21:44.000000000 +0200
@@ -1558,7 +1558,7 @@
                         */
                        icalattach_ref (attachment->attach);
                        data = icalattach_get_url (attachment->attach);
-                       buf_size = strlen (data);
+                       buf_size = strlen (data) + 1;
                        buf = g_malloc0 (buf_size + 1);
                        icalvalue_decode_ical_string (data, buf, buf_size);
                } else if (attachment->prop) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libecal/e-reminder-watcher.c 
new/evolution-data-server-3.32.3/src/calendar/libecal/e-reminder-watcher.c
--- old/evolution-data-server-3.32.2/src/calendar/libecal/e-reminder-watcher.c  
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/calendar/libecal/e-reminder-watcher.c  
2019-06-17 15:21:44.000000000 +0200
@@ -1790,6 +1790,43 @@
 }
 
 static gboolean
+e_reminder_watcher_check_wall_clock_time_changed_cb (gpointer user_data)
+{
+       EReminderWatcher *watcher = user_data;
+       gint64 wall_clock_time;
+
+       if (g_source_is_destroyed (g_main_current_source ()))
+               return FALSE;
+
+       g_return_val_if_fail (E_IS_REMINDER_WATCHER (watcher), FALSE);
+
+       #define ADD_SECONDS(to, secs) ((to) + ((secs) * G_USEC_PER_SEC))
+
+       wall_clock_time = g_get_real_time ();
+
+       /* Use one second margin */
+       if (wall_clock_time > ADD_SECONDS 
(watcher->priv->expected_wall_clock_time, 1) ||
+           wall_clock_time < ADD_SECONDS 
(watcher->priv->expected_wall_clock_time, -1)) {
+               gint64 diff = (wall_clock_time - 
watcher->priv->expected_wall_clock_time) / 1000;
+
+               e_reminder_watcher_debug_print ("Current wall-clock time 
differs from expected by %" G_GINT64_FORMAT " ms, rescheduling reminders\n", 
diff);
+
+               /* To make sure the timer is re-scheduled */
+               watcher->priv->next_trigger = 0;
+
+               e_reminder_watcher_maybe_schedule_next_trigger (watcher, 0);
+
+               wall_clock_time = g_get_real_time ();
+       }
+
+       watcher->priv->expected_wall_clock_time = ADD_SECONDS (wall_clock_time, 
60);
+
+       #undef ADD_SECONDS
+
+       return TRUE;
+}
+
+static gboolean
 e_reminder_watcher_construct_idle_cb (gpointer user_data)
 {
        EReminderWatcher *watcher = user_data;
@@ -1815,6 +1852,15 @@
 
        e_source_registry_watcher_reclaim (watcher->priv->registry_watcher);
 
+       if (!watcher->priv->wall_clock_handler_id) {
+               /* Monotonic time doesn't change during hibernation, while the
+                * wall clock time does, thus check for wall clock time changes
+                * and reschedule alarms when it changes. */
+               watcher->priv->expected_wall_clock_time = g_get_real_time () + 
(60 * G_USEC_PER_SEC);
+               watcher->priv->wall_clock_handler_id = 
e_named_timeout_add_seconds (60,
+                       e_reminder_watcher_check_wall_clock_time_changed_cb, 
watcher);
+       }
+
        if (!watcher->priv->snoozed)
                watcher->priv->snoozed = e_reminder_watcher_reminders_from_key 
(watcher, "reminders-snoozed");
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-backend-sexp.c 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-backend-sexp.c
--- 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-backend-sexp.c 
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-backend-sexp.c 
    2019-06-17 15:21:44.000000000 +0200
@@ -43,7 +43,7 @@
        ESExp *search_sexp;
        gchar *text;
        SearchContext *search_context;
-       GMutex search_context_lock;
+       GRecMutex search_context_lock;
 };
 
 struct _SearchContext {
@@ -1128,7 +1128,7 @@
        g_object_unref (priv->search_sexp);
        g_free (priv->text);
        g_free (priv->search_context);
-       g_mutex_clear (&priv->search_context_lock);
+       g_rec_mutex_clear (&priv->search_context_lock);
 
        /* Chain up to parent's finalize() method. */
        G_OBJECT_CLASS (e_cal_backend_sexp_parent_class)->finalize (object);
@@ -1151,7 +1151,7 @@
        sexp->priv = E_CAL_BACKEND_SEXP_GET_PRIVATE (sexp);
        sexp->priv->search_context = g_new (SearchContext, 1);
 
-       g_mutex_init (&sexp->priv->search_context_lock);
+       g_rec_mutex_init (&sexp->priv->search_context_lock);
 }
 
 /* 'builtin' functions */
@@ -1278,7 +1278,7 @@
        g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), FALSE);
        g_return_val_if_fail (E_IS_TIMEZONE_CACHE (cache), FALSE);
 
-       g_mutex_lock (&sexp->priv->search_context_lock);
+       e_cal_backend_sexp_lock (sexp);
 
        sexp->priv->search_context->comp = g_object_ref (comp);
        sexp->priv->search_context->cache = g_object_ref (cache);
@@ -1292,7 +1292,7 @@
 
        e_sexp_result_free (sexp->priv->search_sexp, r);
 
-       g_mutex_unlock (&sexp->priv->search_context_lock);
+       e_cal_backend_sexp_unlock (sexp);
 
        return retval;
 }
@@ -1335,6 +1335,39 @@
 }
 
 /**
+ * e_cal_backend_sexp_lock:
+ * @sexp: an #ECalBackendSExp
+ *
+ * Locks the @sexp. Other threads cannot use it until
+ * it's unlocked with e_cal_backend_sexp_unlock().
+ *
+ * Since: 3.32.3
+ **/
+void
+e_cal_backend_sexp_lock (ECalBackendSExp *sexp)
+{
+       g_return_if_fail (E_IS_CAL_BACKEND_SEXP (sexp));
+
+       g_rec_mutex_lock (&sexp->priv->search_context_lock);
+}
+
+/**
+ * e_cal_backend_sexp_unlock:
+ * @sexp: an #ECalBackendSExp
+ *
+ * Unlocks the @sexp, previously locked by e_cal_backend_sexp_lock().
+ *
+ * Since: 3.32.3
+ **/
+void
+e_cal_backend_sexp_unlock (ECalBackendSExp *sexp)
+{
+       g_return_if_fail (E_IS_CAL_BACKEND_SEXP (sexp));
+
+       g_rec_mutex_unlock (&sexp->priv->search_context_lock);
+}
+
+/**
  * e_cal_backend_sexp_func_time_now:
  * @esexp: An #ESExp object.
  * @argc: Number of arguments.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-backend-sexp.h 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-backend-sexp.h
--- 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-backend-sexp.h 
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-backend-sexp.h 
    2019-06-17 15:21:44.000000000 +0200
@@ -84,6 +84,8 @@
 gboolean       e_cal_backend_sexp_match_comp   (ECalBackendSExp *sexp,
                                                 ECalComponent *comp,
                                                 ETimezoneCache *cache);
+void           e_cal_backend_sexp_lock         (ECalBackendSExp *sexp);
+void           e_cal_backend_sexp_unlock       (ECalBackendSExp *sexp);
 
 /* Default implementations of time functions for use by subclasses */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-cache.c 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-cache.c
--- old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-cache.c    
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-cache.c    
2019-06-17 15:21:44.000000000 +0200
@@ -3419,7 +3419,7 @@
                                gsize buf_size;
                                gchar *buf;
 
-                               buf_size = strlen (url);
+                               buf_size = strlen (url) + 1;
                                buf = g_malloc0 (buf_size + 1);
 
                                icalvalue_decode_ical_string (url, buf, 
buf_size);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-meta-backend.c 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-meta-backend.c
--- 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-cal-meta-backend.c 
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-cal-meta-backend.c 
    2019-06-17 15:21:44.000000000 +0200
@@ -2601,7 +2601,7 @@
                                gsize buf_size;
                                gchar *buf;
 
-                               buf_size = strlen (url);
+                               buf_size = strlen (url) + 1;
                                buf = g_malloc0 (buf_size + 1);
 
                                icalvalue_decode_ical_string (url, buf, 
buf_size);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-data-cal-view.c 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-data-cal-view.c
--- 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-data-cal-view.c    
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-data-cal-view.c    
    2019-06-17 15:21:44.000000000 +0200
@@ -179,8 +179,16 @@
 {
        EDataCalView *view = data;
 
-       if (view->priv->started && !view->priv->stopped)
+       if (view->priv->started && !view->priv->stopped) {
+               /* To avoid race condition when one thread is starting the 
view, while
+                  another thread wants to notify about 
created/modified/removed objects. */
+               e_cal_backend_sexp_lock (view->priv->sexp);
+
                e_cal_backend_start_view (view->priv->backend, view);
+
+               e_cal_backend_sexp_unlock (view->priv->sexp);
+       }
+
        g_object_unref (view);
 
        return NULL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-data-cal.c 
new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-data-cal.c
--- old/evolution-data-server-3.32.2/src/calendar/libedata-cal/e-data-cal.c     
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/calendar/libedata-cal/e-data-cal.c     
2019-06-17 15:21:44.000000000 +0200
@@ -2470,6 +2470,12 @@
        if (g_str_equal (prop_name, CAL_BACKEND_PROPERTY_DEFAULT_OBJECT))
                e_dbus_calendar_set_default_object (dbus_interface, prop_value);
 
+       /* Ensure the property change signal on the D-Bus is invoked 
immediately, not on idle */
+       g_dbus_interface_skeleton_flush (G_DBUS_INTERFACE_SKELETON 
(dbus_interface));
+
+       if (cal->priv->connection && !g_dbus_connection_is_closed 
(cal->priv->connection))
+               g_dbus_connection_flush_sync (cal->priv->connection, NULL, 
NULL);
+
        /* Disregard anything else. */
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/camel-mime-message.c 
new/evolution-data-server-3.32.3/src/camel/camel-mime-message.c
--- old/evolution-data-server-3.32.2/src/camel/camel-mime-message.c     
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/camel/camel-mime-message.c     
2019-06-17 15:21:44.000000000 +0200
@@ -860,13 +860,11 @@
        return src;
 }
 
-typedef gboolean (*CamelPartFunc)(CamelMimeMessage *message, CamelMimePart 
*part, CamelMimePart *parent_part, gpointer data);
-
 static gboolean
 message_foreach_part_rec (CamelMimeMessage *msg,
                           CamelMimePart *part,
                          CamelMimePart *parent_part,
-                          CamelPartFunc callback,
+                          CamelForeachPartFunc callback,
                           gpointer data)
 {
        CamelDataWrapper *containee;
@@ -896,14 +894,27 @@
        return go;
 }
 
-/* dont make this public yet, it might need some more thinking ... */
-/* MPZ */
-static void
-camel_mime_message_foreach_part (CamelMimeMessage *msg,
-                                 CamelPartFunc callback,
-                                 gpointer data)
+/**
+ * camel_mime_message_foreach_part:
+ * @message: a #CamelMimeMessage
+ * @callback: (scope call): a #CamelForeachPartFunc callback to call for each 
part
+ * @user_data: (closure callback): user data passed to the @callback
+ *
+ * Calls @callback for each part of the @message, including the message itself.
+ * The traverse of the @message parts can be stopped when the @callback
+ * returns %FALSE.
+ *
+ * Since: 3.32.3
+ **/
+void
+camel_mime_message_foreach_part (CamelMimeMessage *message,
+                                CamelForeachPartFunc callback,
+                                gpointer user_data)
 {
-       message_foreach_part_rec (msg, (CamelMimePart *) msg, NULL, callback, 
data);
+       g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message));
+       g_return_if_fail (callback != NULL);
+
+       message_foreach_part_rec (message, CAMEL_MIME_PART (message), NULL, 
callback, user_data);
 }
 
 static gboolean
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/camel-mime-message.h 
new/evolution-data-server-3.32.3/src/camel/camel-mime-message.h
--- old/evolution-data-server-3.32.2/src/camel/camel-mime-message.h     
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/camel/camel-mime-message.h     
2019-06-17 15:21:44.000000000 +0200
@@ -119,6 +119,29 @@
 const gchar *  camel_mime_message_get_source   (CamelMimeMessage *message);
 
 /* utility functions */
+
+/**
+ * CamelForeachPartFunc:
+ * @message: a #CamelMimeMessage
+ * @part: a #CamelMimePart, for which the function is called
+ * @parent_part: (nullable): a #CamelMimePart, parent of the @part; can be 
%NULL
+ * @user_data: user data, as passed to camel_mime_message_foreach_part()
+ *
+ * Callback used to traverse parts of the @message using 
camel_mime_message_foreach_part().
+ *
+ * Returns: %TRUE, when the traverse should continue, %FALSE to stop
+ *    traversing parts of the @message
+ *
+ * Since: 3.32.3
+ **/
+typedef gboolean (* CamelForeachPartFunc)      (CamelMimeMessage *message,
+                                                CamelMimePart *part,
+                                                CamelMimePart *parent_part,
+                                                gpointer user_data);
+
+void           camel_mime_message_foreach_part (CamelMimeMessage *message,
+                                                CamelForeachPartFunc callback,
+                                                gpointer user_data);
 gboolean       camel_mime_message_has_8bit_parts
                                                (CamelMimeMessage *message);
 void           camel_mime_message_set_best_encoding
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/camel-offline-store.c 
new/evolution-data-server-3.32.3/src/camel/camel-offline-store.c
--- old/evolution-data-server-3.32.2/src/camel/camel-offline-store.c    
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/camel/camel-offline-store.c    
2019-06-17 15:21:44.000000000 +0200
@@ -153,6 +153,15 @@
 {
        if (g_strcmp0 (pspec->name, "host-reachable") == 0)
                g_object_notify (object, "online");
+       else if (g_strcmp0 (pspec->name, "connection-status") == 0 &&
+                camel_service_get_connection_status (CAMEL_SERVICE (object)) 
== CAMEL_SERVICE_DISCONNECTED) {
+               CamelOfflineStore *store = CAMEL_OFFLINE_STORE (object);
+
+               if (store->priv->online) {
+                       store->priv->online = FALSE;
+                       g_object_notify (object, "online");
+               }
+       }
 
        /* Chain up to parent's notify() method. */
        G_OBJECT_CLASS (camel_offline_store_parent_class)->
@@ -275,7 +284,8 @@
                if (camel_service_get_connection_status (service) == 
CAMEL_SERVICE_CONNECTING)
                        return TRUE;
 
-               return camel_service_connect_sync (service, cancellable, error);
+               if (!camel_service_connect_sync (service, cancellable, error))
+                       return FALSE;
        }
 
        if (host_reachable) {
@@ -339,9 +349,11 @@
                        service, host_reachable, cancellable, error);
        }
 
-       store->priv->online = online;
+       if (store->priv->online != online) {
+               store->priv->online = online;
 
-       g_object_notify (G_OBJECT (store), "online");
+               g_object_notify (G_OBJECT (store), "online");
+       }
 
        return success;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/camel-operation.c 
new/evolution-data-server-3.32.3/src/camel/camel-operation.c
--- old/evolution-data-server-3.32.2/src/camel/camel-operation.c        
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/camel/camel-operation.c        
2019-06-17 15:21:44.000000000 +0200
@@ -148,7 +148,7 @@
 }
 
 static void
-operation_finalize (GObject *object)
+operation_dispose (GObject *object)
 {
        CamelOperationPrivate *priv;
 
@@ -168,14 +168,14 @@
        g_queue_remove (&operation_list, object);
 
        /* Because each StatusNode holds a reference to its
-        * CamelOperation, the fact that we're being finalized
+        * CamelOperation, the fact that we're being disposed
         * implies the stack should be empty now. */
        g_warn_if_fail (g_queue_is_empty (&priv->status_stack));
 
        UNLOCK ();
 
-       /* Chain up to parent's finalize() method. */
-       G_OBJECT_CLASS (camel_operation_parent_class)->finalize (object);
+       /* Chain up to parent's dispose() method. */
+       G_OBJECT_CLASS (camel_operation_parent_class)->dispose (object);
 }
 
 static void
@@ -186,7 +186,7 @@
        g_type_class_add_private (class, sizeof (CamelOperationPrivate));
 
        object_class = G_OBJECT_CLASS (class);
-       object_class->finalize = operation_finalize;
+       object_class->dispose = operation_dispose;
 
        signals[STATUS] = g_signal_new (
                "status",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-folder.c 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-folder.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-folder.c 
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-folder.c 
    2019-06-17 15:21:44.000000000 +0200
@@ -1408,7 +1408,6 @@
        CamelIMAPXStoreInfo *imapx_store_info;
        gchar *folder_path = NULL;
        gchar *mailbox_name = NULL;
-       gchar *pattern;
        gboolean success;
 
        g_return_val_if_fail (CAMEL_IS_IMAPX_FOLDER (folder), FALSE);
@@ -1449,13 +1448,9 @@
        /* Last resort is to issue a LIST command.  Maintainer should
         * monitor IMAP logs to make sure this is rarely if ever used. */
 
-       pattern = camel_utf8_utf7 (mailbox_name);
-
        /* This creates a mailbox instance from the LIST response. */
        conn_man = camel_imapx_store_get_conn_manager (imapx_store);
-       success = camel_imapx_conn_manager_list_sync (conn_man, pattern, 0, 
cancellable, error);
-
-       g_free (pattern);
+       success = camel_imapx_conn_manager_list_sync (conn_man, mailbox_name, 
0, cancellable, error);
 
        if (!success)
                goto exit;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-input-stream.c
 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-input-stream.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-input-stream.c
       2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-input-stream.c
       2019-06-17 15:21:44.000000000 +0200
@@ -46,6 +46,8 @@
 
        guchar *tokenbuf;
        guint bufsize;
+
+       gboolean utf8_accept;
 };
 
 /* Forward Declarations */
@@ -263,6 +265,7 @@
        is->priv->buf = g_malloc (is->priv->bufsize + 1);
        is->priv->ptr = is->priv->end = is->priv->buf;
        is->priv->tokenbuf = g_malloc (is->priv->bufsize + 1);
+       is->priv->utf8_accept = FALSE;
 }
 
 static void
@@ -329,6 +332,32 @@
        return is->priv->end - is->priv->ptr;
 }
 
+/*
+ * Returns whether the stream has enabled RFC 6855 extension,
+ * where strings like mailbox names are not encoded in UTF-7,
+ * but they are provided in UTF-8 directly.
+ */
+gboolean
+camel_imapx_input_stream_get_utf8_accept (CamelIMAPXInputStream *is)
+{
+       g_return_val_if_fail (CAMEL_IS_IMAPX_INPUT_STREAM (is), FALSE);
+
+       return is->priv->utf8_accept;
+}
+
+/*
+ * Sets whether the stream has enabled RFC 6855 extension. The default
+ * is FALSE.
+ */
+void
+camel_imapx_input_stream_set_utf8_accept (CamelIMAPXInputStream *is,
+                                         gboolean utf8_accept)
+{
+       g_return_if_fail (CAMEL_IS_IMAPX_INPUT_STREAM (is));
+
+       is->priv->utf8_accept = utf8_accept;
+}
+
 /* FIXME: these should probably handle it themselves,
  * and get rid of the token interface? */
 gboolean
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-input-stream.h
 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-input-stream.h
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-input-stream.h
       2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-input-stream.h
       2019-06-17 15:21:44.000000000 +0200
@@ -79,6 +79,11 @@
 GInputStream * camel_imapx_input_stream_new    (GInputStream *base_stream);
 gint           camel_imapx_input_stream_buffered
                                                (CamelIMAPXInputStream *is);
+gboolean       camel_imapx_input_stream_get_utf8_accept
+                                               (CamelIMAPXInputStream *is);
+void           camel_imapx_input_stream_set_utf8_accept
+                                               (CamelIMAPXInputStream *is,
+                                                gboolean utf8_accept);
 
 camel_imapx_token_t
                camel_imapx_input_stream_token  (CamelIMAPXInputStream *is,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-search.c 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-search.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-search.c 
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-search.c 
    2019-06-17 15:21:44.000000000 +0200
@@ -701,7 +701,8 @@
  * @search: a #CamelIMAPXSearch
  *
  * Returns a #CamelIMAPXStore to use for server-side searches,
- * or %NULL when the store is offline.
+ * or %NULL when the store is offline or when the current folder
+ * is synchronized for offline use.
  *
  * The returned #CamelIMAPXStore is referenced for thread-safety and
  * must be unreferenced with g_object_unref() when finished with it.
@@ -719,8 +720,27 @@
 
        imapx_store = g_weak_ref_get (&search->priv->imapx_store);
 
-       if (imapx_store && !camel_offline_store_get_online (CAMEL_OFFLINE_STORE 
(imapx_store)))
-               g_clear_object (&imapx_store);
+       if (imapx_store) {
+               if (!camel_offline_store_get_online (CAMEL_OFFLINE_STORE 
(imapx_store))) {
+                       g_clear_object (&imapx_store);
+               } else {
+                       CamelFolder *folder;
+
+                       folder = camel_folder_search_get_folder 
(CAMEL_FOLDER_SEARCH (search));
+
+                       if (CAMEL_IS_OFFLINE_FOLDER (folder) && 
camel_offline_folder_can_downsync (CAMEL_OFFLINE_FOLDER (folder))) {
+                               CamelSettings *settings;
+
+                               settings = camel_service_ref_settings 
(CAMEL_SERVICE (imapx_store));
+
+                               /* Downloads everything for the offline usage, 
thus search in the local cache only */
+                               if (settings && 
!camel_offline_settings_get_limit_by_age (CAMEL_OFFLINE_SETTINGS (settings)))
+                                       g_clear_object (&imapx_store);
+
+                               g_clear_object (&settings);
+                       }
+               }
+       }
 
        return imapx_store;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-server.c 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-server.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-server.c 
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-server.c 
    2019-06-17 15:21:44.000000000 +0200
@@ -3408,6 +3408,9 @@
                g_mutex_lock (&is->priv->stream_lock);
 
                is->priv->utf8_accept = TRUE;
+
+               if (CAMEL_IS_IMAPX_INPUT_STREAM (is->priv->input_stream))
+                       camel_imapx_input_stream_set_utf8_accept 
(CAMEL_IMAPX_INPUT_STREAM (is->priv->input_stream), TRUE);
        }
 
        if (CAMEL_IMAPX_HAVE_CAPABILITY (is->priv->cinfo, NAMESPACE)) {
@@ -4352,6 +4355,7 @@
        data_size = camel_message_info_get_size (mi);
        use_multi_fetch = data_size > MULTI_SIZE && 
camel_imapx_settings_get_use_multi_fetch (settings);
        g_object_unref (settings);
+       g_clear_object (&mi);
 
        g_warn_if_fail (is->priv->get_message_stream == NULL);
 
@@ -4848,6 +4852,7 @@
                                        if (camel_folder_change_info_changed 
(dest_changes)) {
                                                camel_folder_summary_touch 
(destination_summary);
                                                camel_folder_summary_save 
(destination_summary, NULL);
+                                               imapx_update_store_summary 
(destination_folder);
                                                camel_folder_changed 
(destination_folder, dest_changes);
                                        }
 
@@ -5103,6 +5108,7 @@
                if (ic->status && ic->status->condition == IMAPX_APPENDUID) {
                        c (is->priv->tagprefix, "Got appenduid %u %u\n", 
(guint32) ic->status->u.appenduid.uidvalidity, ic->status->u.appenduid.uid);
                        if (ic->status->u.appenduid.uidvalidity == uidvalidity) 
{
+                               CamelFolderChangeInfo *dest_changes;
                                gchar *uid;
 
                                uid = g_strdup_printf ("%u", 
ic->status->u.appenduid.uid);
@@ -5123,11 +5129,13 @@
 
                                camel_folder_summary_add 
(camel_folder_get_folder_summary (folder), clone, TRUE);
 
-                               g_mutex_lock (&is->priv->changes_lock);
-                               camel_folder_change_info_add_uid 
(is->priv->changes, camel_message_info_get_uid (clone));
-                               g_mutex_unlock (&is->priv->changes_lock);
+                               dest_changes = camel_folder_change_info_new ();
+                               camel_folder_change_info_add_uid (dest_changes, 
camel_message_info_get_uid (clone));
 
                                camel_folder_summary_save 
(camel_folder_get_folder_summary (folder), NULL);
+                               imapx_update_store_summary (folder);
+                               camel_folder_changed (folder, dest_changes);
+                               camel_folder_change_info_free (dest_changes);
 
                                if (appended_uid)
                                        *appended_uid = uid;
@@ -5450,12 +5458,25 @@
 camel_imapx_server_skip_old_flags_update (CamelStore *store)
 {
        CamelSession *session;
+       CamelSettings *settings;
        GNetworkMonitor *network_monitor;
        gboolean skip_old_flags_update = FALSE;
 
        if (!CAMEL_IS_STORE (store))
                return FALSE;
 
+       settings = camel_service_ref_settings (CAMEL_SERVICE (store));
+       if (settings) {
+               gboolean allow_update;
+
+               allow_update = 
camel_imapx_settings_get_full_update_on_metered_network (CAMEL_IMAPX_SETTINGS 
(settings));
+
+               g_object_unref (settings);
+
+               if (allow_update)
+                       return FALSE;
+       }
+
        session = camel_service_ref_session (CAMEL_SERVICE (store));
        if (!session)
                return skip_old_flags_update;
@@ -6386,7 +6407,7 @@
 
                                camel_folder_summary_remove_uids 
(folder_summary, removed);
                                camel_folder_summary_save (folder_summary, 
NULL);
-
+                               imapx_update_store_summary (folder);
                                camel_folder_changed (folder, changes);
                                camel_folder_change_info_free (changes);
 
@@ -6410,29 +6431,33 @@
 
 gboolean
 camel_imapx_server_list_sync (CamelIMAPXServer *is,
-                             const gchar *pattern,
+                             const gchar *in_pattern,
                              CamelStoreGetFolderInfoFlags flags,
                              GCancellable *cancellable,
                              GError **error)
 {
        CamelIMAPXCommand *ic;
+       gchar *utf7_pattern = NULL;
        gboolean success;
 
        g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (is), FALSE);
-       g_return_val_if_fail (pattern != NULL, FALSE);
+       g_return_val_if_fail (in_pattern != NULL, FALSE);
 
        g_warn_if_fail (is->priv->list_responses_hash == NULL);
        g_warn_if_fail (is->priv->list_responses == NULL);
        g_warn_if_fail (is->priv->lsub_responses == NULL);
 
+       if (!camel_imapx_server_get_utf8_accept (is))
+               utf7_pattern = camel_utf8_utf7 (in_pattern);
+
        if (is->priv->list_return_opts != NULL) {
                ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LIST, "LIST 
\"\" %s RETURN (%t)",
-                       pattern, is->priv->list_return_opts);
+                       utf7_pattern ? utf7_pattern : in_pattern, 
is->priv->list_return_opts);
        } else {
                is->priv->list_responses_hash = g_hash_table_new 
(camel_strcase_hash, camel_strcase_equal);
 
                ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LIST, "LIST 
\"\" %s",
-                       pattern);
+                       utf7_pattern ? utf7_pattern : in_pattern);
        }
 
        success = camel_imapx_server_process_command_sync (is, ic, _("Error 
fetching folders"), cancellable, error);
@@ -6441,13 +6466,15 @@
 
        if (success && !is->priv->list_return_opts) {
                ic = camel_imapx_command_new (is, CAMEL_IMAPX_JOB_LSUB, "LSUB 
\"\" %s",
-                       pattern);
+                       utf7_pattern ? utf7_pattern : in_pattern);
 
                success = camel_imapx_server_process_command_sync (is, ic, 
_("Error fetching subscribed folders"), cancellable, error);
 
                camel_imapx_command_unref (ic);
        }
 
+       g_free (utf7_pattern);
+
        if (is->priv->list_responses_hash) {
                CamelIMAPXStore *imapx_store;
                GSList *link;
@@ -6503,17 +6530,11 @@
        camel_imapx_command_unref (ic);
 
        if (success) {
-               gchar *utf7_pattern;
-
-               utf7_pattern = camel_utf8_utf7 (mailbox_name);
-
                /* List the new mailbox so we trigger our untagged
                 * LIST handler.  This simulates being notified of
                 * a newly-created mailbox, so we can just let the
                 * callback functions handle the bookkeeping. */
-               success = camel_imapx_server_list_sync (is, utf7_pattern, 0, 
cancellable, error);
-
-               g_free (utf7_pattern);
+               success = camel_imapx_server_list_sync (is, mailbox_name, 0, 
cancellable, error);
        }
 
        return success;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-settings.c
 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-settings.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-settings.c
   2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-settings.c
   2019-06-17 15:21:44.000000000 +0200
@@ -50,6 +50,7 @@
        gboolean use_subscriptions;
        gboolean ignore_other_users_namespace;
        gboolean ignore_shared_folders_namespace;
+       gboolean full_update_on_metered_network;
 
        CamelSortType fetch_order;
 };
@@ -81,7 +82,8 @@
        PROP_USE_SHELL_COMMAND,
        PROP_USE_SUBSCRIPTIONS,
        PROP_IGNORE_OTHER_USERS_NAMESPACE,
-       PROP_IGNORE_SHARED_FOLDERS_NAMESPACE
+       PROP_IGNORE_SHARED_FOLDERS_NAMESPACE,
+       PROP_FULL_UPDATE_ON_METERED_NETWORK
 };
 
 G_DEFINE_TYPE_WITH_CODE (
@@ -253,6 +255,12 @@
                                CAMEL_IMAPX_SETTINGS (object),
                                g_value_get_boolean (value));
                        return;
+
+               case PROP_FULL_UPDATE_ON_METERED_NETWORK:
+                       camel_imapx_settings_set_full_update_on_metered_network 
(
+                               CAMEL_IMAPX_SETTINGS (object),
+                               g_value_get_boolean (value));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -446,6 +454,13 @@
                                
camel_imapx_settings_get_ignore_shared_folders_namespace (
                                CAMEL_IMAPX_SETTINGS (object)));
                        return;
+
+               case PROP_FULL_UPDATE_ON_METERED_NETWORK:
+                       g_value_set_boolean (
+                               value,
+                               
camel_imapx_settings_get_full_update_on_metered_network (
+                               CAMEL_IMAPX_SETTINGS (object)));
+                       return;
        }
 
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -787,6 +802,19 @@
                        G_PARAM_CONSTRUCT |
                        G_PARAM_EXPLICIT_NOTIFY |
                        G_PARAM_STATIC_STRINGS));
+
+       g_object_class_install_property (
+               object_class,
+               PROP_FULL_UPDATE_ON_METERED_NETWORK,
+               g_param_spec_boolean (
+                       "full-update-on-metered-network",
+                       "Full Update On Metered Network",
+                       "Whether can do full folder update even on metered 
network",
+                       TRUE,
+                       G_PARAM_READWRITE |
+                       G_PARAM_CONSTRUCT |
+                       G_PARAM_EXPLICIT_NOTIFY |
+                       G_PARAM_STATIC_STRINGS));
 }
 
 static void
@@ -1886,3 +1914,47 @@
        g_object_notify (G_OBJECT (settings), "use-subscriptions");
 }
 
+/**
+ * camel_imapx_settings_get_full_update_on_metered_network:
+ * @settings: a #CamelIMAPXSettings
+ *
+ * Returns whether to allow full folder update on metered network. With
+ * this off the folder update skips updates of the known messages, which
+ * can lead to not removing removed messages or not updating flags of
+ * the old messages. The option is meant to save bandwidth usage on
+ * the metered network.
+ *
+ * Returns: whether to allow full folder update on metered network
+ *
+ * Since: 3.32.3
+ **/
+gboolean
+camel_imapx_settings_get_full_update_on_metered_network (CamelIMAPXSettings 
*settings)
+{
+       g_return_val_if_fail (CAMEL_IS_IMAPX_SETTINGS (settings), FALSE);
+
+       return settings->priv->full_update_on_metered_network;
+}
+
+/**
+ * camel_imapx_settings_set_full_update_on_metered_network:
+ * @settings: a #CamelIMAPXSettings
+ * @full_update_on_metered_network: whether to allow it
+ *
+ * Sets whether to allow full folder update on metered network.
+ *
+ * Since: 3.32.3
+ **/
+void
+camel_imapx_settings_set_full_update_on_metered_network (CamelIMAPXSettings 
*settings,
+                                                        gboolean 
full_update_on_metered_network)
+{
+       g_return_if_fail (CAMEL_IS_IMAPX_SETTINGS (settings));
+
+       if (settings->priv->full_update_on_metered_network == 
full_update_on_metered_network)
+               return;
+
+       settings->priv->full_update_on_metered_network = 
full_update_on_metered_network;
+
+       g_object_notify (G_OBJECT (settings), "full-update-on-metered-network");
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-settings.h
 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-settings.h
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-settings.h
   2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-settings.h
   2019-06-17 15:21:44.000000000 +0200
@@ -171,6 +171,11 @@
 void           camel_imapx_settings_set_use_subscriptions
                                                (CamelIMAPXSettings *settings,
                                                 gboolean use_subscriptions);
+gboolean       camel_imapx_settings_get_full_update_on_metered_network
+                                               (CamelIMAPXSettings *settings);
+void           camel_imapx_settings_set_full_update_on_metered_network
+                                               (CamelIMAPXSettings *settings,
+                                                gboolean 
full_update_on_metered_network);
 
 G_END_DECLS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-store.c 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-store.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-store.c  
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-store.c  
    2019-06-17 15:21:44.000000000 +0200
@@ -1605,7 +1605,6 @@
        CamelIMAPXNamespaceResponse *namespace_response;
        CamelIMAPXNamespace *namespace;
        gchar *mailbox_name;
-       gchar *utf7_mailbox_name;
        gchar *pattern;
        gchar separator;
        gboolean success = FALSE;
@@ -1630,15 +1629,13 @@
        separator = camel_imapx_namespace_get_separator (namespace);
        mailbox_name = g_strdelimit (g_strdup (folder_path), "/", separator);
 
-       utf7_mailbox_name = camel_utf8_utf7 (mailbox_name);
-       pattern = g_strdup_printf ("%s*", utf7_mailbox_name);
+       pattern = g_strdup_printf ("%s*", mailbox_name);
 
        success = fetch_folder_info_for_pattern (
                conn_man, namespace, pattern, flags,
                folder_info_results, cancellable, error);
 
        g_free (pattern);
-       g_free (utf7_mailbox_name);
        g_free (mailbox_name);
 
 exit:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-utils.c 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-utils.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/imapx/camel-imapx-utils.c  
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/imapx/camel-imapx-utils.c  
    2019-06-17 15:21:44.000000000 +0200
@@ -2963,7 +2963,10 @@
        if (!success)
                return NULL;
 
-       mailbox_name = camel_utf7_utf8 ((gchar *) token);
+       if (camel_imapx_input_stream_get_utf8_accept (stream))
+               mailbox_name = g_strdup ((const gchar *) token);
+       else
+               mailbox_name = camel_utf7_utf8 ((const gchar *) token);
 
        camel_imapx_normalize_mailbox (mailbox_name, separator);
 
@@ -3251,7 +3254,10 @@
        if (!success)
                goto fail;
 
-       mailbox_name = camel_utf7_utf8 ((gchar *) token);
+       if (camel_imapx_input_stream_get_utf8_accept (stream))
+               mailbox_name = g_strdup ((const gchar *) token);
+       else
+               mailbox_name = camel_utf7_utf8 ((const gchar *) token);
 
        while (TRUE) {
                /* Peek at the next token, and break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/camel/providers/smtp/camel-smtp-transport.c
 
new/evolution-data-server-3.32.3/src/camel/providers/smtp/camel-smtp-transport.c
--- 
old/evolution-data-server-3.32.2/src/camel/providers/smtp/camel-smtp-transport.c
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/camel/providers/smtp/camel-smtp-transport.c
    2019-06-17 15:21:44.000000000 +0200
@@ -77,6 +77,7 @@
 static gboolean                smtp_helo               (CamelSmtpTransport 
*transport,
                                                 CamelStreamBuffer *istream,
                                                 CamelStream *ostream,
+                                                gboolean ignore_8bitmime,
                                                 GCancellable *cancellable,
                                                 GError **error);
 static gboolean                smtp_mail               (CamelSmtpTransport 
*transport,
@@ -178,6 +179,7 @@
        GIOStream *tls_stream;
        gchar *respbuf = NULL;
        gboolean success = TRUE;
+       gboolean ignore_8bitmime;
        gchar *host;
 
        if (!CAMEL_SERVICE_CLASS (camel_smtp_transport_parent_class)->
@@ -247,9 +249,11 @@
        } while (*(respbuf+3) == '-'); /* if we got "220-" then loop again */
        g_free (respbuf);
 
+       ignore_8bitmime = host && camel_strstrcase (host, "yahoo.com");
+
        /* Try sending EHLO */
        transport->flags |= CAMEL_SMTP_TRANSPORT_IS_ESMTP;
-       if (!smtp_helo (transport, istream, ostream, cancellable, error)) {
+       if (!smtp_helo (transport, istream, ostream, ignore_8bitmime, 
cancellable, error)) {
                if (!transport->connected) {
                        success = FALSE;
                        goto exit;
@@ -259,7 +263,7 @@
                g_clear_error (error);
                transport->flags &= ~CAMEL_SMTP_TRANSPORT_IS_ESMTP;
 
-               if (!smtp_helo (transport, istream, ostream, cancellable, 
error)) {
+               if (!smtp_helo (transport, istream, ostream, ignore_8bitmime, 
cancellable, error)) {
                        success = FALSE;
                        goto exit;
                }
@@ -331,7 +335,7 @@
 
        /* We are supposed to re-EHLO after a successful STARTTLS to
         * re-fetch any supported extensions. */
-       if (!smtp_helo (transport, istream, ostream, cancellable, error)) {
+       if (!smtp_helo (transport, istream, ostream, ignore_8bitmime, 
cancellable, error)) {
                success = FALSE;
        }
 
@@ -855,6 +859,25 @@
 }
 
 static gboolean
+message_has_8bit_or_qp_part_cb (CamelMimeMessage *message,
+                               CamelMimePart *part,
+                               CamelMimePart *parent_part,
+                               gpointer user_data)
+{
+       CamelTransferEncoding encoding;
+       gint *has8bit = user_data;
+
+       /* check this part, and stop as soon as we are done */
+       encoding = camel_mime_part_get_encoding (part);
+
+       *has8bit = encoding == CAMEL_TRANSFER_ENCODING_8BIT ||
+                  encoding == CAMEL_TRANSFER_ENCODING_BINARY ||
+                  encoding == CAMEL_TRANSFER_ENCODING_QUOTEDPRINTABLE;
+
+       return !(*has8bit);
+}
+
+static gboolean
 smtp_transport_send_to_sync (CamelTransport *transport,
                              CamelMimeMessage *message,
                              CamelAddress *from,
@@ -867,7 +890,7 @@
        CamelInternetAddress *cia;
        CamelStreamBuffer *istream;
        CamelStream *ostream;
-       gboolean has_8bit_parts;
+       gboolean has_8bit_parts = FALSE;
        const gchar *addr;
        gint i, len;
 
@@ -897,8 +920,8 @@
 
        camel_operation_push_message (cancellable, _("Sending message"));
 
-       /* find out if the message has 8bit mime parts */
-       has_8bit_parts = camel_mime_message_has_8bit_parts (message);
+       /* find out if the message has 8bit mime parts; quoted-printable are 
reencoded to 8bit too */
+       camel_mime_message_foreach_part (message, 
message_has_8bit_or_qp_part_cb, &has_8bit_parts);
 
        /* If the connection needs a ReSET, then do so */
        if (smtp_transport->need_rset &&
@@ -1358,10 +1381,12 @@
 smtp_helo (CamelSmtpTransport *transport,
           CamelStreamBuffer *istream,
           CamelStream *ostream,
+          gboolean ignore_8bitmime,
            GCancellable *cancellable,
            GError **error)
 {
        gchar *name = NULL, *cmdbuf = NULL, *respbuf = NULL;
+       gboolean first_line = TRUE;
        const gchar *token;
        GResolver *resolver;
        GInetAddress *address;
@@ -1446,9 +1471,17 @@
 
                token = respbuf + 4;
 
+               if (first_line) {
+                       ignore_8bitmime = ignore_8bitmime || camel_strstrcase 
(token, "yahoo.com") != NULL;
+                       first_line = FALSE;
+               }
+
                if (transport->flags & CAMEL_SMTP_TRANSPORT_IS_ESMTP) {
                        if (!g_ascii_strncasecmp (token, "8BITMIME", 8)) {
-                               transport->flags |= 
CAMEL_SMTP_TRANSPORT_8BITMIME;
+                               if (ignore_8bitmime)
+                                       d (fprintf (stderr, "[SMTP] Ignoring 
8BITMIME extension\n"));
+                               else
+                                       transport->flags |= 
CAMEL_SMTP_TRANSPORT_8BITMIME;
                        } else if (!g_ascii_strncasecmp (token, 
"ENHANCEDSTATUSCODES", 19)) {
                                transport->flags |= 
CAMEL_SMTP_TRANSPORT_ENHANCEDSTATUSCODES;
                        } else if (!g_ascii_strncasecmp (token, "STARTTLS", 8)) 
{
@@ -1505,7 +1538,7 @@
        /* we gotta tell the smtp server who we are. (our email addy) */
        gchar *cmdbuf, *respbuf = NULL;
 
-       if (transport->flags & CAMEL_SMTP_TRANSPORT_8BITMIME && has_8bit_parts)
+       if ((transport->flags & CAMEL_SMTP_TRANSPORT_8BITMIME) && 
has_8bit_parts)
                cmdbuf = g_strdup_printf ("MAIL FROM:<%s> BODY=8BITMIME\r\n", 
sender);
        else
                cmdbuf = g_strdup_printf ("MAIL FROM:<%s>\r\n", sender);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/libedataserverui/e-credentials-prompter.c 
new/evolution-data-server-3.32.3/src/libedataserverui/e-credentials-prompter.c
--- 
old/evolution-data-server-3.32.2/src/libedataserverui/e-credentials-prompter.c  
    2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/src/libedataserverui/e-credentials-prompter.c  
    2019-06-17 15:21:44.000000000 +0200
@@ -1572,9 +1572,9 @@
  * @prompter: an #ECredentialsPrompter
  * @source: an #ESource
  *
- * Continues a credential prompt for @source. Returns, whether anything wil be 
done.
+ * Continues a credential prompt for @source. Returns, whether anything will 
be done.
  * The %FALSE either means that the @source<!-- -->'s connection status is not
- * the %E_SOURCE_CONNECTION_STATUS_AWAITING_CREDENTIALS.
+ * the %E_SOURCE_CONNECTION_STATUS_AWAITING_CREDENTIALS or it is disabled.
  *
  * Returns: Whether continues with the credentials prompt.
  *
@@ -1587,7 +1587,8 @@
        g_return_val_if_fail (E_IS_CREDENTIALS_PROMPTER (prompter), FALSE);
        g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
 
-       if (e_source_get_connection_status (source) != 
E_SOURCE_CONNECTION_STATUS_AWAITING_CREDENTIALS)
+       if (e_source_get_connection_status (source) != 
E_SOURCE_CONNECTION_STATUS_AWAITING_CREDENTIALS ||
+           !e_source_registry_check_enabled (prompter->priv->registry, source))
                return FALSE;
 
        e_source_get_last_credentials_required_arguments (source, 
prompter->priv->cancellable,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/src/libedataserverui/e-reminders-widget.c 
new/evolution-data-server-3.32.3/src/libedataserverui/e-reminders-widget.c
--- old/evolution-data-server-3.32.2/src/libedataserverui/e-reminders-widget.c  
2019-05-06 12:16:15.000000000 +0200
+++ new/evolution-data-server-3.32.3/src/libedataserverui/e-reminders-widget.c  
2019-06-17 15:21:44.000000000 +0200
@@ -438,6 +438,8 @@
 
                reminders->priv->overdue_update_id = g_timeout_add_seconds 
(until_minute,
                        reminders_widget_overdue_update_cb, reminders);
+
+               reminders_widget_overdue_update (reminders);
        }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/tests/libebook/client/test-book-client-get-revision.c
 
new/evolution-data-server-3.32.3/tests/libebook/client/test-book-client-get-revision.c
--- 
old/evolution-data-server-3.32.2/tests/libebook/client/test-book-client-get-revision.c
      2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/tests/libebook/client/test-book-client-get-revision.c
      2019-06-17 15:21:44.000000000 +0200
@@ -48,6 +48,19 @@
        if (!e_client_get_backend_property_sync (E_CLIENT (client), 
CLIENT_BACKEND_PROPERTY_REVISION, &revision_after, NULL, &error))
                g_error ("Error getting book revision: %s", error->message);
 
+       /* Sometimes, kind of rarely, the D-Bus property change is not 
delivered on time,
+          thus give it some time to be received and processed. */
+       if (g_strcmp0 (revision_before, revision_after) == 0) {
+               g_message ("   D-Bus property 'revision' change not received 
yet, trying to wait a bit");
+
+               g_usleep (G_USEC_PER_SEC / 2);
+
+               g_clear_pointer (&revision_after, g_free);
+
+               if (!e_client_get_backend_property_sync (E_CLIENT (client), 
CLIENT_BACKEND_PROPERTY_REVISION, &revision_after, NULL, &error))
+                       g_error ("Error getting book revision: %s", 
error->message);
+       }
+
        g_assert (revision_before);
        g_assert (revision_after);
        g_assert_cmpstr (revision_before, !=, revision_after);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/evolution-data-server-3.32.2/tests/libecal/client/test-cal-client-get-revision.c
 
new/evolution-data-server-3.32.3/tests/libecal/client/test-cal-client-get-revision.c
--- 
old/evolution-data-server-3.32.2/tests/libecal/client/test-cal-client-get-revision.c
        2019-05-06 12:16:15.000000000 +0200
+++ 
new/evolution-data-server-3.32.3/tests/libecal/client/test-cal-client-get-revision.c
        2019-06-17 15:21:44.000000000 +0200
@@ -54,6 +54,19 @@
                                                &revision_after, NULL, &error))
                g_error ("Error getting calendar revision: %s", error->message);
 
+       /* Sometimes, kind of rarely, the D-Bus property change is not 
delivered on time,
+          thus give it some time to be received and processed. */
+       if (g_strcmp0 (revision_before, revision_after) == 0) {
+               g_message ("   D-Bus property 'revision' change not received 
yet, trying to wait a bit");
+
+               g_usleep (G_USEC_PER_SEC / 2);
+
+               g_clear_pointer (&revision_after, g_free);
+
+               if (!e_client_get_backend_property_sync (E_CLIENT (client), 
CLIENT_BACKEND_PROPERTY_REVISION, &revision_after, NULL, &error))
+                       g_error ("Error getting calendar revision: %s", 
error->message);
+       }
+
        g_assert (revision_before);
        g_assert (revision_after);
        g_assert_cmpstr (revision_before, !=, revision_after);


Reply via email to