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:
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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 */
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user