import evolution-3.28.5-14.el8
This commit is contained in:
commit
31521b4f3e
1
.evolution.metadata
Normal file
1
.evolution.metadata
Normal file
@ -0,0 +1 @@
|
||||
4e88744b1ae02e2d49c220b2e981007eae701bb0 SOURCES/evolution-3.28.5.tar.xz
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
SOURCES/evolution-3.28.5.tar.xz
|
37
SOURCES/evolution-3.28.5-config-lookup-crash.patch
Normal file
37
SOURCES/evolution-3.28.5-config-lookup-crash.patch
Normal file
@ -0,0 +1,37 @@
|
||||
diff --git a/src/e-util/e-collection-account-wizard.c b/src/e-util/e-collection-account-wizard.c
|
||||
index 49b1ac4a96..84ccd3fd53 100644
|
||||
--- a/src/e-util/e-collection-account-wizard.c
|
||||
+++ b/src/e-util/e-collection-account-wizard.c
|
||||
@@ -1858,8 +1858,6 @@ collection_account_wizard_dispose (GObject *object)
|
||||
wizard->priv->store_passwords = NULL;
|
||||
}
|
||||
|
||||
- g_warn_if_fail (wizard->priv->running_result == NULL);
|
||||
-
|
||||
if (wizard->priv->running_result) {
|
||||
e_simple_async_result_complete_idle (wizard->priv->running_result);
|
||||
g_clear_object (&wizard->priv->running_result);
|
||||
diff --git a/src/e-util/e-config-lookup.c b/src/e-util/e-config-lookup.c
|
||||
index d0eff38ef2..3b68fa6876 100644
|
||||
--- a/src/e-util/e-config-lookup.c
|
||||
+++ b/src/e-util/e-config-lookup.c
|
||||
@@ -277,6 +277,11 @@ config_lookup_dispose (GObject *object)
|
||||
|
||||
e_config_lookup_cancel_all (config_lookup);
|
||||
|
||||
+ if (config_lookup->priv->pool) {
|
||||
+ g_thread_pool_free (config_lookup->priv->pool, TRUE, TRUE);
|
||||
+ config_lookup->priv->pool = NULL;
|
||||
+ }
|
||||
+
|
||||
g_mutex_lock (&config_lookup->priv->property_lock);
|
||||
|
||||
g_clear_object (&config_lookup->priv->run_cancellable);
|
||||
@@ -305,7 +310,6 @@ config_lookup_finalize (GObject *object)
|
||||
EConfigLookup *config_lookup = E_CONFIG_LOOKUP (object);
|
||||
|
||||
g_slist_free_full (config_lookup->priv->results, g_object_unref);
|
||||
- g_thread_pool_free (config_lookup->priv->pool, TRUE, FALSE);
|
||||
g_mutex_clear (&config_lookup->priv->property_lock);
|
||||
|
||||
/* Chain up to parent's method. */
|
314
SOURCES/evolution-3.28.5-crash-empty-attendee.patch
Normal file
314
SOURCES/evolution-3.28.5-crash-empty-attendee.patch
Normal file
@ -0,0 +1,314 @@
|
||||
diff -up evolution-3.28.5/src/calendar/gui/e-comp-editor.c.crash-empty-attendee evolution-3.28.5/src/calendar/gui/e-comp-editor.c
|
||||
--- evolution-3.28.5/src/calendar/gui/e-comp-editor.c.crash-empty-attendee 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/calendar/gui/e-comp-editor.c 2020-05-15 12:24:47.067773299 +0200
|
||||
@@ -112,10 +112,10 @@ ece_restore_focus (ECompEditor *comp_edi
|
||||
g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
|
||||
|
||||
if (comp_editor->priv->restore_focus) {
|
||||
- gtk_widget_grab_focus (comp_editor->priv->restore_focus);
|
||||
-
|
||||
if (GTK_IS_ENTRY (comp_editor->priv->restore_focus))
|
||||
- gtk_editable_set_position (GTK_EDITABLE (comp_editor->priv->restore_focus), 0);
|
||||
+ gtk_entry_grab_focus_without_selecting (GTK_ENTRY (comp_editor->priv->restore_focus));
|
||||
+ else
|
||||
+ gtk_widget_grab_focus (comp_editor->priv->restore_focus);
|
||||
|
||||
comp_editor->priv->restore_focus = NULL;
|
||||
}
|
||||
@@ -2610,6 +2610,7 @@ e_comp_editor_fill_component (ECompEdito
|
||||
icalcomponent *component)
|
||||
{
|
||||
ECompEditorClass *comp_editor_class;
|
||||
+ GtkWidget *focused_widget;
|
||||
gboolean is_valid;
|
||||
|
||||
g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
|
||||
@@ -2619,8 +2620,34 @@ e_comp_editor_fill_component (ECompEdito
|
||||
g_return_val_if_fail (comp_editor_class != NULL, FALSE);
|
||||
g_return_val_if_fail (comp_editor_class->fill_component != NULL, FALSE);
|
||||
|
||||
+ focused_widget = gtk_window_get_focus (GTK_WINDOW (comp_editor));
|
||||
+ if (focused_widget) {
|
||||
+ GtkWidget *parent, *ce_widget = GTK_WIDGET (comp_editor);
|
||||
+
|
||||
+ /* When a cell-renderer is focused and editing the cell content,
|
||||
+ then unfocus it may mean to free the currently focused widget,
|
||||
+ thus get the GtkTreeView in such cases. */
|
||||
+ parent = focused_widget;
|
||||
+ while (parent = gtk_widget_get_parent (parent), parent && parent != ce_widget) {
|
||||
+ if (GTK_IS_TREE_VIEW (parent)) {
|
||||
+ focused_widget = parent;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* Save any pending changes */
|
||||
+ gtk_window_set_focus (GTK_WINDOW (comp_editor), NULL);
|
||||
+ }
|
||||
+
|
||||
is_valid = comp_editor_class->fill_component (comp_editor, component);
|
||||
|
||||
+ if (focused_widget) {
|
||||
+ if (GTK_IS_ENTRY (focused_widget))
|
||||
+ gtk_entry_grab_focus_without_selecting (GTK_ENTRY (focused_widget));
|
||||
+ else
|
||||
+ gtk_widget_grab_focus (focused_widget);
|
||||
+ }
|
||||
+
|
||||
if (is_valid && comp_editor->priv->validation_alert) {
|
||||
e_alert_response (comp_editor->priv->validation_alert, GTK_RESPONSE_CLOSE);
|
||||
g_clear_object (&comp_editor->priv->validation_alert);
|
||||
diff -up evolution-3.28.5/src/calendar/gui/e-comp-editor-event.c.crash-empty-attendee evolution-3.28.5/src/calendar/gui/e-comp-editor-event.c
|
||||
--- evolution-3.28.5/src/calendar/gui/e-comp-editor-event.c.crash-empty-attendee 2020-05-15 12:23:49.488776711 +0200
|
||||
+++ evolution-3.28.5/src/calendar/gui/e-comp-editor-event.c 2020-05-15 12:24:47.064773299 +0200
|
||||
@@ -67,14 +67,14 @@ ece_event_update_times (ECompEditorEvent
|
||||
EDateEdit *date_edit,
|
||||
gboolean change_end_datetime)
|
||||
{
|
||||
- GtkWidget *widget;
|
||||
guint flags;
|
||||
|
||||
g_return_if_fail (E_IS_COMP_EDITOR_EVENT (event_editor));
|
||||
g_return_if_fail (E_IS_DATE_EDIT (date_edit));
|
||||
|
||||
- widget = e_date_edit_get_entry (date_edit);
|
||||
- if (widget && gtk_widget_has_focus (widget))
|
||||
+ if (e_date_edit_has_focus (date_edit) ||
|
||||
+ !e_date_edit_date_is_valid (date_edit) ||
|
||||
+ !e_date_edit_time_is_valid (date_edit))
|
||||
return;
|
||||
|
||||
if (!e_comp_editor_get_updating (E_COMP_EDITOR (event_editor))) {
|
||||
diff -up evolution-3.28.5/src/calendar/gui/e-comp-editor-property-part.c.crash-empty-attendee evolution-3.28.5/src/calendar/gui/e-comp-editor-property-part.c
|
||||
--- evolution-3.28.5/src/calendar/gui/e-comp-editor-property-part.c.crash-empty-attendee 2020-05-15 12:24:06.520775702 +0200
|
||||
+++ evolution-3.28.5/src/calendar/gui/e-comp-editor-property-part.c 2020-05-15 12:30:44.589752111 +0200
|
||||
@@ -589,6 +589,23 @@ struct _ECompEditorPropertyPartDatetimeP
|
||||
G_DEFINE_ABSTRACT_TYPE (ECompEditorPropertyPartDatetime, e_comp_editor_property_part_datetime, E_TYPE_COMP_EDITOR_PROPERTY_PART)
|
||||
|
||||
static void
|
||||
+ecepp_datetime_changed_cb (ECompEditorPropertyPart *property_part)
|
||||
+{
|
||||
+ GtkWidget *edit_widget;
|
||||
+
|
||||
+ g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DATETIME (property_part));
|
||||
+
|
||||
+ edit_widget = e_comp_editor_property_part_get_edit_widget (property_part);
|
||||
+
|
||||
+ if (!edit_widget || e_date_edit_has_focus (E_DATE_EDIT (edit_widget)) ||
|
||||
+ !e_date_edit_date_is_valid (E_DATE_EDIT (edit_widget)) ||
|
||||
+ !e_date_edit_time_is_valid (E_DATE_EDIT (edit_widget)))
|
||||
+ return;
|
||||
+
|
||||
+ e_comp_editor_property_part_emit_changed (property_part);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
ecepp_datetime_create_widgets (ECompEditorPropertyPart *property_part,
|
||||
GtkWidget **out_label_widget,
|
||||
GtkWidget **out_edit_widget)
|
||||
@@ -616,9 +633,9 @@ ecepp_datetime_create_widgets (ECompEdit
|
||||
gtk_widget_show (*out_edit_widget);
|
||||
|
||||
g_signal_connect_swapped (*out_edit_widget, "changed",
|
||||
- G_CALLBACK (e_comp_editor_property_part_emit_changed), property_part);
|
||||
+ G_CALLBACK (ecepp_datetime_changed_cb), property_part);
|
||||
g_signal_connect_swapped (*out_edit_widget, "notify::show-time",
|
||||
- G_CALLBACK (e_comp_editor_property_part_emit_changed), property_part);
|
||||
+ G_CALLBACK (ecepp_datetime_changed_cb), property_part);
|
||||
}
|
||||
|
||||
static void
|
||||
diff -up evolution-3.28.5/src/e-util/e-dateedit.c.crash-empty-attendee evolution-3.28.5/src/e-util/e-dateedit.c
|
||||
--- evolution-3.28.5/src/e-util/e-dateedit.c.crash-empty-attendee 2020-05-15 12:22:47.352780394 +0200
|
||||
+++ evolution-3.28.5/src/e-util/e-dateedit.c 2020-05-15 12:24:47.068773299 +0200
|
||||
@@ -527,6 +527,13 @@ e_date_edit_new (void)
|
||||
}
|
||||
|
||||
static void
|
||||
+on_time_entry_changed_cb (GtkEditable *editable,
|
||||
+ EDateEdit *dedit)
|
||||
+{
|
||||
+ e_date_edit_check_time_changed (dedit);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
create_children (EDateEdit *dedit)
|
||||
{
|
||||
EDateEditPrivate *priv;
|
||||
@@ -636,6 +643,9 @@ create_children (EDateEdit *dedit)
|
||||
g_signal_connect_after (
|
||||
child, "focus_out_event",
|
||||
G_CALLBACK (on_time_entry_focus_out), dedit);
|
||||
+ g_signal_connect (
|
||||
+ child, "changed",
|
||||
+ G_CALLBACK (on_time_entry_changed_cb), dedit);
|
||||
g_signal_connect_after (
|
||||
priv->time_combo, "changed",
|
||||
G_CALLBACK (on_date_edit_time_selected), dedit);
|
||||
@@ -2000,7 +2010,6 @@ on_date_entry_focus_out (GtkEntry *entry
|
||||
EDateEdit *dedit)
|
||||
{
|
||||
struct tm tmp_tm;
|
||||
- GtkWidget *msg_dialog;
|
||||
|
||||
tmp_tm.tm_year = 0;
|
||||
tmp_tm.tm_mon = 0;
|
||||
@@ -2009,21 +2018,9 @@ on_date_entry_focus_out (GtkEntry *entry
|
||||
e_date_edit_check_date_changed (dedit);
|
||||
|
||||
if (!e_date_edit_date_is_valid (dedit)) {
|
||||
- msg_dialog = gtk_message_dialog_new (
|
||||
- NULL,
|
||||
- GTK_DIALOG_MODAL,
|
||||
- GTK_MESSAGE_WARNING,
|
||||
- GTK_BUTTONS_OK,
|
||||
- "%s", _("Invalid Date Value"));
|
||||
- gtk_dialog_run (GTK_DIALOG (msg_dialog));
|
||||
- gtk_widget_destroy (msg_dialog);
|
||||
- e_date_edit_get_date (
|
||||
- dedit, &tmp_tm.tm_year,
|
||||
- &tmp_tm.tm_mon, &tmp_tm.tm_mday);
|
||||
- e_date_edit_set_date (
|
||||
- dedit, tmp_tm.tm_year,
|
||||
- tmp_tm.tm_mon, tmp_tm.tm_mday);
|
||||
- gtk_widget_grab_focus (GTK_WIDGET (entry));
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, "dialog-warning");
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, _("Invalid Date Value"));
|
||||
+ gtk_entry_grab_focus_without_selecting (entry);
|
||||
return FALSE;
|
||||
} else if (e_date_edit_get_date (
|
||||
dedit, &tmp_tm.tm_year, &tmp_tm.tm_mon, &tmp_tm.tm_mday)) {
|
||||
@@ -2041,6 +2038,10 @@ on_date_entry_focus_out (GtkEntry *entry
|
||||
dedit->priv->date_set_to_none = TRUE;
|
||||
e_date_edit_update_date_entry (dedit);
|
||||
}
|
||||
+
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
|
||||
+
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2049,23 +2050,17 @@ on_time_entry_focus_out (GtkEntry *entry
|
||||
GdkEventFocus *event,
|
||||
EDateEdit *dedit)
|
||||
{
|
||||
- GtkWidget *msg_dialog;
|
||||
-
|
||||
e_date_edit_check_time_changed (dedit);
|
||||
|
||||
if (!e_date_edit_time_is_valid (dedit)) {
|
||||
- msg_dialog = gtk_message_dialog_new (
|
||||
- NULL,
|
||||
- GTK_DIALOG_MODAL,
|
||||
- GTK_MESSAGE_WARNING,
|
||||
- GTK_BUTTONS_OK,
|
||||
- "%s", _("Invalid Time Value"));
|
||||
- gtk_dialog_run (GTK_DIALOG (msg_dialog));
|
||||
- gtk_widget_destroy (msg_dialog);
|
||||
- e_date_edit_set_time (dedit,e_date_edit_get_time (dedit));
|
||||
- gtk_widget_grab_focus (GTK_WIDGET (entry));
|
||||
- return FALSE;
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, "dialog-warning");
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, _("Invalid Time Value"));
|
||||
+ gtk_entry_grab_focus_without_selecting (entry);
|
||||
+ } else {
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
|
||||
}
|
||||
+
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2363,7 +2358,7 @@ e_date_edit_check_time_changed (EDateEdi
|
||||
tmp_tm.tm_min);
|
||||
|
||||
if (time_changed) {
|
||||
- e_date_edit_update_time_entry (dedit);
|
||||
+ /* Do not call e_date_edit_update_time_entry (dedit); let the user correct the value */
|
||||
g_signal_emit (dedit, signals[CHANGED], 0);
|
||||
}
|
||||
}
|
||||
@@ -2467,6 +2462,20 @@ e_date_edit_set_date_internal (EDateEdit
|
||||
}
|
||||
}
|
||||
|
||||
+ if (date_changed) {
|
||||
+ GtkEntry *entry;
|
||||
+
|
||||
+ entry = GTK_ENTRY (dedit->priv->date_entry);
|
||||
+
|
||||
+ if (priv->date_is_valid) {
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, NULL);
|
||||
+ } else {
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY, "dialog-warning");
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY, _("Invalid Date Value"));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return date_changed;
|
||||
}
|
||||
|
||||
@@ -2510,6 +2519,20 @@ e_date_edit_set_time_internal (EDateEdit
|
||||
}
|
||||
}
|
||||
|
||||
+ if (time_changed) {
|
||||
+ GtkEntry *entry;
|
||||
+
|
||||
+ entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (dedit->priv->time_combo)));
|
||||
+
|
||||
+ if (priv->time_is_valid) {
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, NULL);
|
||||
+ } else {
|
||||
+ gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_PRIMARY, "dialog-warning");
|
||||
+ gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_PRIMARY, _("Invalid Time Value"));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
return time_changed;
|
||||
}
|
||||
|
||||
@@ -2561,3 +2584,13 @@ e_date_edit_get_entry (EDateEdit *dedit)
|
||||
|
||||
return GTK_WIDGET (dedit->priv->date_entry);
|
||||
}
|
||||
+
|
||||
+gboolean
|
||||
+e_date_edit_has_focus (EDateEdit *dedit)
|
||||
+{
|
||||
+ g_return_val_if_fail (E_IS_DATE_EDIT (dedit), FALSE);
|
||||
+
|
||||
+ return gtk_widget_has_focus (GTK_WIDGET (dedit)) ||
|
||||
+ (dedit->priv->date_entry && gtk_widget_has_focus (dedit->priv->date_entry)) ||
|
||||
+ (dedit->priv->time_combo && gtk_widget_has_focus (dedit->priv->time_combo));
|
||||
+}
|
||||
diff -up evolution-3.28.5/src/e-util/e-dateedit.h.crash-empty-attendee evolution-3.28.5/src/e-util/e-dateedit.h
|
||||
--- evolution-3.28.5/src/e-util/e-dateedit.h.crash-empty-attendee 2020-05-15 12:24:41.256773643 +0200
|
||||
+++ evolution-3.28.5/src/e-util/e-dateedit.h 2020-05-15 12:24:47.068773299 +0200
|
||||
@@ -211,6 +211,8 @@ void e_date_edit_set_get_time_callback
|
||||
|
||||
GtkWidget * e_date_edit_get_entry (EDateEdit *dedit);
|
||||
|
||||
+gboolean e_date_edit_has_focus (EDateEdit *dedit);
|
||||
+
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* E_DATE_EDIT_H */
|
||||
diff -up evolution-3.28.5/src/modules/calendar/e-cal-shell-content.c.crash-empty-attendee evolution-3.28.5/src/modules/calendar/e-cal-shell-content.c
|
||||
--- evolution-3.28.5/src/modules/calendar/e-cal-shell-content.c.crash-empty-attendee 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/modules/calendar/e-cal-shell-content.c 2020-05-15 12:21:11.487786075 +0200
|
||||
@@ -847,9 +847,9 @@ cal_shell_content_get_attendee_prop (ica
|
||||
while (prop != NULL) {
|
||||
const gchar *attendee;
|
||||
|
||||
- attendee = icalproperty_get_attendee (prop);
|
||||
+ attendee = itip_strip_mailto (icalproperty_get_attendee (prop));
|
||||
|
||||
- if (g_str_equal (itip_strip_mailto (attendee), address))
|
||||
+ if (attendee && g_ascii_strcasecmp (attendee, address) == 0)
|
||||
return prop;
|
||||
|
||||
prop = icalcomponent_get_next_property (
|
@ -0,0 +1,383 @@
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-formatter-utils.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-formatter-utils.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-formatter-utils.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-formatter-utils.c 2019-10-24 16:21:32.730944332 +0200
|
||||
@@ -549,71 +549,136 @@ e_mail_formatter_format_security_header
|
||||
EMailPart *part,
|
||||
guint32 flags)
|
||||
{
|
||||
- const gchar* part_id;
|
||||
- gchar* part_id_prefix;
|
||||
- GString* tmp;
|
||||
+ struct _validity_flags {
|
||||
+ guint32 flags;
|
||||
+ const gchar *description_complete;
|
||||
+ const gchar *description_partial;
|
||||
+ } validity_flags[] = {
|
||||
+ { E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_SIGNED, N_("GPG signed"), N_("partially GPG signed") },
|
||||
+ { E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_ENCRYPTED, N_("GPG encrypted"), N_("partially GPG encrypted") },
|
||||
+ { E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_SIGNED, N_("S/MIME signed"), N_("partially S/MIME signed") },
|
||||
+ { E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_ENCRYPTED, N_("S/MIME encrypted"), N_("partially S/MIME encrypted") }
|
||||
+ };
|
||||
+ const gchar *part_id;
|
||||
+ gchar *part_id_prefix;
|
||||
GQueue queue = G_QUEUE_INIT;
|
||||
GList *head, *link;
|
||||
+ guint32 check_valid_flags = 0;
|
||||
+ gint part_id_prefix_len;
|
||||
+ gboolean is_partial = FALSE;
|
||||
+ guint ii;
|
||||
|
||||
g_return_if_fail (E_IS_MAIL_PART_HEADERS (part));
|
||||
|
||||
/* Get prefix of this PURI */
|
||||
part_id = e_mail_part_get_id (part);
|
||||
part_id_prefix = g_strndup (part_id, g_strrstr (part_id, ".") - part_id);
|
||||
-
|
||||
- /* Add encryption/signature header */
|
||||
- tmp = g_string_new ("");
|
||||
+ part_id_prefix_len = strlen (part_id_prefix);
|
||||
|
||||
e_mail_part_list_queue_parts (context->part_list, NULL, &queue);
|
||||
|
||||
head = g_queue_peek_head_link (&queue);
|
||||
|
||||
- /* Find first secured part. */
|
||||
- for (link = head; link != NULL; link = g_list_next(link)) {
|
||||
+ /* Ignore the main message, the headers and the end parts */
|
||||
+ #define should_skip_part(_id) \
|
||||
+ (g_strcmp0 (_id, part_id_prefix) == 0 || \
|
||||
+ (_id && g_str_has_suffix (_id, ".rfc822.end")) || \
|
||||
+ (_id && strlen (_id) == part_id_prefix_len + 8 /* strlen (".headers") */ && \
|
||||
+ g_strcmp0 (_id + part_id_prefix_len, ".headers") == 0))
|
||||
+
|
||||
+ /* Check parts for this ID. */
|
||||
+ for (link = head; link != NULL; link = g_list_next (link)) {
|
||||
EMailPart *mail_part = link->data;
|
||||
+ const gchar *id = e_mail_part_get_id (mail_part);
|
||||
|
||||
- if (!e_mail_part_has_validity (mail_part))
|
||||
+ if (!e_mail_part_id_has_prefix (mail_part, part_id_prefix))
|
||||
continue;
|
||||
|
||||
- if (!e_mail_part_id_has_prefix (mail_part, part_id_prefix))
|
||||
+ if (should_skip_part (id))
|
||||
continue;
|
||||
|
||||
- if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_SIGNED)) {
|
||||
- g_string_append (tmp, _("GPG signed"));
|
||||
+ if (!e_mail_part_has_validity (mail_part)) {
|
||||
+ /* A part without validity, thus it's partially signed/encrypted */
|
||||
+ is_partial = TRUE;
|
||||
+ } else {
|
||||
+ guint32 validies = 0;
|
||||
+ for (ii = 0; ii < G_N_ELEMENTS (validity_flags); ii++) {
|
||||
+ if (e_mail_part_get_validity (mail_part, validity_flags[ii].flags))
|
||||
+ validies |= validity_flags[ii].flags;
|
||||
+ }
|
||||
+ check_valid_flags |= validies;
|
||||
}
|
||||
|
||||
- if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_ENCRYPTED)) {
|
||||
- if (tmp->len > 0)
|
||||
- g_string_append (tmp, ", ");
|
||||
- g_string_append (tmp, _("GPG encrypted"));
|
||||
- }
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822") &&
|
||||
+ !g_str_equal (e_mail_part_get_id (mail_part), part_id_prefix))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
+ }
|
||||
|
||||
- if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_SIGNED)) {
|
||||
- if (tmp->len > 0)
|
||||
- g_string_append (tmp, ", ");
|
||||
- g_string_append (tmp, _("S/MIME signed"));
|
||||
+ if (check_valid_flags) {
|
||||
+ GString *tmp;
|
||||
+
|
||||
+ if (!is_partial) {
|
||||
+ for (link = head; link != NULL && !is_partial; link = g_list_next (link)) {
|
||||
+ EMailPart *mail_part = link->data;
|
||||
+ const gchar *id = e_mail_part_get_id (mail_part);
|
||||
+
|
||||
+ if (!e_mail_part_id_has_prefix (mail_part, part_id_prefix))
|
||||
+ continue;
|
||||
+
|
||||
+ if (should_skip_part (id))
|
||||
+ continue;
|
||||
+
|
||||
+ if (!e_mail_part_has_validity (mail_part)) {
|
||||
+ /* A part without validity, thus it's partially signed/encrypted */
|
||||
+ is_partial = TRUE;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ is_partial = !e_mail_part_get_validity (mail_part, check_valid_flags);
|
||||
+
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822") &&
|
||||
+ !g_str_equal (e_mail_part_get_id (mail_part), part_id_prefix))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
+ }
|
||||
}
|
||||
|
||||
- if (e_mail_part_get_validity (mail_part, E_MAIL_PART_VALIDITY_SMIME | E_MAIL_PART_VALIDITY_ENCRYPTED)) {
|
||||
- if (tmp->len > 0)
|
||||
- g_string_append (tmp, ", ");
|
||||
- g_string_append (tmp, _("S/MIME encrypted"));
|
||||
+ /* Add encryption/signature header */
|
||||
+ tmp = g_string_new ("");
|
||||
+
|
||||
+ for (link = head; link; link = g_list_next (link)) {
|
||||
+ EMailPart *mail_part = link->data;
|
||||
+ const gchar *id = e_mail_part_get_id (mail_part);
|
||||
+
|
||||
+ if (!e_mail_part_has_validity (mail_part) ||
|
||||
+ !e_mail_part_id_has_prefix (mail_part, part_id_prefix))
|
||||
+ continue;
|
||||
+
|
||||
+ if (should_skip_part (id))
|
||||
+ continue;
|
||||
+
|
||||
+ for (ii = 0; ii < G_N_ELEMENTS (validity_flags); ii++) {
|
||||
+ if (e_mail_part_get_validity (mail_part, validity_flags[ii].flags)) {
|
||||
+ if (tmp->len > 0)
|
||||
+ g_string_append (tmp, ", ");
|
||||
+ g_string_append (tmp, is_partial ? _(validity_flags[ii].description_partial) : _(validity_flags[ii].description_complete));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ break;
|
||||
}
|
||||
|
||||
- break;
|
||||
- }
|
||||
+ if (tmp->len > 0)
|
||||
+ e_mail_formatter_format_header (formatter, buffer, _("Security"), tmp->str, flags, "UTF-8");
|
||||
|
||||
- if (tmp->len > 0) {
|
||||
- e_mail_formatter_format_header (
|
||||
- formatter, buffer,
|
||||
- _("Security"), tmp->str,
|
||||
- flags,
|
||||
- "UTF-8");
|
||||
+ g_string_free (tmp, TRUE);
|
||||
}
|
||||
|
||||
+ #undef should_skip_part
|
||||
+
|
||||
while (!g_queue_is_empty (&queue))
|
||||
g_object_unref (g_queue_pop_head (&queue));
|
||||
|
||||
- g_string_free (tmp, TRUE);
|
||||
g_free (part_id_prefix);
|
||||
}
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-parser-application-smime.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-parser-application-smime.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-parser-application-smime.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-parser-application-smime.c 2019-10-24 16:21:32.730944332 +0200
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <e-util/e-util.h>
|
||||
|
||||
+#include "e-mail-formatter-utils.h"
|
||||
#include "e-mail-parser-extension.h"
|
||||
#include "e-mail-part-utils.h"
|
||||
|
||||
@@ -104,6 +105,10 @@ empe_app_smime_parse (EMailParserExtensi
|
||||
mail_part, valid,
|
||||
E_MAIL_PART_VALIDITY_ENCRYPTED |
|
||||
E_MAIL_PART_VALIDITY_SMIME);
|
||||
+
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822"))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
}
|
||||
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-parser.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-parser.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-parser.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-parser.c 2019-10-24 16:21:32.729944332 +0200
|
||||
@@ -79,6 +79,67 @@ GType e_mail_parser_application_smime_ge
|
||||
static gpointer parent_class;
|
||||
|
||||
static void
|
||||
+mail_parser_move_security_before_headers (GQueue *part_queue)
|
||||
+{
|
||||
+ GList *link, *last_headers = NULL;
|
||||
+ GSList *headers_stack = NULL;
|
||||
+
|
||||
+ link = g_queue_peek_head_link (part_queue);
|
||||
+ while (link) {
|
||||
+ EMailPart *part = link->data;
|
||||
+ const gchar *id;
|
||||
+
|
||||
+ if (!part) {
|
||||
+ link = g_list_next (link);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ id = e_mail_part_get_id (part);
|
||||
+ if (!id) {
|
||||
+ link = g_list_next (link);
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ if (g_str_has_suffix (id, ".rfc822")) {
|
||||
+ headers_stack = g_slist_prepend (headers_stack, last_headers);
|
||||
+ last_headers = NULL;
|
||||
+ } else if (g_str_has_suffix (id, ".rfc822.end")) {
|
||||
+ g_warn_if_fail (headers_stack != NULL);
|
||||
+
|
||||
+ if (headers_stack) {
|
||||
+ last_headers = headers_stack->data;
|
||||
+ headers_stack = g_slist_remove (headers_stack, last_headers);
|
||||
+ } else {
|
||||
+ last_headers = NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (g_strcmp0 (e_mail_part_get_mime_type (part), "application/vnd.evolution.headers") == 0) {
|
||||
+ last_headers = link;
|
||||
+ link = g_list_next (link);
|
||||
+ } else if (g_strcmp0 (e_mail_part_get_mime_type (part), "application/vnd.evolution.secure-button") == 0) {
|
||||
+ g_warn_if_fail (last_headers != NULL);
|
||||
+
|
||||
+ if (last_headers) {
|
||||
+ GList *next = g_list_next (link);
|
||||
+
|
||||
+ g_warn_if_fail (g_queue_remove (part_queue, part));
|
||||
+ g_queue_insert_before (part_queue, last_headers, part);
|
||||
+
|
||||
+ link = next;
|
||||
+ } else {
|
||||
+ link = g_list_next (link);
|
||||
+ }
|
||||
+ } else {
|
||||
+ link = g_list_next (link);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ g_warn_if_fail (headers_stack == NULL);
|
||||
+ g_slist_free (headers_stack);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
mail_parser_run (EMailParser *parser,
|
||||
EMailPartList *part_list,
|
||||
GCancellable *cancellable)
|
||||
@@ -132,6 +193,8 @@ mail_parser_run (EMailParser *parser,
|
||||
break;
|
||||
}
|
||||
|
||||
+ mail_parser_move_security_before_headers (&mail_part_queue);
|
||||
+
|
||||
while (!g_queue_is_empty (&mail_part_queue)) {
|
||||
mail_part = g_queue_pop_head (&mail_part_queue);
|
||||
e_mail_part_list_add_part (part_list, mail_part);
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-encrypted.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-encrypted.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-encrypted.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-encrypted.c 2019-10-24 16:21:32.730944332 +0200
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <e-util/e-util.h>
|
||||
|
||||
+#include "e-mail-formatter-utils.h"
|
||||
#include "e-mail-parser-extension.h"
|
||||
#include "e-mail-part-utils.h"
|
||||
|
||||
@@ -135,6 +136,10 @@ empe_inlinepgp_encrypted_parse (EMailPar
|
||||
mail_part, valid,
|
||||
E_MAIL_PART_VALIDITY_ENCRYPTED |
|
||||
E_MAIL_PART_VALIDITY_PGP);
|
||||
+
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822"))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
}
|
||||
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-signed.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-signed.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-signed.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-parser-inlinepgp-signed.c 2019-10-24 16:21:32.731944332 +0200
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <e-util/e-util.h>
|
||||
|
||||
+#include "e-mail-formatter-utils.h"
|
||||
#include "e-mail-parser-extension.h"
|
||||
#include "e-mail-part-utils.h"
|
||||
|
||||
@@ -142,6 +143,10 @@ empe_inlinepgp_signed_parse (EMailParser
|
||||
mail_part, valid,
|
||||
E_MAIL_PART_VALIDITY_SIGNED |
|
||||
E_MAIL_PART_VALIDITY_PGP);
|
||||
+
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822"))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
}
|
||||
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-parser-multipart-encrypted.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-parser-multipart-encrypted.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-parser-multipart-encrypted.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-parser-multipart-encrypted.c 2019-10-24 16:21:32.731944332 +0200
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <libedataserver/libedataserver.h>
|
||||
|
||||
+#include "e-mail-formatter-utils.h"
|
||||
#include "e-mail-parser-extension.h"
|
||||
#include "e-mail-part-utils.h"
|
||||
|
||||
@@ -126,6 +127,10 @@ empe_mp_encrypted_parse (EMailParserExte
|
||||
mail_part, valid,
|
||||
E_MAIL_PART_VALIDITY_ENCRYPTED |
|
||||
E_MAIL_PART_VALIDITY_PGP);
|
||||
+
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822"))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
}
|
||||
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-parser-multipart-signed.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-parser-multipart-signed.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-parser-multipart-signed.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-parser-multipart-signed.c 2019-10-24 16:21:32.731944332 +0200
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include <libedataserver/libedataserver.h>
|
||||
|
||||
+#include "e-mail-formatter-utils.h"
|
||||
#include "e-mail-parser-extension.h"
|
||||
#include "e-mail-part-utils.h"
|
||||
|
||||
@@ -170,6 +171,10 @@ empe_mp_signed_parse (EMailParserExtensi
|
||||
e_mail_part_update_validity (
|
||||
mail_part, valid,
|
||||
validity_type | E_MAIL_PART_VALIDITY_SIGNED);
|
||||
+
|
||||
+ /* Do not traverse sub-messages */
|
||||
+ if (g_str_has_suffix (e_mail_part_get_id (mail_part), ".rfc822"))
|
||||
+ link = e_mail_formatter_find_rfc822_end_iter (link);
|
||||
}
|
||||
|
||||
e_queue_transfer (&work_queue, out_mail_parts);
|
||||
diff -up evolution-3.28.5/src/em-format/e-mail-part.c.cve-2018-15587-reposition-signature-bar evolution-3.28.5/src/em-format/e-mail-part.c
|
||||
--- evolution-3.28.5/src/em-format/e-mail-part.c.cve-2018-15587-reposition-signature-bar 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/em-format/e-mail-part.c 2019-10-24 16:21:32.731944332 +0200
|
||||
@@ -662,6 +662,15 @@ e_mail_part_update_validity (EMailPart *
|
||||
|
||||
mask = E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_SMIME;
|
||||
|
||||
+ /* Auto-add flags when the related part is present */
|
||||
+ if (!(validity_type & E_MAIL_PART_VALIDITY_SIGNED) &&
|
||||
+ validity->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)
|
||||
+ validity_type |= E_MAIL_PART_VALIDITY_SIGNED;
|
||||
+
|
||||
+ if (!(validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED) &&
|
||||
+ validity->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE)
|
||||
+ validity_type |= E_MAIL_PART_VALIDITY_ENCRYPTED;
|
||||
+
|
||||
pair = mail_part_find_validity_pair (part, validity_type & mask);
|
||||
if (pair != NULL) {
|
||||
pair->validity_type |= validity_type;
|
46
SOURCES/evolution-3.28.5-deselect-task-memo-list.patch
Normal file
46
SOURCES/evolution-3.28.5-deselect-task-memo-list.patch
Normal file
@ -0,0 +1,46 @@
|
||||
diff -up evolution-3.28.5/src/modules/calendar/e-cal-base-shell-sidebar.c.deselect-task-memo-list evolution-3.28.5/src/modules/calendar/e-cal-base-shell-sidebar.c
|
||||
--- evolution-3.28.5/src/modules/calendar/e-cal-base-shell-sidebar.c.deselect-task-memo-list 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/modules/calendar/e-cal-base-shell-sidebar.c 2018-10-01 12:20:09.864492453 +0200
|
||||
@@ -296,6 +296,7 @@ typedef struct _OpenClientData {
|
||||
ECalBaseShellSidebar *sidebar;
|
||||
ESource *source;
|
||||
EClient *client;
|
||||
+ gboolean was_cancelled;
|
||||
} OpenClientData;
|
||||
|
||||
static void
|
||||
@@ -304,9 +305,14 @@ open_client_data_free (gpointer pdata)
|
||||
OpenClientData *data = pdata;
|
||||
|
||||
if (data) {
|
||||
+ /* To free the cancellable in the 'value' pair, which is useless now */
|
||||
+ g_hash_table_insert (data->sidebar->priv->selected_uids,
|
||||
+ g_strdup (e_source_get_uid (data->source)),
|
||||
+ NULL);
|
||||
+
|
||||
if (data->client) {
|
||||
g_signal_emit (data->sidebar, signals[CLIENT_OPENED], 0, data->client);
|
||||
- } else {
|
||||
+ } else if (!data->was_cancelled) {
|
||||
ESourceSelector *selector = e_cal_base_shell_sidebar_get_selector (data->sidebar);
|
||||
e_source_selector_unselect_source (selector, data->source);
|
||||
}
|
||||
@@ -333,6 +339,7 @@ e_cal_base_shell_sidebar_open_client_thr
|
||||
selector = E_CLIENT_SELECTOR (e_cal_base_shell_sidebar_get_selector (data->sidebar));
|
||||
data->client = e_client_selector_get_client_sync (
|
||||
selector, data->source, TRUE, (guint32) -1, cancellable, &local_error);
|
||||
+ data->was_cancelled = g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
|
||||
|
||||
e_util_propagate_open_source_job_error (job_data, data->extension_name, local_error, error);
|
||||
}
|
||||
@@ -350,6 +357,10 @@ e_cal_base_shell_sidebar_ensure_source_o
|
||||
g_return_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (sidebar));
|
||||
g_return_if_fail (E_IS_SOURCE (source));
|
||||
|
||||
+ /* Skip it when it's already opening or opened */
|
||||
+ if (g_hash_table_contains (sidebar->priv->selected_uids, e_source_get_uid (source)))
|
||||
+ return;
|
||||
+
|
||||
shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (sidebar));
|
||||
|
||||
switch (e_cal_base_shell_view_get_source_type (shell_view)) {
|
66
SOURCES/evolution-3.28.5-extra-new-line-before-url.patch
Normal file
66
SOURCES/evolution-3.28.5-extra-new-line-before-url.patch
Normal file
@ -0,0 +1,66 @@
|
||||
diff -up evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c.extra-new-line-before-url evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c
|
||||
--- evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c.extra-new-line-before-url 2018-09-03 15:40:14.491506323 +0200
|
||||
+++ evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c 2018-09-03 15:40:14.494506323 +0200
|
||||
@@ -1319,6 +1319,44 @@ test_issue_86 (TestFixture *fixture)
|
||||
g_free (converted);
|
||||
}
|
||||
|
||||
+static void
|
||||
+test_issue_103 (TestFixture *fixture)
|
||||
+{
|
||||
+ #define LONG_URL "https://www.example.com/123456789012345678901234567890123456789012345678901234567890"
|
||||
+ #define SHORTER_URL "https://www.example.com/1234567890123456789012345678901234567890"
|
||||
+ #define SHORT_URL "https://www.example.com/"
|
||||
+
|
||||
+ if (!test_utils_run_simple_test (fixture,
|
||||
+ "mode:plain\n"
|
||||
+ "type:before\\n"
|
||||
+ LONG_URL "\\n"
|
||||
+ "after\\n"
|
||||
+ "prefix text " SHORTER_URL " suffix\\n"
|
||||
+ "prefix " SHORT_URL " suffix\\n"
|
||||
+ "end\n",
|
||||
+ HTML_PREFIX "<div style=\"width: 71ch;\">before</div>"
|
||||
+ "<div style=\"width: 71ch;\"><a href=\"" LONG_URL "\">" LONG_URL "</a></div>"
|
||||
+ "<div style=\"width: 71ch;\">after</div>"
|
||||
+ "<div style=\"width: 71ch;\">prefix text <a href=\"" SHORTER_URL "\">" SHORTER_URL "</a> suffix</div>"
|
||||
+ "<div style=\"width: 71ch;\">prefix <a href=\"" SHORT_URL "\">" SHORT_URL "</a> suffix</div>"
|
||||
+ "<div style=\"width: 71ch;\">end</div>"
|
||||
+ HTML_SUFFIX,
|
||||
+ "before\n"
|
||||
+ LONG_URL "\n"
|
||||
+ "after\n"
|
||||
+ "prefix text \n"
|
||||
+ SHORTER_URL " suffix\n"
|
||||
+ "prefix " SHORT_URL " suffix\n"
|
||||
+ "end")) {
|
||||
+ g_test_fail ();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ #undef SHORT_URL
|
||||
+ #undef SHORTER_URL
|
||||
+ #undef LONG_URL
|
||||
+}
|
||||
+
|
||||
void
|
||||
test_add_html_editor_bug_tests (void)
|
||||
{
|
||||
@@ -1349,4 +1387,5 @@ test_add_html_editor_bug_tests (void)
|
||||
test_utils_add_test ("/bug/788829", test_bug_788829);
|
||||
test_utils_add_test ("/bug/750636", test_bug_750636);
|
||||
test_utils_add_test ("/issue/86", test_issue_86);
|
||||
+ test_utils_add_test ("/issue/103", test_issue_103);
|
||||
}
|
||||
diff -up evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c.extra-new-line-before-url evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c
|
||||
--- evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c.extra-new-line-before-url 2018-09-03 15:40:14.493506323 +0200
|
||||
+++ evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c 2018-09-03 15:40:14.496506323 +0200
|
||||
@@ -14089,7 +14089,7 @@ wrap_lines (EEditorPage *editor_page,
|
||||
|
||||
next_sibling = webkit_dom_node_get_next_sibling (node);
|
||||
/* If the anchor doesn't fit on the line, add it to a separate line. */
|
||||
- if ((line_length + anchor_length) > length_to_wrap) {
|
||||
+ if (line_length > 0 && (line_length + anchor_length) > length_to_wrap) {
|
||||
/* Put <BR> before the anchor, thus it starts on a new line */
|
||||
element = webkit_dom_document_create_element (document, "BR", NULL);
|
||||
element_add_class (element, "-x-evo-wrap-br");
|
200
SOURCES/evolution-3.28.5-gala11yetableitem-ref-child.patch
Normal file
200
SOURCES/evolution-3.28.5-gala11yetableitem-ref-child.patch
Normal file
@ -0,0 +1,200 @@
|
||||
From d928258bb4f3e21973089183463c4dab11558b73 Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Wed, 18 Sep 2019 14:12:44 +0200
|
||||
Subject: I#624 - GalA11yETableItem: Incorrect implementation of
|
||||
AtkObjectClass::ref_child()
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/evolution/issues/624
|
||||
|
||||
diff --git a/src/e-util/gal-a11y-e-table-item.c b/src/e-util/gal-a11y-e-table-item.c
|
||||
index cf06fb3f4f..be302ed09d 100644
|
||||
--- a/src/e-util/gal-a11y-e-table-item.c
|
||||
+++ b/src/e-util/gal-a11y-e-table-item.c
|
||||
@@ -61,6 +61,7 @@ struct _GalA11yETableItemPrivate {
|
||||
ESelectionModel *selection;
|
||||
AtkStateSet *state_set;
|
||||
GtkWidget *widget;
|
||||
+ GHashTable *a11y_column_headers; /* ETableCol * ~> GalA11yETableColumnHeader * */
|
||||
};
|
||||
|
||||
static gboolean gal_a11y_e_table_item_ref_selection (GalA11yETableItem *a11y,
|
||||
@@ -124,6 +125,11 @@ item_finalized (gpointer user_data,
|
||||
if (priv->selection)
|
||||
gal_a11y_e_table_item_unref_selection (a11y);
|
||||
|
||||
+ if (priv->columns) {
|
||||
+ free_columns (priv->columns);
|
||||
+ priv->columns = NULL;
|
||||
+ }
|
||||
+
|
||||
g_object_unref (a11y);
|
||||
}
|
||||
|
||||
@@ -273,11 +279,60 @@ eti_a11y_reset_focus_object (GalA11yETableItem *a11y,
|
||||
g_signal_emit_by_name (a11y, "active-descendant-changed", cell);
|
||||
}
|
||||
|
||||
+static void eti_column_header_a11y_gone (gpointer user_data, GObject *a11y_col_header);
|
||||
+
|
||||
+static void
|
||||
+eti_table_column_gone (gpointer user_data,
|
||||
+ GObject *col)
|
||||
+{
|
||||
+ GalA11yETableItem *a11y = user_data;
|
||||
+ GalA11yETableItemPrivate *priv;
|
||||
+ GalA11yETableColumnHeader *a11y_col_header;
|
||||
+
|
||||
+ g_return_if_fail (GAL_A11Y_IS_E_TABLE_ITEM (a11y));
|
||||
+
|
||||
+ priv = GET_PRIVATE (a11y);
|
||||
+
|
||||
+ a11y_col_header = g_hash_table_lookup (priv->a11y_column_headers, col);
|
||||
+ g_hash_table_remove (priv->a11y_column_headers, col);
|
||||
+
|
||||
+ if (a11y_col_header)
|
||||
+ g_object_weak_unref (G_OBJECT (a11y_col_header), eti_column_header_a11y_gone, a11y);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+eti_column_header_a11y_gone (gpointer user_data,
|
||||
+ GObject *a11y_col_header)
|
||||
+{
|
||||
+ GalA11yETableItem *a11y = user_data;
|
||||
+ GalA11yETableItemPrivate *priv;
|
||||
+ GHashTableIter iter;
|
||||
+ gpointer key, value;
|
||||
+
|
||||
+ g_return_if_fail (GAL_A11Y_IS_E_TABLE_ITEM (a11y));
|
||||
+
|
||||
+ priv = GET_PRIVATE (a11y);
|
||||
+
|
||||
+ g_hash_table_iter_init (&iter, priv->a11y_column_headers);
|
||||
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
+ ETableCol *col = key;
|
||||
+ GalA11yETableColumnHeader *stored_a11y_col_header = value;
|
||||
+
|
||||
+ if (((GObject *) stored_a11y_col_header) == a11y_col_header) {
|
||||
+ g_object_weak_unref (G_OBJECT (col), eti_table_column_gone, a11y);
|
||||
+ g_hash_table_remove (priv->a11y_column_headers, col);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
eti_dispose (GObject *object)
|
||||
{
|
||||
GalA11yETableItem *a11y = GAL_A11Y_E_TABLE_ITEM (object);
|
||||
GalA11yETableItemPrivate *priv = GET_PRIVATE (a11y);
|
||||
+ GHashTableIter iter;
|
||||
+ gpointer key, value;
|
||||
|
||||
if (priv->columns) {
|
||||
free_columns (priv->columns);
|
||||
@@ -289,10 +344,35 @@ eti_dispose (GObject *object)
|
||||
priv->item = NULL;
|
||||
}
|
||||
|
||||
+ g_clear_object (&priv->state_set);
|
||||
+
|
||||
+ g_hash_table_iter_init (&iter, priv->a11y_column_headers);
|
||||
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
|
||||
+ ETableCol *col = key;
|
||||
+ GalA11yETableColumnHeader *a11y_col_header = value;
|
||||
+
|
||||
+ g_object_weak_unref (G_OBJECT (col), eti_table_column_gone, a11y);
|
||||
+ g_object_weak_unref (G_OBJECT (a11y_col_header), eti_column_header_a11y_gone, a11y);
|
||||
+ }
|
||||
+
|
||||
+ g_hash_table_remove_all (priv->a11y_column_headers);
|
||||
+
|
||||
if (parent_class->dispose)
|
||||
parent_class->dispose (object);
|
||||
}
|
||||
|
||||
+static void
|
||||
+eti_finalize (GObject *object)
|
||||
+{
|
||||
+ GalA11yETableItem *a11y = GAL_A11Y_E_TABLE_ITEM (object);
|
||||
+ GalA11yETableItemPrivate *priv = GET_PRIVATE (a11y);
|
||||
+
|
||||
+ g_hash_table_destroy (priv->a11y_column_headers);
|
||||
+
|
||||
+ if (parent_class->finalize)
|
||||
+ parent_class->finalize (object);
|
||||
+}
|
||||
+
|
||||
/* Static functions */
|
||||
static gint
|
||||
eti_get_n_children (AtkObject *accessible)
|
||||
@@ -318,12 +398,24 @@ eti_ref_child (AtkObject *accessible,
|
||||
return NULL;
|
||||
|
||||
if (index < item->cols) {
|
||||
+ GalA11yETableItemPrivate *priv = GET_PRIVATE (accessible);
|
||||
ETableCol *ecol;
|
||||
AtkObject *child;
|
||||
|
||||
ecol = e_table_header_get_column (item->header, index);
|
||||
- child = gal_a11y_e_table_column_header_new (ecol, item, accessible);
|
||||
- return child;
|
||||
+ child = g_hash_table_lookup (priv->a11y_column_headers, ecol);
|
||||
+
|
||||
+ if (!child) {
|
||||
+ child = gal_a11y_e_table_column_header_new (ecol, item, accessible);
|
||||
+ if (child) {
|
||||
+ g_hash_table_insert (priv->a11y_column_headers, ecol, child);
|
||||
+
|
||||
+ g_object_weak_ref (G_OBJECT (ecol), eti_table_column_gone, accessible);
|
||||
+ g_object_weak_ref (G_OBJECT (child), eti_column_header_a11y_gone, accessible);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return child ? g_object_ref (child) : NULL;
|
||||
}
|
||||
index -= item->cols;
|
||||
|
||||
@@ -966,6 +1058,7 @@ eti_header_structure_changed (ETableHeader *eth,
|
||||
g_free (state);
|
||||
g_free (reorder);
|
||||
g_free (prev_state);
|
||||
+ free_columns (cols);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1051,6 +1144,7 @@ eti_class_init (GalA11yETableItemClass *class)
|
||||
parent_class = g_type_class_ref (PARENT_TYPE);
|
||||
|
||||
object_class->dispose = eti_dispose;
|
||||
+ object_class->finalize = eti_finalize;
|
||||
|
||||
atk_object_class->get_n_children = eti_get_n_children;
|
||||
atk_object_class->ref_child = eti_ref_child;
|
||||
@@ -1069,6 +1163,7 @@ eti_init (GalA11yETableItem *a11y)
|
||||
priv->selection_row_changed_id = 0;
|
||||
priv->cursor_changed_id = 0;
|
||||
priv->selection = NULL;
|
||||
+ priv->a11y_column_headers = g_hash_table_new (g_direct_hash, g_direct_equal);
|
||||
}
|
||||
|
||||
/* atk selection */
|
||||
@@ -1189,14 +1284,17 @@ gal_a11y_e_table_item_new (ETableItem *item)
|
||||
|
||||
accessible = ATK_OBJECT (a11y);
|
||||
|
||||
- GET_PRIVATE (a11y)->item = item;
|
||||
/* Initialize cell data. */
|
||||
GET_PRIVATE (a11y)->cols = item->cols;
|
||||
GET_PRIVATE (a11y)->rows = item->rows >= 0 ? item->rows : 0;
|
||||
|
||||
GET_PRIVATE (a11y)->columns = e_table_header_get_columns (item->header);
|
||||
- if (GET_PRIVATE (a11y)->columns == NULL)
|
||||
+ if (GET_PRIVATE (a11y)->columns == NULL) {
|
||||
+ g_clear_object (&a11y);
|
||||
return NULL;
|
||||
+ }
|
||||
+
|
||||
+ GET_PRIVATE (a11y)->item = item;
|
||||
|
||||
g_signal_connect (
|
||||
item, "selection_model_removed",
|
36
SOURCES/evolution-3.28.5-help-contents-link.patch
Normal file
36
SOURCES/evolution-3.28.5-help-contents-link.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From fe293e9f75ef3a7fec90e9b11f9c5935ae98445c Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Mon, 17 Sep 2018 22:46:40 +0200
|
||||
Subject: [PATCH] I#129 - Use unversioned URL to help.gnome.org
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/evolution/issues/129
|
||||
---
|
||||
src/e-util/e-misc-utils.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/e-util/e-misc-utils.c b/src/e-util/e-misc-utils.c
|
||||
index c6f4e105b3..3801337fc2 100644
|
||||
--- a/src/e-util/e-misc-utils.c
|
||||
+++ b/src/e-util/e-misc-utils.c
|
||||
@@ -319,7 +319,9 @@ e_display_help (GtkWindow *parent,
|
||||
uri = g_string_new ("help:" PACKAGE);
|
||||
} else {
|
||||
uri = g_string_new ("https://help.gnome.org/users/" PACKAGE "/");
|
||||
- g_string_append_printf (uri, "%d.%d", EDS_MAJOR_VERSION, EDS_MINOR_VERSION);
|
||||
+ /* Use '/stable/' until https://bugzilla.gnome.org/show_bug.cgi?id=785522 is fixed */
|
||||
+ g_string_append (uri, "stable/");
|
||||
+ /* g_string_append_printf (uri, "%d.%d", EDS_MAJOR_VERSION, EDS_MINOR_VERSION); */
|
||||
}
|
||||
|
||||
timestamp = gtk_get_current_event_time ();
|
||||
@@ -327,7 +329,6 @@ e_display_help (GtkWindow *parent,
|
||||
if (parent != NULL)
|
||||
screen = gtk_widget_get_screen (GTK_WIDGET (parent));
|
||||
|
||||
-
|
||||
if (link_id != NULL) {
|
||||
g_string_append (uri, "/");
|
||||
g_string_append (uri, link_id);
|
||||
--
|
||||
2.21.0
|
||||
|
42
SOURCES/evolution-3.28.5-intltool-cache.patch
Normal file
42
SOURCES/evolution-3.28.5-intltool-cache.patch
Normal file
@ -0,0 +1,42 @@
|
||||
From f315ca6a601e77220323bff4ac7782b54c862a0c Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 30 Oct 2018 15:50:58 +0100
|
||||
Subject: [PATCH] Make sure intltool-merge cache is created only once
|
||||
|
||||
Similar to https://gitlab.gnome.org/GNOME/evolution/issues/196
|
||||
when intltool-merge is called in parallel, it could either rewrite
|
||||
the ongoing attempt to build it or use an incomplete data, which
|
||||
results in broken output files (.desktop, .metainfo and so on).
|
||||
This change ensures the intltool-merge cache is created only once
|
||||
and any other requests which would use it will wait until it's created.
|
||||
---
|
||||
cmake/modules/FindIntltool.cmake | 11 ++++++++++-
|
||||
1 file changed, 10 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/cmake/modules/FindIntltool.cmake b/cmake/modules/FindIntltool.cmake
|
||||
index 2cda2549eb..8e223e9d7f 100644
|
||||
--- a/cmake/modules/FindIntltool.cmake
|
||||
+++ b/cmake/modules/FindIntltool.cmake
|
||||
@@ -176,9 +176,18 @@ macro(intltool_merge _in_filename _out_filename)
|
||||
DEPENDS ${_in}
|
||||
)
|
||||
else(_has_no_translations)
|
||||
+ if(NOT TARGET intltool-merge-cache)
|
||||
+ add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/po/.intltool-merge-cache
|
||||
+ COMMAND ${INTLTOOL_MERGE} ${_args} --quiet --cache="${CMAKE_BINARY_DIR}/po/.intltool-merge-cache" "${GETTEXT_PO_DIR}" "${_in}" "${_out}"
|
||||
+ DEPENDS ${_in}
|
||||
+ )
|
||||
+ add_custom_target(intltool-merge-cache ALL
|
||||
+ DEPENDS ${CMAKE_BINARY_DIR}/po/.intltool-merge-cache)
|
||||
+ endif(NOT TARGET intltool-merge-cache)
|
||||
+
|
||||
add_custom_command(OUTPUT ${_out}
|
||||
COMMAND ${INTLTOOL_MERGE} ${_args} --quiet --cache="${CMAKE_BINARY_DIR}/po/.intltool-merge-cache" "${GETTEXT_PO_DIR}" "${_in}" "${_out}"
|
||||
- DEPENDS ${_in}
|
||||
+ DEPENDS ${_in} intltool-merge-cache
|
||||
)
|
||||
endif(_has_no_translations)
|
||||
endmacro(intltool_merge)
|
||||
--
|
||||
2.18.1
|
||||
|
133
SOURCES/evolution-3.28.5-mail-account-name-sync-in-wizard.patch
Normal file
133
SOURCES/evolution-3.28.5-mail-account-name-sync-in-wizard.patch
Normal file
@ -0,0 +1,133 @@
|
||||
From 44fbd35658e842a146daf31c53d8dbd670dd21bb Mon Sep 17 00:00:00 2001
|
||||
From: Milan Crha <mcrha@redhat.com>
|
||||
Date: Tue, 3 Dec 2019 12:05:25 +0100
|
||||
Subject: [PATCH] I#729 - New Mail account wizard ignores email address change
|
||||
|
||||
Closes https://gitlab.gnome.org/GNOME/evolution/issues/729
|
||||
---
|
||||
src/mail/e-mail-config-assistant.c | 25 +++++++++++++++++++++++--
|
||||
src/mail/e-mail-config-summary-page.c | 23 ++++++++++++++++++++---
|
||||
src/mail/e-mail-config-summary-page.h | 2 ++
|
||||
3 files changed, 45 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/src/mail/e-mail-config-assistant.c b/src/mail/e-mail-config-assistant.c
|
||||
index 5307f1f90e..0c8da3c015 100644
|
||||
--- a/src/mail/e-mail-config-assistant.c
|
||||
+++ b/src/mail/e-mail-config-assistant.c
|
||||
@@ -1069,7 +1069,26 @@ mail_config_assistant_prepare (GtkAssistant *assistant,
|
||||
e_named_parameters_free (params);
|
||||
}
|
||||
|
||||
- if (E_IS_MAIL_CONFIG_RECEIVING_PAGE (page) && first_visit) {
|
||||
+ if (!first_visit && E_IS_MAIL_CONFIG_IDENTITY_PAGE (page)) {
|
||||
+ ESource *source;
|
||||
+ ESourceMailIdentity *extension;
|
||||
+ const gchar *email_address;
|
||||
+ const gchar *extension_name;
|
||||
+
|
||||
+ source = priv->identity_source;
|
||||
+ extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
|
||||
+ extension = e_source_get_extension (source, extension_name);
|
||||
+ email_address = e_source_mail_identity_get_address (extension);
|
||||
+
|
||||
+ /* Set the value to an empty string when going back to the identity page,
|
||||
+ thus when moving away from it the source's display name is updated
|
||||
+ with the new address, in case it changed. Do not modify the display
|
||||
+ name when the user changed it. */
|
||||
+ if (g_strcmp0 (e_mail_config_summary_page_get_account_name (priv->summary_page), email_address) == 0)
|
||||
+ e_source_set_display_name (source, "");
|
||||
+ }
|
||||
+
|
||||
+ if (E_IS_MAIL_CONFIG_RECEIVING_PAGE (page)) {
|
||||
ESource *source;
|
||||
ESourceMailIdentity *extension;
|
||||
const gchar *email_address;
|
||||
@@ -1084,7 +1103,9 @@ mail_config_assistant_prepare (GtkAssistant *assistant,
|
||||
extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
|
||||
extension = e_source_get_extension (source, extension_name);
|
||||
email_address = e_source_mail_identity_get_address (extension);
|
||||
- e_source_set_display_name (source, email_address);
|
||||
+
|
||||
+ if (first_visit || g_strcmp0 (e_source_get_display_name (source), "") == 0)
|
||||
+ e_source_set_display_name (source, email_address);
|
||||
}
|
||||
|
||||
if (first_visit && (
|
||||
diff --git a/src/mail/e-mail-config-summary-page.c b/src/mail/e-mail-config-summary-page.c
|
||||
index fb0306d3e1..20c669ad65 100644
|
||||
--- a/src/mail/e-mail-config-summary-page.c
|
||||
+++ b/src/mail/e-mail-config-summary-page.c
|
||||
@@ -53,6 +53,8 @@ struct _EMailConfigSummaryPagePrivate {
|
||||
GtkLabel *send_user_label;
|
||||
GtkLabel *send_security_label;
|
||||
GtkEntry *account_name_entry;
|
||||
+
|
||||
+ GBinding *account_name_binding;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -549,9 +551,6 @@ mail_config_summary_page_refresh (EMailConfigSummaryPage *page)
|
||||
const gchar *extension_name;
|
||||
const gchar *value;
|
||||
|
||||
- value = e_source_get_display_name (source);
|
||||
- gtk_entry_set_text (priv->account_name_entry, value);
|
||||
-
|
||||
extension_name = E_SOURCE_EXTENSION_MAIL_IDENTITY;
|
||||
extension = e_source_get_extension (source, extension_name);
|
||||
|
||||
@@ -830,6 +829,14 @@ e_mail_config_summary_page_get_internal_box (EMailConfigSummaryPage *page)
|
||||
return page->priv->main_box;
|
||||
}
|
||||
|
||||
+const gchar *
|
||||
+e_mail_config_summary_page_get_account_name (EMailConfigSummaryPage *page)
|
||||
+{
|
||||
+ g_return_val_if_fail (E_IS_MAIL_CONFIG_SUMMARY_PAGE (page), NULL);
|
||||
+
|
||||
+ return gtk_entry_get_text (page->priv->account_name_entry);
|
||||
+}
|
||||
+
|
||||
void
|
||||
e_mail_config_summary_page_refresh (EMailConfigSummaryPage *page)
|
||||
{
|
||||
@@ -934,6 +941,11 @@ e_mail_config_summary_page_set_identity_source (EMailConfigSummaryPage *page,
|
||||
page->priv->identity_source = identity_source;
|
||||
page->priv->identity_source_changed_id = 0;
|
||||
|
||||
+ if (page->priv->account_name_binding) {
|
||||
+ g_binding_unbind (page->priv->account_name_binding);
|
||||
+ page->priv->account_name_binding = NULL;
|
||||
+ }
|
||||
+
|
||||
if (identity_source != NULL) {
|
||||
gulong handler_id;
|
||||
|
||||
@@ -943,6 +955,11 @@ e_mail_config_summary_page_set_identity_source (EMailConfigSummaryPage *page,
|
||||
page);
|
||||
|
||||
page->priv->identity_source_changed_id = handler_id;
|
||||
+
|
||||
+ page->priv->account_name_binding =
|
||||
+ e_binding_bind_property (identity_source, "display-name",
|
||||
+ page->priv->account_name_entry, "text",
|
||||
+ G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
|
||||
}
|
||||
|
||||
g_object_notify (G_OBJECT (page), "identity-source");
|
||||
diff --git a/src/mail/e-mail-config-summary-page.h b/src/mail/e-mail-config-summary-page.h
|
||||
index af793dc8b6..64d0af875c 100644
|
||||
--- a/src/mail/e-mail-config-summary-page.h
|
||||
+++ b/src/mail/e-mail-config-summary-page.h
|
||||
@@ -68,6 +68,8 @@ EMailConfigPage *
|
||||
e_mail_config_summary_page_new (void);
|
||||
GtkBox * e_mail_config_summary_page_get_internal_box
|
||||
(EMailConfigSummaryPage *page);
|
||||
+const gchar * e_mail_config_summary_page_get_account_name
|
||||
+ (EMailConfigSummaryPage *page);
|
||||
void e_mail_config_summary_page_refresh
|
||||
(EMailConfigSummaryPage *page);
|
||||
EMailConfigServiceBackend *
|
||||
--
|
||||
2.21.0
|
||||
|
338
SOURCES/evolution-3.28.5-mangled-deeper-html-quotes.patch
Normal file
338
SOURCES/evolution-3.28.5-mangled-deeper-html-quotes.patch
Normal file
@ -0,0 +1,338 @@
|
||||
diff -up evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c.mangled-deeper-html-quotes evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c
|
||||
--- evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c.mangled-deeper-html-quotes 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/e-util/test-html-editor-units-bugs.c 2018-09-03 15:31:08.028513879 +0200
|
||||
@@ -1205,6 +1205,120 @@ test_bug_750636 (TestFixture *fixture)
|
||||
g_test_fail ();
|
||||
}
|
||||
|
||||
+static void
|
||||
+test_issue_86 (TestFixture *fixture)
|
||||
+{
|
||||
+ const gchar *source_text =
|
||||
+ "normal text\n"
|
||||
+ "\n"
|
||||
+ "> level 1\n"
|
||||
+ "> level 1\n"
|
||||
+ "> > level 2\n"
|
||||
+ "> > level 2\n"
|
||||
+ "> >\n"
|
||||
+ "> > level 2\n"
|
||||
+ ">\n"
|
||||
+ "> level 1\n"
|
||||
+ "> level 1\n"
|
||||
+ ">\n"
|
||||
+ "> > > level 3\n"
|
||||
+ "> > > level 3\n"
|
||||
+ ">\n"
|
||||
+ "> > level 2\n"
|
||||
+ "> > level 2\n"
|
||||
+ ">\n"
|
||||
+ "> level 1\n"
|
||||
+ "\n"
|
||||
+ "back normal text\n";
|
||||
+ gchar *converted, *to_insert;
|
||||
+
|
||||
+ if (!test_utils_process_commands (fixture,
|
||||
+ "mode:html\n")) {
|
||||
+ g_test_fail ();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ converted = camel_text_to_html (source_text,
|
||||
+ CAMEL_MIME_FILTER_TOHTML_PRE |
|
||||
+ CAMEL_MIME_FILTER_TOHTML_CONVERT_URLS |
|
||||
+ CAMEL_MIME_FILTER_TOHTML_CONVERT_ADDRESSES |
|
||||
+ CAMEL_MIME_FILTER_TOHTML_QUOTE_CITATION,
|
||||
+ 0xDDDDDD);
|
||||
+
|
||||
+ g_return_if_fail (converted != NULL);
|
||||
+
|
||||
+ to_insert = g_strconcat (converted,
|
||||
+ "<span class=\"-x-evo-to-body\" data-credits=\"On Today, User wrote:\"></span>"
|
||||
+ "<span class=\"-x-evo-cite-body\"></span>",
|
||||
+ NULL);
|
||||
+
|
||||
+ test_utils_insert_content (fixture, to_insert,
|
||||
+ E_CONTENT_EDITOR_INSERT_REPLACE_ALL | E_CONTENT_EDITOR_INSERT_TEXT_HTML);
|
||||
+
|
||||
+ if (!test_utils_run_simple_test (fixture,
|
||||
+ "",
|
||||
+ HTML_PREFIX "<div>On Today, User wrote:</div>"
|
||||
+ "<blockquote type=\"cite\" " BLOCKQUOTE_STYLE ">"
|
||||
+ "<pre>normal text</pre>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<blockquote type=\"cite\" " BLOCKQUOTE_STYLE ">"
|
||||
+ "<pre>level 1</pre>"
|
||||
+ "<pre>level 1</pre>"
|
||||
+ "<blockquote type=\"cite\" " BLOCKQUOTE_STYLE ">"
|
||||
+ "<pre>level 2</pre>"
|
||||
+ "<pre>level 2</pre>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<pre>level 2</pre>"
|
||||
+ "</blockquote>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<pre>level 1</pre>"
|
||||
+ "<pre>level 1</pre>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<blockquote type=\"cite\" " BLOCKQUOTE_STYLE ">"
|
||||
+ "<blockquote type=\"cite\" " BLOCKQUOTE_STYLE ">"
|
||||
+ "<pre>level 3</pre>"
|
||||
+ "<pre>level 3</pre>"
|
||||
+ "</blockquote>"
|
||||
+ "</blockquote>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<blockquote type=\"cite\" " BLOCKQUOTE_STYLE ">"
|
||||
+ "<pre>level 2</pre>"
|
||||
+ "<pre>level 2</pre>"
|
||||
+ "</blockquote>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<pre>level 1</pre>"
|
||||
+ "</blockquote>"
|
||||
+ "<pre><br></pre>"
|
||||
+ "<pre>back normal text</pre>"
|
||||
+ "</blockquote>" HTML_SUFFIX,
|
||||
+ "On Today, User wrote:\n"
|
||||
+ "> normal text\n"
|
||||
+ "> \n"
|
||||
+ "> > level 1\n"
|
||||
+ "> > level 1\n"
|
||||
+ "> > > level 2\n"
|
||||
+ "> > > level 2\n"
|
||||
+ "> > > \n"
|
||||
+ "> > > level 2\n"
|
||||
+ "> > \n"
|
||||
+ "> > level 1\n"
|
||||
+ "> > level 1\n"
|
||||
+ "> > \n"
|
||||
+ "> > > > level 3\n"
|
||||
+ "> > > > level 3\n"
|
||||
+ "> > \n"
|
||||
+ "> > > level 2\n"
|
||||
+ "> > > level 2\n"
|
||||
+ "> > \n"
|
||||
+ "> > level 1\n"
|
||||
+ "> \n"
|
||||
+ "> back normal text"))
|
||||
+ g_test_fail ();
|
||||
+
|
||||
+ g_free (to_insert);
|
||||
+ g_free (converted);
|
||||
+}
|
||||
+
|
||||
void
|
||||
test_add_html_editor_bug_tests (void)
|
||||
{
|
||||
@@ -1234,4 +1348,5 @@ test_add_html_editor_bug_tests (void)
|
||||
test_utils_add_test ("/bug/780088", test_bug_780088);
|
||||
test_utils_add_test ("/bug/788829", test_bug_788829);
|
||||
test_utils_add_test ("/bug/750636", test_bug_750636);
|
||||
+ test_utils_add_test ("/issue/86", test_issue_86);
|
||||
}
|
||||
diff -up evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c.mangled-deeper-html-quotes evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c
|
||||
--- evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c.mangled-deeper-html-quotes 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/modules/webkit-editor/web-extension/e-editor-dom-functions.c 2018-09-03 15:32:41.220512591 +0200
|
||||
@@ -6230,7 +6230,6 @@ e_editor_dom_convert_content (EEditorPag
|
||||
WEBKIT_DOM_NODE (content_wrapper),
|
||||
WEBKIT_DOM_NODE (e_editor_dom_prepare_paragraph (editor_page, FALSE)),
|
||||
NULL);
|
||||
-
|
||||
if (!cite_body) {
|
||||
if (!empty) {
|
||||
WebKitDOMNode *child;
|
||||
@@ -8754,6 +8753,133 @@ adapt_to_editor_dom_changes (WebKitDOMDo
|
||||
g_clear_object (&collection);
|
||||
}
|
||||
|
||||
+static void
|
||||
+traverse_nodes_to_split_pre (WebKitDOMDocument *document,
|
||||
+ WebKitDOMNode *node,
|
||||
+ WebKitDOMNode *new_parent, /* can be NULL, then prepend to out_new_nodes */
|
||||
+ gboolean is_in_pre,
|
||||
+ GSList **out_new_nodes) /* WebKitDOMNode * */
|
||||
+{
|
||||
+ if (is_in_pre && WEBKIT_DOM_IS_TEXT (node)) {
|
||||
+ gchar *text;
|
||||
+
|
||||
+ text = webkit_dom_text_get_whole_text (WEBKIT_DOM_TEXT (node));
|
||||
+ if (text) {
|
||||
+ WebKitDOMElement *pre;
|
||||
+ gint ii;
|
||||
+ gchar **strv;
|
||||
+
|
||||
+ strv = g_strsplit (text, "\n", -1);
|
||||
+
|
||||
+ for (ii = 0; strv && strv[ii]; ii++) {
|
||||
+ if (*(strv[ii])) {
|
||||
+ gint len = strlen (strv[ii]);
|
||||
+
|
||||
+ if (strv[ii][len - 1] == '\r') {
|
||||
+ strv[ii][len - 1] = '\0';
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /* <pre> is shown as a block, thus adding a new line at the end behaves like two <br>-s */
|
||||
+ if (!*(strv[ii]) && !strv[ii + 1])
|
||||
+ break;
|
||||
+
|
||||
+ pre = webkit_dom_document_create_element (document, "pre", NULL);
|
||||
+
|
||||
+ if (*(strv[ii])) {
|
||||
+ webkit_dom_html_element_set_inner_text (WEBKIT_DOM_HTML_ELEMENT (pre), strv[ii], NULL);
|
||||
+ } else {
|
||||
+ WebKitDOMElement *br;
|
||||
+
|
||||
+ br = webkit_dom_document_create_element (document, "br", NULL);
|
||||
+ webkit_dom_node_append_child (WEBKIT_DOM_NODE (pre), WEBKIT_DOM_NODE (br), NULL);
|
||||
+ }
|
||||
+
|
||||
+ if (new_parent)
|
||||
+ webkit_dom_node_append_child (new_parent, WEBKIT_DOM_NODE (pre), NULL);
|
||||
+ else
|
||||
+ *out_new_nodes = g_slist_prepend (*out_new_nodes, pre);
|
||||
+ }
|
||||
+
|
||||
+ g_strfreev (strv);
|
||||
+ }
|
||||
+
|
||||
+ g_free (text);
|
||||
+ } else if (WEBKIT_DOM_IS_HTML_PRE_ELEMENT (node)) {
|
||||
+ is_in_pre = TRUE;
|
||||
+ } else {
|
||||
+ WebKitDOMNode *nd;
|
||||
+ GError *error = NULL;
|
||||
+
|
||||
+ nd = webkit_dom_node_clone_node_with_error (node, FALSE, &error);
|
||||
+ if (nd) {
|
||||
+ if (new_parent)
|
||||
+ webkit_dom_node_append_child (new_parent, nd, NULL);
|
||||
+ else
|
||||
+ *out_new_nodes = g_slist_prepend (*out_new_nodes, nd);
|
||||
+
|
||||
+ new_parent = nd;
|
||||
+ } else {
|
||||
+ g_warning ("%s: Failed to clone node %s: %s\n", G_STRFUNC, G_OBJECT_TYPE_NAME (node), error ? error->message : "Unknown error");
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ for (node = webkit_dom_node_get_first_child (node);
|
||||
+ node;
|
||||
+ node = webkit_dom_node_get_next_sibling (node)) {
|
||||
+ traverse_nodes_to_split_pre (document, node, new_parent, is_in_pre, out_new_nodes);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+maybe_split_pre_paragraphs (WebKitDOMDocument *document)
|
||||
+{
|
||||
+ WebKitDOMHTMLElement *body;
|
||||
+ WebKitDOMNodeList *list;
|
||||
+
|
||||
+ body = webkit_dom_document_get_body (document);
|
||||
+ if (!body)
|
||||
+ return;
|
||||
+
|
||||
+ list = webkit_dom_document_query_selector_all (document, "pre", NULL);
|
||||
+ if (webkit_dom_node_list_get_length (list)) {
|
||||
+ WebKitDOMNode *body_node, *node, *current;
|
||||
+ GSList *new_nodes = NULL, *to_remove = NULL, *link;
|
||||
+
|
||||
+ g_clear_object (&list);
|
||||
+
|
||||
+ body_node = WEBKIT_DOM_NODE (body);
|
||||
+ webkit_dom_node_normalize (body_node);
|
||||
+
|
||||
+ for (current = webkit_dom_node_get_first_child (body_node);
|
||||
+ current;
|
||||
+ current = webkit_dom_node_get_next_sibling (current)) {
|
||||
+ traverse_nodes_to_split_pre (document, current, NULL, FALSE, &new_nodes);
|
||||
+ to_remove = g_slist_prepend (to_remove, current);
|
||||
+ }
|
||||
+
|
||||
+ for (link = to_remove; link; link = g_slist_next (link)) {
|
||||
+ node = link->data;
|
||||
+
|
||||
+ webkit_dom_node_remove_child (body_node, node, NULL);
|
||||
+ }
|
||||
+
|
||||
+ /* They are in reverse order, thus reverse it */
|
||||
+ new_nodes = g_slist_reverse (new_nodes);
|
||||
+
|
||||
+ for (link = new_nodes; link; link = g_slist_next (link)) {
|
||||
+ node = link->data;
|
||||
+
|
||||
+ webkit_dom_node_append_child (body_node, node, NULL);
|
||||
+ }
|
||||
+
|
||||
+ g_slist_free (to_remove);
|
||||
+ g_slist_free (new_nodes);
|
||||
+ }
|
||||
+
|
||||
+ g_clear_object (&list);
|
||||
+}
|
||||
+
|
||||
void
|
||||
e_editor_dom_process_content_after_load (EEditorPage *editor_page)
|
||||
{
|
||||
@@ -8803,60 +8929,8 @@ e_editor_dom_process_content_after_load
|
||||
}
|
||||
|
||||
goto out;
|
||||
- } else {
|
||||
- WebKitDOMNodeList *list;
|
||||
- gulong ii;
|
||||
-
|
||||
- list = webkit_dom_document_query_selector_all (document, "pre", NULL);
|
||||
- for (ii = webkit_dom_node_list_get_length (list); ii--;) {
|
||||
- WebKitDOMNode *node = webkit_dom_node_list_item (list, ii), *parent;
|
||||
- WebKitDOMElement *element;
|
||||
- gchar *inner_html;
|
||||
-
|
||||
- element = WEBKIT_DOM_ELEMENT (node);
|
||||
- parent = webkit_dom_node_get_parent_node (node);
|
||||
- inner_html = webkit_dom_element_get_inner_html (element);
|
||||
-
|
||||
- if (inner_html && *inner_html) {
|
||||
- gchar **strv;
|
||||
-
|
||||
- strv = g_strsplit (inner_html, "\n", -1);
|
||||
- if (strv && strv[0] && strv[1]) {
|
||||
- WebKitDOMElement *pre;
|
||||
- gint jj;
|
||||
-
|
||||
- for (jj = 0; strv[jj]; jj++) {
|
||||
- pre = webkit_dom_document_create_element (document, "pre", NULL);
|
||||
- if (*(strv[jj])) {
|
||||
- gint len = strlen (strv[jj]);
|
||||
-
|
||||
- if (strv[jj][len - 1] == '\r') {
|
||||
- strv[jj][len - 1] = '\0';
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if (*(strv[jj])) {
|
||||
- webkit_dom_html_element_set_inner_html (WEBKIT_DOM_HTML_ELEMENT (pre), strv[jj], NULL);
|
||||
- } else {
|
||||
- WebKitDOMElement *br;
|
||||
-
|
||||
- br = webkit_dom_document_create_element (document, "br", NULL);
|
||||
- webkit_dom_node_append_child (WEBKIT_DOM_NODE (pre), WEBKIT_DOM_NODE (br), NULL);
|
||||
- }
|
||||
-
|
||||
- webkit_dom_node_insert_before (parent, WEBKIT_DOM_NODE (pre), node, NULL);
|
||||
- }
|
||||
-
|
||||
- remove_node (node);
|
||||
- }
|
||||
-
|
||||
- g_strfreev (strv);
|
||||
- }
|
||||
-
|
||||
- g_free (inner_html);
|
||||
- }
|
||||
-
|
||||
- g_clear_object (&list);
|
||||
+ } else if (!webkit_dom_element_has_attribute (WEBKIT_DOM_ELEMENT (body), "data-evo-draft")) {
|
||||
+ maybe_split_pre_paragraphs (document);
|
||||
}
|
||||
|
||||
adapt_to_editor_dom_changes (document);
|
35
SOURCES/evolution-3.28.5-webkitgtk-2.28.patch
Normal file
35
SOURCES/evolution-3.28.5-webkitgtk-2.28.patch
Normal file
@ -0,0 +1,35 @@
|
||||
diff -up evolution-3.28.5/src/e-util/e-misc-utils.c.webkitgtk-2.28 evolution-3.28.5/src/e-util/e-misc-utils.c
|
||||
--- evolution-3.28.5/src/e-util/e-misc-utils.c.webkitgtk-2.28 2020-06-11 15:56:03.324428384 +0200
|
||||
+++ evolution-3.28.5/src/e-util/e-misc-utils.c 2020-06-11 15:56:03.334428384 +0200
|
||||
@@ -3633,7 +3633,7 @@ e_util_claim_dbus_proxy_call_error (GDBu
|
||||
g_return_if_fail (method_name != NULL);
|
||||
|
||||
if (in_error && !g_error_matches (in_error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
- g_warning ("Failed to call a DBus Proxy method %s::%s: %s",
|
||||
+ printf ("Failed to call a DBus Proxy method %s::%s: %s\n",
|
||||
g_dbus_proxy_get_name (dbus_proxy), method_name, in_error->message);
|
||||
}
|
||||
|
||||
diff -up evolution-3.28.5/src/e-util/e-web-view.c.webkitgtk-2.28 evolution-3.28.5/src/e-util/e-web-view.c
|
||||
--- evolution-3.28.5/src/e-util/e-web-view.c.webkitgtk-2.28 2018-07-30 15:37:05.000000000 +0200
|
||||
+++ evolution-3.28.5/src/e-util/e-web-view.c 2020-06-11 15:57:24.375430212 +0200
|
||||
@@ -1221,6 +1221,9 @@ web_view_initialize (WebKitWebView *web_
|
||||
g_object_unref (settings);
|
||||
}
|
||||
|
||||
+static void
|
||||
+web_view_load_uri (EWebView *web_view,
|
||||
+ const gchar *uri);
|
||||
|
||||
static void
|
||||
web_view_constructed (GObject *object)
|
||||
@@ -1265,6 +1268,9 @@ web_view_constructed (GObject *object)
|
||||
web_view_initialize (WEBKIT_WEB_VIEW (object));
|
||||
|
||||
web_view_set_find_controller (E_WEB_VIEW (object));
|
||||
+
|
||||
+ /* Initialize the WebPage content for WebKitGTK 2.28 */
|
||||
+ web_view_load_uri (E_WEB_VIEW (object), NULL);
|
||||
}
|
||||
|
||||
static void
|
3351
SPECS/evolution.spec
Normal file
3351
SPECS/evolution.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user