2005-07-13 [colin] 1.9.12cvs40
authorColin Leroy <colin@colino.net>
Wed, 13 Jul 2005 02:56:41 +0000 (02:56 +0000)
committerColin Leroy <colin@colino.net>
Wed, 13 Jul 2005 02:56:41 +0000 (02:56 +0000)
* configure.ac
* src/plugins/pgpmime/passphrase.c
* src/plugins/pgpmime/passphrase.h
* src/plugins/pgpmime/pgpmime.c
* src/plugins/pgpmime/plugin.c
* src/plugins/pgpmime/select-keys.c
* src/plugins/pgpmime/select-keys.h
* src/plugins/pgpmime/sgpgme.c
* src/plugins/pgpmime/sgpgme.h
Port pgpmime to gpgme-1.0.

ChangeLog-gtk2.claws
PATCHSETS
configure.ac
src/plugins/pgpmime/passphrase.c
src/plugins/pgpmime/passphrase.h
src/plugins/pgpmime/pgpmime.c
src/plugins/pgpmime/plugin.c
src/plugins/pgpmime/select-keys.c
src/plugins/pgpmime/select-keys.h
src/plugins/pgpmime/sgpgme.c
src/plugins/pgpmime/sgpgme.h

index 1069c12c3a1767cd22c3e9b152586d023a5668b5..cb028c4dce0a8bb6c81e768a95d2ca63a5eb3bd7 100644 (file)
@@ -1,3 +1,16 @@
+2005-07-13 [colin]     1.9.12cvs40
+
+       * configure.ac
+       * src/plugins/pgpmime/passphrase.c
+       * src/plugins/pgpmime/passphrase.h
+       * src/plugins/pgpmime/pgpmime.c
+       * src/plugins/pgpmime/plugin.c
+       * src/plugins/pgpmime/select-keys.c
+       * src/plugins/pgpmime/select-keys.h
+       * src/plugins/pgpmime/sgpgme.c
+       * src/plugins/pgpmime/sgpgme.h
+               Port pgpmime to gpgme-1.0.
+
 2005-07-12 [paul]      1.9.12cvs39
 
        * AUTHORS
index 91bec3684f407c0296371744f7fb376f6bdd74aa..84b945653da4cddecee4861042a087cf3e1e8f53 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.5.12.4 -r 1.5.12.5 src/editjpilot.c;  ) > 1.9.12cvs37.patchset
 ( cvs diff -u -r 1.5.2.5 -r 1.5.2.6 src/statusbar.c;  ) > 1.9.12cvs38.patchset
 ( cvs diff -u -r 1.100.2.21 -r 1.100.2.22 AUTHORS;  cvs diff -u -r 1.43.2.19 -r 1.43.2.20 src/toolbar.c;  cvs diff -u -r 1.19.2.3 -r 1.19.2.4 src/toolbar.h;  ) > 1.9.12cvs39.patchset
+( cvs diff -u -r 1.654.2.674 -r 1.654.2.675 configure.ac;  cvs diff -u -r 1.1.2.8 -r 1.1.2.9 src/plugins/pgpmime/passphrase.c;  cvs diff -u -r 1.1.2.1 -r 1.1.2.2 src/plugins/pgpmime/passphrase.h;  cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/plugins/pgpmime/pgpmime.c;  cvs diff -u -r 1.1.2.9 -r 1.1.2.10 src/plugins/pgpmime/plugin.c;  cvs diff -u -r 1.1.2.6 -r 1.1.2.7 src/plugins/pgpmime/select-keys.c;  cvs diff -u -r 1.1.2.1 -r 1.1.2.2 src/plugins/pgpmime/select-keys.h;  cvs diff -u -r 1.1.2.8 -r 1.1.2.9 src/plugins/pgpmime/sgpgme.c;  cvs diff -u -r 1.1.2.4 -r 1.1.2.5 src/plugins/pgpmime/sgpgme.h;  ) > 1.9.12cvs40.patchset
index add54c77e6d1c9dd15665ae2efe1fe80513086be..bd1879ba900d8a9d7ce95c29a542d56ff0d7a901 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=12
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=39
+EXTRA_VERSION=40
 EXTRA_RELEASE=
 EXTRA_GTK2_VERSION=
 
@@ -553,7 +553,7 @@ AC_ARG_ENABLE(pgpmime-plugin,
        [  --disable-pgpmime-plugin           Do not build PGP/MIME plugin],
        [ac_cv_enable_pgpmime_plugin=$enableval], [ac_cv_enable_pgpmime_plugin=yes])
 if test x"$ac_cv_enable_pgpmime_plugin" = xyes; then
-       AM_PATH_GPGME(0.3.10, AC_DEFINE(USE_GPGME, 1, Define if you use GPGME to support OpenPGP.),
+       AM_PATH_GPGME(0.4.5, AC_DEFINE(USE_GPGME, 1, Define if you use GPGME to support OpenPGP.),
                      [ac_cv_enable_pgpmime_plugin=no])
        if test x"$ac_cv_enable_pgpmime_plugin" = xyes; then
                PLUGINS="pgpmime $PLUGINS"
index c9a5eab067c32e0b0860b334d040ea40ae3ad4c7..a717f1befcd56f9f800e51c9c4704a4b42ed8d8a 100644 (file)
@@ -47,9 +47,9 @@
 
 #include "passphrase.h"
 #include "prefs_common.h"
+#include "prefs_gpg.h"
 #include "manage_window.h"
 #include "utils.h"
-#include "prefs_gpg.h"
 
 static gboolean grab_all = FALSE;
 
@@ -62,10 +62,11 @@ static gint passphrase_deleted(GtkWidget *widget, GdkEventAny *event,
                               gpointer data);
 static gboolean passphrase_key_pressed(GtkWidget *widget, GdkEventKey *event,
                                       gpointer data);
-static gchar* passphrase_mbox (const gchar *desc);
-
+static gchar* passphrase_mbox(const gchar *uid_hint, const gchar *pass_hint,
+                             gint prev_bad);
 
-static GtkWidget *create_description (const gchar *desc);
+static GtkWidget *create_description(const gchar *uid_hint,
+                                    const gchar *pass_hint, gint prev_bad);
 
 void
 gpgmegtk_set_passphrase_grab(gint yes)
@@ -74,7 +75,7 @@ gpgmegtk_set_passphrase_grab(gint yes)
 }
 
 static gchar*
-passphrase_mbox (const gchar *desc)
+passphrase_mbox(const gchar *uid_hint, const gchar *pass_hint, gint prev_bad)
 {
     gchar *the_passphrase = NULL;
     GtkWidget *vbox;
@@ -89,11 +90,11 @@ passphrase_mbox (const gchar *desc)
     gtk_widget_set_size_request(window, 450, -1);
     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
     gtk_window_set_modal(GTK_WINDOW(window), TRUE);
-    gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+    gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
     g_signal_connect(G_OBJECT(window), "delete_event",
-                    G_CALLBACK(passphrase_deleted), NULL);
+                     G_CALLBACK(passphrase_deleted), NULL);
     g_signal_connect(G_OBJECT(window), "key_press_event",
-                    G_CALLBACK(passphrase_key_pressed), NULL);
+                     G_CALLBACK(passphrase_key_pressed), NULL);
     MANAGE_WINDOW_SIGNALS_CONNECT(window);
     manage_window_set_transient(GTK_WINDOW(window));
 
@@ -101,9 +102,9 @@ passphrase_mbox (const gchar *desc)
     gtk_container_add(GTK_CONTAINER(window), vbox);
     gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
 
-    if (desc) {
+    if (uid_hint || pass_hint) {
         GtkWidget *label;
-        label = create_description (desc);
+        label = create_description (uid_hint, pass_hint, prev_bad);
         gtk_box_pack_start (GTK_BOX(vbox), label, FALSE, FALSE, 0);
     }
 
@@ -119,42 +120,50 @@ passphrase_mbox (const gchar *desc)
     gtk_widget_grab_default(ok_button);
 
     g_signal_connect(G_OBJECT(ok_button), "clicked",
-                    G_CALLBACK(passphrase_ok_cb), NULL);
+                     G_CALLBACK(passphrase_ok_cb), NULL);
     g_signal_connect(G_OBJECT(pass_entry), "activate",
-                    G_CALLBACK(passphrase_ok_cb), NULL);
+                     G_CALLBACK(passphrase_ok_cb), NULL);
     g_signal_connect(G_OBJECT(cancel_button), "clicked",
-                    G_CALLBACK(passphrase_cancel_cb), NULL);
+                     G_CALLBACK(passphrase_cancel_cb), NULL);
 
     gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER);
     if (grab_all)   
-        gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+        gtk_window_set_policy (GTK_WINDOW(window), FALSE, FALSE, TRUE);
     
     gtk_widget_show_all(window);
 
     if (grab_all) {
-       int err, cnt = 0;
-try_again:
-       /* make sure that window is viewable */
+        int err = 0, cnt = 0;
+        /* make sure that window is viewable */
         gtk_widget_show_now(window);
        gdk_flush();
        while(gtk_events_pending())
                gtk_main_iteration();
+#ifdef GDK_WINDOWING_X11
+       gdk_x11_display_grab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
+try_again:
         if ((err = gdk_pointer_grab(window->window, TRUE, 0,
                              window->window, NULL, GDK_CURRENT_TIME))) {
            if (err == GDK_GRAB_NOT_VIEWABLE && cnt < 10) {
-               /* HACK! */
-               cnt++;
+               cnt++;
                g_warning("trying to grab mouse again\n");
                goto try_again;
-           } else {
-               g_warning("OOPS: Could not grab mouse (%d)\n", err);
-               gtk_widget_destroy(window);
-               return NULL;
+            } else {
+#ifdef GDK_WINDOWING_X11
+                gdk_x11_display_ungrab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
+                g_warning("OOPS: Could not grab mouse\n");
+                gtk_widget_destroy(window);
+                return NULL;
            }
         }
         if (gdk_keyboard_grab(window->window, FALSE, GDK_CURRENT_TIME)) {
             gdk_display_pointer_ungrab(gdk_display_get_default(),
                                       GDK_CURRENT_TIME);
+#ifdef GDK_WINDOWING_X11
+            gdk_x11_display_ungrab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
             g_warning("OOPS: Could not grab keyboard\n");
             gtk_widget_destroy(window);
             return NULL;
@@ -167,13 +176,17 @@ try_again:
         gdk_display_keyboard_ungrab(gdk_display_get_default(),
                                    GDK_CURRENT_TIME);
         gdk_display_pointer_ungrab(gdk_display_get_default(), GDK_CURRENT_TIME);
+#ifdef GDK_WINDOWING_X11
+        gdk_x11_display_ungrab(gdk_display_get_default());
+#endif /* GDK_WINDOWING_X11 */
         gdk_flush();
     }
 
     manage_window_focus_out(window, NULL, NULL);
 
     if (pass_ack) {
-        const gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(pass_entry));
+        const gchar *entry_text;
+        entry_text = gtk_entry_get_text(GTK_ENTRY(pass_entry));
         if (entry_text) /* Hmmm: Do we really need this? */
             the_passphrase = g_strdup (entry_text);
     }
@@ -226,29 +239,25 @@ linelen (const gchar *s)
 }
 
 static GtkWidget *
-create_description (const gchar *desc)
+create_description(const gchar *uid_hint, const gchar *pass_hint, gint prev_bad)
 {
-    const gchar *cmd = NULL, *uid = NULL, *info = NULL;
+    const gchar *uid = NULL, *info = NULL;
     gchar *buf;
     GtkWidget *label;
 
-    cmd = desc;
-    uid = strchr (cmd, '\n');
-    if (uid) {
-        info = strchr (++uid, '\n');
-        if (info )
-            info++;
-    }
-
-    if (!uid)
+    if (!uid_hint)
         uid = _("[no user id]");
-    if (!info)
+    else
+        uid = uid_hint;
+    if (!pass_hint)
         info = "";
+    else
+        info = pass_hint;
 
     buf = g_strdup_printf (_("%sPlease enter the passphrase for:\n\n"
                            "  %.*s  \n"
                            "(%.*s)\n"),
-                           !strncmp (cmd, "TRY_AGAIN", 9 ) ?
+                           prev_bad ?
                            _("Bad passphrase! Try again...\n\n") : "",
                            linelen (uid), uid, linelen (info), info);
 
@@ -271,28 +280,25 @@ static int free_passphrase(gpointer _unused)
     return FALSE;
 }
 
-const char*
-gpgmegtk_passphrase_cb (void *opaque, const char *desc, void **r_hd)
+gpgme_error_t
+gpgmegtk_passphrase_cb(void *opaque, const char *uid_hint,
+        const char *passphrase_hint, int prev_bad, int fd)
 {
-    struct passphrase_cb_info_s *info = opaque;
-    GpgmeCtx ctx = info ? info->c : NULL;
     const char *pass;
 
-    if (!desc) {
-        /* FIXME: cleanup by looking at *r_hd */
-        return NULL;
+    if (prefs_gpg_get_config()->store_passphrase && last_pass != NULL && !prev_bad) {
+        write(fd, last_pass, strlen(last_pass));
+        write(fd, "\n", 1);
+        return GPG_ERR_NO_ERROR;
     }
-    if (prefs_gpg_get_config()->store_passphrase && last_pass != NULL &&
-        strncmp(desc, "TRY_AGAIN", 9) != 0)
-        return g_strdup(last_pass);
-
     gpgmegtk_set_passphrase_grab (prefs_gpg_get_config()->passphrase_grab);
-    debug_print ("%% requesting passphrase for `%s': ", desc);
-    pass = passphrase_mbox (desc);
+    debug_print ("%% requesting passphrase for `%s': ", uid_hint);
+    pass = passphrase_mbox (uid_hint, passphrase_hint, prev_bad);
     gpgmegtk_free_passphrase();
     if (!pass) {
         debug_print ("%% cancel passphrase entry");
-        gpgme_cancel (ctx);
+        write(fd, "\n", 1);
+        return GPG_ERR_CANCELED;
     }
     else {
         if (prefs_gpg_get_config()->store_passphrase) {
@@ -307,13 +313,14 @@ gpgmegtk_passphrase_cb (void *opaque, const char *desc, void **r_hd)
         }
         debug_print ("%% sending passphrase");
     }
-
-    return pass;
+    write(fd, pass, strlen(pass));
+    write(fd, "\n", 1);
+    return GPG_ERR_NO_ERROR;
 }
 
-void gpgmegtk_free_passphrase(void)
+void gpgmegtk_free_passphrase()
 {
-    (void)free_passphrase(NULL); /* could be inline */
+    (void)free_passphrase(NULL); // could be inline
 }
 
 #endif /* USE_GPGME */
index 5556a50c15e8601dba464b36a9e21ca08d5f0f9e..206a1049a15557e4f08dc9c296b3e0ebc6eb3197 100644 (file)
 #include <gpgme.h>
 
 struct passphrase_cb_info_s {
-    GpgmeCtx c;
+    gpgme_ctx_t c;
     int did_it;
 };
 
 void gpgmegtk_set_passphrase_grab (gint yesno);
-const char* gpgmegtk_passphrase_cb(void *opaque, const char *desc, void **r_hd);
-void gpgmegtk_free_passphrase (void);
+gpgme_error_t gpgmegtk_passphrase_cb(void *opaque, const char *uid_hint,
+const char *passphrase_info, int prev_bad, int fd);
+void gpgmegtk_free_passphrase();
 
 #endif /* GPGMEGTK_PASSPHRASE_H */
index 19d2a37571e4ee777880d866db25d58374070702..5b9ee133ba9c9c7a41c034884a0adea039ada788 100644 (file)
@@ -45,8 +45,8 @@ struct _PrivacyDataPGP
        
        gboolean        done_sigtest;
        gboolean        is_signed;
-       GpgmeSigStat    sigstatus;
-       GpgmeCtx        ctx;
+       gpgme_verify_result_t   sigstatus;
+       gpgme_ctx_t     ctx;
 };
 
 static PrivacySystem pgpmime_system;
@@ -61,7 +61,7 @@ static PrivacyDataPGP *pgpmime_new_privacydata()
        data->data.system = &pgpmime_system;
        data->done_sigtest = FALSE;
        data->is_signed = FALSE;
-       data->sigstatus = GPGME_SIG_STAT_NONE;
+       data->sigstatus = NULL;
        gpgme_new(&data->ctx);
        
        return data;
@@ -160,11 +160,12 @@ static gint pgpmime_check_signature(MimeInfo *mimeinfo)
        FILE *fp;
        gchar *boundary;
        gchar *textstr;
-       GpgmeData sigdata, textdata;
-       
+       gpgme_data_t sigdata = NULL, textdata = NULL;
+       gpgme_error_t err;
        g_return_val_if_fail(mimeinfo != NULL, -1);
        g_return_val_if_fail(mimeinfo->privacy != NULL, -1);
        data = (PrivacyDataPGP *) mimeinfo->privacy;
+       gpgme_new(&data->ctx);
        
        debug_print("Checking PGP/MIME signature\n");
        parent = procmime_mimeinfo_parent(mimeinfo);
@@ -178,13 +179,17 @@ static gint pgpmime_check_signature(MimeInfo *mimeinfo)
 
        textstr = get_canonical_content(fp, boundary);
 
-       gpgme_data_new_from_mem(&textdata, textstr, strlen(textstr), 0);
+       err = gpgme_data_new_from_mem(&textdata, textstr, strlen(textstr), 0);
+       if (err) {
+               debug_print ("gpgme_data_new_from_mem failed: %s\n",
+                   gpgme_strerror (err));
+       }
        signature = (MimeInfo *) mimeinfo->node->next->data;
        sigdata = sgpgme_data_from_mimeinfo(signature);
 
        data->sigstatus =
-               sgpgme_verify_signature (data->ctx, sigdata, textdata);
-       
+               sgpgme_verify_signature (data->ctx, sigdata, textdata, NULL);
+
        gpgme_data_release(sigdata);
        gpgme_data_release(textdata);
        g_free(textstr);
@@ -199,7 +204,7 @@ static SignatureStatus pgpmime_get_sig_status(MimeInfo *mimeinfo)
        
        g_return_val_if_fail(data != NULL, SIGNATURE_INVALID);
 
-       if (data->sigstatus == GPGME_SIG_STAT_NONE && 
+       if (data->sigstatus == NULL && 
            prefs_gpg_get_config()->auto_check_signatures)
                pgpmime_check_signature(mimeinfo);
        
@@ -212,7 +217,7 @@ static gchar *pgpmime_get_sig_info_short(MimeInfo *mimeinfo)
        
        g_return_val_if_fail(data != NULL, g_strdup("Error"));
 
-       if (data->sigstatus == GPGME_SIG_STAT_NONE && 
+       if (data->sigstatus == NULL && 
            prefs_gpg_get_config()->auto_check_signatures)
                pgpmime_check_signature(mimeinfo);
        
@@ -225,7 +230,7 @@ static gchar *pgpmime_get_sig_info_full(MimeInfo *mimeinfo)
        
        g_return_val_if_fail(data != NULL, g_strdup("Error"));
 
-       if (data->sigstatus == GPGME_SIG_STAT_NONE && 
+       if (data->sigstatus == NULL && 
            prefs_gpg_get_config()->auto_check_signatures)
                pgpmime_check_signature(mimeinfo);
        
@@ -265,17 +270,17 @@ static gboolean pgpmime_is_encrypted(MimeInfo *mimeinfo)
 static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
 {
        MimeInfo *encinfo, *decinfo, *parseinfo;
-       GpgmeData cipher, plain;
+       gpgme_data_t cipher = NULL, plain = NULL;
        static gint id = 0;
        FILE *dstfp;
        gint nread;
        gchar *fname;
        gchar buf[BUFFSIZE];
-       GpgmeSigStat sigstat = 0;
+       gpgme_verify_result_t sigstat = NULL;
        PrivacyDataPGP *data = NULL;
-       GpgmeCtx ctx;
-       
-       if (gpgme_new(&ctx) != GPGME_No_Error)
+       gpgme_ctx_t ctx;
+
+       if (gpgme_new(&ctx) != GPG_ERR_NO_ERROR)
                return NULL;
 
        
@@ -288,6 +293,7 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
 
        gpgme_data_release(cipher);
        if (plain == NULL) {
+               debug_print("plain is null!\n");
                gpgme_release(ctx);
                return NULL;
        }
@@ -300,14 +306,17 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
                g_free(fname);
                gpgme_data_release(plain);
                gpgme_release(ctx);
+               debug_print("can't open!\n");
                return NULL;
        }
 
        fprintf(dstfp, "MIME-Version: 1.0\n");
-       gpgme_data_rewind (plain);
-       while (gpgme_data_read(plain, buf, sizeof(buf), &nread) == GPGME_No_Error) {
+
+       while ((nread = gpgme_data_read(plain, buf, sizeof(buf))) > 0) {
+               debug_print("read %d:%s\n", nread, buf);
                fwrite (buf, nread, 1, dstfp);
        }
+       debug_print("nread %d!\n", nread);
        fclose(dstfp);
        
        gpgme_data_release(plain);
@@ -330,7 +339,7 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
 
        decinfo->tmp = TRUE;
 
-       if (sigstat != GPGME_SIG_STAT_NONE) {
+       if (sigstat != NULL && sigstat->signatures != NULL) {
                if (decinfo->privacy != NULL) {
                        data = (PrivacyDataPGP *) decinfo->privacy;
                } else {
@@ -349,76 +358,17 @@ static MimeInfo *pgpmime_decrypt(MimeInfo *mimeinfo)
        return decinfo;
 }
 
-/*
- * Find TAG in XML and return a pointer into xml set just behind the
- * closing angle.  Return NULL if not found. 
- */
-static const char *
-find_xml_tag (const char *xml, const char *tag)
-{
-    int taglen = strlen (tag);
-    const char *s = xml;
-    while ( (s = strchr (s, '<')) ) {
-        s++;
-        if (!strncmp (s, tag, taglen)) {
-            const char *s2 = s + taglen;
-            if (*s2 == '>' || isspace (*(const unsigned char*)s2) ) {
-                /* found */
-                while (*s2 && *s2 != '>') /* skip attributes */
-                    s2++;
-                /* fixme: do need to handle angles inside attribute vallues? */
-                return *s2? (s2+1):NULL;
-            }
-        }
-        while (*s && *s != '>') /* skip to end of tag */
-            s++;
-    }
-    return NULL;
-}
-
-
-/*
- * Extract the micalg from an GnupgOperationInfo XML container.
- */
-static char *
-extract_micalg (char *xml)
-{
-    const char *s;
-
-    s = find_xml_tag (xml, "GnupgOperationInfo");
-    if (s) {
-        const char *s_end = find_xml_tag (s, "/GnupgOperationInfo");
-        s = find_xml_tag (s, "signature");
-        if (s && s_end && s < s_end) {
-            const char *s_end2 = find_xml_tag (s, "/signature");
-            if (s_end2 && s_end2 < s_end) {
-                s = find_xml_tag (s, "micalg");
-                if (s && s < s_end2) {
-                    s_end = strchr (s, '<');
-                    if (s_end) {
-                        char *p = g_malloc (s_end - s + 1);
-                        memcpy (p, s, s_end - s);
-                        p[s_end-s] = 0;
-                        return p;
-                    }
-                }
-            }
-        }
-    }
-    return NULL;
-}
-
 gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account)
 {
        MimeInfo *msgcontent, *sigmultipart, *newinfo;
-       gchar *textstr, *opinfo, *micalg;
+       gchar *textstr, *micalg;
        FILE *fp;
        gchar *boundary, *sigcontent;
-       GpgmeCtx ctx;
-       GpgmeData gpgtext, gpgsig;
+       gpgme_ctx_t ctx;
+       gpgme_data_t gpgtext, gpgsig;
        size_t len;
        struct passphrase_cb_info_s info;
+       gpgme_sign_result_t result = NULL;
 
        memset (&info, 0, sizeof info);
 
@@ -453,6 +403,7 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account)
        gpgme_new(&ctx);
        gpgme_set_textmode(ctx, 1);
        gpgme_set_armor(ctx, 1);
+       gpgme_signers_clear (ctx);
 
        if (!sgpgme_setup_signers(ctx, account)) {
                gpgme_release(ctx);
@@ -464,13 +415,23 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account)
                gpgme_set_passphrase_cb (ctx, gpgmegtk_passphrase_cb, &info);
        }
 
-       if (gpgme_op_sign(ctx, gpgtext, gpgsig, GPGME_SIG_MODE_DETACH) != GPGME_No_Error) {
+       if (gpgme_op_sign(ctx, gpgtext, gpgsig, GPGME_SIG_MODE_DETACH) != GPG_ERR_NO_ERROR) {
                gpgme_release(ctx);
                return FALSE;
        }
-       opinfo = gpgme_get_op_info(ctx, 0);
-       micalg = extract_micalg(opinfo);
-       g_free(opinfo);
+       result = gpgme_op_sign_result(ctx);
+       if (result && result->signatures) {
+           if (gpgme_get_protocol(ctx) == GPGME_PROTOCOL_OpenPGP) {
+               micalg = g_strdup_printf("PGP-%s", gpgme_hash_algo_name(
+                           result->signatures->hash_algo));
+           } else {
+               micalg = g_strdup(gpgme_hash_algo_name(
+                           result->signatures->hash_algo));
+           }
+       } else {
+           /* can't get result (maybe no signing key?) */
+           return FALSE;
+       }
 
        gpgme_release(ctx);
        sigcontent = gpgme_data_release_and_get_mem(gpgsig, &len);
@@ -494,7 +455,6 @@ gboolean pgpmime_sign(MimeInfo *mimeinfo, PrefsAccount *account)
 
        return TRUE;
 }
-
 gchar *pgpmime_get_encrypt_data(GSList *recp_names)
 {
        return sgpgme_get_encrypt_data(recp_names);
@@ -507,20 +467,32 @@ gboolean pgpmime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data)
        gchar *boundary, *enccontent;
        size_t len;
        gchar *textstr;
-       GpgmeData gpgtext, gpgenc;
-       gchar **recipients, **nextrecp;
-       GpgmeRecipients recp;
-       GpgmeCtx ctx;
-
-       /* build GpgmeRecipients from encrypt_data */
-       recipients = g_strsplit(encrypt_data, " ", 0);
-       gpgme_recipients_new(&recp);
-       for (nextrecp = recipients; *nextrecp != NULL; nextrecp++) {
-               gpgme_recipients_add_name_with_validity(recp, *nextrecp,
-                                                       GPGME_VALIDITY_FULL);
+       gpgme_data_t gpgtext = NULL, gpgenc = NULL;
+       gpgme_ctx_t ctx = NULL;
+       gpgme_key_t *kset = NULL;
+       gchar **fprs = g_strsplit(encrypt_data, " ", -1);
+       gint i = 0;
+       while (fprs[i] && strlen(fprs[i])) {
+               i++;
        }
-       g_strfreev(recipients);
-
+       
+       kset = g_malloc(sizeof(gpgme_key_t)*(i+1));
+       memset(kset, 0, sizeof(gpgme_key_t)*(i+1));
+       gpgme_new(&ctx);
+       i = 0;
+       while (fprs[i] && strlen(fprs[i])) {
+               gpgme_key_t key;
+               gpgme_error_t err;
+               err = gpgme_get_key(ctx, fprs[i], &key, 0);
+               if (err) {
+                       debug_print("can't add key '%s'[%d] (%s)\n", fprs[i],i, gpgme_strerror(err));
+                       break;
+               }
+               debug_print("found %s at %d\n", fprs[i], i);
+               kset[i] = key;
+               i++;
+       }
+       
        debug_print("Encrypting message content\n");
 
        /* remove content node from message */
@@ -551,14 +523,13 @@ gboolean pgpmime_encrypt(MimeInfo *mimeinfo, const gchar *encrypt_data)
        /* encrypt data */
        gpgme_data_new_from_mem(&gpgtext, textstr, strlen(textstr), 0);
        gpgme_data_new(&gpgenc);
-       gpgme_new(&ctx);
        gpgme_set_armor(ctx, 1);
-
-       gpgme_op_encrypt(ctx, recp, gpgtext, gpgenc);
+       gpgme_data_seek(gpgtext, 0, SEEK_SET);
+       
+       gpgme_op_encrypt(ctx, kset, GPGME_ENCRYPT_ALWAYS_TRUST, gpgtext, gpgenc);
 
        gpgme_release(ctx);
        enccontent = gpgme_data_release_and_get_mem(gpgenc, &len);
-       gpgme_recipients_release(recp);
        gpgme_data_release(gpgtext);
        g_free(textstr);
 
index c86b7d3cc66621a204775496d5c196f62c3be123..06c4f1231405c3abdf91d3adaa25d3ea88c09876 100644 (file)
@@ -38,7 +38,7 @@ gint plugin_init(gchar **error)
                return -1;
        }
 
-       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(0, 9, 12, 164))) {
+       if ((sylpheed_get_version() < MAKE_NUMERIC_VERSION(1, 9, 12, 40))) {
                *error = g_strdup("Your sylpheed version is too old");
                return -1;
        }
index 2fc629f8153ea0a07a42291236a9e0cfcfdedf6c..1cd365ee202bf6997556404796f32c7cb975e381 100644 (file)
@@ -45,6 +45,7 @@
 #include "gtkutils.h"
 #include "inputdialog.h"
 #include "manage_window.h"
+#include "alertpanel.h"
 
 #define DIM(v) (sizeof(v)/sizeof((v)[0]))
 #define DIMof(type,member)   DIM(((type *)0)->member)
@@ -66,8 +67,9 @@ struct select_keys_s {
     GtkLabel *toplabel;
     GtkCList *clist;
     const char *pattern;
-    GpgmeRecipients rset;
-    GpgmeCtx select_ctx;
+    unsigned int num_keys;
+    gpgme_key_t *kset;
+    gpgme_ctx_t select_ctx;
 
     GtkSortType sort_type;
     enum col_titles sort_column;
@@ -75,7 +77,7 @@ struct select_keys_s {
 };
 
 
-static void set_row (GtkCList *clist, GpgmeKey key);
+static void set_row (GtkCList *clist, gpgme_key_t key);
 static void fill_clist (struct select_keys_s *sk, const char *pattern);
 static void create_dialog (struct select_keys_s *sk);
 static void open_dialog (struct select_keys_s *sk);
@@ -84,7 +86,6 @@ static gint delete_event_cb (GtkWidget *widget,
                              GdkEventAny *event, gpointer data);
 static gboolean key_pressed_cb (GtkWidget *widget,
                                 GdkEventKey *event, gpointer data);
-static void showall_btn_cb (GtkWidget *widget, gpointer data);
 static void select_btn_cb (GtkWidget *widget, gpointer data);
 static void cancel_btn_cb (GtkWidget *widget, gpointer data);
 static void other_btn_cb (GtkWidget *widget, gpointer data);
@@ -92,6 +93,7 @@ static void sort_keys (struct select_keys_s *sk, enum col_titles column);
 static void sort_keys_name (GtkWidget *widget, gpointer data);
 static void sort_keys_email (GtkWidget *widget, gpointer data);
 
+static gboolean use_untrusted (gpgme_key_t);
 
 static void
 update_progress (struct select_keys_s *sk, int running, const char *pattern)
@@ -112,7 +114,7 @@ update_progress (struct select_keys_s *sk, int running, const char *pattern)
 
 
 /**
- * select_keys_get_recipients:
+ * gpgmegtk_recipient_selection:
  * @recp_names: A list of email addresses
  * 
  * Select a list of recipients from a given list of email addresses.
@@ -121,21 +123,13 @@ update_progress (struct select_keys_s *sk, int running, const char *pattern)
  * 
  * Return value: NULL on error or a list of list of recipients.
  **/
-GpgmeRecipients
+gpgme_key_t *
 gpgmegtk_recipient_selection (GSList *recp_names)
 {
     struct select_keys_s sk;
-    GpgmeError err;
 
     memset (&sk, 0, sizeof sk);
 
-    err = gpgme_recipients_new (&sk.rset);
-    if (err) {
-        g_warning ("failed to allocate recipients set: %s",
-                   gpgme_strerror (err));
-        return NULL;
-    }
-
     open_dialog (&sk);
 
     do {
@@ -151,63 +145,72 @@ gpgmegtk_recipient_selection (GSList *recp_names)
     close_dialog (&sk);
 
     if (!sk.okay) {
-        gpgme_recipients_release (sk.rset);
-        sk.rset = NULL;
+        g_free(sk.kset);
+        sk.kset = NULL;
+    } else {
+        sk.kset = g_realloc(sk.kset, sizeof(gpgme_key_t) * (sk.num_keys + 1));
+        sk.kset[sk.num_keys] = NULL;
     }
-    return sk.rset;
+    return sk.kset;
 } 
 
 static void
 destroy_key (gpointer data)
 {
-    GpgmeKey key = data;
+    gpgme_key_t key = data;
     gpgme_key_release (key);
 }
 
 static void
-set_row (GtkCList *clist, GpgmeKey key)
+set_row (GtkCList *clist, gpgme_key_t key)
 {
     const char *s;
     const char *text[N_COL_TITLES];
     char *algo_buf;
     int row;
-    gssize by_read = 0, by_written = 0;
-    gchar *ret_str;
 
     /* first check whether the key is capable of encryption which is not
      * the case for revoked, expired or sign-only keys */
-    if ( !gpgme_key_get_ulong_attr (key, GPGME_ATTR_CAN_ENCRYPT, NULL, 0 ) )
+    if (!key->can_encrypt)
         return;
-    
-    algo_buf = g_strdup_printf ("%lu/%s", 
-         gpgme_key_get_ulong_attr (key, GPGME_ATTR_LEN, NULL, 0 ),
-         gpgme_key_get_string_attr (key, GPGME_ATTR_ALGO, NULL, 0 ) );
+    algo_buf = g_strdup_printf ("%du/%s", 
+         key->subkeys->length,
+         gpgme_pubkey_algo_name(key->subkeys->pubkey_algo) );
     text[COL_ALGO] = algo_buf;
 
-    s = gpgme_key_get_string_attr (key, GPGME_ATTR_KEYID, NULL, 0);
+    s = key->subkeys->keyid;
     if (strlen (s) == 16)
         s += 8; /* show only the short keyID */
     text[COL_KEYID] = s;
 
-    s = gpgme_key_get_string_attr (key, GPGME_ATTR_NAME, NULL, 0);
-    ret_str = g_locale_to_utf8 (s, strlen(s), &by_read, &by_written, NULL);
-    if (ret_str && by_written) {
-        s = ret_str;
-    }
+    s = key->uids->name;
     text[COL_NAME] = s;
 
-    s = gpgme_key_get_string_attr (key, GPGME_ATTR_EMAIL, NULL, 0);
-    ret_str = g_locale_to_utf8 (s, strlen(s), &by_read, &by_written, NULL);
-    if (ret_str && by_written) {
-        s = ret_str;
-    }
+    s = key->uids->email;
     text[COL_EMAIL] = s;
 
-    s = gpgme_key_get_string_attr (key, GPGME_ATTR_VALIDITY, NULL, 0);
-    ret_str = g_locale_to_utf8 (s, strlen(s), &by_read, &by_written, NULL);
-    if (ret_str && by_written) {
-        s = ret_str;
-    }
+    switch (key->uids->validity)
+      {
+      case GPGME_VALIDITY_UNDEFINED:
+        s = "q";
+        break;
+      case GPGME_VALIDITY_NEVER:
+        s = "n";
+        break;
+      case GPGME_VALIDITY_MARGINAL:
+        s = "m";
+        break;
+      case GPGME_VALIDITY_FULL:
+        s = "f";
+        break;
+      case GPGME_VALIDITY_ULTIMATE:
+        s = "u";
+        break;
+      case GPGME_VALIDITY_UNKNOWN:
+      default:
+        s = "?";
+        break;
+      }
     text[COL_VALIDITY] = s;
 
     row = gtk_clist_append (clist, (gchar**)text);
@@ -216,14 +219,13 @@ set_row (GtkCList *clist, GpgmeKey key)
     gtk_clist_set_row_data_full (clist, row, key, destroy_key);
 }
 
-
 static void 
 fill_clist (struct select_keys_s *sk, const char *pattern)
 {
     GtkCList *clist;
-    GpgmeCtx ctx;
-    GpgmeError err;
-    GpgmeKey key;
+    gpgme_ctx_t ctx;
+    gpgme_error_t err;
+    gpgme_key_t key;
     int running=0;
 
     g_return_if_fail (sk);
@@ -247,6 +249,7 @@ fill_clist (struct select_keys_s *sk, const char *pattern)
         debug_print ("** gpgme_op_keylist_start(%s) failed: %s",
                      pattern, gpgme_strerror (err));
         sk->select_ctx = NULL;
+        gpgme_release(ctx);
         return;
     }
     update_progress (sk, ++running, pattern);
@@ -258,9 +261,11 @@ fill_clist (struct select_keys_s *sk, const char *pattern)
             gtk_main_iteration ();
     }
     debug_print ("%% %s:%d:  ready\n", __FILE__ ,__LINE__ );
-    if (err != GPGME_EOF)
+    if (gpgme_err_code(err) != GPG_ERR_EOF) {
         debug_print ("** gpgme_op_keylist_next failed: %s",
                      gpgme_strerror (err));
+        gpgme_op_keylist_end(ctx);
+    }
     sk->select_ctx = NULL;
     gpgme_release (ctx);
     /*gtk_clist_thaw (select_keys.clist);*/
@@ -277,7 +282,6 @@ create_dialog (struct select_keys_s *sk)
     GtkWidget *clist;
     GtkWidget *label;
     GtkWidget *select_btn, *cancel_btn, *other_btn;
-    GtkWidget *showall_btn;
     const char *titles[N_COL_TITLES];
 
     g_assert (!sk->window);
@@ -287,9 +291,9 @@ create_dialog (struct select_keys_s *sk)
     gtk_window_set_title (GTK_WINDOW (window), _("Select Keys"));
     gtk_window_set_modal (GTK_WINDOW (window), TRUE);
     g_signal_connect (G_OBJECT (window), "delete_event",
-                     G_CALLBACK (delete_event_cb), sk);
+                      G_CALLBACK (delete_event_cb), sk);
     g_signal_connect (G_OBJECT (window), "key_press_event",
-                     G_CALLBACK (key_pressed_cb), sk);
+                      G_CALLBACK (key_pressed_cb), sk);
     MANAGE_WINDOW_SIGNALS_CONNECT (window);
 
     vbox = gtk_vbox_new (FALSE, 8);
@@ -326,21 +330,14 @@ create_dialog (struct select_keys_s *sk)
     gtk_clist_set_selection_mode (GTK_CLIST(clist), GTK_SELECTION_BROWSE);
     g_signal_connect (G_OBJECT(GTK_CLIST(clist)->column[COL_NAME].button),
                      "clicked",
-                     G_CALLBACK(sort_keys_name), sk);
+                      G_CALLBACK(sort_keys_name), sk);
     g_signal_connect (G_OBJECT(GTK_CLIST(clist)->column[COL_EMAIL].button),
                      "clicked",
-                     G_CALLBACK(sort_keys_email), sk);
+                      G_CALLBACK(sort_keys_email), sk);
 
     hbox = gtk_hbox_new (FALSE, 8);
     gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
 
-    showall_btn = gtk_button_new_with_label (_(" List all keys "));
-    gtk_widget_show (showall_btn);
-    gtk_box_pack_start (GTK_BOX (hbox), showall_btn, FALSE, FALSE, 0);
-
-    g_signal_connect(G_OBJECT (showall_btn), "clicked",
-                     G_CALLBACK(showall_btn_cb), sk);
-
     gtkut_stock_button_set_create (&bbox, 
                                    &select_btn, _("Select"),
                                    &cancel_btn, GTK_STOCK_CANCEL,
@@ -349,11 +346,11 @@ create_dialog (struct select_keys_s *sk)
     gtk_widget_grab_default (select_btn);
 
     g_signal_connect (G_OBJECT (select_btn), "clicked",
-                     G_CALLBACK (select_btn_cb), sk);
+                      G_CALLBACK (select_btn_cb), sk);
     g_signal_connect (G_OBJECT(cancel_btn), "clicked",
-                     G_CALLBACK (cancel_btn_cb), sk);
+                      G_CALLBACK (cancel_btn_cb), sk);
     g_signal_connect (G_OBJECT (other_btn), "clicked",
-                     G_CALLBACK (other_btn_cb), sk);
+                      G_CALLBACK (other_btn_cb), sk);
 
     vbox2 = gtk_vbox_new (FALSE, 4);
     gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
@@ -400,7 +397,7 @@ delete_event_cb (GtkWidget *widget, GdkEventAny *event, gpointer data)
 }
 
 
-static gboolean 
+static gboolean
 key_pressed_cb (GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
     struct select_keys_s *sk = data;
@@ -410,7 +407,7 @@ key_pressed_cb (GtkWidget *widget, GdkEventKey *event, gpointer data)
         sk->okay = 0;
         gtk_main_quit ();
     }
-       return FALSE;
+    return FALSE;
 }
 
 
@@ -419,7 +416,8 @@ select_btn_cb (GtkWidget *widget, gpointer data)
 {
     struct select_keys_s *sk = data;
     int row;
-    GpgmeKey key;
+    gboolean use_key;
+    gpgme_key_t key;
 
     g_return_if_fail (sk);
     if (!sk->clist->selection) {
@@ -429,18 +427,20 @@ select_btn_cb (GtkWidget *widget, gpointer data)
     row = GPOINTER_TO_INT(sk->clist->selection->data);
     key = gtk_clist_get_row_data(sk->clist, row);
     if (key) {
-        const char *s = gpgme_key_get_string_attr (key,
-                                                   GPGME_ATTR_FPR,
-                                                   NULL, 0 );
-        if ( gpgme_key_get_ulong_attr (key, GPGME_ATTR_VALIDITY, NULL, 0 )
-             < GPGME_VALIDITY_FULL ) {
-            debug_print ("** FIXME: we are faking the trust calculation");
+        if ( key->uids->validity < GPGME_VALIDITY_FULL ) {
+            use_key = use_untrusted(key);
+            if (!use_key) {
+                debug_print ("** Key untrusted, will not encrypt");
+                return;
+            }
         }
-        if (!gpgme_recipients_add_name_with_validity (sk->rset, s,
-                                                      GPGME_VALIDITY_FULL) ) {
+        sk->kset = g_realloc(sk->kset,
+                sizeof(gpgme_key_t) * (sk->num_keys + 1));
+        gpgme_key_ref(key);
+        sk->kset[sk->num_keys] = key;
+        sk->num_keys++;
             sk->okay = 1;
             gtk_main_quit ();
-        }
     }
 }
 
@@ -475,28 +475,35 @@ other_btn_cb (GtkWidget *widget, gpointer data)
     g_free (uid);
 }
 
-static void
-showall_btn_cb (GtkWidget *widget, gpointer data)
-{
-    struct select_keys_s *sk = data;
-    char *uid;
 
-    g_return_if_fail (sk);
-    uid = "";
-       
-    fill_clist (sk, uid);
-    update_progress (sk, 0, sk->pattern);
+static gboolean
+use_untrusted (gpgme_key_t key)
+{
+    AlertValue aval;
+
+    aval = alertpanel
+           (_("Trust key"),
+            _("The selected key is not fully trusted.\n"
+              "If you choose to encrypt the message with this key you don't\n"
+              "know for sure that it will go to the person you mean it to.\n"
+              "Do you trust it enough to use it anyway?"),
+            GTK_STOCK_YES, GTK_STOCK_NO, NULL);
+    if (aval == G_ALERTDEFAULT)
+       return TRUE;
+    else
+       return FALSE;
 }
 
+
 static gint 
-cmp_attr (gconstpointer pa, gconstpointer pb, GpgmeAttr attr)
+cmp_name (GtkCList *clist, gconstpointer pa, gconstpointer pb)
 {
-    GpgmeKey a = ((GtkCListRow *)pa)->data;
-    GpgmeKey b = ((GtkCListRow *)pb)->data;
+    gpgme_key_t a = ((GtkCListRow *)pa)->data;
+    gpgme_key_t b = ((GtkCListRow *)pb)->data;
     const char *sa, *sb;
     
-    sa = a? gpgme_key_get_string_attr (a, attr, NULL, 0 ) : NULL;
-    sb = b? gpgme_key_get_string_attr (b, attr, NULL, 0 ) : NULL;
+    sa = a? a->uids->name : NULL;
+    sb = b? b->uids->name : NULL;
     if (!sa)
         return !!sb;
     if (!sb)
@@ -504,16 +511,20 @@ cmp_attr (gconstpointer pa, gconstpointer pb, GpgmeAttr attr)
     return g_ascii_strcasecmp(sa, sb);
 }
 
-static gint 
-cmp_name (GtkCList *clist, gconstpointer pa, gconstpointer pb)
-{
-    return cmp_attr (pa, pb, GPGME_ATTR_NAME);
-}
-
 static gint 
 cmp_email (GtkCList *clist, gconstpointer pa, gconstpointer pb)
 {
-    return cmp_attr (pa, pb, GPGME_ATTR_EMAIL);
+    gpgme_key_t a = ((GtkCListRow *)pa)->data;
+    gpgme_key_t b = ((GtkCListRow *)pb)->data;
+    const char *sa, *sb;
+    
+    sa = a? a->uids->email : NULL;
+    sb = b? b->uids->email : NULL;
+    if (!sa)
+        return !!sb;
+    if (!sb)
+        return -1;
+    return g_ascii_strcasecmp(sa, sb);
 }
 
 static void
index 009afc109a16988501a0228e931b86d738538bd7..4ca96e7535577242aa830e52b9bd359f3e0a4f0d 100644 (file)
@@ -23,7 +23,7 @@
 #include <gpgme.h>
 
 
-GpgmeRecipients gpgmegtk_recipient_selection (GSList *recp_names);
+gpgme_key_t *gpgmegtk_recipient_selection (GSList *recp_names);
 
 
 #endif /* GPGMEGTK_SELECT_KEYS_H */
index 51db393cd6b0dbd5bb30974b87c097b7e50a3058..095bfdb1036052daa2265db3ec96dd29a8d1a8d4 100644 (file)
@@ -28,6 +28,7 @@
 #include <gpgme.h>
 #include <glib.h>
 #include <glib/gi18n.h>
+#include <stdio.h>
 
 #include "sgpgme.h"
 #include "privacy.h"
 #include "prefs_gpg.h"
 #include "select-keys.h"
 
-static void idle_function_for_gpgme(void)
-{
-       while (gtk_events_pending())
-               gtk_main_iteration();
-}
-
 static void sgpgme_disable_all(void)
 {
     /* FIXME: set a flag, so that we don't bother the user with failed
      * gpgme messages */
 }
 
-GpgmeSigStat sgpgme_verify_signature(GpgmeCtx ctx, GpgmeData sig, 
-                                       GpgmeData plain)
+gpgme_verify_result_t sgpgme_verify_signature(gpgme_ctx_t ctx, gpgme_data_t sig, 
+                                       gpgme_data_t plain, gpgme_data_t dummy)
 {
-       GpgmeSigStat status;
+       gpgme_verify_result_t status = NULL;
+       gpgme_error_t err;
 
-       if (gpgme_op_verify(ctx, sig, plain, &status) != GPGME_No_Error)
-               return GPGME_SIG_STAT_ERROR;
+       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;
+       }
+       status = gpgme_op_verify_result(ctx);
 
        return status;
 }
 
-SignatureStatus sgpgme_sigstat_gpgme_to_privacy(GpgmeCtx ctx, GpgmeSigStat status)
+SignatureStatus sgpgme_sigstat_gpgme_to_privacy(gpgme_ctx_t ctx, gpgme_verify_result_t status)
 {
        unsigned long validity = 0;
+       gpgme_signature_t sig = NULL;
        
-       validity = gpgme_get_sig_ulong_attr(ctx, 0,
-               GPGME_ATTR_VALIDITY, 0);
+       if (status == NULL)
+               return SIGNATURE_UNCHECKED;
+
+       sig = status->signatures;
 
-       switch (status) {
-       case GPGME_SIG_STAT_GOOD:
+       if (sig == NULL)
+               return SIGNATURE_UNCHECKED;
+
+       validity = sig->validity;
+
+       switch (gpg_err_code(sig->status)) {
+       case GPG_ERR_NO_ERROR:
                if ((validity != GPGME_VALIDITY_MARGINAL) &&
                    (validity != GPGME_VALIDITY_FULL) &&
                    (validity != GPGME_VALIDITY_ULTIMATE))
                        return SIGNATURE_WARN;
                return SIGNATURE_OK;
-       case GPGME_SIG_STAT_GOOD_EXP:
-       case GPGME_SIG_STAT_GOOD_EXPKEY:
-       case GPGME_SIG_STAT_DIFF:
+       case GPG_ERR_SIG_EXPIRED:
+       case GPG_ERR_KEY_EXPIRED:
                return SIGNATURE_WARN;
-       case GPGME_SIG_STAT_BAD:
+       case GPG_ERR_BAD_SIGNATURE:
                return SIGNATURE_INVALID;
-       case GPGME_SIG_STAT_NOKEY:
-       case GPGME_SIG_STAT_NOSIG:
-       case GPGME_SIG_STAT_ERROR:
+       case GPG_ERR_NO_PUBKEY:
+               return SIGNATURE_CHECK_FAILED;
+       default:
                return SIGNATURE_CHECK_FAILED;
-       case GPGME_SIG_STAT_NONE:
-               return SIGNATURE_UNCHECKED;
        }
        return SIGNATURE_CHECK_FAILED;
 }
 
 static const gchar *get_validity_str(unsigned long validity)
 {
-       switch (validity) {
+       switch (gpg_err_code(validity)) {
        case GPGME_VALIDITY_UNKNOWN:
                return _("Unknown");
        case GPGME_VALIDITY_UNDEFINED:
@@ -111,81 +115,81 @@ static const gchar *get_validity_str(unsigned long validity)
        }
 }
 
-gchar *sgpgme_sigstat_info_short(GpgmeCtx ctx, GpgmeSigStat status)
+gchar *sgpgme_sigstat_info_short(gpgme_ctx_t ctx, gpgme_verify_result_t status)
 {
-       switch (status) {
-       case GPGME_SIG_STAT_GOOD:
-       {
-               GpgmeKey key;
-               unsigned long validity = 0;
+       gpgme_signature_t sig = NULL;
        
-               if (gpgme_get_sig_key(ctx, 0, &key) != GPGME_No_Error)
-                       return g_strdup(_("Error"));
+       if (status == NULL) {
+               return g_strdup(_("The signature has not been checked"));
+       }
+       sig = status->signatures;
+       if (sig == NULL) {
+               return g_strdup(_("The signature has not been checked"));
+       }
+
+       switch (gpg_err_code(sig->status)) {
+       case GPG_ERR_NO_ERROR:
+       {       gpgme_user_id_t user = NULL;
+               gpgme_key_t key;
+
+               gpgme_get_key(ctx, sig->fpr, &key, 0);
+
+               user = key->uids;
 
-               validity = gpgme_get_sig_ulong_attr(ctx, 0,
-                       GPGME_ATTR_VALIDITY, 0);
-               
                return g_strdup_printf(_("Valid signature by %s (Trust: %s)"),
-                       gpgme_key_get_string_attr(key, GPGME_ATTR_NAME, NULL, 0),
-                       get_validity_str(validity));
+                       user->uid, get_validity_str(sig->validity));
        }
-       case GPGME_SIG_STAT_GOOD_EXP:
+       case GPG_ERR_SIG_EXPIRED:
                return g_strdup(_("The signature has expired"));
-       case GPGME_SIG_STAT_GOOD_EXPKEY:
+       case GPG_ERR_KEY_EXPIRED:
                return g_strdup(_("The key that was used to sign this part has expired"));
-       case GPGME_SIG_STAT_DIFF:
-               return g_strdup(_("Not all signatures are valid"));
-       case GPGME_SIG_STAT_BAD:
+       case GPG_ERR_BAD_SIGNATURE:
                return g_strdup(_("This signature is invalid"));
-       case GPGME_SIG_STAT_NOKEY:
+       case GPG_ERR_NO_PUBKEY:
                return g_strdup(_("You have no key to verify this signature"));
-       case GPGME_SIG_STAT_NOSIG:
-               return g_strdup(_("No signature found"));
-       case GPGME_SIG_STAT_ERROR:
-               return g_strdup(_("An error occured"));
-       case GPGME_SIG_STAT_NONE:
+       default:
                return g_strdup(_("The signature has not been checked"));
        }
        return g_strdup(_("Error"));
 }
 
-gchar *sgpgme_sigstat_info_full(GpgmeCtx ctx, GpgmeSigStat status)
+gchar *sgpgme_sigstat_info_full(gpgme_ctx_t ctx, gpgme_verify_result_t status)
 {
        gint i = 0;
        gchar *ret;
        GString *siginfo;
-       GpgmeKey key;
+       gpgme_signature_t sig = status->signatures;
        
        siginfo = g_string_sized_new(64);
-       while (gpgme_get_sig_key(ctx, i, &key) != GPGME_EOF) {
-               time_t sigtime, expiretime;
-               GpgmeSigStat sigstatus;
-               gchar timestr[64];
+       while (sig) {
+               gpgme_user_id_t user = NULL;
+               gpgme_key_t key;
+
                const gchar *keytype, *keyid, *uid;
                
-               sigtime = gpgme_get_sig_ulong_attr(ctx, i, GPGME_ATTR_CREATED, 0);
-               strftime(timestr, 64, "%c", gmtime(&sigtime));
-               keytype = gpgme_key_get_string_attr(key, GPGME_ATTR_ALGO, NULL, 0);
-               keyid = gpgme_key_get_string_attr(key, GPGME_ATTR_KEYID, NULL, 0);
+               gpgme_get_key(ctx, sig->fpr, &key, 0);
+               user = key->uids;
+
+               keytype = gpgme_pubkey_algo_name(key->subkeys->pubkey_algo);
+               keyid = key->subkeys->keyid;
                g_string_append_printf(siginfo,
-                       _("Signature made %s using %s key ID %s\n"),
-                       timestr, keytype, keyid);
+                       _("Signature made using %s key ID %s\n"),
+                       keytype, keyid);
                
-               sigstatus = gpgme_get_sig_ulong_attr(ctx, i, GPGME_ATTR_SIG_STATUS, 0); 
-               uid = gpgme_key_get_string_attr(key, GPGME_ATTR_USERID, NULL, 0);
-               switch (sigstatus) {
-               case GPGME_SIG_STAT_GOOD:
-               case GPGME_SIG_STAT_GOOD_EXPKEY:
+               uid = user->uid;
+               switch (gpg_err_code(sig->status)) {
+               case GPG_ERR_NO_ERROR:
+               case GPG_ERR_KEY_EXPIRED:
                        g_string_append_printf(siginfo,
                                _("Good signature from \"%s\"\n"),
                                uid);
                        break;
-               case GPGME_SIG_STAT_GOOD_EXP:
+               case GPG_ERR_SIG_EXPIRED:
                        g_string_append_printf(siginfo,
                                _("Expired signature from \"%s\"\n"),
                                uid);
                        break;
-               case GPGME_SIG_STAT_BAD:
+               case GPG_ERR_BAD_SIGNATURE:
                        g_string_append_printf(siginfo,
                                _("BAD signature from \"%s\"\n"),
                                uid);
@@ -193,35 +197,24 @@ gchar *sgpgme_sigstat_info_full(GpgmeCtx ctx, GpgmeSigStat status)
                default:
                        break;
                }
-               if (sigstatus != GPGME_SIG_STAT_BAD) {
+               if (sig->status != GPG_ERR_BAD_SIGNATURE) {
                        gint j = 1;
-                       
-                       while ((uid = gpgme_key_get_string_attr(key, GPGME_ATTR_USERID, NULL, j)) != 0) {
+                       user = user->next;
+                       while (user != NULL) {
                                g_string_append_printf(siginfo,
                                        _("                aka \"%s\"\n"),
-                                       uid);
+                                       user->uid);
                                j++;
+                               user = user->next;
                        }
                        g_string_append_printf(siginfo,
                                _("Primary key fingerprint: %s\n"), 
-                               gpgme_key_get_string_attr(key, GPGME_ATTR_FPR, NULL, 0));
-               }
-
-               
-               expiretime = gpgme_get_sig_ulong_attr(ctx, i, GPGME_ATTR_EXPIRE, 0);
-               if (expiretime > 0) {
-                       const gchar *format;
-
-                       strftime(timestr, 64, "%c", gmtime(&expiretime));
-                       if (time(NULL) < expiretime)
-                               format = _("Signature expires %s\n");
-                       else
-                               format = _("Signature expired %s\n");
-                       g_string_append_printf(siginfo, format, timestr);
+                               sig->fpr);
                }
                
                g_string_append(siginfo, "\n");
                i++;
+               sig = sig->next;
        }
 
        ret = siginfo->str;
@@ -229,28 +222,46 @@ gchar *sgpgme_sigstat_info_full(GpgmeCtx ctx, GpgmeSigStat status)
        return ret;
 }
 
-GpgmeData sgpgme_data_from_mimeinfo(MimeInfo *mimeinfo)
+gpgme_data_t sgpgme_data_from_mimeinfo(MimeInfo *mimeinfo)
 {
-       GpgmeData data;
-       
-       gpgme_data_new_from_filepart(&data,
-               mimeinfo->data.filename,
-               NULL,
-               mimeinfo->offset,
-               mimeinfo->length);
+       gpgme_data_t data = NULL;
+       gpgme_error_t err;
+       FILE *fp = fopen(mimeinfo->data.filename, "rb");
+       gchar *tmp_file = NULL;
+
+       if (!fp) 
+               return NULL;
+
+       tmp_file = get_tmp_file();
+       copy_file_part(fp, mimeinfo->offset, mimeinfo->length, tmp_file);
+       fclose(fp);
+       fp = 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_free(tmp_file);
+
+       debug_print("data %p (%d %d)\n", data, mimeinfo->offset, mimeinfo->length);
+       if (err) {
+               debug_print ("gpgme_data_new_from_file failed: %s\n",
+                   gpgme_strerror (err));
+               return NULL;
+       }
        return data;
 }
 
-GpgmeData sgpgme_decrypt_verify(GpgmeData cipher, GpgmeSigStat *status, GpgmeCtx ctx)
+gpgme_data_t sgpgme_decrypt_verify(gpgme_data_t cipher, gpgme_verify_result_t *status, gpgme_ctx_t ctx)
 {
        struct passphrase_cb_info_s info;
-       GpgmeData plain;
-       GpgmeError err;
+       gpgme_data_t plain;
+       gpgme_error_t err;
 
        memset (&info, 0, sizeof info);
        
-       if (gpgme_data_new(&plain) != GPGME_No_Error) {
+       if (gpgme_data_new(&plain) != GPG_ERR_NO_ERROR) {
                gpgme_release(ctx);
                return NULL;
        }
@@ -260,51 +271,45 @@ GpgmeData sgpgme_decrypt_verify(GpgmeData cipher, GpgmeSigStat *status, GpgmeCtx
                gpgme_set_passphrase_cb (ctx, gpgmegtk_passphrase_cb, &info);
        }
 
-       err = gpgme_op_decrypt_verify(ctx, cipher, plain, status);
-
-       if (err != GPGME_No_Error) {
+       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); /* why doesn't gpgme_data_seek() work here?! */
+/*     err = gpgme_data_seek(plain, 0, SEEK_SET);*/
+       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)
 {
-
-       GpgmeRecipients recp;
-       GString *encdata;
-       void *iter;
-       const gchar *recipient;
-       gchar *data;
-
-       recp = gpgmegtk_recipient_selection(recp_names);
-       if (recp == NULL)
-               return NULL;
-
-       if (gpgme_recipients_enum_open(recp, &iter) != GPGME_No_Error) {
-               gpgme_recipients_release(recp);
-               return NULL;
-       }
-
-       encdata = g_string_sized_new(64);
-       while ((recipient = gpgme_recipients_enum_read(recp, &iter)) != NULL) {
-               if (encdata->len > 0)
-                       g_string_append_c(encdata, ' ');
-               g_string_append(encdata, recipient);
+       gpgme_key_t *keys = gpgmegtk_recipient_selection(recp_names);
+       gchar *ret = NULL;
+       int i = 0;
+       while (keys[i]) {
+               gpgme_subkey_t skey = keys[i]->subkeys;
+               gchar *fpr = skey->fpr;
+               gchar *tmp = NULL;
+               debug_print("adding %s\n", fpr);
+               tmp = g_strconcat(ret?ret:"", fpr, " ", NULL);
+               g_free(ret);
+               ret = tmp;
+               i++;
        }
-
-       gpgme_recipients_release(recp);
-
-       data = encdata->str;
-       g_string_free(encdata, FALSE);
-
-       return data;
+       return ret;
 }
 
-gboolean sgpgme_setup_signers(GpgmeCtx ctx, PrefsAccount *account)
+gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account)
 {
        GPGAccountConfig *config;
 
@@ -314,7 +319,7 @@ gboolean sgpgme_setup_signers(GpgmeCtx ctx, PrefsAccount *account)
 
        if (config->sign_key != SIGN_KEY_DEFAULT) {
                gchar *keyid;
-               GpgmeKey key;
+               gpgme_key_t key;
 
                if (config->sign_key == SIGN_KEY_BY_FROM)
                        keyid = account->address;
@@ -325,8 +330,6 @@ gboolean sgpgme_setup_signers(GpgmeCtx ctx, PrefsAccount *account)
 
                gpgme_op_keylist_start(ctx, keyid, 1);
                while (!gpgme_op_keylist_next(ctx, &key)) {
-                       debug_print("adding key: %s\n", 
-                               gpgme_key_get_string_attr(key, GPGME_ATTR_KEYID, NULL, 0));
                        gpgme_signers_add(ctx, key);
                        gpgme_key_release(key);
                }
@@ -340,11 +343,20 @@ gboolean sgpgme_setup_signers(GpgmeCtx ctx, PrefsAccount *account)
 
 void sgpgme_init()
 {
-       if (gpgme_engine_check_version(GPGME_PROTOCOL_OpenPGP) != 
-                       GPGME_No_Error) {  /* Also does some gpgme init */
+       gpgme_engine_info_t engineInfo;
+       if (gpgme_check_version("0.4.5")) {
+               gpgme_set_locale(NULL, LC_CTYPE, setlocale(LC_CTYPE, NULL));
+               gpgme_set_locale(NULL, LC_MESSAGES, setlocale(LC_MESSAGES, NULL));
+               if (!gpgme_get_engine_info(&engineInfo)) {
+                       while (engineInfo) {
+                               debug_print("GpgME Protocol: %s\n      Version: %s\n",
+                                       gpgme_get_protocol_name(engineInfo->protocol),
+                                       engineInfo->version);
+                               engineInfo = engineInfo->next;
+                       }
+               }
+       } else {
                sgpgme_disable_all();
-               debug_print("gpgme_engine_version:\n%s\n",
-                           gpgme_get_engine_info());
 
                if (prefs_gpg_get_config()->gpg_warning) {
                        AlertValue val;
@@ -359,14 +371,11 @@ void sgpgme_init()
                                prefs_gpg_get_config()->gpg_warning = FALSE;
                }
        }
-
-       gpgme_register_idle(idle_function_for_gpgme);
 }
 
 void sgpgme_done()
 {
         gpgmegtk_free_passphrase();
-       gpgme_register_idle(NULL);
 }
 
 #endif /* USE_GPGME */
index 736ecc73c2f4c151f5c1255a4d8b9c413204f65f..f2fd77955ff593cd9555e613038a6609d4f360ed 100644 (file)
 void sgpgme_init(void);
 void sgpgme_done(void);
 
-GpgmeSigStat sgpgme_verify_signature   (GpgmeCtx ctx,
-                                        GpgmeData sig,
-                                        GpgmeData plain);
+gpgme_verify_result_t sgpgme_verify_signature  (gpgme_ctx_t ctx,
+                                        gpgme_data_t sig,
+                                        gpgme_data_t plain,
+                                        gpgme_data_t dummy);
 SignatureStatus sgpgme_sigstat_gpgme_to_privacy
-                                       (GpgmeCtx ctx,
-                                        GpgmeSigStat status);
-gchar *sgpgme_sigstat_info_short       (GpgmeCtx ctx,
-                                        GpgmeSigStat status);
-gchar *sgpgme_sigstat_info_full                (GpgmeCtx ctx,
-                                        GpgmeSigStat status);
-GpgmeData sgpgme_data_from_mimeinfo    (MimeInfo *mimeinfo);
-GpgmeData sgpgme_decrypt_verify                (GpgmeData cipher, GpgmeSigStat *status,
-                                        GpgmeCtx ctx);
+                                       (gpgme_ctx_t ctx,
+                                        gpgme_verify_result_t status);
+gchar *sgpgme_sigstat_info_short       (gpgme_ctx_t ctx,
+                                        gpgme_verify_result_t status);
+gchar *sgpgme_sigstat_info_full                (gpgme_ctx_t ctx,
+                                        gpgme_verify_result_t status);
+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);
-gboolean sgpgme_setup_signers(GpgmeCtx ctx, PrefsAccount *account);
+gboolean sgpgme_setup_signers(gpgme_ctx_t ctx, PrefsAccount *account);
 
 #endif /* SGPGME_H */