Skip to content
Commits on Source (20)
......@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.1)
cmake_policy(VERSION 3.1)
project(evolution-data-server
VERSION 3.46.1
VERSION 3.46.2
LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 14)
set(PROJECT_BUGREPORT "https://gitlab.gnome.org/GNOME/evolution-data-server/issues/")
......@@ -678,6 +678,9 @@ if((NOT HAVE_TM_GMTOFF) AND (NOT HAVE_TIMEZONE))
message(FATAL_ERROR "Unable to find a way to determine timezone")
endif((NOT HAVE_TM_GMTOFF) AND (NOT HAVE_TIMEZONE))
CHECK_C_SOURCE_COMPILES("#include <time.h>
int main(void) { localtime_r(NULL, NULL); return 0; }" HAVE_LOCALTIME_R)
# ******************************
# gethostbyaddr_r prototype
# ******************************
......
Evolution-Data-Server 3.46.2 2022-12-02
---------------------------------------
Bug Fixes:
I#431 - e-xml-utils: Enable parse of huge XML files
I#432 - Fix possible NULL-dereference in e_cal_backend_file_modify_objects()
I#435 - ECalComponentAttendee: Default CUTYPE is INDIVIDUAL
I#437 - IMAP: Excessive memory usage on folder summary download
I#438 - Trust Prompt: Add issuer's certificate fingerprint
I#439 - Fails to add task with X-EVOLUTION-GTASKS-POSITION into Google Task list
Miscellaneous:
build: Add a check for localtime_r()
Translations:
Balázs Úr (hu)
Boyuan Yang (zh_CN)
Gianvito Cavasoli (it)
Jürgen Benvenuti (de)
Kukuh Syafaat (id)
Nart Tlisha (ab)
Nathan Follens (nl)
Мирослав Николић (sr)
Evolution-Data-Server 3.46.1 2022-10-21
---------------------------------------
......
......@@ -117,6 +117,9 @@
/* Define if libc defines an altzone variable */
#cmakedefine HAVE_ALTZONE 1
/* Define if libc defines localtime_r function */
#cmakedefine HAVE_LOCALTIME_R
/* Define to 1 if you have the `gethostbyaddr_r' function. */
#cmakedefine HAVE_GETHOSTBYADDR_R 1
......
This diff is collapsed.
......@@ -22,8 +22,8 @@ msgstr ""
"Project-Id-Version: evolution-data-server master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/evolution-data-server/"
"issues\n"
"POT-Creation-Date: 2022-10-07 06:27+0000\n"
"PO-Revision-Date: 2022-10-16 11:43+0200\n"
"POT-Creation-Date: 2022-10-21 14:11+0000\n"
"PO-Revision-Date: 2022-10-25 11:13+0200\n"
"Last-Translator: Jürgen Benvenuti <gastornis@posteo.org>\n"
"Language-Team: German <gnome-de@gnome.org>\n"
"Language: de\n"
......@@ -1014,7 +1014,7 @@ msgstr "Fehler beim Auswerten des regulären Ausdrucks"
#: src/addressbook/libedata-book/e-book-backend-sqlitedb.c:1549
#: src/addressbook/libedata-book/e-book-cache.c:4586
#: src/addressbook/libedata-book/e-book-sqlite.c:1877 src/camel/camel-db.c:829
#: src/addressbook/libedata-book/e-book-sqlite.c:1877 src/camel/camel-db.c:828
#, c-format
msgid "Insufficient memory"
msgstr "Nicht ausreichender Speicher"
......@@ -2726,7 +2726,7 @@ msgstr "Zwischenspeicherdatei ist leer"
msgid "Could not remove cache entry: %s: %s"
msgstr "Cache-Eintrag konnte nicht entfernt werden: %s: %s"
#: src/camel/camel-db.c:883 src/camel/providers/local/camel-mbox-store.c:913
#: src/camel/camel-db.c:882 src/camel/providers/local/camel-mbox-store.c:913
#, c-format
msgid "Could not rename “%s” to %s: %s"
msgstr "%s konnte nicht in %s umbenannt werden: %s"
......@@ -6125,6 +6125,18 @@ msgstr "Vergangene Erinnerungen für EReminderWatcher"
msgid "Snoozed reminders for EReminderWatcher"
msgstr "Auf Wiederholung gesetzte Erinnerungen für EReminderWatcher"
# Ich bin mir nicht sicher, ob ich den ersten Satz richtig verstanden bzw. übersetzt habe. - jb
#: data/org.gnome.evolution-data-server.calendar.gschema.xml.in:37
msgid ""
"How many days the reminders-past can hold back. Reminders older than these "
"days are automatically removed from the list of the past reminders. Use '0' "
"to not remove old reminders."
msgstr ""
"Wie viele Tage in die Vergangenheit die Erinnerungen zurückreichen sollen. "
"Erinnerungen, die älter sind als diese Tage, werden automatisch aus der "
"Liste der vergangenen Erinnerungen entfernt. Verwenden Sie »0«, um keine "
"alten Erinnerungen zu entfernen."
#: data/org.gnome.evolution-data-server.calendar.gschema.xml.in:42
msgid "Reminder programs"
msgstr "Erinnerungsprogramme"
......@@ -6137,6 +6149,12 @@ msgstr "Programme, die von Erinnerungen ausgeführt werden dürfen"
msgid "Enable desktop notifications"
msgstr "Arbeitsumgebung-Benachrichtigungen aktivieren"
#: data/org.gnome.evolution-data-server.calendar.gschema.xml.in:48
msgid "When set to true, the desktop/system notifications are shown"
msgstr ""
"Legt fest, ob die Benachrichtigungen der Arbeitsumgebung/des Systems "
"angezeigt werden sollen"
#: data/org.gnome.evolution-data-server.calendar.gschema.xml.in:52
msgid "Enable audio notifications"
msgstr "Klang-Benachrichtigungen aktivieren"
......@@ -6457,6 +6475,20 @@ msgstr ""
"Zeichenkette bedeutet, dass das bei der Erstellung angegebene Passwort "
"verwendet wird. Änderungen erfordern einen Neustart."
#: data/org.gnome.evolution-data-server.gschema.xml.in:91
msgid "Whether to limit operations in Power Saver mode"
msgstr "Legt fest, ob Vorgänge im Energiesparmodus eingeschränkt werden sollen"
#: data/org.gnome.evolution-data-server.gschema.xml.in:92
msgid ""
"When set to “true”, possibly expensive operations required to refresh books/"
"calendars/mail accounts/... are skipped when the machine is in the Power "
"Saver mode."
msgstr ""
"Wenn auf »wahr« gesetzt, werden möglicherweise arbeitsintensive Vorgänge, "
"die zum Aktualisieren der Adressbücher/Kalender/E-Mail-Konten/… notwendig "
"sind, übersprungen, wenn sich das Gerät im Energiesparmodus befindet."
#: data/org.gnome.evolution.shell.network-config.gschema.xml.in:11
msgid "(Deprecated) Proxy type to use"
msgstr "(Veraltet) Typ des zu verwendenden Proxys"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -2700,7 +2700,7 @@ e_cal_backend_file_modify_objects (ECalBackendSync *backend,
obj_data->recurrences_list = g_list_remove (obj_data->recurrences_list, recurrence);
g_hash_table_remove (obj_data->recurrences, rid);
} else {
if (*old_components)
if (old_components)
*old_components = g_slist_prepend (*old_components, obj_data->full_object ? e_cal_component_clone (obj_data->full_object) : NULL);
}
......
......@@ -45,6 +45,21 @@ struct _ECalBackendGTasksPrivate {
G_DEFINE_TYPE_WITH_PRIVATE (ECalBackendGTasks, e_cal_backend_gtasks, E_TYPE_CAL_META_BACKEND)
static gboolean
ecb_gtasks_only_zeros (const gchar *str)
{
if (!str)
return FALSE;
while (*str) {
if (*str != '0')
return FALSE;
str++;
}
return TRUE;
}
static gboolean
ecb_gtasks_check_data_version (ECalCache *cal_cache)
{
......@@ -161,7 +176,7 @@ ecb_gtasks_gdata_to_comp (JsonObject *task)
}
position = e_gdata_task_get_position (task);
if (position)
if (position && !ecb_gtasks_only_zeros (position))
e_cal_util_component_set_x_property (icomp, X_EVO_GTASKS_POSITION, position);
parent = e_gdata_task_get_parent (task);
......@@ -261,7 +276,7 @@ ecb_gtasks_comp_to_gdata (ECalComponent *comp,
}
}
if (position && *position)
if (position && *position && !ecb_gtasks_only_zeros (position))
*out_position = g_steal_pointer (&position);
g_free (position);
......@@ -800,8 +815,9 @@ ecb_gtasks_save_component_sync (ECalMetaBackend *meta_backend,
e_gdata_task_get_id (new_task), parent, NULL /*position*/, cancellable, error);
}
} else {
/* TODO: Position is an ordering string, not a task id */
success = e_gdata_session_tasks_insert_sync (cbgtasks->priv->gdata, cbgtasks->priv->tasklist_id, comp_task,
parent, position, &new_task, cancellable, error);
parent, NULL /* position */, &new_task, cancellable, error);
}
g_rec_mutex_unlock (&cbgtasks->priv->conn_lock);
......
......@@ -66,7 +66,7 @@ e_cal_component_attendee_new (void)
ECalComponentAttendee *attendee;
attendee = g_slice_new0 (ECalComponentAttendee);
attendee->cutype = I_CAL_CUTYPE_NONE;
attendee->cutype = I_CAL_CUTYPE_INDIVIDUAL;
attendee->role = I_CAL_ROLE_REQPARTICIPANT;
attendee->partstat = I_CAL_PARTSTAT_NEEDSACTION;
attendee->parameter_bag = e_cal_component_parameter_bag_new ();
......@@ -270,7 +270,7 @@ e_cal_component_attendee_set_from_property (ECalComponentAttendee *attendee,
g_clear_object (&param);
param = i_cal_property_get_first_parameter (prop, I_CAL_CUTYPE_PARAMETER);
e_cal_component_attendee_set_cutype (attendee, param ? i_cal_parameter_get_cutype (param) : I_CAL_CUTYPE_NONE);
e_cal_component_attendee_set_cutype (attendee, param ? i_cal_parameter_get_cutype (param) : I_CAL_CUTYPE_INDIVIDUAL);
g_clear_object (&param);
param = i_cal_property_get_first_parameter (prop, I_CAL_ROLE_PARAMETER);
......
......@@ -1861,6 +1861,15 @@ camel_filter_driver_filter_folder (CamelFilterDriver *driver,
if (cache)
camel_uid_cache_save (cache);
/* Unset message headers on the infos, which are meant only for filtering,
which just finished, thus the memory can be freed now */
for (i = 0; i < uids->len; i++) {
info = camel_folder_get_message_info (folder, uids->pdata[i]);
if (info)
camel_message_info_take_headers (info, NULL);
g_clear_object (&info);
}
if (driver->priv->defaultfolder) {
report_status (
driver, CAMEL_FILTER_STATUS_PROGRESS,
......
......@@ -3059,7 +3059,11 @@ message_info_new_from_headers (CamelFolderSummary *summary,
if (ct)
camel_content_type_unref (ct);
camel_message_info_take_headers (mi, camel_name_value_array_copy (headers));
/* Headers are meant to be used when filtering, to speed things up.
Do not save them, when the folder is not expected to be filtered. */
if (summary && summary->priv->folder &&
(camel_folder_get_flags (summary->priv->folder) & (CAMEL_FOLDER_FILTER_RECENT | CAMEL_FOLDER_FILTER_JUNK)) != 0)
camel_message_info_take_headers (mi, camel_name_value_array_copy (headers));
camel_message_info_set_abort_notifications (mi, FALSE);
......
......@@ -58,6 +58,10 @@
#define MAX_COMMAND_LEN 1000
/* Allow up to this number of message infos in a folder with message headers
stored in memory, to not use too much memory when fetching new messages. */
#define MAX_N_MESSAGES_WITH_HEADERS 500
/* Ping the server after a period of inactivity to avoid being logged off.
* Using a 29 minute inactivity timeout as recommended in RFC 2177 (IDLE). */
#define INACTIVITY_TIMEOUT_SECONDS (29 * 60)
......@@ -310,6 +314,7 @@ struct _CamelIMAPXServerPrivate {
CamelFolder *fetch_changes_folder; /* not referenced */
GHashTable *fetch_changes_infos; /* gchar *uid ~> FetchChangesInfo-s */
gint64 fetch_changes_last_progress; /* when was called last progress */
gboolean fetch_changes_with_headers; /* whether can preserve message headers in the message info */
struct _status_info *copyuid_status;
......@@ -1184,7 +1189,7 @@ imapx_untagged_fetch (CamelIMAPXServer *is,
if ((finfo->got & FETCH_UID) != 0 && is->priv->fetch_changes_folder && is->priv->fetch_changes_infos) {
FetchChangesInfo *nfo;
gint64 monotonic_time;
gint n_messages;
guint32 n_messages;
nfo = g_hash_table_lookup (is->priv->fetch_changes_infos, finfo->uid);
if (!nfo) {
......@@ -1205,15 +1210,10 @@ imapx_untagged_fetch (CamelIMAPXServer *is,
COMMAND_LOCK (is);
if (is->priv->current_command) {
guint32 n_messages;
COMMAND_UNLOCK (is);
is->priv->fetch_changes_last_progress = monotonic_time;
n_messages = camel_imapx_mailbox_get_messages (is->priv->fetch_changes_mailbox);
if (n_messages > 0)
camel_operation_progress (cancellable, 100 * is->priv->context->id / n_messages);
camel_operation_progress (cancellable, 100 * is->priv->context->id / n_messages);
} else {
COMMAND_UNLOCK (is);
}
......@@ -1424,6 +1424,9 @@ imapx_untagged_fetch (CamelIMAPXServer *is,
}
}
if (is->priv->fetch_changes_infos && !is->priv->fetch_changes_with_headers)
camel_message_info_take_headers (mi, NULL);
camel_message_info_set_size (mi, finfo->size);
camel_message_info_set_abort_notifications (mi, FALSE);
......@@ -5376,6 +5379,20 @@ imapx_server_process_fetch_changes_infos (CamelIMAPXServer *is,
}
}
/* One would use `g_slist_length()`, but the actual length is not needed here,
thus this is quicker for large lists, due to not traversing all the items. */
static gboolean
imapx_server_slist_length_not_more_than (GSList *list,
guint n_items)
{
while (list && n_items) {
list = g_slist_next (list);
n_items--;
}
return !list;
}
static gboolean
imapx_server_fetch_changes (CamelIMAPXServer *is,
CamelIMAPXMailbox *mailbox,
......@@ -5415,6 +5432,7 @@ imapx_server_fetch_changes (CamelIMAPXServer *is,
is->priv->fetch_changes_folder = folder;
is->priv->fetch_changes_infos = infos;
is->priv->fetch_changes_last_progress = 0;
is->priv->fetch_changes_with_headers = TRUE;
camel_operation_push_message (cancellable,
/* Translators: The first “%s” is replaced with an account name and the second “%s”
......@@ -5435,6 +5453,8 @@ imapx_server_fetch_changes (CamelIMAPXServer *is,
g_hash_table_remove_all (infos);
if (success && fetch_summary_uids) {
CamelIMAPXStore *imapx_store;
gboolean bodystructure_enabled;
struct _uidset_state uidset;
GSList *link;
......@@ -5449,6 +5469,10 @@ imapx_server_fetch_changes (CamelIMAPXServer *is,
camel_service_get_display_name (CAMEL_SERVICE (camel_folder_get_parent_store (folder))),
camel_folder_get_full_display_name (folder));
imapx_store = camel_imapx_server_ref_store (is);
bodystructure_enabled = imapx_store && camel_imapx_store_get_bodystructure_enabled (imapx_store);
is->priv->fetch_changes_with_headers = imapx_server_slist_length_not_more_than (fetch_summary_uids, MAX_N_MESSAGES_WITH_HEADERS);
fetch_summary_uids = g_slist_sort (fetch_summary_uids, imapx_uids_desc_cmp);
for (link = fetch_summary_uids; link; link = g_slist_next (link)) {
......@@ -5462,11 +5486,6 @@ imapx_server_fetch_changes (CamelIMAPXServer *is,
if (imapx_uidset_add (&uidset, ic, uid) == 1 || (!link->next && ic && imapx_uidset_done (&uidset, ic))) {
GError *local_error = NULL;
gboolean bodystructure_enabled;
CamelIMAPXStore *imapx_store;
imapx_store = camel_imapx_server_ref_store (is);
bodystructure_enabled = imapx_store && camel_imapx_store_get_bodystructure_enabled (imapx_store);
if (bodystructure_enabled)
camel_imapx_command_add (ic, " (RFC822.SIZE RFC822.HEADER BODYSTRUCTURE FLAGS)");
......@@ -5482,13 +5501,12 @@ imapx_server_fetch_changes (CamelIMAPXServer *is,
even when it's not 100% sure the BODYSTRUCTURE response was the broken one. */
if (bodystructure_enabled && !success &&
g_error_matches (local_error, CAMEL_IMAPX_ERROR, CAMEL_IMAPX_ERROR_SERVER_RESPONSE_MALFORMED)) {
bodystructure_enabled = FALSE;
camel_imapx_store_set_bodystructure_enabled (imapx_store, FALSE);
local_error->domain = CAMEL_IMAPX_SERVER_ERROR;
local_error->code = CAMEL_IMAPX_SERVER_ERROR_TRY_RECONNECT;
}
g_clear_object (&imapx_store);
if (local_error)
g_propagate_error (error, local_error);
......@@ -5500,6 +5518,8 @@ imapx_server_fetch_changes (CamelIMAPXServer *is,
}
}
g_clear_object (&imapx_store);
camel_operation_pop_message (cancellable);
imapx_server_process_fetch_changes_infos (is, mailbox, folder, infos, NULL, NULL, 0, 0);
......
......@@ -222,7 +222,7 @@ e_xml_parse_data (gconstpointer data,
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (length > 0, NULL);
return xmlReadMemory (data, length, "data.xml", NULL, XML_PARSE_NOWARNING | XML_PARSE_RECOVER);
return xmlReadMemory (data, length, "data.xml", NULL, XML_PARSE_NOWARNING | XML_PARSE_RECOVER | XML_PARSE_HUGE | XML_PARSE_NONET);
}
/**
......
......@@ -362,6 +362,20 @@ ecw_dup_signature_alg (CERTCertificate *cert)
return g_strdup (description);
}
static gchar *
ecw_dup_issuer_fingerprint_sha256 (CERTCertificate *cert)
{
guchar fingerprint[SHA256_LENGTH + 1];
if (!cert->derIssuer.data || !cert->derIssuer.len)
return NULL;
memset (fingerprint, 0, sizeof fingerprint);
PK11_HashBuf (SEC_OID_SHA256, fingerprint, cert->derIssuer.data, cert->derIssuer.len);
return ecw_dup_hexify (fingerprint, SHA256_LENGTH);
}
static gchar *
ecw_dup_fingerprint_sha256 (CERTCertificate *cert)
{
......@@ -415,6 +429,7 @@ static struct _SectionKey {
{ NULL, N_("State"), ecw_dup_issuer_state },
{ NULL, N_("Locality"), ecw_dup_issuer_locality },
{ NULL, N_("Domain Component Name"), ecw_dup_issuer_domain_component_name },
{ NULL, N_("SHA-256 Fingerprint"), ecw_dup_issuer_fingerprint_sha256 },
{ N_("Details"), N_("Not Before"), ecw_dup_not_before },
{ NULL, N_("Not After"), ecw_dup_not_after },
{ NULL, N_("Usage"), ecw_dup_usage },
......