set session on print formatter for signatures to work.

2003-11-25  Not Zed  <NotZed@Ximian.com>

        * 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
This commit is contained in:
Not Zed
2003-11-24 22:35:33 +00:00
committed by Michael Zucci
parent a25373060b
commit 2f99f8636a
7 changed files with 216 additions and 258 deletions

View File

@ -1,3 +1,30 @@
2003-11-25 Not Zed <NotZed@Ximian.com>
* 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 <rodo@ximian.com>
* em-format-html.c (efh_text_plain): use new colors

View File

@ -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)

View File

@ -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, "<table border=0 width=\"100%%\" cellpadding=3 cellspacing=0 bgcolor=%s><tr>",
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, "<td valign=top><object classid=\"%s\"></object></td><td width=100%% valign=top>", classid);
if (valid->sign.status != CAMEL_CIPHER_VALIDITY_SIGN_NONE) {
camel_stream_printf(stream, "%s<br>", _(smime_sign_table[valid->sign.status].shortdesc));
}
if (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) {
camel_stream_printf(stream, "%s<br>", _(smime_encrypt_table[valid->encrypt.status].shortdesc));
}
camel_stream_printf(stream, "</td></tr></table>");
}
}
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, "<table border=1 width=\"100%%\" cellpadding=3 cellspacing=0><tr>");
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, "<td valign=top><object classid=\"%s\"></object><br>%s</td>", 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, "<td valign=top><object classid=\"%s\"></object><br>%s</td>", classid, valid->encrypt.description);
g_free(classid);
}
camel_stream_printf(stream, "</tr></table>");
}
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++);
CamelException *ex = camel_exception_new();
CamelCipherValidity *valid;
/* wtf is this so fugly? */
camel_stream_printf(stream,
"<br><table cellspacing=0 cellpadding=0>"
"<tr><td><table width=10 cellspacing=0 cellpadding=0>"
"<tr><td></td></tr></table></td>"
"<td><object classid=\"%s\"></object></td>"
"<td><table width=3 cellspacing=0 cellpadding=0>"
"<tr><td></td></tr></table></td>"
"<td><font size=-1>%s</font></td></tr>"
"<tr><td height=10>"
"<table cellspacing=0 cellpadding=0><tr>"
"<td height=10><a name=\"glue\"></td></tr>"
"</table></td></tr></table>\n",
classid,
_("This message is digitally signed. Click the lock icon for more information."));
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);
}
em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_signature_button);
g_free(classid);
camel_exception_free(ex);
camel_object_unref(cipher);
}
}

View File

@ -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 <camel/camel-stream-null.h>
/* 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, "<table border=0 width=\"100%%\" cellpadding=3 cellspacing=0 bgcolor=%s><tr>",
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, "<td valign=\"top\"><img src=\"%s\"></td><td valign=\"top\" width=\"100%%\">", 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<br>", _(smime_sign_table[valid->sign.status].shortdesc));
}
if (valid->encrypt.status != CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE) {
camel_stream_printf(stream, "%s<br>", _(smime_encrypt_table[valid->encrypt.status].shortdesc));
}
camel_stream_printf(stream, "</td></tr></table>");
}
}
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, "<table border=1 width=\"100%%\" cellpadding=3 cellspacing=0><tr>");
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, "<td valign=top><img src=\"%s\"><br>%s</td>", 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, "<td valign=top><img src=\"%s\"><br>%s</td>", classid, valid->encrypt.description);
g_free(classid);
}
camel_stream_printf(stream, "</tr></table>");
}
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, "<table><tr valign=top>"
"<td><img src=\"%s\"></td>"
"<td>%s<br><br>",
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, "<font size=-1%s>%s</font>", good?"":" color=red", tmp);
g_free(tmp);
}
camel_stream_write_string(stream, "</td></tr></table>");
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, "<blockquote>\n");
@ -1607,7 +1565,10 @@ static void efh_format_message(EMFormat *emf, CamelStream *stream, CamelMedium *
if (emf->message != part)
camel_stream_printf(stream, "</blockquote>\n");
efh->enveloped_validity = save;
camel_cipher_validity_free(efh->valid);
efh->valid = save;
efh->valid_parent = save_parent;
#undef efh
}

View File

@ -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 */

View File

@ -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);

View File

@ -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;
}