From 2f99f8636abd7efc68bfa5de1591c594e9f532eb Mon Sep 17 00:00:00 2001 From: Not Zed Date: Mon, 24 Nov 2003 22:35:33 +0000 Subject: set session on print formatter for signatures to work. 2003-11-25 Not Zed * em-folder-view.c (em_folder_view_print): set session on print formatter for signatures to work. * em-message-browser.c (emmb_destroy): kill warning. * em-format-html.c (efh_output_secure): same as efhd_output_secure, output the security bar, but for printing/plain html. (efh_application_xpkcs7mime): use output_secure. (em_format_html_multipart_signed_sign): removed, output_secure does what this did. * em-format-html-display.c (smime_sign_table, smime_encrypt_table): Added a short description for the mail display. (efhd_xpkcs7mime_button): only good/bad signature at this point, if only encrypted, then display 'bad' icon. (efhd_output_secure): output the security bar/button and handle multi-level enveloping properly. (efhd_application_xpkcs7mime): just call output_secure to do the security bar. (efhd_multipart_signed): same. (efhd_signature_button): removed, no longer used. (efhd_signature_check): removed, no longer used. svn path=/trunk/; revision=23483 --- mail/ChangeLog | 27 +++++ mail/em-folder-view.c | 1 + mail/em-format-html-display.c | 197 +++++++++++++++------------------- mail/em-format-html.c | 243 ++++++++++++++++++------------------------ mail/em-format-html.h | 6 +- mail/em-format.c | 2 +- mail/em-message-browser.c | 2 +- 7 files changed, 218 insertions(+), 260 deletions(-) diff --git a/mail/ChangeLog b/mail/ChangeLog index 4bae234613..ba60d0ccd7 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,30 @@ +2003-11-25 Not Zed + + * em-folder-view.c (em_folder_view_print): set session on print + formatter for signatures to work. + + * em-message-browser.c (emmb_destroy): kill warning. + + * em-format-html.c (efh_output_secure): same as + efhd_output_secure, output the security bar, but for + printing/plain html. + (efh_application_xpkcs7mime): use output_secure. + (em_format_html_multipart_signed_sign): removed, output_secure + does what this did. + + * em-format-html-display.c (smime_sign_table, + smime_encrypt_table): Added a short description for the mail + display. + (efhd_xpkcs7mime_button): only good/bad signature at this point, + if only encrypted, then display 'bad' icon. + (efhd_output_secure): output the security bar/button and handle + multi-level enveloping properly. + (efhd_application_xpkcs7mime): just call output_secure to do + the security bar. + (efhd_multipart_signed): same. + (efhd_signature_button): removed, no longer used. + (efhd_signature_check): removed, no longer used. + 2003-11-24 Radek Doulik * em-format-html.c (efh_text_plain): use new colors diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c index ffece26fac..602993e8f9 100644 --- a/mail/em-folder-view.c +++ b/mail/em-folder-view.c @@ -1597,6 +1597,7 @@ int em_folder_view_print(EMFolderView *emfv, int preview) } print = em_format_html_print_new(); + em_format_set_session((EMFormat *)print, ((EMFormat *)emfv->preview)->session); res = em_format_html_print_print(print, msg, (EMFormatHTML *)emfv->preview, config, preview); g_object_unref(print); if (config) diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c index ec606ec5d7..07fe4869b4 100644 --- a/mail/em-format-html-display.c +++ b/mail/em-format-html-display.c @@ -589,22 +589,24 @@ efhd_complete(EMFormat *emf) /* ********************************************************************** */ +/* TODO: rename some of this stuff, it isn't 'smime' specific */ +/* FIXME: also in em-format-html.c */ static const struct { - const char *icon, *description; + const char *icon, *shortdesc, *description; } smime_sign_table[4] = { - { NULL, N_("This message is not signed. There is no guarantee the sender of the message is authentic.") }, - { "pgp-signature-ok.png", N_("This message is signed and is valid, the sender of this message is very likely who they claim to be.") }, - { "pgp-signature-bad.png", N_("The signature of this message cannot be verified, it may have been altered in transit.") }, - { "pgp-signature-nokey.png", N_("This message is signed with a valid signature, but the sender of the message cannot be verified.") }, + { NULL, N_("Unsigned"), N_("This message is not signed. There is no guarantee the sender of the message is authentic.") }, + { "pgp-signature-ok.png",N_("Valid signature"), N_("This message is signed and is valid, the sender of this message is very likely who they claim to be.") }, + { "pgp-signature-bad.png", N_("Invalid signature"), N_("The signature of this message cannot be verified, it may have been altered in transit.") }, + { "pgp-signature-nokey.png", N_("Valid signature, cannot verify sender"), N_("This message is signed with a valid signature, but the sender of the message cannot be verified.") }, }; static const struct { - const char *icon, *description; + const char *icon, *shortdesc, *description; } smime_encrypt_table[4] = { - { NULL, N_("This message is not encrypted. It's content may be viewed in transit across The Internet.") }, - { "pgp-signature-ok.png", N_("This message is encrypted, but with a weak encryption algorithm. It would be difficult, but not impossible for an outsider to view the content of this message in a practical amount of time.") }, - { "pgp-signature-ok.png", N_("This message is encrypted. It would be difficult for an outsider to view the content of this message.") }, - { "pgp-signature-ok.png", N_("This message is encrypted, with a strong encryption algorithm. It would be very difficult for an outsider to view the content of this message in a practical amount of time.") }, + { NULL, N_("Unencrypted"), N_("This message is not encrypted. It's content may be viewed in transit across The Internet.") }, + { "pgp-signature-ok.png", N_("Encrypted, weak"), N_("This message is encrypted, but with a weak encryption algorithm. It would be difficult, but not impossible for an outsider to view the content of this message in a practical amount of time.") }, + { "pgp-signature-ok.png", N_("Encrypted"), N_("This message is encrypted. It would be difficult for an outsider to view the content of this message.") }, + { "pgp-signature-ok.png", N_("Encrypted, strong"), N_("This message is encrypted, with a strong encryption algorithm. It would be very difficult for an outsider to view the content of this message in a practical amount of time.") }, }; struct _smime_pobject { @@ -683,10 +685,11 @@ efhd_xpkcs7mime_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObje char *file; const char *name; - if (po->signature) - name = smime_sign_table[po->valid->sign.status].icon; + /* FIXME: need to have it based on encryption and signing too */ + if (po->valid->sign.status == CAMEL_CIPHER_VALIDITY_SIGN_GOOD) + name = "pgp-signature-ok.png"; else - name = smime_encrypt_table[po->valid->encrypt.status].icon; + name = "pgp-signature-bad.png"; file = g_build_filename(EVOLUTION_ICONSDIR, name, NULL); pixbuf = gdk_pixbuf_new_from_file(file, NULL); @@ -709,6 +712,50 @@ efhd_xpkcs7mime_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObje return TRUE; } +static void +efhd_output_secure(EMFormat *emf, CamelStream *stream, CamelMimePart *part, CamelCipherValidity *valid) +{ + CamelCipherValidity *save = ((EMFormatHTML *)emf)->valid_parent; + + /* Note: this same logic is in efh_output_secure */ + + if (((EMFormatHTML *)emf)->valid == NULL) { + ((EMFormatHTML *)emf)->valid = valid; + } else { + e_dlist_addtail(&((EMFormatHTML *)emf)->valid_parent->children, (EDListNode *)valid); + camel_cipher_validity_envelope(((EMFormatHTML *)emf)->valid_parent, valid); + } + + ((EMFormatHTML *)emf)->valid_parent = valid; + em_format_part(emf, stream, part); + ((EMFormatHTML *)emf)->valid_parent = save; + + if (((EMFormatHTML *)emf)->valid == valid + && (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE + || valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)) { + char *classid; + struct _smime_pobject *pobj; + + camel_stream_printf(stream, "", + valid->sign.status == CAMEL_CIPHER_VALIDITY_SIGN_GOOD?"#88bb88":"#bb8888"); + classid = g_strdup_printf("smime:///em-format-html/%p/icon/signed", part); + pobj = (struct _smime_pobject *)em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(*pobj), classid, part, efhd_xpkcs7mime_button); + pobj->valid = camel_cipher_validity_clone(valid); + pobj->object.free = efhd_xpkcs7mime_free; + camel_stream_printf(stream, "
", classid); + + if (valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) { + camel_stream_printf(stream, "%s
", _(smime_sign_table[valid->sign.status].shortdesc)); + } + + if (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) { + camel_stream_printf(stream, "%s
", _(smime_encrypt_table[valid->encrypt.status].shortdesc)); + } + + camel_stream_printf(stream, "
"); + } +} + static void efhd_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info) { @@ -728,46 +775,7 @@ efhd_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *p em_format_format_error(emf, stream, ex->desc?ex->desc:_("Could not parse S/MIME message: Unknown error")); em_format_part_as(emf, stream, part, NULL); } else { - CamelCipherValidity *save = ((EMFormatHTML *)emf)->enveloped_validity; - - if (save != NULL) - camel_cipher_validity_envelope(valid, save); - - ((EMFormatHTML *)emf)->enveloped_validity = valid; - em_format_part(emf, stream, opart); - ((EMFormatHTML *)emf)->enveloped_validity = save; - - if (save != NULL - && (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE - || valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)) { - char *classid; - struct _smime_pobject *pobj; - - camel_stream_printf(stream, ""); - - if (valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) { - classid = g_strdup_printf("smime:///em-format-html/%p/icon/signed", part); - pobj = (struct _smime_pobject *)em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(*pobj), classid, part, efhd_xpkcs7mime_button); - pobj->valid = camel_cipher_validity_clone(valid); - pobj->signature = TRUE; - pobj->object.free = efhd_xpkcs7mime_free; - camel_stream_printf(stream, "", classid, valid->sign.description); - g_free(classid); - } - - if (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) { - classid = g_strdup_printf("smime:///em-format-html/%p/icon/encrypted", part); - pobj = (struct _smime_pobject *)em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(*pobj), classid, part, efhd_xpkcs7mime_button); - pobj->valid = camel_cipher_validity_clone(valid); - pobj->object.free = efhd_xpkcs7mime_free; - camel_stream_printf(stream, "", classid, valid->encrypt.description); - g_free(classid); - } - - camel_stream_printf(stream, "

%s

%s
"); - } - - camel_cipher_validity_free(valid); + efhd_output_secure(emf, stream, opart, valid); } camel_object_unref(opart); @@ -777,48 +785,12 @@ efhd_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *p /* ********************************************************************** */ -static void -efhd_signature_check(GtkWidget *w, EMFormatHTMLPObject *pobject) -{ - d(printf("insert signature check here ... redraw ? or what ?\n")); - /* blah, do the old way for now, force a complete re-draw */ - em_format_set_inline((EMFormat *)pobject->format, pobject->part, TRUE); - em_format_format_clone((EMFormat *)pobject->format, ((EMFormat *)pobject->format)->message, (EMFormat *)pobject->format); -} - -static gboolean -efhd_signature_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject *pobject) -{ - GtkWidget *icon, *button; - GdkPixbuf *pixbuf; - - pixbuf = gdk_pixbuf_new_from_file(EVOLUTION_ICONSDIR "/pgp-signature-nokey.png", NULL); - if (pixbuf == NULL) - return FALSE; - - /* wtf isn't this just scaled on disk? */ - icon = gtk_image_new_from_pixbuf(gdk_pixbuf_scale_simple(pixbuf, 24, 24, GDK_INTERP_BILINEAR)); - g_object_unref(pixbuf); - gtk_widget_show(icon); - - button = gtk_button_new(); - g_signal_connect(button, "clicked", G_CALLBACK (efhd_signature_check), pobject); - /*g_signal_connect (button, "key_press_event", G_CALLBACK (inline_button_press), part);*/ - - gtk_container_add((GtkContainer *)button, icon); - gtk_widget_show(button); - gtk_container_add((GtkContainer *)eb, button); - - return TRUE; -} - static void efhd_multipart_signed (EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info) { - char *classid; - static int signedid; CamelMultipartSigned *mps; CamelMimePart *cpart; + CamelCipherContext *cipher = NULL; mps = (CamelMultipartSigned *)camel_medium_get_content_object((CamelMedium *)part); if (!CAMEL_IS_MULTIPART_SIGNED(mps) @@ -827,31 +799,30 @@ efhd_multipart_signed (EMFormat *emf, CamelStream *stream, CamelMimePart *part, return; } - em_format_part(emf, stream, cpart); + /* FIXME: Should be done via a plugin interface */ + /* FIXME: duplicated in em-format-html.c */ + if (g_ascii_strcasecmp("application/x-pkcs7-signature", mps->protocol) == 0) + cipher = camel_smime_context_new(emf->session); + else if (g_ascii_strcasecmp("application/pgp-signature", mps->protocol) == 0) + cipher = camel_gpg_context_new(emf->session); - if (em_format_is_inline(emf, part)) { - em_format_html_multipart_signed_sign(emf, stream, part); + if (cipher == NULL) { + em_format_format_error(emf, stream, _("Unsupported signature format")); + em_format_part_as(emf, stream, part, NULL); } else { - classid = g_strdup_printf("multipart-signed:///icon/%d", signedid++); - - /* wtf is this so fugly? */ - camel_stream_printf(stream, - "
" - "" - "" - "" - "" - "
" - "
" - "
%s
" - "" - "" - "
\n", - classid, - _("This message is digitally signed. Click the lock icon for more information.")); - - em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_signature_button); - g_free(classid); + CamelException *ex = camel_exception_new(); + CamelCipherValidity *valid; + + valid = camel_cipher_verify(cipher, part, ex); + if (valid == NULL) { + em_format_format_error(emf, stream, ex->desc?ex->desc:_("Unknown error verifying signature")); + em_format_part_as(emf, stream, part, NULL); + } else { + efhd_output_secure(emf, stream, cpart, valid); + } + + camel_exception_free(ex); + camel_object_unref(cipher); } } diff --git a/mail/em-format-html.c b/mail/em-format-html.c index e1ef6be129..f3b9b46c5a 100644 --- a/mail/em-format-html.c +++ b/mail/em-format-html.c @@ -176,6 +176,7 @@ efh_finalise(GObject *o) /* FIXME: check for leaked stuff */ em_format_html_clear_pobject(efh); + camel_cipher_validity_free(efh->valid); efh_gtkhtml_destroy(efh->html, efh); @@ -556,24 +557,75 @@ efh_object_requested(GtkHTML *html, GtkHTMLEmbedded *eb, EMFormatHTML *efh) #include "em-inline-filter.h" #include +/* FIXME: This is duplicated in em-format-html-display, should be exported or in security module */ static const struct { - const char *icon; + const char *icon, *shortdesc; } smime_sign_table[4] = { - { NULL }, - { "pgp-signature-ok.png" }, - { "pgp-signature-bad.png" }, - { "pgp-signature-nokey.png" }, + { "pgp-signature-nokey.png", N_("Unsigned") }, + { "pgp-signature-ok.png", N_("Valid signature") }, + { "pgp-signature-bad.png", N_("Invalid signature") }, + { "pgp-signature-nokey.png", N_("Valid signature, cannot verify sender") }, }; static const struct { - const char *icon; + const char *icon, *shortdesc; } smime_encrypt_table[4] = { - { NULL }, - { "pgp-signature-ok.png" }, - { "pgp-signature-ok.png" }, - { "pgp-signature-ok.png" }, + { NULL, N_("Unencrypted") }, + { "pgp-signature-ok.png", N_("Encrypted, weak"),}, + { "pgp-signature-ok.png", N_("Encrypted") }, + { "pgp-signature-ok.png", N_("Encrypted, strong") }, }; +/* TODO: this could probably be virtual on em-format-html + then we only need one version of each type handler */ +static void +efh_output_secure(EMFormat *emf, CamelStream *stream, CamelMimePart *part, CamelCipherValidity *valid) +{ + CamelCipherValidity *save = ((EMFormatHTML *)emf)->valid_parent; + + /* Note: this same logic is in efhd_output_secure */ + if (((EMFormatHTML *)emf)->valid == NULL) { + ((EMFormatHTML *)emf)->valid = valid; + } else { + e_dlist_addtail(&((EMFormatHTML *)emf)->valid_parent->children, (EDListNode *)valid); + camel_cipher_validity_envelope(((EMFormatHTML *)emf)->valid_parent, valid); + } + + ((EMFormatHTML *)emf)->valid_parent = valid; + em_format_part(emf, stream, part); + ((EMFormatHTML *)emf)->valid_parent = save; + + if (((EMFormatHTML *)emf)->valid == valid + && (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE + || valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)) { + char *classid; + CamelMimePart *iconpart; + + camel_stream_printf(stream, "", + valid->sign.status == CAMEL_CIPHER_VALIDITY_SIGN_GOOD?"#88bb88":"#bb8888"); + + classid = g_strdup_printf("smime:///em-format-html/%p/icon/signed", part); + camel_stream_printf(stream, "
", classid); + iconpart = em_format_html_file_part((EMFormatHTML *)emf, "image/png", + EVOLUTION_ICONSDIR, smime_sign_table[valid->sign.status].icon); + if (iconpart) { + (void)em_format_add_puri(emf, sizeof(EMFormatPURI), classid, iconpart, efh_write_image); + camel_object_unref(iconpart); + } + g_free(classid); + + if (valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) { + camel_stream_printf(stream, "%s
", _(smime_sign_table[valid->sign.status].shortdesc)); + } + + if (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) { + camel_stream_printf(stream, "%s
", _(smime_encrypt_table[valid->encrypt.status].shortdesc)); + } + + camel_stream_printf(stream, "
"); + } +} + static void efh_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info) { @@ -593,54 +645,7 @@ efh_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *pa em_format_format_error(emf, stream, ex->desc?ex->desc:_("Could not parse S/MIME message: Unknown error")); em_format_part_as(emf, stream, part, NULL); } else { - CamelCipherValidity *save = ((EMFormatHTML *)emf)->enveloped_validity; - - if (save != NULL) - camel_cipher_validity_envelope(valid, save); - - ((EMFormatHTML *)emf)->enveloped_validity = valid; - em_format_part(emf, stream, opart); - ((EMFormatHTML *)emf)->enveloped_validity = save; - - if (save != NULL - && (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE - || valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE)) { - char *classid; - CamelMimePart *iconpart; - EMFormatPURI *iconpuri; - - camel_stream_printf(stream, ""); - - if (valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) { - classid = g_strdup_printf("smime:///em-format-html/%p/icon/signed", part); - iconpart = em_format_html_file_part((EMFormatHTML *)emf, "image/png", - EVOLUTION_ICONSDIR, smime_sign_table[valid->sign.status].icon); - if (iconpart) { - iconpuri = em_format_add_puri(emf, sizeof(*iconpuri), classid, iconpart, efh_write_image); - camel_object_unref(iconpart); - } - - camel_stream_printf(stream, "", classid, valid->sign.description); - g_free(classid); - } - - if (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) { - classid = g_strdup_printf("smime:///em-format-html/%p/icon/encrypted", part); - iconpart = em_format_html_file_part((EMFormatHTML *)emf, "image/png", - EVOLUTION_ICONSDIR, smime_encrypt_table[valid->encrypt.status].icon); - if (iconpart) { - iconpuri = em_format_add_puri(emf, sizeof(*iconpuri), classid, iconpart, efh_write_image); - camel_object_unref(iconpart); - } - - camel_stream_printf(stream, "", classid, valid->encrypt.description); - g_free(classid); - } - - camel_stream_printf(stream, "

%s

%s
"); - } - - camel_cipher_validity_free(valid); + efh_output_secure(emf, stream, opart, valid); } camel_object_unref(opart); @@ -1011,89 +1016,12 @@ efh_multipart_related(EMFormat *emf, CamelStream *stream, CamelMimePart *part, c } } -static const struct { - const char *icon; - const char *text; -} signed_table[2] = { - { "pgp-signature-bad.png", N_("This message is digitally signed but can not be proven to be authentic.") }, - { "pgp-signature-ok.png", N_("This message is digitally signed and has been found to be authentic.") } -}; - -void -em_format_html_multipart_signed_sign(EMFormat *emf, CamelStream *stream, CamelMimePart *part) -{ - CamelMultipartSigned *mps; - CamelCipherValidity *valid = NULL; - CamelException ex; - const char *message = NULL; - int good = 0; - char *classid; - EMFormatPURI *iconpuri; - CamelMimePart *iconpart; - static int iconid; - - mps = (CamelMultipartSigned *)camel_medium_get_content_object((CamelMedium *)part); - - /* FIXME: This sequence is also copied in em-format.c */ - - camel_exception_init(&ex); - if (emf->session == NULL) { - message = _("Session not initialised"); - } else { - CamelCipherContext *cipher = NULL; - - /* FIXME: Should be done via a plugin interface */ - if (g_ascii_strcasecmp("application/x-pkcs7-signature", mps->protocol) == 0) - cipher = camel_smime_context_new(emf->session); - else if (g_ascii_strcasecmp("application/pgp-signature", mps->protocol) == 0) - cipher = camel_gpg_context_new(emf->session); - - if (cipher == NULL) { - message = _("Unsupported signature format"); - } else { - valid = camel_cipher_verify(cipher, part, &ex); - camel_object_unref(cipher); - if (valid) { - good = camel_cipher_validity_get_valid(valid)?1:0; - message = camel_cipher_validity_get_description(valid); - } else { - message = camel_exception_get_description(&ex); - } - } - } - - classid = g_strdup_printf("multipart-signed:///em-format-html/%p/icon/%d", part, iconid++); - iconpart = em_format_html_file_part((EMFormatHTML *)emf, "image/png", EVOLUTION_ICONSDIR, signed_table[good].icon); - if (iconpart) { - iconpuri = em_format_add_puri(emf, sizeof(*iconpuri), classid, iconpart, efh_write_image); - camel_object_unref(iconpart); - } - - camel_stream_printf(stream, "" - "" - "
%s

", - classid, - _(signed_table[good].text)); - g_free(classid); - - if (message) { - char *tmp = camel_text_to_html(message, ((EMFormatHTML *)emf)->text_html_flags, 0); - - camel_stream_printf(stream, "%s", good?"":" color=red", tmp); - g_free(tmp); - } - - camel_stream_write_string(stream, "
"); - - camel_exception_clear(&ex); - camel_cipher_validity_free(valid); -} - static void efh_multipart_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info) { CamelMimePart *cpart; CamelMultipartSigned *mps; + CamelCipherContext *cipher = NULL; mps = (CamelMultipartSigned *)camel_medium_get_content_object((CamelMedium *)part); if (!CAMEL_IS_MULTIPART_SIGNED(mps) @@ -1103,8 +1031,31 @@ efh_multipart_signed(EMFormat *emf, CamelStream *stream, CamelMimePart *part, co return; } - em_format_part(emf, stream, cpart); - em_format_html_multipart_signed_sign(emf, stream, part); + /* FIXME: Should be done via a plugin interface */ + /* FIXME: duplicated in em-format-html-display.c */ + if (g_ascii_strcasecmp("application/x-pkcs7-signature", mps->protocol) == 0) + cipher = camel_smime_context_new(emf->session); + else if (g_ascii_strcasecmp("application/pgp-signature", mps->protocol) == 0) + cipher = camel_gpg_context_new(emf->session); + + if (cipher == NULL) { + em_format_format_error(emf, stream, _("Unsupported signature format")); + em_format_part_as(emf, stream, part, NULL); + } else { + CamelException *ex = camel_exception_new(); + CamelCipherValidity *valid; + + valid = camel_cipher_verify(cipher, part, ex); + if (valid == NULL) { + em_format_format_error(emf, stream, ex->desc?ex->desc:_("Unknown error verifying signature")); + em_format_part_as(emf, stream, part, NULL); + } else { + efh_output_secure(emf, stream, cpart, valid); + } + + camel_exception_free(ex); + camel_object_unref(cipher); + } } static void @@ -1316,6 +1267,12 @@ efh_format_timeout(struct _format_msg *m) efh_parent->format_clone((EMFormat *)efh, m->message, m->format_source); em_format_html_clear_pobject(m->format); + if (efh->valid) { + camel_cipher_validity_free(efh->valid); + efh->valid = NULL; + efh->valid_parent = NULL; + } + if (m->message == NULL) { hstream = gtk_html_begin(efh->html); gtk_html_stream_close(hstream, GTK_HTML_STREAM_OK); @@ -1591,9 +1548,10 @@ em_format_html_format_headers(EMFormatHTML *efh, CamelStream *stream, CamelMediu static void efh_format_message(EMFormat *emf, CamelStream *stream, CamelMedium *part) { #define efh ((EMFormatHTML *)emf) - CamelCipherValidity *save = efh->enveloped_validity; + CamelCipherValidity *save = efh->valid, *save_parent = efh->valid_parent; - efh->enveloped_validity = NULL; + efh->valid = NULL; + efh->valid_parent = NULL; if (emf->message != part) camel_stream_printf(stream, "
\n"); @@ -1607,7 +1565,10 @@ static void efh_format_message(EMFormat *emf, CamelStream *stream, CamelMedium * if (emf->message != part) camel_stream_printf(stream, "
\n"); - efh->enveloped_validity = save; + camel_cipher_validity_free(efh->valid); + + efh->valid = save; + efh->valid_parent = save_parent; #undef efh } diff --git a/mail/em-format-html.h b/mail/em-format-html.h index 5e48c8c671..4a981cd792 100644 --- a/mail/em-format-html.h +++ b/mail/em-format-html.h @@ -106,7 +106,8 @@ struct _EMFormatHTML { EDList pending_object_list; - struct _CamelCipherValidity *enveloped_validity; + struct _CamelCipherValidity *valid; + struct _CamelCipherValidity *valid_parent; GSList *headers; @@ -154,7 +155,4 @@ EMFormatHTMLJob *em_format_html_job_new(EMFormatHTML *emfh, void (*callback)(str ; void em_format_html_job_queue(EMFormatHTML *emfh, struct _EMFormatHTMLJob *job); -/* outputs a signature test */ -void em_format_html_multipart_signed_sign(EMFormat *emf, struct _CamelStream *stream, struct _CamelMimePart *part); - #endif /* ! EM_FORMAT_HTML_H */ diff --git a/mail/em-format.c b/mail/em-format.c index 208b4b79b0..63c1b3936f 100644 --- a/mail/em-format.c +++ b/mail/em-format.c @@ -52,7 +52,7 @@ #include "em-format.h" -#define d(x) +#define d(x) x static void emf_builtin_init(EMFormatClass *); static const char *emf_snoop_part(CamelMimePart *part); diff --git a/mail/em-message-browser.c b/mail/em-message-browser.c index f7eb7ecd49..5621fe07bf 100644 --- a/mail/em-message-browser.c +++ b/mail/em-message-browser.c @@ -94,7 +94,7 @@ emmb_destroy(GtkObject *o) EMMessageBrowser *emmb = (EMMessageBrowser *)o; if (emmb->view.list) { - gtk_widget_destroy(emmb->view.list); + gtk_widget_destroy((GtkWidget *)emmb->view.list); emmb->view.list = NULL; } -- cgit v1.2.3