Bug #687670 - Signing with both pgp and S/MIME shows only one signature
This commit is contained in:
@ -140,11 +140,21 @@ emfe_attachment_format (EMailFormatterExtension *extension,
|
||||
if ((context->mode == E_MAIL_FORMATTER_MODE_NORMAL) ||
|
||||
(context->mode == E_MAIL_FORMATTER_MODE_PRINTING) ||
|
||||
(context->mode == E_MAIL_FORMATTER_MODE_ALL_HEADERS)) {
|
||||
if (part->validity) {
|
||||
e_attachment_set_signed (
|
||||
empa->attachment, part->validity->sign.status);
|
||||
e_attachment_set_encrypted (
|
||||
empa->attachment, part->validity->encrypt.status);
|
||||
if (part->validities) {
|
||||
GSList *lst;
|
||||
|
||||
for (lst = part->validities; lst; lst = lst->next) {
|
||||
EMailPartValidityPair *pair = lst->data;
|
||||
|
||||
if (!pair)
|
||||
continue;
|
||||
|
||||
if ((pair->validity_type & E_MAIL_PART_VALIDITY_SIGNED) != 0)
|
||||
e_attachment_set_signed (empa->attachment, pair->validity->sign.status);
|
||||
|
||||
if ((pair->validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED) != 0)
|
||||
e_attachment_set_encrypted (empa->attachment, pair->validity->encrypt.status);
|
||||
}
|
||||
}
|
||||
|
||||
store = find_attachment_store (context->parts, part->id);
|
||||
|
||||
@ -136,31 +136,31 @@ emfpe_headers_format (EMailFormatterExtension *extension,
|
||||
if (mail_part == NULL)
|
||||
continue;
|
||||
|
||||
if (mail_part->validity_type == 0)
|
||||
if (!mail_part->validities)
|
||||
continue;
|
||||
|
||||
if (!g_str_has_prefix (mail_part->id, part_id_prefix))
|
||||
continue;
|
||||
|
||||
if ((mail_part->validity_type & E_MAIL_PART_VALIDITY_PGP) &&
|
||||
(mail_part->validity_type & E_MAIL_PART_VALIDITY_SIGNED)) {
|
||||
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 ((mail_part->validity_type & E_MAIL_PART_VALIDITY_PGP) &&
|
||||
(mail_part->validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED)) {
|
||||
if (tmp->len > 0) g_string_append (tmp, ", ");
|
||||
|
||||
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 encrpyted"));
|
||||
}
|
||||
if ((mail_part->validity_type & E_MAIL_PART_VALIDITY_SMIME) &&
|
||||
(mail_part->validity_type & E_MAIL_PART_VALIDITY_SIGNED)) {
|
||||
|
||||
if (tmp->len > 0) g_string_append (tmp, ", ");
|
||||
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 ((mail_part->validity_type & E_MAIL_PART_VALIDITY_SMIME) &&
|
||||
(mail_part->validity_type & E_MAIL_PART_VALIDITY_ENCRYPTED)) {
|
||||
|
||||
if (tmp->len > 0) g_string_append (tmp, ", ");
|
||||
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 encrpyted"));
|
||||
}
|
||||
|
||||
|
||||
@ -267,29 +267,31 @@ format_cert_infos (GQueue *cert_infos,
|
||||
|
||||
static void
|
||||
secure_button_clicked_cb (GtkWidget *widget,
|
||||
EMailPart *part)
|
||||
CamelCipherValidity *validity)
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
GtkWidget *grid, *w;
|
||||
GtkWidget *dialog;
|
||||
|
||||
g_return_if_fail (validity != NULL);
|
||||
|
||||
builder = gtk_builder_new ();
|
||||
e_load_ui_builder_definition (builder, "mail-dialogs.ui");
|
||||
|
||||
dialog = e_builder_get_widget (builder, "message_security_dialog");
|
||||
|
||||
grid = e_builder_get_widget (builder, "signature_grid");
|
||||
w = gtk_label_new (_(smime_sign_table[part->validity->sign.status].description));
|
||||
w = gtk_label_new (_(smime_sign_table[validity->sign.status].description));
|
||||
gtk_misc_set_alignment ((GtkMisc *) w, 0.0, 0.5);
|
||||
gtk_label_set_line_wrap ((GtkLabel *) w, TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (grid), w);
|
||||
if (part->validity->sign.description) {
|
||||
if (validity->sign.description) {
|
||||
GtkTextBuffer *buffer;
|
||||
|
||||
buffer = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_set_text (
|
||||
buffer, part->validity->sign.description,
|
||||
strlen (part->validity->sign.description));
|
||||
buffer, validity->sign.description,
|
||||
strlen (validity->sign.description));
|
||||
w = g_object_new (
|
||||
gtk_scrolled_window_get_type (),
|
||||
"hscrollbar_policy", GTK_POLICY_AUTOMATIC,
|
||||
@ -309,24 +311,24 @@ secure_button_clicked_cb (GtkWidget *widget,
|
||||
gtk_container_add (GTK_CONTAINER (grid), w);
|
||||
}
|
||||
|
||||
if (!g_queue_is_empty (&part->validity->sign.signers))
|
||||
if (!g_queue_is_empty (&validity->sign.signers))
|
||||
add_cert_table (
|
||||
grid, &part->validity->sign.signers, NULL);
|
||||
grid, &validity->sign.signers, NULL);
|
||||
|
||||
gtk_widget_show_all (grid);
|
||||
|
||||
grid = e_builder_get_widget (builder, "encryption_grid");
|
||||
w = gtk_label_new (_(smime_encrypt_table[part->validity->encrypt.status].description));
|
||||
w = gtk_label_new (_(smime_encrypt_table[validity->encrypt.status].description));
|
||||
gtk_misc_set_alignment ((GtkMisc *) w, 0.0, 0.5);
|
||||
gtk_label_set_line_wrap ((GtkLabel *) w, TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (grid), w);
|
||||
if (part->validity->encrypt.description) {
|
||||
if (validity->encrypt.description) {
|
||||
GtkTextBuffer *buffer;
|
||||
|
||||
buffer = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_set_text (
|
||||
buffer, part->validity->encrypt.description,
|
||||
strlen (part->validity->encrypt.description));
|
||||
buffer, validity->encrypt.description,
|
||||
strlen (validity->encrypt.description));
|
||||
w = g_object_new (
|
||||
gtk_scrolled_window_get_type (),
|
||||
"hscrollbar_policy", GTK_POLICY_AUTOMATIC,
|
||||
@ -346,8 +348,8 @@ secure_button_clicked_cb (GtkWidget *widget,
|
||||
gtk_container_add (GTK_CONTAINER (grid), w);
|
||||
}
|
||||
|
||||
if (!g_queue_is_empty (&part->validity->encrypt.encrypters))
|
||||
add_cert_table (grid, &part->validity->encrypt.encrypters, NULL);
|
||||
if (!g_queue_is_empty (&validity->encrypt.encrypters))
|
||||
add_cert_table (grid, &validity->encrypt.encrypters, NULL);
|
||||
|
||||
gtk_widget_show_all (grid);
|
||||
|
||||
@ -361,37 +363,37 @@ secure_button_clicked_cb (GtkWidget *widget,
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
emfe_secure_button_get_widget (EMailFormatterExtension *extension,
|
||||
EMailPartList *context,
|
||||
EMailPart *part,
|
||||
GHashTable *params)
|
||||
secure_button_get_widget_for_validity (CamelCipherValidity *validity)
|
||||
{
|
||||
GtkWidget *box, *button, *layout, *widget;
|
||||
const gchar *icon_name;
|
||||
gchar *description;
|
||||
GString *buffer;
|
||||
|
||||
g_return_val_if_fail (validity != NULL, NULL);
|
||||
|
||||
buffer = g_string_new ("");
|
||||
|
||||
if (part->validity->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) {
|
||||
if (validity->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) {
|
||||
const gchar *desc;
|
||||
gint status;
|
||||
|
||||
status = part->validity->sign.status;
|
||||
status = validity->sign.status;
|
||||
desc = smime_sign_table[status].shortdesc;
|
||||
|
||||
g_string_append (buffer, gettext (desc));
|
||||
|
||||
format_cert_infos (&part->validity->sign.signers, buffer);
|
||||
format_cert_infos (&validity->sign.signers, buffer);
|
||||
}
|
||||
|
||||
if (part->validity->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) {
|
||||
if (validity->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) {
|
||||
const gchar *desc;
|
||||
gint status;
|
||||
|
||||
if (part->validity->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)
|
||||
if (validity->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)
|
||||
g_string_append (buffer, "\n");
|
||||
|
||||
status = part->validity->encrypt.status;
|
||||
status = validity->encrypt.status;
|
||||
desc = smime_encrypt_table[status].shortdesc;
|
||||
g_string_append (buffer, gettext (desc));
|
||||
}
|
||||
@ -399,16 +401,16 @@ emfe_secure_button_get_widget (EMailFormatterExtension *extension,
|
||||
description = g_string_free (buffer, FALSE);
|
||||
|
||||
/* FIXME: need to have it based on encryption and signing too */
|
||||
if (part->validity->sign.status != 0)
|
||||
icon_name = smime_sign_table[part->validity->sign.status].icon;
|
||||
if (validity->sign.status != 0)
|
||||
icon_name = smime_sign_table[validity->sign.status].icon;
|
||||
else
|
||||
icon_name = smime_encrypt_table[part->validity->encrypt.status].icon;
|
||||
icon_name = smime_encrypt_table[validity->encrypt.status].icon;
|
||||
|
||||
box = gtk_event_box_new ();
|
||||
if (part->validity->sign.status != 0)
|
||||
if (validity->sign.status != 0)
|
||||
gtk_widget_override_background_color (
|
||||
box, GTK_STATE_FLAG_NORMAL,
|
||||
&smime_sign_colour[part->validity->sign.status]);
|
||||
&smime_sign_colour[validity->sign.status]);
|
||||
|
||||
layout = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
|
||||
gtk_container_add (GTK_CONTAINER (box), layout);
|
||||
@ -417,7 +419,7 @@ emfe_secure_button_get_widget (EMailFormatterExtension *extension,
|
||||
gtk_box_pack_start (GTK_BOX (layout), button, FALSE, FALSE, 0);
|
||||
g_signal_connect (
|
||||
button, "clicked",
|
||||
G_CALLBACK (secure_button_clicked_cb), part);
|
||||
G_CALLBACK (secure_button_clicked_cb), validity);
|
||||
|
||||
widget = gtk_image_new_from_icon_name (
|
||||
icon_name, GTK_ICON_SIZE_LARGE_TOOLBAR);
|
||||
@ -426,12 +428,49 @@ emfe_secure_button_get_widget (EMailFormatterExtension *extension,
|
||||
widget = gtk_label_new (description);
|
||||
gtk_box_pack_start (GTK_BOX (layout), widget, FALSE, FALSE, 0);
|
||||
|
||||
gtk_widget_show_all (box);
|
||||
|
||||
g_free (description);
|
||||
|
||||
return box;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
emfe_secure_button_get_widget (EMailFormatterExtension *extension,
|
||||
EMailPartList *context,
|
||||
EMailPart *part,
|
||||
GHashTable *params)
|
||||
{
|
||||
GtkWidget *grid;
|
||||
GSList *lst;
|
||||
|
||||
g_return_val_if_fail (part != NULL, NULL);
|
||||
|
||||
grid = g_object_new (GTK_TYPE_GRID,
|
||||
"orientation", GTK_ORIENTATION_VERTICAL,
|
||||
"row-spacing", 2,
|
||||
"halign", GTK_ALIGN_FILL,
|
||||
"hexpand", TRUE,
|
||||
NULL);
|
||||
|
||||
for (lst = part->validities; lst; lst = lst->next) {
|
||||
EMailPartValidityPair *pair = lst->data;
|
||||
GtkWidget *widget;
|
||||
|
||||
if (!pair)
|
||||
continue;
|
||||
|
||||
widget = secure_button_get_widget_for_validity (pair->validity);
|
||||
if (widget) {
|
||||
gtk_widget_set_halign (widget, GTK_ALIGN_FILL);
|
||||
gtk_widget_set_hexpand (widget, TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (grid), widget);
|
||||
}
|
||||
}
|
||||
|
||||
gtk_widget_show_all (grid);
|
||||
|
||||
return grid;
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
emfe_secure_button_get_display_name (EMailFormatterExtension *extension)
|
||||
{
|
||||
|
||||
@ -38,6 +38,18 @@ struct _EMailPartPrivate {
|
||||
GFreeFunc free_func;
|
||||
};
|
||||
|
||||
static void
|
||||
mail_part_validity_pair_free (gpointer ptr)
|
||||
{
|
||||
EMailPartValidityPair *pair = ptr;
|
||||
|
||||
if (!pair)
|
||||
return;
|
||||
|
||||
camel_cipher_validity_free (pair->validity);
|
||||
g_free (pair);
|
||||
}
|
||||
|
||||
static void
|
||||
mail_part_free (EMailPart *part)
|
||||
{
|
||||
@ -59,14 +71,9 @@ mail_part_free (EMailPart *part)
|
||||
part->mime_type = NULL;
|
||||
}
|
||||
|
||||
if (part->validity) {
|
||||
camel_cipher_validity_free (part->validity);
|
||||
part->validity = NULL;
|
||||
}
|
||||
|
||||
if (part->validity_parent) {
|
||||
camel_cipher_validity_free (part->validity_parent);
|
||||
part->validity_parent = NULL;
|
||||
if (part->validities) {
|
||||
g_slist_free_full (part->validities, mail_part_validity_pair_free);
|
||||
part->validities = NULL;
|
||||
}
|
||||
|
||||
if (part->priv->free_func) {
|
||||
@ -169,6 +176,22 @@ e_mail_part_get_instance_size (EMailPart *part)
|
||||
return part->priv->instance_size;
|
||||
}
|
||||
|
||||
static EMailPartValidityPair *
|
||||
mail_part_find_validity_pair (EMailPart *part,
|
||||
guint32 validity_type)
|
||||
{
|
||||
GSList *lst;
|
||||
|
||||
for (lst = part->validities; lst; lst = lst->next) {
|
||||
EMailPartValidityPair *pair = lst->data;
|
||||
|
||||
if (pair && (pair->validity_type & validity_type) == validity_type)
|
||||
return pair;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* e_mail_part_update_validity:
|
||||
* @part: An #EMailPart
|
||||
@ -177,20 +200,52 @@ e_mail_part_get_instance_size (EMailPart *part)
|
||||
*
|
||||
* Updates validity of the @part. When the part already has some validity
|
||||
* set, the new @validity and @validity_type are just appended, preserving
|
||||
* the original validity.
|
||||
* the original validity. Validities of the same type (PGP or S/MIME) are
|
||||
* merged together.
|
||||
*/
|
||||
void
|
||||
e_mail_part_update_validity (EMailPart *part,
|
||||
CamelCipherValidity *validity,
|
||||
guint32 validity_type)
|
||||
{
|
||||
EMailPartValidityPair *pair;
|
||||
|
||||
g_return_if_fail (part != NULL);
|
||||
|
||||
part->validity_type &= validity_type;
|
||||
|
||||
if (part->validity) {
|
||||
camel_cipher_validity_envelope (part->validity, validity);
|
||||
pair = mail_part_find_validity_pair (part, validity_type & (E_MAIL_PART_VALIDITY_PGP | E_MAIL_PART_VALIDITY_SMIME));
|
||||
if (pair) {
|
||||
pair->validity_type |= validity_type;
|
||||
camel_cipher_validity_envelope (pair->validity, validity);
|
||||
} else {
|
||||
part->validity = camel_cipher_validity_clone (validity);
|
||||
pair = g_new0 (EMailPartValidityPair, 1);
|
||||
pair->validity_type = validity_type;
|
||||
pair->validity = camel_cipher_validity_clone (validity);
|
||||
|
||||
part->validities = g_slist_append (part->validities, pair);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* e_mail_part_get_validity:
|
||||
* @part: An #EMailPart
|
||||
* @validity_type: E_MAIL_PART_VALIDITY_* flags
|
||||
*
|
||||
* Returns, validity of @part contains any validity with the same bits
|
||||
* as @validity_type set. It should contain all bits of it.
|
||||
*
|
||||
* Returns: a #CamelCipherValidity of the given type, %NULL if not found
|
||||
*
|
||||
* Since: 3.8
|
||||
*/
|
||||
CamelCipherValidity *
|
||||
e_mail_part_get_validity (EMailPart *part,
|
||||
guint32 validity_type)
|
||||
{
|
||||
EMailPartValidityPair *pair;
|
||||
|
||||
g_return_val_if_fail (part != NULL, NULL);
|
||||
|
||||
pair = mail_part_find_validity_pair (part, validity_type);
|
||||
|
||||
return pair ? pair->validity : NULL;
|
||||
}
|
||||
|
||||
@ -43,6 +43,13 @@ enum {
|
||||
E_MAIL_PART_VALIDITY_ENCRYPTED = 1 << 3
|
||||
} EMailPartValidityFlags;
|
||||
|
||||
typedef struct _EMailPartValidityPair EMailPartValidityPair;
|
||||
|
||||
struct _EMailPartValidityPair {
|
||||
guint32 validity_type; /* E_MAIL_PART_VALIDITY_ * flags */
|
||||
CamelCipherValidity *validity;
|
||||
};
|
||||
|
||||
struct _EMailPart {
|
||||
EMailPartPrivate *priv;
|
||||
|
||||
@ -53,9 +60,7 @@ struct _EMailPart {
|
||||
gchar *cid;
|
||||
gchar *mime_type;
|
||||
|
||||
guint32 validity_type; /* E_MAIL_PART_VALIDITY_ * flags */
|
||||
CamelCipherValidity *validity;
|
||||
CamelCipherValidity *validity_parent;
|
||||
GSList *validities; /* EMailPartValidityPair pointer */
|
||||
|
||||
gint is_attachment: 1;
|
||||
|
||||
@ -92,6 +97,9 @@ gsize e_mail_part_get_instance_size (EMailPart *part);
|
||||
void e_mail_part_update_validity (EMailPart *part,
|
||||
CamelCipherValidity *validity,
|
||||
guint32 validity_type);
|
||||
CamelCipherValidity *
|
||||
e_mail_part_get_validity (EMailPart *part,
|
||||
guint32 validity_type);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@ -1349,8 +1349,16 @@ em_utils_message_to_html (CamelSession *session,
|
||||
hidden_text_html_part = part;
|
||||
}
|
||||
|
||||
if (part->validity_type)
|
||||
is_validity_found |= part->validity_type;
|
||||
if (part->validities) {
|
||||
GSList *lst;
|
||||
|
||||
for (lst = part->validities; lst; lst = lst->next) {
|
||||
EMailPartValidityPair *pair = lst->data;
|
||||
|
||||
if (pair)
|
||||
is_validity_found |= pair->validity_type;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (validity_found)
|
||||
|
||||
Reference in New Issue
Block a user