2005-09-27 [colin] 1.9.14cvs58
[claws.git] / src / plugins / pgpcore / sgpgme.c
index c4adca337c2f6038f3911b51cc23b59028dd37f7..e9f5a208ad84f09de04a8096e3dc52c891cf288e 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
  
 #ifdef HAVE_CONFIG_H
@@ -29,6 +29,7 @@
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <stdio.h>
+#include <errno.h>
 
 #include "sgpgme.h"
 #include "privacy.h"
@@ -53,7 +54,8 @@ gpgme_verify_result_t sgpgme_verify_signature(gpgme_ctx_t ctx, gpgme_data_t sig,
 
        if ((err = gpgme_op_verify(ctx, sig, plain, dummy)) != GPG_ERR_NO_ERROR) {
                debug_print("op_verify err %s\n", gpgme_strerror(err));
-               return NULL;
+               return GINT_TO_POINTER(-GPG_ERR_SYSTEM_ERROR);
+               
        }
        status = gpgme_op_verify_result(ctx);
 
@@ -65,16 +67,24 @@ SignatureStatus sgpgme_sigstat_gpgme_to_privacy(gpgme_ctx_t ctx, gpgme_verify_re
        unsigned long validity = 0;
        gpgme_signature_t sig = NULL;
        
-       if (status == NULL)
-               return SIGNATURE_UNCHECKED;
+       if (GPOINTER_TO_INT(status) == -GPG_ERR_SYSTEM_ERROR) {
+               debug_print("system error\n");
+               return SIGNATURE_CHECK_FAILED;
+       }
 
+       if (status == NULL) {
+               debug_print("status == NULL\n");
+               return SIGNATURE_UNCHECKED;
+       }
        sig = status->signatures;
 
-       if (sig == NULL)
+       if (sig == NULL) {
+               debug_print("sig == NULL\n");
                return SIGNATURE_UNCHECKED;
-
+       }
        validity = sig->validity;
 
+       debug_print("err code %d\n", gpg_err_code(sig->status));
        switch (gpg_err_code(sig->status)) {
        case GPG_ERR_NO_ERROR:
                if ((validity != GPGME_VALIDITY_MARGINAL) &&
@@ -118,10 +128,13 @@ static const gchar *get_validity_str(unsigned long validity)
 gchar *sgpgme_sigstat_info_short(gpgme_ctx_t ctx, gpgme_verify_result_t status)
 {
        gpgme_signature_t sig = NULL;
-       gpgme_user_id_t user = NULL;
        gchar *uname = NULL;
        gpgme_key_t key;
 
+       if (GPOINTER_TO_INT(status) == -GPG_ERR_SYSTEM_ERROR) {
+               return g_strdup(_("The signature can't be checked - GPG error."));
+       }
+
        if (status == NULL) {
                return g_strdup(_("The signature has not been checked."));
        }
@@ -228,7 +241,7 @@ gpgme_data_t sgpgme_data_from_mimeinfo(MimeInfo *mimeinfo)
 {
        gpgme_data_t data = NULL;
        gpgme_error_t err;
-       FILE *fp = fopen(mimeinfo->data.filename, "rb");
+       FILE *fp = g_fopen(mimeinfo->data.filename, "rb");
        gchar *tmp_file = NULL;
 
        if (!fp) 
@@ -237,19 +250,19 @@ gpgme_data_t sgpgme_data_from_mimeinfo(MimeInfo *mimeinfo)
        tmp_file = get_tmp_file();
        copy_file_part(fp, mimeinfo->offset, mimeinfo->length, tmp_file);
        fclose(fp);
-       fp = fopen(tmp_file, "rb");
+       fp = g_fopen(tmp_file, "rb");
        debug_print("tmp file %s\n", tmp_file);
        if (!fp) 
                return NULL;
        
        err = gpgme_data_new_from_file(&data, tmp_file, 1);
-       unlink(tmp_file);
+       g_unlink(tmp_file);
        g_free(tmp_file);
 
-       debug_print("data %p (%d %d)\n", data, mimeinfo->offset, mimeinfo->length);
+       debug_print("data %p (%d %d)\n", (void *)&data, mimeinfo->offset, mimeinfo->length);
        if (err) {
                debug_print ("gpgme_data_new_from_file failed: %s\n",
-                   gpgme_strerror (err));
+                            gpgme_strerror (err));
                return NULL;
        }
        return data;
@@ -294,13 +307,17 @@ gpgme_data_t sgpgme_decrypt_verify(gpgme_data_t cipher, gpgme_verify_result_t *s
 
 gchar *sgpgme_get_encrypt_data(GSList *recp_names)
 {
-       gpgme_key_t *keys = gpgmegtk_recipient_selection(recp_names);
+       SelectionResult result = KEY_SELECTION_CANCEL;
+       gpgme_key_t *keys = gpgmegtk_recipient_selection(recp_names, &result);
        gchar *ret = NULL;
        int i = 0;
 
-       if (!keys)
-               return NULL;
-
+       if (!keys) {
+               if (result == KEY_SELECTION_DONT)
+                       return g_strdup("_DONT_ENCRYPT_");
+               else
+                       return NULL;
+       }
        while (keys[i]) {
                gpgme_subkey_t skey = keys[i]->subkeys;
                gchar *fpr = skey->fpr;
@@ -366,12 +383,13 @@ void sgpgme_init()
                if (prefs_gpg_get_config()->gpg_warning) {
                        AlertValue val;
 
-                       val = alertpanel_message_with_disable
+                       val = alertpanel_full
                                (_("Warning"),
                                 _("GnuPG is not installed properly, or needs "
-                                  "to be upgraded.\n"
-                                  "OpenPGP support disabled."), 
-                               NULL, NULL, NULL, ALERT_WARNING);
+                                "to be upgraded.\n"
+                                "OpenPGP support disabled."),
+                                GTK_STOCK_CLOSE, NULL, NULL, TRUE, NULL,
+                                ALERT_WARNING, G_ALERTDEFAULT);
                        if (val & G_ALERTDISABLE)
                                prefs_gpg_get_config()->gpg_warning = FALSE;
                }