2006-04-05 [colin] 2.1.0cvs1
authorColin Leroy <colin@colino.net>
Wed, 5 Apr 2006 16:36:10 +0000 (16:36 +0000)
committerColin Leroy <colin@colino.net>
Wed, 5 Apr 2006 16:36:10 +0000 (16:36 +0000)
* src/plugins/pgpcore/plugin.c
* src/plugins/pgpcore/select-keys.c
* src/plugins/pgpcore/select-keys.h
* src/plugins/pgpcore/sgpgme.c
* src/plugins/pgpcore/sgpgme.h
* src/plugins/pgpinline/pgpinline.c
* src/plugins/pgpinline/plugin.c
* src/plugins/pgpmime/pgpmime.c
* src/plugins/pgpmime/plugin.c
Factorize and generalize a bit
Drop S/MIME signature verification from PGP/MIME
(adding it as another, more complete plugin)

12 files changed:
ChangeLog
PATCHSETS
configure.ac
src/plugins/pgpcore/plugin.c
src/plugins/pgpcore/select-keys.c
src/plugins/pgpcore/select-keys.h
src/plugins/pgpcore/sgpgme.c
src/plugins/pgpcore/sgpgme.h
src/plugins/pgpinline/pgpinline.c
src/plugins/pgpinline/plugin.c
src/plugins/pgpmime/pgpmime.c
src/plugins/pgpmime/plugin.c

index 5017b95..518c9d8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2006-04-05 [colin]     2.1.0cvs1
+
+       * src/plugins/pgpcore/plugin.c
+       * src/plugins/pgpcore/select-keys.c
+       * src/plugins/pgpcore/select-keys.h
+       * src/plugins/pgpcore/sgpgme.c
+       * src/plugins/pgpcore/sgpgme.h
+       * src/plugins/pgpinline/pgpinline.c
+       * src/plugins/pgpinline/plugin.c
+       * src/plugins/pgpmime/pgpmime.c
+       * src/plugins/pgpmime/plugin.c
+               Factorize and generalize a bit 
+               Drop S/MIME signature verification from PGP/MIME
+               (adding it as another, more complete plugin)
+
 2006-04-05 [paul]      2.1.0
 
        2.1.0 released
index 266b5a9..8bb93a3 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.60.2.26 -r 1.60.2.27 po/es.po;  ) > 2.0.0cvs184.patchset
 ( cvs diff -u -r 1.21.2.4 -r 1.21.2.5 po/bg.po;  cvs diff -u -r 1.9.2.3 -r 1.9.2.4 po/cs.po;  cvs diff -u -r 1.58.2.19 -r 1.58.2.20 po/de.po;  cvs diff -u -r 1.9.2.4 -r 1.9.2.5 po/el.po;  cvs diff -u -r 1.12.2.9 -r 1.12.2.10 po/en_GB.po;  cvs diff -u -r 1.1.2.8 -r 1.1.2.9 po/fi.po;  cvs diff -u -r 1.42.2.21 -r 1.42.2.22 po/fr.po;  cvs diff -u -r 1.34.2.17 -r 1.34.2.18 po/it.po;  cvs diff -u -r 1.28.2.4 -r 1.28.2.5 po/nl.po;  cvs diff -u -r 1.10.2.9 -r 1.10.2.10 po/pl.po;  cvs diff -u -r 1.50.2.15 -r 1.50.2.16 po/pt_BR.po;  cvs diff -u -r 1.17.2.18 -r 1.17.2.19 po/sr.po;  cvs diff -u -r 1.5.2.13 -r 1.5.2.14 po/zh_CN.po;  cvs diff -u -r 1.1.2.16 -r 1.1.2.17 src/gtk/authors.h;  cvs diff -u -r 1.1.2.8 -r 1.1.2.9 tools/claws.i18n.status.pl;  ) > 2.0.0cvs185.patchset
 ( cvs diff -u -r 1.1.2.11 -r 1.1.2.12 manual/advanced.xml;  ) > 2.0.0cvs186.patchset
+( cvs diff -u -r 1.1.2.7 -r 1.1.2.8 src/plugins/pgpcore/plugin.c;  cvs diff -u -r 1.1.2.9 -r 1.1.2.10 src/plugins/pgpcore/select-keys.c;  cvs diff -u -r 1.1.2.5 -r 1.1.2.6 src/plugins/pgpcore/select-keys.h;  cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/plugins/pgpcore/sgpgme.c;  cvs diff -u -r 1.1.2.3 -r 1.1.2.4 src/plugins/pgpcore/sgpgme.h;  cvs diff -u -r 1.1.2.10 -r 1.1.2.11 src/plugins/pgpinline/pgpinline.c;  cvs diff -u -r 1.1.2.8 -r 1.1.2.9 src/plugins/pgpinline/plugin.c;  cvs diff -u -r 1.1.2.31 -r 1.1.2.32 src/plugins/pgpmime/pgpmime.c;  cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/plugins/pgpmime/plugin.c;  ) > 2.1.0cvs1.patchset
index 3bba7e9..a938698 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=1
 MICRO_VERSION=0
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=0
+EXTRA_VERSION=1
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
index d319333..70720e1 100644 (file)
@@ -37,7 +37,7 @@ gint plugin_init(gchar **error)
                return -1;
        }
 
-       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(1, 9, 12, 40))) {
+       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(2, 1, 0, 1))) {
                *error = g_strdup("Your version of Sylpheed-Claws is too old for the PGP/Core plugin");
                return -1;
        }
index b92a404..850e910 100644 (file)
@@ -70,7 +70,7 @@ struct select_keys_s {
     unsigned int num_keys;
     gpgme_key_t *kset;
     gpgme_ctx_t select_ctx;
-
+    gpgme_protocol_t proto;
     GtkSortType sort_type;
     enum col_titles sort_column;
     SelectionResult result;
@@ -78,7 +78,8 @@ struct select_keys_s {
 
 
 static void set_row (GtkCList *clist, gpgme_key_t key);
-static void fill_clist (struct select_keys_s *sk, const char *pattern);
+static void fill_clist (struct select_keys_s *sk, const char *pattern,
+                       gpgme_protocol_t proto);
 static void create_dialog (struct select_keys_s *sk);
 static void open_dialog (struct select_keys_s *sk);
 static void close_dialog (struct select_keys_s *sk);
@@ -125,7 +126,8 @@ update_progress (struct select_keys_s *sk, int running, const char *pattern)
  * Return value: NULL on error or a list of list of recipients.
  **/
 gpgme_key_t *
-gpgmegtk_recipient_selection (GSList *recp_names, SelectionResult *result)
+gpgmegtk_recipient_selection (GSList *recp_names, SelectionResult *result,
+                               gpgme_protocol_t proto)
 {
     struct select_keys_s sk;
 
@@ -135,8 +137,9 @@ gpgmegtk_recipient_selection (GSList *recp_names, SelectionResult *result)
 
     do {
         sk.pattern = recp_names? recp_names->data:NULL;
+       sk.proto = proto;
         gtk_clist_clear (sk.clist);
-        fill_clist (&sk, sk.pattern);
+        fill_clist (&sk, sk.pattern, proto);
         update_progress (&sk, 0, sk.pattern);
         gtk_main ();
         if (recp_names)
@@ -189,6 +192,8 @@ set_row (GtkCList *clist, gpgme_key_t key)
     text[COL_KEYID] = s;
 
     s = key->uids->name;
+    if (!s || !strlen(s))
+        s = key->uids->uid;
     ret_str = g_locale_to_utf8 (s, strlen(s), &by_read, &by_written, NULL);
     if (ret_str && by_written) {
         s = ret_str;
@@ -233,7 +238,7 @@ set_row (GtkCList *clist, gpgme_key_t key)
 }
 
 static void 
-fill_clist (struct select_keys_s *sk, const char *pattern)
+fill_clist (struct select_keys_s *sk, const char *pattern, gpgme_protocol_t proto)
 {
     GtkCList *clist;
     gpgme_ctx_t ctx;
@@ -245,12 +250,13 @@ fill_clist (struct select_keys_s *sk, const char *pattern)
     clist = sk->clist;
     g_return_if_fail (clist);
 
-    debug_print ("select_keys:fill_clist:  pattern '%s'\n", pattern);
+    debug_print ("select_keys:fill_clist:  pattern '%s' proto %d\n", pattern, proto);
 
     /*gtk_clist_freeze (select_keys.clist);*/
     err = gpgme_new (&ctx);
     g_assert (!err);
 
+    gpgme_set_protocol(ctx, proto);
     sk->select_ctx = ctx;
 
     update_progress (sk, ++running, pattern);
@@ -504,7 +510,7 @@ other_btn_cb (GtkWidget *widget, gpointer data)
                          NULL );
     if (!uid)
         return;
-    fill_clist (sk, uid);
+    fill_clist (sk, uid, sk->proto);
     update_progress (sk, 0, sk->pattern);
     g_free (uid);
 }
index 732b243..fe7ebeb 100644 (file)
@@ -28,7 +28,9 @@ typedef enum {
        KEY_SELECTION_DONT
 } SelectionResult;
        
-gpgme_key_t *gpgmegtk_recipient_selection (GSList *recp_names, SelectionResult *result);
+gpgme_key_t *gpgmegtk_recipient_selection (GSList *recp_names, 
+               SelectionResult *result,
+               gpgme_protocol_t proto);
 
 
 #endif /* GPGMEGTK_SELECT_KEYS_H */
index 392ac73..88682de 100644 (file)
@@ -159,6 +159,8 @@ gchar *sgpgme_sigstat_info_short(gpgme_ctx_t ctx, gpgme_verify_result_t status)
        gchar *uname = NULL;
        gpgme_key_t key;
        gchar *result = NULL;
+       gpgme_error_t err = 0;
+       static gboolean warned = FALSE;
 
        if (GPOINTER_TO_INT(status) == -GPG_ERR_SYSTEM_ERROR) {
                return g_strdup(_("The signature can't be checked - GPG error."));
@@ -172,7 +174,14 @@ gchar *sgpgme_sigstat_info_short(gpgme_ctx_t ctx, gpgme_verify_result_t status)
                return g_strdup(_("The signature has not been checked."));
        }
 
-       gpgme_get_key(ctx, sig->fpr, &key, 0);
+       err = gpgme_get_key(ctx, sig->fpr, &key, 0);
+       if (gpg_err_code(err) == GPG_ERR_NO_AGENT) {
+               if (!warned)
+                       alertpanel_error(_("PGP Core: Can't get key - no gpg-agent running."));
+               else
+                       g_warning(_("PGP Core: Can't get key - no gpg-agent running."));
+               warned = TRUE;
+       }
        if (key)
                uname = extract_name(key->uids->uid);
        else
@@ -353,34 +362,58 @@ gpgme_data_t sgpgme_decrypt_verify(gpgme_data_t cipher, gpgme_verify_result_t *s
                return NULL;
        }
        
-       if (!getenv("GPG_AGENT_INFO")) {
+       if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_OpenPGP) {
+               if (!getenv("GPG_AGENT_INFO")) {
+                       info.c = ctx;
+                       gpgme_set_passphrase_cb (ctx, gpgmegtk_passphrase_cb, &info);
+               }
+       } else {
                info.c = ctx;
-               gpgme_set_passphrase_cb (ctx, gpgmegtk_passphrase_cb, &info);
-       }
-
-       err = gpgme_op_decrypt_verify(ctx, cipher, plain);
-       if (err != GPG_ERR_NO_ERROR) {
-               debug_print("can't decrypt (%s)\n", gpgme_strerror(err));
-               gpgmegtk_free_passphrase();
-               gpgme_data_release(plain);
-               return NULL;
+               gpgme_set_passphrase_cb (ctx, NULL, &info);
        }
+       
+       
+       if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_OpenPGP) {
+               err = gpgme_op_decrypt_verify(ctx, cipher, plain);
+               if (err != GPG_ERR_NO_ERROR) {
+                       debug_print("can't decrypt (%s)\n", gpgme_strerror(err));
+                       gpgmegtk_free_passphrase();
+                       gpgme_data_release(plain);
+                       return NULL;
+               }
 
-       err = gpgme_data_rewind(plain);
-       if (err) {
-               debug_print("can't seek (%d %d %s)\n", err, errno, strerror(errno));
-       }
+               err = gpgme_data_rewind(plain);
+               if (err) {
+                       debug_print("can't seek (%d %d %s)\n", err, errno, strerror(errno));
+               }
 
-       debug_print("decrypted.\n");
-       *status = gpgme_op_verify_result (ctx);
+               debug_print("decrypted.\n");
+               *status = gpgme_op_verify_result (ctx);
+       } else {
+               err = gpgme_op_decrypt(ctx, cipher, plain);
+               if (err != GPG_ERR_NO_ERROR) {
+                       debug_print("can't decrypt (%s)\n", gpgme_strerror(err));
+                       gpgmegtk_free_passphrase();
+                       gpgme_data_release(plain);
+                       return NULL;
+               }
+
+               err = gpgme_data_rewind(plain);
+               if (err) {
+                       debug_print("can't seek (%d %d %s)\n", err, errno, strerror(errno));
+               }
 
+               debug_print("decrypted.\n");
+               *status = gpgme_op_verify_result (ctx);
+       }
        return plain;
 }
 
-gchar *sgpgme_get_encrypt_data(GSList *recp_names)
+gchar *sgpgme_get_encrypt_data(GSList *recp_names, gpgme_protocol_t proto)
 {
        SelectionResult result = KEY_SELECTION_CANCEL;
-       gpgme_key_t *keys = gpgmegtk_recipient_selection(recp_names, &result);
+       gpgme_key_t *keys = gpgmegtk_recipient_selection(recp_names, &result,
+                               proto);
        gchar *ret = NULL;
        int i = 0;
 
@@ -414,6 +447,7 @@ gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account)
        if (config->sign_key != SIGN_KEY_DEFAULT) {
                gchar *keyid;
                gpgme_key_t key;
+               gpgme_error_t err;
 
                if (config->sign_key == SIGN_KEY_BY_FROM)
                        keyid = account->address;
@@ -422,12 +456,27 @@ gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account)
                else
                        return FALSE;
 
-               gpgme_op_keylist_start(ctx, keyid, 1);
-               while (!gpgme_op_keylist_next(ctx, &key)) {
+               err = gpgme_op_keylist_start(ctx, keyid, 1);
+               if (err) {
+                       g_warning("setup_signers start: %s",
+                               gpg_strerror(err));
+                       return FALSE;
+               }
+               while (!(err = gpgme_op_keylist_next(ctx, &key))) {
                        gpgme_signers_add(ctx, key);
                        gpgme_key_release(key);
                }
-               gpgme_op_keylist_end(ctx);
+               if (err && gpg_err_code(err) != GPG_ERR_EOF) {
+                       g_warning("setup_signers next: %s",
+                               gpg_strerror(err));
+                       return FALSE;
+               }
+               err = gpgme_op_keylist_end(ctx);
+               if (err) {
+                       g_warning("setup_signers end: %s",
+                               gpg_strerror(err));
+                       return FALSE;
+               }
        }
 
        prefs_gpg_account_free_config(config);
index dcb272c..7936775 100644 (file)
@@ -42,7 +42,8 @@ gpgme_data_t sgpgme_data_from_mimeinfo        (MimeInfo *mimeinfo);
 gpgme_data_t sgpgme_decrypt_verify     (gpgme_data_t cipher, 
                                         gpgme_verify_result_t *status,
                                         gpgme_ctx_t ctx);
-gchar *sgpgme_get_encrypt_data         (GSList *recp_names);
+gchar *sgpgme_get_encrypt_data         (GSList *recp_names,
+                                        gpgme_protocol_t proto);
 gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account);
 
 #endif /* SGPGME_H */
index d81521d..c67219b 100644 (file)
@@ -545,7 +545,7 @@ static gboolean pgpinline_sign(MimeInfo *mimeinfo, PrefsAccount *account)
 
 static gchar *pgpinline_get_encrypt_data(GSList *recp_names)
 {
-       return sgpgme_get_encrypt_data(recp_names);
+       return sgpgme_get_encrypt_data(recp_names, GPGME_PROTOCOL_OpenPGP);
 }
 
 static gboolean pgpinline_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data)
index a41ba9e..f59eb28 100644 (file)
@@ -37,7 +37,7 @@ gint plugin_init(gchar **error)
                return -1;
        }
 
-       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(1, 9, 12, 49))) {
+       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(2, 1, 0, 1))) {
                *error = g_strdup("Your version of Sylpheed-Claws is too old for the PGP/inline plugin");
                return -1;
        }
index 1010335..d5bb140 100644 (file)
@@ -49,7 +49,6 @@ struct _PrivacyDataPGP
        gboolean        is_signed;
        gpgme_verify_result_t   sigstatus;
        gpgme_ctx_t     ctx;
-       gboolean        is_pkcs7;
 };
 
 static PrivacySystem pgpmime_system;
@@ -100,9 +99,7 @@ static gboolean pgpmime_is_signed(MimeInfo *mimeinfo)
                return FALSE;
        protocol = procmime_mimeinfo_get_parameter(parent, "protocol");
        if ((protocol == NULL) || 
-           (g_ascii_strcasecmp(protocol, "application/pgp-signature") &&
-            g_ascii_strcasecmp(protocol, "application/pkcs7-signature") &&
-            g_ascii_strcasecmp(protocol, "application/x-pkcs7-signature")))
+           (g_ascii_strcasecmp(protocol, "application/pgp-signature")))
                return FALSE;
 
        /* check if mimeinfo is the first child */
@@ -115,9 +112,7 @@ static gboolean pgpmime_is_signed(MimeInfo *mimeinfo)
        if (signature == NULL)
                return FALSE;
        if ((signature->type != MIMETYPE_APPLICATION) ||
-           (g_ascii_strcasecmp(signature->subtype, "pgp-signature") &&
-            g_ascii_strcasecmp(signature->subtype, "pkcs7-signature") &&
-            g_ascii_strcasecmp(signature->subtype, "x-pkcs7-signature")))
+           (g_ascii_strcasecmp(signature->subtype, "pgp-signature")))
                return FALSE;
 
        if (data == NULL) {
@@ -125,12 +120,6 @@ static gboolean pgpmime_is_signed(MimeInfo *mimeinfo)
                mimeinfo->privacy = (PrivacyData *) data;
        }
        
-       if (!g_ascii_strcasecmp(signature->subtype, "pkcs7-signature") ||
-           !g_ascii_strcasecmp(signature->subtype, "x-pkcs7-signature"))
-               data->is_pkcs7 = TRUE;
-       else
-               data->is_pkcs7 = FALSE;
-
        data->done_sigtest = TRUE;
        data->is_signed = TRUE;
 
@@ -182,12 +171,9 @@ static gint pgpmime_check_signature(MimeInfo *mimeinfo)
        data = (PrivacyDataPGP *) mimeinfo->privacy;
        gpgme_new(&data->ctx);
        
-       debug_print("Checking %s/MIME signature\n", data->is_pkcs7?"S":"PGP");
+       debug_print("Checking PGP/MIME signature\n");
 
-       if (data->is_pkcs7) {
-               err = gpgme_set_protocol(data->ctx, GPGME_PROTOCOL_CMS);
-       } else
-               err = gpgme_set_protocol(data->ctx, GPGME_PROTOCOL_OpenPGP);
+       err = gpgme_set_protocol(data->ctx, GPGME_PROTOCOL_OpenPGP);
 
        if (err) {
                debug_print ("gpgme_set_protocol failed: %s\n",
@@ -525,7 +511,7 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account)
 }
 gchar *pgpmime_get_encrypt_data(GSList *recp_names)
 {
-       return sgpgme_get_encrypt_data(recp_names);
+       return sgpgme_get_encrypt_data(recp_names, GPGME_PROTOCOL_OpenPGP);
 }
 
 gboolean pgpmime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data)
index b494a17..0d5885b 100644 (file)
@@ -36,7 +36,7 @@ gint plugin_init(gchar **error)
                return -1;
        }
 
-       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(1, 9, 12, 40))) {
+       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(2, 1, 0, 1))) {
                *error = g_strdup("Your version of Sylpheed-Claws is too old for the PGP/MIME plugin");
                return -1;
        }