Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package evolution-data-server for openSUSE:Factory checked in at 2022-06-01 17:33:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/evolution-data-server (Old) and /work/SRC/openSUSE:Factory/.evolution-data-server.new.1548 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "evolution-data-server" Wed Jun 1 17:33:53 2022 rev:236 rq:980022 version:3.44.2 Changes: -------- --- /work/SRC/openSUSE:Factory/evolution-data-server/evolution-data-server.changes 2022-04-26 20:17:07.948714503 +0200 +++ /work/SRC/openSUSE:Factory/.evolution-data-server.new.1548/evolution-data-server.changes 2022-06-01 17:33:59.822693657 +0200 @@ -1,0 +2,18 @@ +Mon May 30 11:38:48 UTC 2022 - Dominique Leuenberger <dims...@opensuse.org> + +- Update to version 3.44.2: + + Miscellaneous: + - ERemindersWidget: Allow width shrink for small screens. + - Fix few memory leaks discovered by Coverity scan. + - GOA module: Prevent ESource removal on D-Bus reconnect or + registry reload. + + Bug Fixes: + - CalDAV: Crash on calendar update. + - e-webdav-discover: Fails to find Radicale calendars within + collection account. + - Google OAuth out-of-band (oob) flow will be deprecated. + - IMAPx: Fails to create folder with NIL folder hierarchy + delimiter. + - WebDAVCollectionBackend: Removes sources on server error. + +------------------------------------------------------------------- Old: ---- evolution-data-server-3.44.1.tar.xz New: ---- evolution-data-server-3.44.2.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ evolution-data-server.spec ++++++ --- /var/tmp/diff_new_pack.0kLSV5/_old 2022-06-01 17:34:00.378694315 +0200 +++ /var/tmp/diff_new_pack.0kLSV5/_new 2022-06-01 17:34:00.382694319 +0200 @@ -31,7 +31,7 @@ %bcond_without introspection Name: evolution-data-server -Version: 3.44.1 +Version: 3.44.2 Release: 0 Summary: Evolution Data Server License: LGPL-2.0-only ++++++ evolution-data-server-3.44.1.tar.xz -> evolution-data-server-3.44.2.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/CMakeLists.txt new/evolution-data-server-3.44.2/CMakeLists.txt --- old/evolution-data-server-3.44.1/CMakeLists.txt 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/CMakeLists.txt 2022-05-27 07:43:00.000000000 +0200 @@ -4,7 +4,7 @@ cmake_policy(VERSION 3.1) project(evolution-data-server - VERSION 3.44.1 + VERSION 3.44.2 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.44.1/NEWS new/evolution-data-server-3.44.2/NEWS --- old/evolution-data-server-3.44.1/NEWS 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/NEWS 2022-05-27 07:43:00.000000000 +0200 @@ -1,3 +1,18 @@ +Evolution-Data-Server 3.44.2 2022-05-27 +--------------------------------------- + +Bug Fixes: + I#359 - CalDAV: Crash on calendar update + I#386 - e-webdav-discover: Fails to find Radicale calendars within collection account + I#388 - Google OAuth out-of-band (oob) flow will be deprecated + I#389 - IMAPx: Fails to create folder with NIL folder hierarchy delimiter + evo-I#1348 - WebDAVCollectionBackend: Removes sources on server error + +Miscellaneous: + ERemindersWidget: Allow width shrink for small screens + Fix few memory leaks discovered by Coverity scan + GOA module: Prevent ESource removal on D-Bus reconnect or registry reload + Evolution-Data-Server 3.44.1 2022-04-22 --------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/addressbook/backends/ldap/e-book-backend-ldap.c new/evolution-data-server-3.44.2/src/addressbook/backends/ldap/e-book-backend-ldap.c --- old/evolution-data-server-3.44.1/src/addressbook/backends/ldap/e-book-backend-ldap.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/addressbook/backends/ldap/e-book-backend-ldap.c 2022-05-27 07:43:00.000000000 +0200 @@ -2841,7 +2841,7 @@ const gchar *ldap_attr) { gint phone_ids[2] = { E_CONTACT_PHONE_HOME, E_CONTACT_PHONE_HOME_2 }; - const gchar *phone1, *phone2; + gchar *phone1, *phone2; gint i; for (i = 0; i < 2; i++) { @@ -2854,6 +2854,9 @@ else equal = (!!phone1 == !!phone2); + g_free (phone1); + g_free (phone2); + if (!equal) return equal; } @@ -2914,7 +2917,7 @@ const gchar *ldap_attr) { gint phone_ids[2] = { E_CONTACT_PHONE_BUSINESS, E_CONTACT_PHONE_BUSINESS_2 }; - const gchar *phone1, *phone2; + gchar *phone1, *phone2; gint i; for (i = 0; i < 2; i++) { @@ -2927,6 +2930,9 @@ else equal = (!!phone1 == !!phone2); + g_free (phone1); + g_free (phone2); + if (!equal) return equal; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/calendar/backends/caldav/e-cal-backend-caldav.c new/evolution-data-server-3.44.2/src/calendar/backends/caldav/e-cal-backend-caldav.c --- old/evolution-data-server-3.44.1/src/calendar/backends/caldav/e-cal-backend-caldav.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/calendar/backends/caldav/e-cal-backend-caldav.c 2022-05-27 07:43:00.000000000 +0200 @@ -545,7 +545,8 @@ link = *in_link; while (link && left_to_go > 0) { - ECalMetaBackendInfo *nfo = link->data; + GSList *nfo_link = link; + ECalMetaBackendInfo *nfo = nfo_link->data; link = g_slist_next (link); if (!link) { @@ -635,7 +636,7 @@ else e_cal_meta_backend_info_free (nfo); - link->data = NULL; + nfo_link->data = NULL; g_clear_error (&local_error); continue; } else if (local_error) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/camel/providers/imapx/camel-imapx-store.c new/evolution-data-server-3.44.2/src/camel/providers/imapx/camel-imapx-store.c --- old/evolution-data-server-3.44.1/src/camel/providers/imapx/camel-imapx-store.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/camel/providers/imapx/camel-imapx-store.c 2022-05-27 07:43:00.000000000 +0200 @@ -2317,6 +2317,16 @@ goto exit; separator = camel_imapx_mailbox_get_separator (parent_mailbox); + + /* NIL separator means flat structure, where subfolders cannot be created */ + if (!separator) { + g_object_unref (parent_mailbox); + /* Cannot set error here, like in the development version, due to untranslated + string, thus let it create the folder in the top level. Evolution throws + an error about "folder not found" due to using the path with the parent folder. */ + goto check_namespace; + } + parent_mailbox_name = camel_imapx_mailbox_get_name (parent_mailbox); mailbox_name = g_strdup_printf ( @@ -2355,7 +2365,7 @@ check_separator: - if (strchr (folder_name, separator) != NULL) { + if (separator && strchr (folder_name, separator) != NULL) { g_set_error ( error, CAMEL_FOLDER_ERROR, CAMEL_FOLDER_ERROR_INVALID_PATH, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/camel/providers/nntp/camel-nntp-store.c new/evolution-data-server-3.44.2/src/camel/providers/nntp/camel-nntp-store.c --- old/evolution-data-server-3.44.1/src/camel/providers/nntp/camel-nntp-store.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/camel/providers/nntp/camel-nntp-store.c 2022-05-27 07:43:00.000000000 +0200 @@ -1442,6 +1442,9 @@ /* return back the .ev-store-summary file, it's saved in user_data_dir */ if (g_rename (ucd_ev_store_summary, udd_ev_store_summary) == -1) g_debug ("%s: Failed to return back '%s' to '%s': %s", G_STRFUNC, ucd_ev_store_summary, udd_ev_store_summary, g_strerror (errno)); + + g_free (udd_ev_store_summary); + g_free (ucd_ev_store_summary); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/libebackend/e-webdav-collection-backend.c new/evolution-data-server-3.44.2/src/libebackend/e-webdav-collection-backend.c --- old/evolution-data-server-3.44.1/src/libebackend/e-webdav-collection-backend.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/libebackend/e-webdav-collection-backend.c 2022-05-27 07:43:00.000000000 +0200 @@ -57,6 +57,19 @@ g_hash_table_insert (known_sources, rid, uid); } +static gboolean +webdav_collection_debug_enabled (void) +{ + static gint enabled = -1; + + if (enabled == -1) { + const gchar *envval = g_getenv ("WEBDAV_DEBUG"); + enabled = envval && *envval && g_strcmp0 (envval, "0") != 0 ? 1 : 0; + } + + return enabled == 1; +} + typedef struct _RemoveSourcesData { ESourceRegistryServer *server; EWebDAVCollectionBackend *webdav_backend; @@ -75,8 +88,13 @@ source = e_source_registry_server_ref_source (rsd->server, uid); if (source) { - if (!e_webdav_collection_backend_is_custom_source (rsd->webdav_backend, source)) + if (!e_webdav_collection_backend_is_custom_source (rsd->webdav_backend, source)) { + if (webdav_collection_debug_enabled ()) { + e_util_debug_print ("WEBDAV", " %p: Going to remove previously known source '%s' (%s)\n", rsd->webdav_backend, + e_source_get_display_name (source), e_source_get_uid (source)); + } e_source_remove_sync (source, NULL, NULL); + } g_object_unref (source); } @@ -571,6 +589,9 @@ g_list_foreach (sources, webdav_collection_add_uid_to_hashtable, known_sources); g_list_free_full (sources, g_object_unref); + if (webdav_collection_debug_enabled ()) + e_util_debug_print ("WEBDAV", "%p: This is '%s' (%s)\n", webdav_backend, e_source_get_display_name (source), e_source_get_uid (source)); + server = e_collection_backend_ref_server (collection); if (e_source_collection_get_calendar_enabled (collection_extension) && calendar_url && @@ -589,9 +610,13 @@ webdav_collection_process_discovered_sources (collection, discovered_sources, known_sources, source_types, G_N_ELEMENTS (source_types)); + if (webdav_collection_debug_enabled ()) + e_util_debug_print ("WEBDAV", "%p: Received %u calendars from '%s'\n", webdav_backend, g_slist_length (discovered_sources), calendar_url); + e_webdav_discover_free_discovered_sources (discovered_sources); discovered_sources = NULL; any_success = TRUE; + /* Prevent lost of already known calendars when the discover failed */ } else if (local_error) { RemoveSourceTypesData rstd; @@ -599,6 +624,17 @@ rstd.calendars = TRUE; g_hash_table_foreach_remove (known_sources, webdav_collection_remove_source_types_cb, &rstd); + + if (webdav_collection_debug_enabled () && + (!credentials_empty || ( + !g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_UNAUTHORIZED) && + !g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_FORBIDDEN)))) + e_util_debug_print ("WEBDAV", "%p: Failed to get calendars from '%s': %s\n", webdav_backend, calendar_url, local_error->message); + } else if (e_source_collection_get_calendar_enabled (collection_extension) && calendar_url) { + if (webdav_collection_debug_enabled ()) { + e_util_debug_print ("WEBDAV", "%p: Failed to get calendars from '%s': %s\n", webdav_backend, calendar_url, + g_cancellable_is_cancelled (cancellable) ? "Is cancelled" : "Unknown error"); + } } if (!local_error && e_source_collection_get_contacts_enabled (collection_extension) && contacts_url && @@ -612,16 +648,31 @@ webdav_collection_process_discovered_sources (collection, discovered_sources, known_sources, source_types, G_N_ELEMENTS (source_types)); + if (webdav_collection_debug_enabled ()) + e_util_debug_print ("WEBDAV", "%p: Received %u books from '%s'\n", webdav_backend, g_slist_length (discovered_sources), contacts_url); + e_webdav_discover_free_discovered_sources (discovered_sources); discovered_sources = NULL; any_success = TRUE; - } else if (any_success && local_error) { + /* Prevent lost of already known address books when the discover failed */ + } else if (local_error) { RemoveSourceTypesData rstd; rstd.server = server; rstd.calendars = FALSE; g_hash_table_foreach_remove (known_sources, webdav_collection_remove_source_types_cb, &rstd); + + if (webdav_collection_debug_enabled () && + (!credentials_empty || ( + !g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_UNAUTHORIZED) && + !g_error_matches (local_error, SOUP_HTTP_ERROR, SOUP_STATUS_FORBIDDEN)))) + e_util_debug_print ("WEBDAV", "%p: Failed to get books from '%s': %s\n", webdav_backend, contacts_url, local_error->message); + } else if (e_source_collection_get_contacts_enabled (collection_extension) && contacts_url) { + if (webdav_collection_debug_enabled ()) { + e_util_debug_print ("WEBDAV", "%p: Failed to get books from '%s': %s\n", webdav_backend, contacts_url, + g_cancellable_is_cancelled (cancellable) ? "Is cancelled" : "Unknown error"); + } } if (any_success && server && !g_cancellable_is_cancelled (cancellable)) { @@ -630,6 +681,11 @@ rsd.server = server; rsd.webdav_backend = webdav_backend; + if (webdav_collection_debug_enabled () && g_hash_table_size (known_sources)) { + e_util_debug_print ("WEBDAV", "%p: Have %u leftover previously known sources\n", webdav_backend, + g_hash_table_size (known_sources)); + } + g_hash_table_foreach (known_sources, webdav_collection_remove_unknown_sources_cb, &rsd); g_clear_error (&local_error); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/libedataserver/e-oauth2-service-google.c new/evolution-data-server-3.44.2/src/libedataserver/e-oauth2-service-google.c --- old/evolution-data-server-3.44.1/src/libedataserver/e-oauth2-service-google.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/libedataserver/e-oauth2-service-google.c 2022-05-27 07:43:00.000000000 +0200 @@ -24,6 +24,7 @@ #include "e-oauth2-service-google.h" /* https://developers.google.com/identity/protocols/OAuth2InstalledApp */ +/* https://developers.google.com/identity/protocols/oauth2/native-app */ /* Forward Declarations */ static void e_oauth2_service_google_oauth2_service_init (EOAuth2ServiceInterface *iface); @@ -120,14 +121,60 @@ eos_google_get_authentication_uri (EOAuth2Service *service, ESource *source) { - return "https://accounts.google.com/o/oauth2/auth"; + return "https://accounts.google.com/o/oauth2/v2/auth"; } static const gchar * eos_google_get_refresh_uri (EOAuth2Service *service, ESource *source) { - return "https://www.googleapis.com/oauth2/v3/token"; + return "https://oauth2.googleapis.com/token"; +} + +static const gchar * +eos_google_get_redirect_uri (EOAuth2Service *service, + ESource *source) +{ + G_LOCK_DEFINE_STATIC (redirect_uri); + const gchar *key_name = "oauth2-google-redirect-uri"; + gchar *value; + + G_LOCK (redirect_uri); + + value = g_object_get_data (G_OBJECT (service), key_name); + if (!value) { + const gchar *client_id = eos_google_get_client_id (service, source); + + if (client_id) { + GPtrArray *array; + gchar **strv; + gchar *joinstr; + guint ii; + + strv = g_strsplit (client_id, ".", -1); + array = g_ptr_array_new (); + + for (ii = 0; strv[ii]; ii++) { + g_ptr_array_insert (array, 0, strv[ii]); + } + + g_ptr_array_add (array, NULL); + + joinstr = g_strjoinv (".", (gchar **) array->pdata); + /* Use reverse-DNS of the client ID with the below path */ + value = g_strconcat (joinstr, ":/oauth2redirect", NULL); + + g_ptr_array_free (array, TRUE); + g_strfreev (strv); + g_free (joinstr); + + g_object_set_data_full (G_OBJECT (service), key_name, value, g_free); + } + } + + G_UNLOCK (redirect_uri); + + return value; } static void @@ -189,13 +236,13 @@ params = soup_form_decode (query); if (params) { - const gchar *response; + const gchar *code; - response = g_hash_table_lookup (params, "response"); - if (response && g_ascii_strncasecmp (response, "code=", 5) == 0) { - *out_authorization_code = g_strdup (response + 5); + code = g_hash_table_lookup (params, "code"); + if (code && *code) { + *out_authorization_code = g_strdup (code); known = TRUE; - } else if (response && g_ascii_strncasecmp (response, "error", 5) == 0) { + } else if (g_hash_table_lookup (params, "error")) { known = TRUE; } @@ -223,6 +270,7 @@ iface->get_client_secret = eos_google_get_client_secret; iface->get_authentication_uri = eos_google_get_authentication_uri; iface->get_refresh_uri = eos_google_get_refresh_uri; + iface->get_redirect_uri = eos_google_get_redirect_uri; iface->prepare_authentication_uri_query = eos_google_prepare_authentication_uri_query; iface->extract_authorization_code = eos_google_extract_authorization_code; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/libedataserver/e-webdav-discover.c new/evolution-data-server-3.44.2/src/libedataserver/e-webdav-discover.c --- old/evolution-data-server-3.44.1/src/libedataserver/e-webdav-discover.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/libedataserver/e-webdav-discover.c 2022-05-27 07:43:00.000000000 +0200 @@ -45,15 +45,18 @@ static gboolean e_webdav_discovery_already_discovered (const gchar *href, - const GSList *discovered_sources) + const GSList *discovered_sources, + guint32 href_supports) { GSList *link; for (link = (GSList *) discovered_sources; link; link = g_slist_next (link)) { EWebDAVDiscoveredSource *discovered = link->data; - if (discovered && g_strcmp0 (href, discovered->href) == 0) + if (discovered && g_strcmp0 (href, discovered->href) == 0) { + discovered->supports |= href_supports; return TRUE; + } } return FALSE; @@ -82,7 +85,8 @@ continue; if (e_webdav_discovery_already_discovered (resource->href, - resource->kind == E_WEBDAV_RESOURCE_KIND_ADDRESSBOOK ? wdd->addressbooks : wdd->calendars)) + resource->kind == E_WEBDAV_RESOURCE_KIND_ADDRESSBOOK ? wdd->addressbooks : wdd->calendars, + resource->supports)) continue; discovered = g_slice_new0 (EWebDAVDiscoveredSource); @@ -105,6 +109,45 @@ } } +typedef enum { + COVERED_LOOKUP = 1 << 0, + COVERED_ADDRESSBOOK = 1 << 1, + COVERED_CALENDAR = 1 << 2 +} ECoveredMark; + +static void +e_webdav_discover_mark_covered (GHashTable *covered_hrefs, + const gchar *href, + ECoveredMark mark) +{ + gint value; + + if (!covered_hrefs || !href || !*href) + return; + + value = GPOINTER_TO_INT (g_hash_table_lookup (covered_hrefs, href)); + + if ((value & mark) != mark) { + value |= mark; + g_hash_table_insert (covered_hrefs, g_strdup (href), GINT_TO_POINTER (value)); + } +} + +static gboolean +e_webdav_discover_is_covered (GHashTable *covered_hrefs, + const gchar *href, + ECoveredMark mark) +{ + gint value; + + if (!covered_hrefs || !href || !*href) + return FALSE; + + value = GPOINTER_TO_INT (g_hash_table_lookup (covered_hrefs, href)); + + return (value & mark) == mark; +} + static gboolean e_webdav_discover_propfind_uri_sync (EWebDAVSession *webdav, WebDAVDiscoverData *wdd, @@ -145,7 +188,7 @@ full_href = e_webdav_session_ensure_full_uri (webdav, request_uri, (const gchar *) home_set_href); - if (full_href && *full_href && GPOINTER_TO_INT (g_hash_table_contains (wdd->covered_hrefs, full_href)) != 2 && + if (full_href && *full_href && !e_webdav_discover_is_covered (wdd->covered_hrefs, full_href, COVERED_ADDRESSBOOK) && e_webdav_session_list_sync (webdav, full_href, E_WEBDAV_DEPTH_THIS_AND_CHILDREN, E_WEBDAV_LIST_ONLY_ADDRESSBOOK | E_WEBDAV_LIST_ALL, &resources, wdd->cancellable, &local_error)) { @@ -154,7 +197,7 @@ } if (full_href && *full_href) - g_hash_table_insert (wdd->covered_hrefs, g_strdup (full_href), GINT_TO_POINTER (2)); + e_webdav_discover_mark_covered (wdd->covered_hrefs, full_href, COVERED_ADDRESSBOOK); if (local_error && wdd->error && !*wdd->error) g_propagate_error (wdd->error, local_error); @@ -181,7 +224,7 @@ full_href = e_webdav_session_ensure_full_uri (webdav, request_uri, (const gchar *) home_set_href); - if (full_href && *full_href && GPOINTER_TO_INT (g_hash_table_contains (wdd->covered_hrefs, full_href)) != 2 && + if (full_href && *full_href && !e_webdav_discover_is_covered (wdd->covered_hrefs, full_href, COVERED_CALENDAR) && e_webdav_session_list_sync (webdav, full_href, E_WEBDAV_DEPTH_THIS_AND_CHILDREN, E_WEBDAV_LIST_ONLY_CALENDAR | E_WEBDAV_LIST_ALL, &resources, wdd->cancellable, &local_error)) { @@ -190,7 +233,7 @@ } if (full_href && *full_href) - g_hash_table_insert (wdd->covered_hrefs, g_strdup (full_href), GINT_TO_POINTER (2)); + e_webdav_discover_mark_covered (wdd->covered_hrefs, full_href, COVERED_CALENDAR); if (local_error && wdd->error && !*wdd->error) g_propagate_error (wdd->error, local_error); @@ -262,10 +305,11 @@ is_addressbook = e_xml_find_child (node, E_WEBDAV_NS_CARDDAV, "addressbook") != NULL; if (is_calendar || is_addressbook) { + gint covered_mark = (is_addressbook ? COVERED_ADDRESSBOOK : 0) | (is_calendar ? COVERED_CALENDAR : 0); GSList *resources = NULL; GError *local_error = NULL; - if (GPOINTER_TO_INT (g_hash_table_contains (wdd->covered_hrefs, href)) != 2 && + if (!e_webdav_discover_is_covered (wdd->covered_hrefs, href, covered_mark) && !g_cancellable_is_cancelled (wdd->cancellable) && e_webdav_session_list_sync (webdav, href, E_WEBDAV_DEPTH_THIS, (is_calendar ? E_WEBDAV_LIST_ONLY_CALENDAR : 0) | (is_addressbook ? E_WEBDAV_LIST_ONLY_ADDRESSBOOK : 0) | E_WEBDAV_LIST_ALL, @@ -274,7 +318,7 @@ g_slist_free_full (resources, e_webdav_resource_free); } - g_hash_table_insert (wdd->covered_hrefs, g_strdup (href), GINT_TO_POINTER (2)); + e_webdav_discover_mark_covered (wdd->covered_hrefs, href, covered_mark); if (local_error && wdd->error && !*wdd->error) g_propagate_error (wdd->error, local_error); @@ -285,7 +329,7 @@ if (((wdd->only_supports & (~CUSTOM_SUPPORTS_FLAGS)) == E_WEBDAV_DISCOVER_SUPPORTS_NONE || (wdd->only_supports & E_WEBDAV_DISCOVER_SUPPORTS_WEBDAV_NOTES) != 0) && (g_str_has_suffix (href, "/Notes") || g_str_has_suffix (href, "/Notes/")) && - !e_webdav_discovery_already_discovered (href, wdd->calendars) && + !e_webdav_discovery_already_discovered (href, wdd->calendars, 0) && e_xml_find_in_hierarchy (prop_node, E_WEBDAV_NS_DAV, "resourcetype", E_WEBDAV_NS_DAV, "collection", NULL, NULL)) { GSList *resources = NULL; @@ -299,7 +343,7 @@ g_slist_free_full (resources, e_webdav_resource_free); - g_hash_table_insert (wdd->covered_hrefs, g_strdup (href), GINT_TO_POINTER (2)); + e_webdav_discover_mark_covered (wdd->covered_hrefs, href, COVERED_CALENDAR); } return TRUE; @@ -319,10 +363,10 @@ g_return_val_if_fail (wdd != NULL, FALSE); g_return_val_if_fail (uri && *uri, FALSE); - if (g_hash_table_contains (wdd->covered_hrefs, uri)) + if (e_webdav_discover_is_covered (wdd->covered_hrefs, uri, COVERED_LOOKUP)) return TRUE; - g_hash_table_insert (wdd->covered_hrefs, g_strdup (uri), GINT_TO_POINTER (1)); + e_webdav_discover_mark_covered (wdd->covered_hrefs, uri, COVERED_LOOKUP); xml = e_xml_document_new (E_WEBDAV_NS_DAV, "propfind"); g_return_val_if_fail (xml != NULL, FALSE); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/libedataserver/e-webdav-session.c new/evolution-data-server-3.44.2/src/libedataserver/e-webdav-session.c --- old/evolution-data-server-3.44.1/src/libedataserver/e-webdav-session.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/libedataserver/e-webdav-session.c 2022-05-27 07:43:00.000000000 +0200 @@ -3459,57 +3459,62 @@ } static guint32 -e_webdav_session_extract_supports (xmlNodePtr prop_node) +e_webdav_session_extract_supports (xmlNodePtr prop_node, + EWebDAVResourceKind kind) { - xmlNodePtr calendar_components; guint32 supports = E_WEBDAV_RESOURCE_SUPPORTS_NONE; g_return_val_if_fail (prop_node != NULL, E_WEBDAV_RESOURCE_SUPPORTS_NONE); - if (e_xml_find_in_hierarchy (prop_node, E_WEBDAV_NS_DAV, "resourcetype", E_WEBDAV_NS_CARDDAV, "addressbook", NULL, NULL)) + if (kind == E_WEBDAV_RESOURCE_KIND_ADDRESSBOOK && + e_xml_find_in_hierarchy (prop_node, E_WEBDAV_NS_DAV, "resourcetype", E_WEBDAV_NS_CARDDAV, "addressbook", NULL, NULL)) supports = supports | E_WEBDAV_RESOURCE_SUPPORTS_CONTACTS; - calendar_components = e_xml_find_child (prop_node, E_WEBDAV_NS_CALDAV, "supported-calendar-component-set"); + if (kind == E_WEBDAV_RESOURCE_KIND_CALENDAR) { + xmlNodePtr calendar_components; - if (calendar_components) { - xmlNodePtr node; - gint found_comps = 0; - - for (node = calendar_components->children; node; node = xmlNextElementSibling (node)) { - if (e_xml_is_element_name (node, E_WEBDAV_NS_CALDAV, "comp")) { - xmlChar *name; - - found_comps++; - - name = xmlGetProp (node, (const xmlChar *) "name"); - - if (!name) - continue; - - if (g_ascii_strcasecmp ((const gchar *) name, "VEVENT") == 0) - supports |= E_WEBDAV_RESOURCE_SUPPORTS_EVENTS; - else if (g_ascii_strcasecmp ((const gchar *) name, "VJOURNAL") == 0) - supports |= E_WEBDAV_RESOURCE_SUPPORTS_MEMOS; - else if (g_ascii_strcasecmp ((const gchar *) name, "VTODO") == 0) - supports |= E_WEBDAV_RESOURCE_SUPPORTS_TASKS; - else if (g_ascii_strcasecmp ((const gchar *) name, "VFREEBUSY") == 0) - supports |= E_WEBDAV_RESOURCE_SUPPORTS_FREEBUSY; - else if (g_ascii_strcasecmp ((const gchar *) name, "VTIMEZONE") == 0) - supports |= E_WEBDAV_RESOURCE_SUPPORTS_TIMEZONE; + calendar_components = e_xml_find_child (prop_node, E_WEBDAV_NS_CALDAV, "supported-calendar-component-set"); - xmlFree (name); + if (calendar_components) { + xmlNodePtr node; + gint found_comps = 0; + + for (node = calendar_components->children; node; node = xmlNextElementSibling (node)) { + if (e_xml_is_element_name (node, E_WEBDAV_NS_CALDAV, "comp")) { + xmlChar *name; + + found_comps++; + + name = xmlGetProp (node, (const xmlChar *) "name"); + + if (!name) + continue; + + if (g_ascii_strcasecmp ((const gchar *) name, "VEVENT") == 0) + supports |= E_WEBDAV_RESOURCE_SUPPORTS_EVENTS; + else if (g_ascii_strcasecmp ((const gchar *) name, "VJOURNAL") == 0) + supports |= E_WEBDAV_RESOURCE_SUPPORTS_MEMOS; + else if (g_ascii_strcasecmp ((const gchar *) name, "VTODO") == 0) + supports |= E_WEBDAV_RESOURCE_SUPPORTS_TASKS; + else if (g_ascii_strcasecmp ((const gchar *) name, "VFREEBUSY") == 0) + supports |= E_WEBDAV_RESOURCE_SUPPORTS_FREEBUSY; + else if (g_ascii_strcasecmp ((const gchar *) name, "VTIMEZONE") == 0) + supports |= E_WEBDAV_RESOURCE_SUPPORTS_TIMEZONE; + + xmlFree (name); + } } - } - if (!found_comps) { - /* If the property is not present, assume all component - * types are supported. (RFC 4791, Section 5.2.3) */ - supports = supports | - E_WEBDAV_RESOURCE_SUPPORTS_EVENTS | - E_WEBDAV_RESOURCE_SUPPORTS_MEMOS | - E_WEBDAV_RESOURCE_SUPPORTS_TASKS | - E_WEBDAV_RESOURCE_SUPPORTS_FREEBUSY | - E_WEBDAV_RESOURCE_SUPPORTS_TIMEZONE; + if (!found_comps) { + /* If the property is not present, assume all component + * types are supported. (RFC 4791, Section 5.2.3) */ + supports = supports | + E_WEBDAV_RESOURCE_SUPPORTS_EVENTS | + E_WEBDAV_RESOURCE_SUPPORTS_MEMOS | + E_WEBDAV_RESOURCE_SUPPORTS_TASKS | + E_WEBDAV_RESOURCE_SUPPORTS_FREEBUSY | + E_WEBDAV_RESOURCE_SUPPORTS_TIMEZONE; + } } } @@ -3672,7 +3677,7 @@ source_href = e_webdav_session_util_maybe_dequote (g_strdup ((const gchar *) x_source_href)); } - supports = e_webdav_session_extract_supports (prop_node); + supports = e_webdav_session_extract_supports (prop_node, kind); etag = e_webdav_session_extract_nonempty (prop_node, E_WEBDAV_NS_DAV, "getetag", E_WEBDAV_NS_CALENDARSERVER, "getctag"); display_name = e_webdav_session_extract_nonempty (prop_node, E_WEBDAV_NS_DAV, "displayname", NULL, NULL); content_type = e_webdav_session_extract_nonempty (prop_node, E_WEBDAV_NS_DAV, "getcontenttype", NULL, NULL); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/libedataserverui/e-reminders-widget.c new/evolution-data-server-3.44.2/src/libedataserverui/e-reminders-widget.c --- old/evolution-data-server-3.44.1/src/libedataserverui/e-reminders-widget.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/libedataserverui/e-reminders-widget.c 2022-05-27 07:43:00.000000000 +0200 @@ -1547,7 +1547,9 @@ GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkWidget *widget; - GtkBox *box; + GtkCssProvider *css_provider; + GtkFlowBox *flow_box; + GError *error = NULL; /* Chain up to parent's method. */ G_OBJECT_CLASS (e_reminders_widget_parent_class)->constructed (object); @@ -1652,27 +1654,44 @@ reminders_widget_fill_snooze_combo (reminders, g_settings_get_int (reminders->priv->settings, "notify-last-snooze-minutes")); - box = GTK_BOX (gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL)); - g_object_set (G_OBJECT (box), - "halign", GTK_ALIGN_END, - "hexpand", TRUE, - "valign", GTK_ALIGN_CENTER, - "vexpand", FALSE, - "margin-top", 4, + flow_box = GTK_FLOW_BOX (gtk_flow_box_new ()); + g_object_set (G_OBJECT (flow_box), + "homogeneous", FALSE, + "selection-mode", GTK_SELECTION_NONE, + "column-spacing", 1, + "row-spacing", 1, NULL); widget = gtk_label_new (""); + gtk_widget_set_margin_start (widget, 8); - gtk_box_pack_start (box, reminders->priv->snooze_combo, FALSE, FALSE, 0); - gtk_box_pack_start (box, reminders->priv->snooze_button, FALSE, FALSE, 0); - gtk_box_pack_start (box, widget, FALSE, FALSE, 0); - gtk_box_pack_start (box, reminders->priv->dismiss_button, FALSE, FALSE, 0); - gtk_box_pack_start (box, reminders->priv->dismiss_all_button, FALSE, FALSE, 0); - - gtk_button_box_set_child_non_homogeneous (GTK_BUTTON_BOX (box), reminders->priv->snooze_combo, TRUE); - gtk_button_box_set_child_non_homogeneous (GTK_BUTTON_BOX (box), widget, TRUE); + gtk_flow_box_insert (flow_box, reminders->priv->snooze_combo, -1); + gtk_flow_box_insert (flow_box, reminders->priv->snooze_button, -1); + gtk_flow_box_insert (flow_box, widget, -1); + gtk_flow_box_insert (flow_box, reminders->priv->dismiss_button, -1); + gtk_flow_box_insert (flow_box, reminders->priv->dismiss_all_button, -1); + + gtk_grid_attach (GTK_GRID (reminders), GTK_WIDGET (flow_box), 0, 1, 1, 1); + + css_provider = gtk_css_provider_new (); + + if (gtk_css_provider_load_from_data (css_provider, "flowboxchild { padding: 0px; }", -1, &error)) { + GtkFlowBoxChild *child; + guint ii = 0; + + while (child = gtk_flow_box_get_child_at_index (flow_box, ii), child) { + gtk_style_context_add_provider ( + gtk_widget_get_style_context (GTK_WIDGET (child)), + GTK_STYLE_PROVIDER (css_provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + ii++; + } + } else { + g_warning ("%s: Failed to parse CSS: %s", G_STRFUNC, error ? error->message : "Unknown error"); + } - gtk_grid_attach (GTK_GRID (reminders), GTK_WIDGET (box), 0, 1, 1, 1); + g_clear_object (&css_provider); + g_clear_error (&error); gtk_widget_show_all (GTK_WIDGET (reminders)); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evolution-data-server-3.44.1/src/modules/gnome-online-accounts/module-gnome-online-accounts.c new/evolution-data-server-3.44.2/src/modules/gnome-online-accounts/module-gnome-online-accounts.c --- old/evolution-data-server-3.44.1/src/modules/gnome-online-accounts/module-gnome-online-accounts.c 2022-04-22 07:45:23.000000000 +0200 +++ new/evolution-data-server-3.44.2/src/modules/gnome-online-accounts/module-gnome-online-accounts.c 2022-05-27 07:43:00.000000000 +0200 @@ -1154,11 +1154,14 @@ e_goa_debug_printf ("Found %d existing sources\n", g_list_length (list)); + g_hash_table_remove_all (extension->goa_to_eds); + for (link = list; link != NULL; link = g_list_next (link)) { ESource *source; ESourceGoa *goa_ext; const gchar *account_id; const gchar *source_uid; + const gchar *existing_source_uid; GList *match; source = E_SOURCE (link->data); @@ -1173,14 +1176,20 @@ continue; } - if (g_hash_table_lookup (extension->goa_to_eds, account_id)) { - e_goa_debug_printf ("Source '%s' references account '%s' which is already used by other source\n", - source_uid, account_id); - - /* There are more ESource-s referencing the same GOA account; - delete the later. */ - g_queue_push_tail (&trash, source); - continue; + existing_source_uid = g_hash_table_lookup (extension->goa_to_eds, account_id); + if (existing_source_uid) { + if (g_strcmp0 (source_uid, existing_source_uid) == 0) { + e_goa_debug_printf ("Already know the source '%s' references account '%s'\n", + source_uid, account_id); + } else { + e_goa_debug_printf ("Source '%s' references account '%s' which is already used by source '%s'\n", + source_uid, account_id, existing_source_uid); + + /* There are more ESource-s referencing the same GOA account; + delete the later. */ + g_queue_push_tail (&trash, source); + continue; + } } /* Verify the GOA account still exists. */