Martin Pool
Fredrik Olofsen
Gustavo Noronha Silva
+ Simon 'corecode' Schubert
bring in Hiro's last 0.7.0 wm class fixes
* tools/sylprint.pl
- bring in Ricardo's fix for sylprint script
+ bring in Ricardo's fix for sylprint script
+
+ * AUTHORS
+ * src/rfc2015.[ch]
+ * src/prefs_common.[ch]
+ * src/prefs_account.[ch]
+ * src/compose.c
+ clean up account preference poison in rfc2015,
+ and preparation to fix double sign bug
+ (patch submitted by Simon 'corecode' Schubert)
2002-01-07 [christoph] 0.6.6claws43
return -1;
}
+
+#ifdef USE_GPGME
+/*
+ * interfaces to rfc2015 to keep out the prefs stuff there.
+ * returns 0 on success and -1 on error. */
+static int compose_create_signers_list (Compose *compose, GSList **pkey_list)
+{
+ const char *keyid = NULL;
+ GSList *key_list;
+
+ switch (compose->account->sign_key) {
+ case SIGN_KEY_DEFAULT:
+ *pkey_list = NULL;
+ return 0; /* nothing to do */
+
+ case SIGN_KEY_BY_FROM:
+ keyid = compose->account->address;
+ break;
+
+ case SIGN_KEY_CUSTOM:
+ keyid = compose->account->sign_key_id;
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ key_list = rfc2015_create_signers_list(keyid);
+
+ if (!key_list) {
+ alertpanel_error("Could not find any key associated with currently "
+ "selected keyid `%s'!", keyid);
+ return -1;
+ }
+
+ *pkey_list = key_list;
+ return 0;
+}
+#endif /* USE_GPGME */
+
static gint compose_write_to_file(Compose *compose, const gchar *file,
gboolean is_draft)
{
#if USE_GPGME
if (compose->use_signing) {
- if (rfc2015_sign(file, compose->account) < 0) {
+ GSList *key_list;
+
+ if (compose_create_signers_list(compose, &key_list) == -1 ||
+ rfc2015_sign(file, key_list) < 0) {
+
unlink(file);
return -1;
}
}
if (compose->use_encryption) {
- if (rfc2015_encrypt(file, compose->to_list) < 0) {
+ if (rfc2015_encrypt(file, compose->to_list, compose->account->ascii_armored) < 0) {
unlink(file);
return -1;
}
#if USE_GPGME
menuitem = gtk_item_factory_get_item(ifactory, "/Message/Sign");
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
- prefs_common.default_sign);
+ account->default_sign);
menuitem = gtk_item_factory_get_item(ifactory, "/Message/Encrypt");
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
- prefs_common.default_encrypt);
+ account->default_encrypt);
#endif /* USE_GPGME */
addressbook_set_target_compose(compose);
#if USE_GPGME
static struct Privacy {
+ GtkWidget *checkbtn_default_encrypt;
+ GtkWidget *checkbtn_ascii_armored;
+ GtkWidget *checkbtn_default_sign;
GtkWidget *defaultkey_radiobtn;
GtkWidget *emailkey_radiobtn;
GtkWidget *customkey_radiobtn;
#if USE_GPGME || USE_SSL
static void prefs_account_enum_set_data_from_radiobtn (PrefParam *pparam);
static void prefs_account_enum_set_radiobtn (PrefParam *pparam);
+static void prefs_account_ascii_armored_warning(GtkWidget* widget,
+ gpointer unused);
#endif /* USE_GPGME || USE_SSL */
static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
#if USE_GPGME
/* Privacy */
+ {"default_encrypt", "FALSE", &tmp_ac_prefs.default_encrypt, P_BOOL,
+ &privacy.checkbtn_default_encrypt,
+ prefs_set_data_from_toggle, prefs_set_toggle},
+ {"ascii_armored", "FALSE", &tmp_ac_prefs.ascii_armored, P_BOOL,
+ &privacy.checkbtn_ascii_armored,
+ prefs_set_data_from_toggle, prefs_set_toggle},
+ {"default_sign", "FALSE", &tmp_ac_prefs.default_sign, P_BOOL,
+ &privacy.checkbtn_default_sign,
+ prefs_set_data_from_toggle, prefs_set_toggle},
{"sign_key", NULL, &tmp_ac_prefs.sign_key, P_ENUM,
&privacy.defaultkey_radiobtn,
prefs_account_enum_set_data_from_radiobtn,
GtkWidget *vbox1;
GtkWidget *frame1;
GtkWidget *vbox2;
+ GtkWidget *frame2;
+ GtkWidget *vbox3;
GtkWidget *hbox1;
GtkWidget *label;
+ GtkWidget *checkbtn_default_encrypt;
+ GtkWidget *checkbtn_ascii_armored;
+ GtkWidget *checkbtn_default_sign;
GtkWidget *defaultkey_radiobtn;
GtkWidget *emailkey_radiobtn;
GtkWidget *customkey_radiobtn;
gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
- PACK_FRAME (vbox1, frame1, _("Sign key"));
+ PACK_FRAME (vbox1, frame1, _("Default Actions"));
- vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+ vbox2 = gtk_vbox_new (FALSE, 0);
gtk_widget_show (vbox2);
gtk_container_add (GTK_CONTAINER (frame1), vbox2);
gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
+ PACK_CHECK_BUTTON (vbox2, checkbtn_default_encrypt,
+ _("Encrypt message by default"));
+
+ PACK_CHECK_BUTTON (vbox2, checkbtn_ascii_armored,
+ _("Plain ASCII armored"));
+ gtk_signal_connect(GTK_OBJECT(checkbtn_ascii_armored), "toggled",
+ prefs_account_ascii_armored_warning, (gpointer)0);
+
+ PACK_CHECK_BUTTON (vbox2, checkbtn_default_sign,
+ _("Sign message by default"));
+
+ PACK_FRAME (vbox1, frame2, _("Sign key"));
+
+ vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
+ gtk_widget_show (vbox3);
+ gtk_container_add (GTK_CONTAINER (frame2), vbox3);
+ gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
+
defaultkey_radiobtn = gtk_radio_button_new_with_label
(NULL, _("Use default GnuPG key"));
gtk_widget_show (defaultkey_radiobtn);
- gtk_box_pack_start (GTK_BOX (vbox2), defaultkey_radiobtn,
+ gtk_box_pack_start (GTK_BOX (vbox3), defaultkey_radiobtn,
FALSE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (defaultkey_radiobtn),
GINT_TO_POINTER (SIGN_KEY_DEFAULT));
(GTK_RADIO_BUTTON (defaultkey_radiobtn),
_("Select key by your email address"));
gtk_widget_show (emailkey_radiobtn);
- gtk_box_pack_start (GTK_BOX (vbox2), emailkey_radiobtn,
+ gtk_box_pack_start (GTK_BOX (vbox3), emailkey_radiobtn,
FALSE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (emailkey_radiobtn),
GINT_TO_POINTER (SIGN_KEY_BY_FROM));
(GTK_RADIO_BUTTON (defaultkey_radiobtn),
_("Specify key manually"));
gtk_widget_show (customkey_radiobtn);
- gtk_box_pack_start (GTK_BOX (vbox2), customkey_radiobtn,
+ gtk_box_pack_start (GTK_BOX (vbox3), customkey_radiobtn,
FALSE, FALSE, 0);
gtk_object_set_user_data (GTK_OBJECT (customkey_radiobtn),
GINT_TO_POINTER (SIGN_KEY_CUSTOM));
hbox1 = gtk_hbox_new (FALSE, 8);
gtk_widget_show (hbox1);
- gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
label = gtk_label_new ("");
gtk_widget_show (label);
SET_TOGGLE_SENSITIVITY (customkey_radiobtn, customkey_entry);
+ privacy.checkbtn_default_encrypt = checkbtn_default_encrypt;
+ privacy.checkbtn_ascii_armored = checkbtn_ascii_armored;
+ privacy.checkbtn_default_sign = checkbtn_default_sign;
privacy.defaultkey_radiobtn = defaultkey_radiobtn;
privacy.emailkey_radiobtn = emailkey_radiobtn;
privacy.customkey_radiobtn = customkey_radiobtn;
privacy.customkey_entry = customkey_entry;
}
+
+static void prefs_account_ascii_armored_warning(GtkWidget* widget,
+ gpointer unused)
+{
+ if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))
+ && gtk_notebook_get_current_page(GTK_NOTEBOOK(dialog.notebook))) {
+ alertpanel_message(_("Warning - Privacy/Plain ASCII armored"),
+ _("Its not recommend to use the old style plain ASCII\n"
+ "armored mode for encypted messages. It doesn't comply\n"
+ "with the RFC 3156 - MIME security with OpenPGP."));
+ }
+}
#endif /* USE_GPGME */
#if USE_SSL
#include "folder.h"
+#ifdef USE_GPGME
+# include "rfc2015.h"
+#endif
+
typedef enum {
A_POP3,
A_APOP,
#if USE_GPGME
/* Privacy */
+ gboolean default_encrypt;
+ gboolean ascii_armored;
+ gboolean default_sign;
SignKeyType sign_key;
gchar *sign_key_id;
#endif /* USE_GPGME */
#if USE_GPGME
static struct Privacy {
- GtkWidget *checkbtn_default_encrypt;
- GtkWidget *checkbtn_ascii_armored;
- GtkWidget *checkbtn_default_sign;
GtkWidget *checkbtn_auto_check_signatures;
GtkWidget *checkbtn_gpg_signature_popup;
GtkWidget *checkbtn_passphrase_grab;
static void prefs_common_default_signkey_set_data_from_optmenu
(PrefParam *pparam);
static void prefs_common_default_signkey_set_optmenu (PrefParam *pparam);
-static void prefs_common_ascii_armored_warning(GtkWidget* widget,
- gpointer unused);
#endif
static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam);
static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam);
#if USE_GPGME
/* Privacy */
- {"default_encrypt", "FALSE", &prefs_common.default_encrypt, P_BOOL,
- &privacy.checkbtn_default_encrypt,
- prefs_set_data_from_toggle, prefs_set_toggle},
- {"ascii_armored", "FALSE", &prefs_common.ascii_armored, P_BOOL,
- &privacy.checkbtn_ascii_armored,
- prefs_set_data_from_toggle, prefs_set_toggle},
- {"default_sign", "FALSE", &prefs_common.default_sign, P_BOOL,
- &privacy.checkbtn_default_sign,
- prefs_set_data_from_toggle, prefs_set_toggle},
{"auto_check_signatures", "TRUE",
&prefs_common.auto_check_signatures, P_BOOL,
&privacy.checkbtn_auto_check_signatures,
GtkWidget *vbox1;
GtkWidget *vbox2;
GtkWidget *hbox1;
- GtkWidget *checkbtn_default_encrypt;
- GtkWidget *checkbtn_ascii_armored;
- GtkWidget *checkbtn_default_sign;
GtkWidget *checkbtn_auto_check_signatures;
GtkWidget *checkbtn_gpg_signature_popup;
GtkWidget *checkbtn_passphrase_grab;
gtk_widget_show (vbox2);
gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
- PACK_CHECK_BUTTON (vbox2, checkbtn_default_encrypt,
- _("Encrypt message by default"));
-
- PACK_CHECK_BUTTON (vbox2, checkbtn_ascii_armored,
- _("Plain ASCII armored"));
- gtk_signal_connect(GTK_OBJECT(checkbtn_ascii_armored), "toggled",
- prefs_common_ascii_armored_warning, (gpointer)0);
-
- PACK_CHECK_BUTTON (vbox2, checkbtn_default_sign,
- _("Sign message by default"));
-
PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
_("Automatically check signatures"));
/* FIXME: disabled because not implemented */
gtk_widget_set_sensitive(optmenu, FALSE);
- privacy.checkbtn_default_encrypt = checkbtn_default_encrypt;
- privacy.checkbtn_ascii_armored = checkbtn_ascii_armored;
- privacy.checkbtn_default_sign = checkbtn_default_sign;
privacy.checkbtn_auto_check_signatures
= checkbtn_auto_check_signatures;
privacy.checkbtn_gpg_signature_popup
prefs_common_charset_set_data_from_optmenu(pparam);
#endif
}
-
-static void prefs_common_ascii_armored_warning(GtkWidget* widget,
- gpointer unused)
-{
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))
- && gtk_notebook_get_current_page(GTK_NOTEBOOK(dialog.notebook))) {
- alertpanel_message(_("Warning - Privacy/Plain ASCII armored"),
- _("Its not recommend to use the old style plain ASCII\n"
- "armored mode for encypted messages. It doesn't comply\n"
- "with the RFC 3156 - MIME security with OpenPGP."));
- }
-}
#endif /* USE_GPGME */
static void prefs_interface_create(void)
GList *mime_open_cmd_history;
+#if USE_GPGME
/* Privacy */
- gboolean default_encrypt;
- gboolean ascii_armored;
- gboolean default_sign;
gboolean auto_check_signatures;
gboolean gpg_signature_popup;
gboolean passphrase_grab;
gchar *default_signkey;
gboolean gpg_warning;
+#endif /* USE_GPGME */
/* Interface */
gboolean sep_folder;
return cipher;
}
+/*
+ * Create and return a list of keys matching a key id
+ */
+
+GSList *rfc2015_create_signers_list (const char *keyid)
+{
+ GSList *key_list = NULL;
+ GpgmeCtx list_ctx = NULL;
+ GSList *p;
+ GpgmeError err;
+ GpgmeKey key;
+
+ err = gpgme_new (&list_ctx);
+ if (err)
+ goto leave;
+ err = gpgme_op_keylist_start (list_ctx, keyid, 1);
+ if (err)
+ goto leave;
+ while ( !(err = gpgme_op_keylist_next (list_ctx, &key)) ) {
+ key_list = g_slist_append (key_list, key);
+ }
+ if (err != GPGME_EOF)
+ goto leave;
+ err = 0;
+ if (key_list == NULL) {
+ debug_print ("no keys found for keyid \"%s\"\n", keyid);
+ }
+
+leave:
+ if (err) {
+ debug_print ("rfc2015_create_signers_list failed: %s\n", gpgme_strerror (err));
+ for (p = key_list; p != NULL; p = p->next)
+ gpgme_key_unref ((GpgmeKey) p->data);
+ g_slist_free (key_list);
+ }
+ if (list_ctx)
+ gpgme_release (list_ctx);
+ return err ? NULL : key_list;
+}
/*
* Encrypt the file by extracting all recipients and finding the
* encryption keys for all of them. The file content is then replaced
* by the encrypted one. */
int
-rfc2015_encrypt (const char *file, GSList *recp_list)
+rfc2015_encrypt (const char *file, GSList *recp_list, gboolean ascii_armored)
{
FILE *fp = NULL;
char buf[BUFFSIZE];
if (!mime_version_seen)
fputs ("MIME-Version: 1\r\n", fp);
- if (prefs_common.ascii_armored) {
+ if (ascii_armored) {
fprintf(fp,
"Content-Type: text/plain; charset=us-ascii\r\n"
"Content-Transfer-Encoding: 7bit\r\n"
}
/* and the final boundary */
- if (!prefs_common.ascii_armored) {
+ if (!ascii_armored) {
fprintf (fp,
"\r\n"
"--%s--\r\n"
return -1; /* error */
}
-int
-set_signers (GpgmeCtx ctx, PrefsAccount *ac)
-{
- GSList *key_list = NULL;
- GpgmeCtx list_ctx = NULL;
- const char *keyid = NULL;
- GSList *p;
- GpgmeError err;
- GpgmeKey key;
-
- if (ac == NULL)
- return 0;
-
- switch (ac->sign_key) {
- case SIGN_KEY_DEFAULT:
- return 0; /* nothing to do */
-
- case SIGN_KEY_BY_FROM:
- keyid = ac->address;
- break;
-
- case SIGN_KEY_CUSTOM:
- keyid = ac->sign_key_id;
- break;
-
- default:
- g_assert_not_reached ();
- }
-
- err = gpgme_new (&list_ctx);
- if (err)
- goto leave;
- err = gpgme_op_keylist_start (list_ctx, keyid, 1);
- if (err)
- goto leave;
- while ( !(err = gpgme_op_keylist_next (list_ctx, &key)) ) {
- key_list = g_slist_append (key_list, key);
- }
- if (err != GPGME_EOF)
- goto leave;
- if (key_list == NULL) {
- debug_print ("no keys found for keyid \"%s\"\n", keyid);
- }
- gpgme_signers_clear (ctx);
- for (p = key_list; p != NULL; p = p->next) {
- err = gpgme_signers_add (ctx, (GpgmeKey) p->data);
- if (err)
- goto leave;
- }
-
-leave:
- if (err)
- debug_print ("set_signers failed: %s\n", gpgme_strerror (err));
- for (p = key_list; p != NULL; p = p->next)
- gpgme_key_unref ((GpgmeKey) p->data);
- g_slist_free (key_list);
- if (list_ctx)
- gpgme_release (list_ctx);
- return err;
-}
-
/*
* plain contains an entire mime object. Sign it and return an
* GpgmeData object with the signature of it or NULL in case of error.
*/
static GpgmeData
-pgp_sign (GpgmeData plain, PrefsAccount *ac)
+pgp_sign (GpgmeData plain, GSList *key_list)
{
+ GSList *p;
GpgmeCtx ctx = NULL;
GpgmeError err;
GpgmeData sig = NULL;
}
gpgme_set_textmode (ctx, 1);
gpgme_set_armor (ctx, 1);
- err = set_signers (ctx, ac);
+ gpgme_signers_clear (ctx);
+ for (p = key_list; p != NULL; p = p->next) {
+ err = gpgme_signers_add (ctx, (GpgmeKey) p->data);
+ if (err)
+ goto leave;
+ }
+ for (p = key_list; p != NULL; p = p->next)
+ gpgme_key_unref ((GpgmeKey) p->data);
+ g_slist_free (key_list);
+
if (err)
goto leave;
err = gpgme_op_sign (ctx, plain, sig, GPGME_SIG_MODE_DETACH);
* Sign the file and replace its content with the signed one.
*/
int
-rfc2015_sign (const char *file, PrefsAccount *ac)
+rfc2015_sign (const char *file, GSList *key_list)
{
FILE *fp = NULL;
char buf[BUFFSIZE];
goto failure;
}
- sigdata = pgp_sign (plain, ac);
+ sigdata = pgp_sign (plain, key_list);
if (!sigdata)
goto failure;
#include <stdio.h>
#include "procmime.h"
-#include "prefs_account.h"
void rfc2015_disable_all (void);
void rfc2015_secure_remove (const char *fname);
void rfc2015_check_signature (MimeInfo *mimeinfo, FILE *fp);
int rfc2015_is_encrypted (MimeInfo *mimeinfo);
void rfc2015_decrypt_message (MsgInfo *msginfo, MimeInfo *mimeinfo, FILE *fp);
-int rfc2015_encrypt (const char *file, GSList *recp_list);
-int rfc2015_sign (const char *file, PrefsAccount *ac);
+GSList *rfc2015_create_signers_list (const char *keyid);
+int rfc2015_encrypt (const char *file, GSList *recp_list, gboolean ascii_armored);
+int rfc2015_sign (const char *file, GSList *key_list);
#endif /* __RFC2015_H__ */