implement the key selector popup using e-cert-selector.

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

        * mail-account-gui.c (smime_sign_key_select)
        (smime_encrypt_key_select, smime_encrypt_key_selected)
        (smime_sign_key_selected): implement the key selector popup using
        e-cert-selector.

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

        * em-format-html.c (efh_application_xpkcs7mime): output icons of the status.
        (em_format_html_add_pobject): Changed to take a size specificier,
        return the pobject, and re-ordered args to be more consistent with
        puri stuff.
        (em_format_html_remove_pobject): handle the free callback if set.

        * em-format.c (emf_application_xpkcs7mime): moved this to
        em-format-html since it needs to do icon stuff.

svn path=/trunk/; revision=23312
This commit is contained in:
Not Zed
2003-11-13 03:57:54 +00:00
committed by Michael Zucci
parent 61b1ec94ba
commit 8e302d84a4
6 changed files with 365 additions and 78 deletions

View File

@ -1,5 +1,21 @@
2003-11-12 Not Zed <NotZed@Ximian.com>
* mail-account-gui.c (smime_sign_key_select)
(smime_encrypt_key_select, smime_encrypt_key_selected)
(smime_sign_key_selected): implement the key selector popup using
e-cert-selector.
2003-11-11 Not Zed <NotZed@Ximian.com>
* em-format-html.c (efh_application_xpkcs7mime): output icons of the status.
(em_format_html_add_pobject): Changed to take a size specificier,
return the pobject, and re-ordered args to be more consistent with
puri stuff.
(em_format_html_remove_pobject): handle the free callback if set.
* em-format.c (emf_application_xpkcs7mime): moved this to
em-format-html since it needs to do icon stuff.
* mail-security.glade: new glade file for security related stuff.
* mail-config.glade: removed the message security dialogue, it

View File

@ -564,6 +564,196 @@ efhd_complete(EMFormat *emf)
/* ********************************************************************** */
static const struct {
const char *icon, *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.") },
};
static const struct {
const char *icon, *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.") },
};
struct _smime_pobject {
EMFormatHTMLPObject object;
int signature;
CamelCipherValidity *valid;
GtkWidget *widget;
};
static void
efhd_xpkcs7mime_free(EMFormatHTMLPObject *o)
{
struct _smime_pobject *po = (struct _smime_pobject *)o;
if (po->widget)
gtk_widget_destroy(po->widget);
camel_cipher_validity_free(po->valid);
}
static void
efhd_xpkcs7mime_info_response(GtkWidget *w, guint button, struct _smime_pobject *po)
{
gtk_widget_destroy(w);
po->widget = NULL;
}
static void
efhd_xpkcs7mime_validity_clicked(GtkWidget *button, EMFormatHTMLPObject *pobject)
{
struct _smime_pobject *po = (struct _smime_pobject *)pobject;
GladeXML *xml;
GtkWidget *vbox, *w;
printf("validity clicked\n");
if (po->widget)
/* FIXME: window raise? */
return;
xml = glade_xml_new(EVOLUTION_GLADEDIR "/mail-security.glade", "message_security_dialog", NULL);
po->widget = glade_xml_get_widget(xml, "message_security_dialog");
vbox = glade_xml_get_widget(xml, "signature_vbox");
w = gtk_label_new(_(smime_sign_table[po->valid->sign.status].description));
gtk_label_set_line_wrap((GtkLabel *)w, TRUE);
gtk_box_pack_start((GtkBox *)vbox, w, TRUE, TRUE, 6);
if (po->valid->sign.description) {
w = gtk_label_new(po->valid->sign.description);
gtk_label_set_line_wrap((GtkLabel *)w, TRUE);
gtk_box_pack_start((GtkBox *)vbox, w, TRUE, TRUE, 6);
}
gtk_widget_show_all(vbox);
vbox = glade_xml_get_widget(xml, "encryption_vbox");
w = gtk_label_new(_(smime_encrypt_table[po->valid->encrypt.status].description));
gtk_label_set_line_wrap((GtkLabel *)w, TRUE);
gtk_box_pack_start((GtkBox *)vbox, w, TRUE, TRUE, 6);
if (po->valid->encrypt.description) {
w = gtk_label_new(po->valid->encrypt.description);
gtk_label_set_line_wrap((GtkLabel *)w, TRUE);
gtk_box_pack_start((GtkBox *)vbox, w, TRUE, TRUE, 6);
}
gtk_widget_show_all(vbox);
g_object_unref(xml);
g_signal_connect(po->widget, "response", G_CALLBACK(efhd_xpkcs7mime_info_response), po);
gtk_widget_show(po->widget);
}
static gboolean
efhd_xpkcs7mime_button(EMFormatHTML *efh, GtkHTMLEmbedded *eb, EMFormatHTMLPObject *pobject)
{
GtkWidget *icon, *button;
GdkPixbuf *pixbuf;
struct _smime_pobject *po = (struct _smime_pobject *)pobject;
char *file;
const char *name;
if (po->signature)
name = smime_sign_table[po->valid->sign.status].icon;
else
name = smime_encrypt_table[po->valid->encrypt.status].icon;
file = g_build_filename(EVOLUTION_ICONSDIR, name, NULL);
pixbuf = gdk_pixbuf_new_from_file(file, NULL);
g_free(file);
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_xpkcs7mime_validity_clicked), pobject);
gtk_container_add((GtkContainer *)button, icon);
gtk_widget_show(button);
gtk_container_add((GtkContainer *)eb, button);
return TRUE;
}
static void
efhd_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info)
{
CamelCipherContext *context;
CamelException *ex;
extern CamelSession *session;
CamelMimePart *opart;
CamelCipherValidity *valid;
ex = camel_exception_new();
context = camel_smime_context_new(session);
opart = camel_mime_part_new();
valid = camel_cipher_decrypt(context, part, opart, ex);
if (valid == NULL) {
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);
}
camel_object_unref(opart);
camel_object_unref(context);
camel_exception_free(ex);
}
/* ********************************************************************** */
static void
efhd_signature_check(GtkWidget *w, EMFormatHTMLPObject *pobject)
{
@ -637,7 +827,7 @@ efhd_multipart_signed (EMFormat *emf, CamelStream *stream, CamelMimePart *part,
classid,
_("This message is digitally signed. Click the lock icon for more information."));
em_format_html_add_pobject((EMFormatHTML *)emf, classid, efhd_signature_button, part);
em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_signature_button);
g_free(classid);
}
}
@ -645,6 +835,7 @@ efhd_multipart_signed (EMFormat *emf, CamelStream *stream, CamelMimePart *part,
/* ********************************************************************** */
static EMFormatHandler type_builtin_table[] = {
{ "application/x-pkcs7-mime", (EMFormatFunc)efhd_application_xpkcs7mime },
{ "multipart/signed", (EMFormatFunc)efhd_multipart_signed },
};
@ -1116,7 +1307,7 @@ efhd_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part,
classid = g_strdup_printf("attachment-%p", part);
info = (struct _attach_puri *)em_format_add_puri(emf, sizeof(*info), classid, part, efhd_attachment_frame);
em_format_html_add_pobject((EMFormatHTML *)emf, classid, efhd_attachment_button, part);
em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_attachment_button);
info->handle = handle;
info->shown = em_format_is_inline(emf, info->puri.part) && handle != NULL;
@ -1151,7 +1342,7 @@ efhd_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part,
g_free(classid); /* messy */
classid = g_strdup_printf("bonobo-unknown:///em-formath-html-display/%p/%d", part, partid++);
em_format_html_add_pobject((EMFormatHTML *)emf, classid, efhd_bonobo_object, part);
em_format_html_add_pobject((EMFormatHTML *)emf, sizeof(EMFormatHTMLPObject), classid, part, efhd_bonobo_object);
camel_stream_printf(stream, "<object classid=\"%s\" type=\"%s\">\n", classid, mime_type);
}

View File

@ -314,13 +314,14 @@ em_format_html_file_part(EMFormatHTML *efh, const char *mime_type, const char *p
/* all this api is a pain in the bum ... */
/* should it have a user-data field? */
const char *
em_format_html_add_pobject(EMFormatHTML *efh, const char *classid, EMFormatHTMLPObjectFunc func, CamelMimePart *part)
EMFormatHTMLPObject *
em_format_html_add_pobject(EMFormatHTML *efh, size_t size, const char *classid, CamelMimePart *part, EMFormatHTMLPObjectFunc func)
{
EMFormatHTMLPObject *pobj;
pobj = g_malloc(sizeof(*pobj));
g_assert(size >= sizeof(EMFormatHTMLPObject));
pobj = g_malloc(size);
if (classid) {
pobj->classid = g_strdup(classid);
} else {
@ -335,7 +336,7 @@ em_format_html_add_pobject(EMFormatHTML *efh, const char *classid, EMFormatHTMLP
e_dlist_addtail(&efh->pending_object_list, (EDListNode *)pobj);
return pobj->classid;
return pobj;
}
EMFormatHTMLPObject *
@ -372,6 +373,8 @@ void
em_format_html_remove_pobject(EMFormatHTML *emf, EMFormatHTMLPObject *pobject)
{
e_dlist_remove((EDListNode *)pobject);
if (pobject->free)
pobject->free(pobject);
g_free(pobject->classid);
g_free(pobject);
}
@ -551,6 +554,98 @@ efh_object_requested(GtkHTML *html, GtkHTMLEmbedded *eb, EMFormatHTML *efh)
#include "em-inline-filter.h"
#include <camel/camel-stream-null.h>
static const struct {
const char *icon;
} smime_sign_table[4] = {
{ NULL },
{ "pgp-signature-ok.png" },
{ "pgp-signature-bad.png" },
{ "pgp-signature-nokey.png" },
};
static const struct {
const char *icon;
} smime_encrypt_table[4] = {
{ NULL },
{ "pgp-signature-ok.png" },
{ "pgp-signature-ok.png" },
{ "pgp-signature-ok.png" },
};
static void
efh_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info)
{
CamelCipherContext *context;
CamelException *ex;
extern CamelSession *session;
CamelMimePart *opart;
CamelCipherValidity *valid;
ex = camel_exception_new();
context = camel_smime_context_new(session);
opart = camel_mime_part_new();
valid = camel_cipher_decrypt(context, part, opart, ex);
if (valid == NULL) {
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);
}
camel_object_unref(opart);
camel_object_unref(context);
camel_exception_free(ex);
}
static void
efh_text_plain(EMFormatHTML *efh, CamelStream *stream, CamelMimePart *part, EMFormatHandler *info)
{
@ -921,7 +1016,7 @@ em_format_html_multipart_signed_sign(EMFormat *emf, CamelStream *stream, CamelMi
mps = (CamelMultipartSigned *)camel_medium_get_content_object((CamelMedium *)part);
/* FIXME: This sequence is also copied in em-format-html.c */
/* FIXME: This sequence is also copied in em-format.c */
camel_exception_init(&ex);
if (emf->session == NULL) {
@ -1017,6 +1112,8 @@ efh_image(EMFormatHTML *efh, CamelStream *stream, CamelMimePart *part, EMFormatH
}
static EMFormatHandler type_builtin_table[] = {
{ "application/x-pkcs7-mime", (EMFormatFunc)efh_application_xpkcs7mime },
{ "image/gif", (EMFormatFunc)efh_image },
{ "image/jpeg", (EMFormatFunc)efh_image },
{ "image/png", (EMFormatFunc)efh_image },
@ -1484,6 +1581,9 @@ 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;
efh->enveloped_validity = NULL;
if (!efh->hide_headers)
em_format_html_format_headers(efh, stream, part);
@ -1495,6 +1595,8 @@ static void efh_format_message(EMFormat *emf, CamelStream *stream, CamelMedium *
if (emf->message != part)
camel_stream_printf(stream, "</blockquote>");
efh->enveloped_validity = save;
#undef efh
}
@ -1527,7 +1629,7 @@ efh_format_attachment(EMFormat *emf, CamelStream *stream, CamelMimePart *part, c
/* this could probably be cleaned up ... */
camel_stream_write_string(stream,
"<table cellspacing=0 cellpadding=0><tr><td>"
"<table border=1 cellspacing=0 cellpadding=0><tr><td>"
"<table width=10 cellspacing=0 cellpadding=0>"
"<tr><td></td></tr></table></td>"
"<td><table width=3 cellspacing=0 cellpadding=0>"

View File

@ -79,6 +79,7 @@ typedef gboolean (*EMFormatHTMLPObjectFunc)(EMFormatHTML *md, struct _GtkHTMLEmb
struct _EMFormatHTMLPObject {
struct _EMFormatHTMLPObject *next, *prev;
void (*free)(struct _EMFormatHTMLPObject *);
struct _EMFormatHTML *format;
char *classid;
@ -105,6 +106,8 @@ struct _EMFormatHTML {
EDList pending_object_list;
struct _CamelCipherValidity *enveloped_validity;
GSList *headers;
guint32 text_html_flags; /* default flags for text to html conversion */
@ -139,8 +142,8 @@ void em_format_html_format_headers(EMFormatHTML *efh, struct _CamelStream *strea
struct _CamelMimePart *em_format_html_file_part(EMFormatHTML *efh, const char *mime_type, const char *path, const char *name);
/* for implementers */
const char *em_format_html_add_pobject(EMFormatHTML *efh, const char *classid, EMFormatHTMLPObjectFunc func, struct _CamelMimePart *part);
EMFormatHTMLPObject * em_format_html_find_pobject(EMFormatHTML *emf, const char *classid);
EMFormatHTMLPObject *em_format_html_add_pobject(EMFormatHTML *efh, size_t size, const char *classid, struct _CamelMimePart *part, EMFormatHTMLPObjectFunc func);
EMFormatHTMLPObject *em_format_html_find_pobject(EMFormatHTML *emf, const char *classid);
EMFormatHTMLPObject *em_format_html_find_pobject_func(EMFormatHTML *emf, struct _CamelMimePart *part, EMFormatHTMLPObjectFunc func);
void em_format_html_remove_pobject(EMFormatHTML *emf, EMFormatHTMLPObject *pobject);
void em_format_html_clear_pobject(EMFormatHTML *emf);

View File

@ -1235,65 +1235,6 @@ emf_message_rfc822(EMFormat *emf, CamelStream *stream, CamelMimePart *part, cons
em_format_format_message(emf, stream, (CamelMedium *)dw);
}
static void
emf_application_xpkcs7mime(EMFormat *emf, CamelStream *stream, CamelMimePart *part, const EMFormatHandler *info)
{
CamelCipherContext *context;
CamelException *ex;
extern CamelSession *session;
CamelMimePart *opart;
CamelCipherValidity *valid;
ex = camel_exception_new();
context = camel_smime_context_new(session);
opart = camel_mime_part_new();
valid = camel_cipher_decrypt(context, part, opart, ex);
if (valid == NULL) {
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 {
switch (valid->encrypt.status) {
case CAMEL_CIPHER_VALIDITY_ENCRYPT_NONE:
em_format_format_error(emf, stream, "No encryption?");
break;
case CAMEL_CIPHER_VALIDITY_ENCRYPT_WEAK:
case CAMEL_CIPHER_VALIDITY_ENCRYPT_ENCRYPTED:
case CAMEL_CIPHER_VALIDITY_ENCRYPT_STRONG:
em_format_format_error(emf, stream, valid->encrypt.description);
break;
}
em_format_part(emf, stream, opart);
/* TODO: this is temporary */
switch (valid->sign.status) {
case CAMEL_CIPHER_VALIDITY_SIGN_NONE:
em_format_format_error(emf, stream, "No signature?");
break;
case CAMEL_CIPHER_VALIDITY_SIGN_GOOD:
em_format_format_error(emf, stream, "Good signature");
em_format_format_error(emf, stream, valid->sign.description);
break;
case CAMEL_CIPHER_VALIDITY_SIGN_BAD:
em_format_format_error(emf, stream, "Bad signature");
em_format_format_error(emf, stream, valid->sign.description);
break;
case CAMEL_CIPHER_VALIDITY_SIGN_UNKNOWN:
em_format_format_error(emf, stream, "Unknown signature");
em_format_format_error(emf, stream, valid->sign.description);
break;
}
camel_cipher_validity_free(valid);
}
camel_object_unref(opart);
camel_object_unref(context);
camel_exception_free(ex);
}
static EMFormatHandler type_builtin_table[] = {
{ "multipart/alternative", emf_multipart_alternative },
{ "multipart/appledouble", emf_multipart_appledouble },
@ -1305,9 +1246,6 @@ static EMFormatHandler type_builtin_table[] = {
{ "message/rfc822", emf_message_rfc822 },
{ "message/news", emf_message_rfc822 },
{ "message/*", emf_message_rfc822 },
/* TODO: This should be done via a plugin? */
{ "application/x-pkcs7-mime",(EMFormatFunc)emf_application_xpkcs7mime },
};
static void

View File

@ -50,6 +50,9 @@
#include "e-storage.h"
#if defined (HAVE_NSS)
#include "smime/gui/e-cert-selector.h"
#endif
#define d(x)
@ -1432,9 +1435,26 @@ smime_changed(MailAccountGui *gui)
}
static void
smime_sign_key_select(GtkWidget *w, MailAccountGui *gui)
smime_sign_key_selected(GtkWidget *dialog, const char *key, MailAccountGui *gui)
{
smime_changed(gui);
if (key != NULL) {
gtk_entry_set_text(gui->smime_sign_key, key);
smime_changed(gui);
}
gtk_widget_destroy(dialog);
}
static void
smime_sign_key_select(GtkWidget *button, MailAccountGui *gui)
{
GtkWidget *w;
w = e_cert_selector_new(E_CERT_SELECTOR_SIGNER, gtk_entry_get_text(gui->smime_sign_key));
gtk_window_set_modal((GtkWindow *)w, TRUE);
gtk_window_set_transient_for((GtkWindow *)w, (GtkWindow *)gui->dialog);
g_signal_connect(w, "selected", G_CALLBACK(smime_sign_key_selected), gui);
gtk_widget_show(w);
}
static void
@ -1445,9 +1465,26 @@ smime_sign_key_clear(GtkWidget *w, MailAccountGui *gui)
}
static void
smime_encrypt_key_select(GtkWidget *w, MailAccountGui *gui)
smime_encrypt_key_selected(GtkWidget *dialog, const char *key, MailAccountGui *gui)
{
smime_changed(gui);
if (key != NULL) {
gtk_entry_set_text(gui->smime_encrypt_key, key);
smime_changed(gui);
}
gtk_widget_destroy(dialog);
}
static void
smime_encrypt_key_select(GtkWidget *button, MailAccountGui *gui)
{
GtkWidget *w;
w = e_cert_selector_new(E_CERT_SELECTOR_SIGNER, gtk_entry_get_text(gui->smime_encrypt_key));
gtk_window_set_modal((GtkWindow *)w, TRUE);
gtk_window_set_transient_for((GtkWindow *)w, (GtkWindow *)gui->dialog);
g_signal_connect(w, "selected", G_CALLBACK(smime_encrypt_key_selected), gui);
gtk_widget_show(w);
}
static void