Remove obsolete gpa patches
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 9 Mar 2015 10:22:43 +0000 (11:22 +0100)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 9 Mar 2015 10:22:43 +0000 (11:22 +0100)
* patches/gpa-0.9.4: Removed patches.
* Makefile.am (EXTRA_DIST): Remove patches.

--

Those patches were already not applied in the last release
which included gpa 0.9.6 and should have been removed then.

Makefile.am
patches/gpa-0.9.4/01-bin-encrypt.patch [deleted file]
patches/gpa-0.9.4/02-cms-detection.patch [deleted file]
patches/gpa-0.9.4/02-x509-import.patch [deleted file]
patches/gpa-0.9.4/03-homedir-via-gpgconf.patch [deleted file]
patches/gpa-0.9.4/04-utf-clip-crash.patch [deleted file]
patches/gpa-0.9.4/05-event-done.patch [deleted file]

index 6b05d6a..3949703 100644 (file)
@@ -50,12 +50,6 @@ EXTRA_DIST = autogen.sh README.GIT ONEWS \
         patches/gnutls-2.12.23/05-cve-2014-3466.patch \
         patches/gnutls-2.12.23/fix-gcrypt-private-api-usage.patch \
         patches/gnutls-2.12.23/gnulib-mingw-w64-fix.patch \
-        patches/gpa-0.9.4/01-bin-encrypt.patch \
-        patches/gpa-0.9.4/02-cms-detection.patch \
-        patches/gpa-0.9.4/02-x509-import.patch \
-        patches/gpa-0.9.4/03-homedir-via-gpgconf.patch \
-        patches/gpa-0.9.4/04-utf-clip-crash.patch \
-        patches/gpa-0.9.4/05-event-done.patch \
         patches/gtkhtml2_viewer-0.34/80-src-makefile.postcfg-build \
         patches/libtasn1-2.14/gnulib-mingw-w64-fix.patch \
         patches/pthreads-w32-2-8-0-release/01-make.patch \
diff --git a/patches/gpa-0.9.4/01-bin-encrypt.patch b/patches/gpa-0.9.4/01-bin-encrypt.patch
deleted file mode 100755 (executable)
index 4eb9a4d..0000000
+++ /dev/null
@@ -1,509 +0,0 @@
-#! /bin/sh
-patch -p1 -l -f $* < $0
-exit $?
-
-From 5574ece82ed5950dca11d729744f52ac159444d5 Mon Sep 17 00:00:00 2001
-From: Werner Koch <wk@gnupg.org>
-Date: Wed, 31 Jul 2013 17:35:39 +0200
-Subject: [PATCH] Implement the binary option for server based encrypt and
- sign.
-
-* src/server.c (conn_ctrl_s): Add field OUTPUT_BINARY.
-(prepare_io_streams): Set data encoding to binary if requested.
-(output_notify): New.
-(connection_startup): Register new callback.
-* src/gpastreamencryptop.c (start_encryption): Use a provided encoding.
-* src/gpastreamsignop.c (start_signing): Ditto.
---
-
-Note that these changes have not yet been tested.
----
- src/gpastreamencryptop.c |   62 +++++++++++++++++++++++---------------------
- src/gpastreamsignop.c    |   64 ++++++++++++++++++++++++---------------------
- src/server.c             |   23 ++++++++++++++++
- 3 files changed, 90 insertions(+), 59 deletions(-)
-
-diff --git a/src/gpastreamencryptop.c b/src/gpastreamencryptop.c
-index 146707f..70a5e24 100644
---- a/src/gpastreamencryptop.c
-+++ b/src/gpastreamencryptop.c
-@@ -28,11 +28,11 @@
- #include "selectkeydlg.h"
-
-
--struct _GpaStreamEncryptOperation
-+struct _GpaStreamEncryptOperation
- {
-   GpaStreamOperation parent;
--
--  SelectKeyDlg *key_dialog;
-+
-+  SelectKeyDlg *key_dialog;
-   RecipientDlg *recp_dialog;
-   GSList *recipients;
-   gpgme_key_t *keys;
-@@ -40,7 +40,7 @@ struct _GpaStreamEncryptOperation
- };
-
-
--struct _GpaStreamEncryptOperationClass
-+struct _GpaStreamEncryptOperationClass
- {
-   GpaStreamOperationClass parent_class;
- };
-@@ -48,7 +48,7 @@ struct _GpaStreamEncryptOperationClass
-
-
- /* Indentifiers for our properties. */
--enum
-+enum
-   {
-     PROP_0,
-     PROP_RECIPIENTS,
-@@ -95,7 +95,7 @@ static GSList *
- copy_recipients (GSList *recipients)
- {
-   GSList *recp, *newlist;
--
-+
-   newlist= NULL;
-   for (recp = recipients; recp; recp = g_slist_next (recp))
-     newlist = g_slist_append (newlist, g_strdup (recp->data));
-@@ -110,7 +110,7 @@ gpa_stream_encrypt_operation_get_property (GObject *object, guint prop_id,
-                                            GValue *value, GParamSpec *pspec)
- {
-   GpaStreamEncryptOperation *op = GPA_STREAM_ENCRYPT_OPERATION (object);
--
-+
-   switch (prop_id)
-     {
-     case PROP_RECIPIENTS:
-@@ -156,7 +156,7 @@ gpa_stream_encrypt_operation_set_property (GObject *object, guint prop_id,
-
- static void
- gpa_stream_encrypt_operation_finalize (GObject *object)
--{
-+{
-   GpaStreamEncryptOperation *op = GPA_STREAM_ENCRYPT_OPERATION (object);
-
-   release_recipients (op->recipients);
-@@ -180,7 +180,7 @@ gpa_stream_encrypt_operation_init (GpaStreamEncryptOperation *op)
-
-
- static GObject*
--gpa_stream_encrypt_operation_constructor
-+gpa_stream_encrypt_operation_constructor
-       (GType type,
-          guint n_construct_properties,
-          GObjectConstructParam *construct_properties)
-@@ -224,7 +224,7 @@ gpa_stream_encrypt_operation_constructor
-   g_signal_connect (G_OBJECT (GPA_OPERATION (op)->context), "done",
-                   G_CALLBACK (done_cb), op);
-
--  gtk_window_set_title
-+  gtk_window_set_title
-     (GTK_WINDOW (GPA_STREAM_OPERATION (op)->progress_dialog),
-                       _("Encrypting message ..."));
-
-@@ -241,7 +241,7 @@ static void
- gpa_stream_encrypt_operation_class_init (GpaStreamEncryptOperationClass *klass)
- {
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
--
-+
-   parent_class = g_type_class_peek_parent (klass);
-
-   object_class->constructor = gpa_stream_encrypt_operation_constructor;
-@@ -249,21 +249,21 @@ gpa_stream_encrypt_operation_class_init (GpaStreamEncryptOperationClass *klass)
-   object_class->set_property = gpa_stream_encrypt_operation_set_property;
-   object_class->get_property = gpa_stream_encrypt_operation_get_property;
-
--  g_object_class_install_property
-+  g_object_class_install_property
-     (object_class, PROP_RECIPIENTS,
--     g_param_spec_pointer
-+     g_param_spec_pointer
-      ("recipients", "Recipients",
-       "A list of recipients in rfc-822 mailbox format.",
-       G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY));
--  g_object_class_install_property
-+  g_object_class_install_property
-     (object_class, PROP_RECIPIENT_KEYS,
--     g_param_spec_pointer
-+     g_param_spec_pointer
-      ("recipient-keys", "Recipient-keys",
-       "An array of gpgme_key_t with the selected keys.",
-       G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY));
--  g_object_class_install_property
-+  g_object_class_install_property
-     (object_class, PROP_PROTOCOL,
--     g_param_spec_int
-+     g_param_spec_int
-      ("protocol", "Protocol",
-       "The gpgme protocol currently selected.",
-       GPGME_PROTOCOL_OpenPGP, GPGME_PROTOCOL_UNKNOWN, GPGME_PROTOCOL_UNKNOWN,
-@@ -276,7 +276,7 @@ GType
- gpa_stream_encrypt_operation_get_type (void)
- {
-   static GType stream_encrypt_operation_type = 0;
--
-+
-   if (!stream_encrypt_operation_type)
-     {
-       static const GTypeInfo stream_encrypt_operation_info =
-@@ -291,12 +291,12 @@ gpa_stream_encrypt_operation_get_type (void)
-         0,    /* n_preallocs */
-         (GInstanceInitFunc) gpa_stream_encrypt_operation_init,
-       };
--
--      stream_encrypt_operation_type = g_type_register_static
-+
-+      stream_encrypt_operation_type = g_type_register_static
-       (GPA_STREAM_OPERATION_TYPE, "GpaStreamEncryptOperation",
-        &stream_encrypt_operation_info, 0);
-     }
--
-+
-   return stream_encrypt_operation_type;
- }
-
-@@ -343,10 +343,14 @@ start_encryption (GpaStreamEncryptOperation *op)
-     goto leave;
-
-   /* Set the output encoding.  */
--  if (GPA_STREAM_OPERATION (op)->input_stream
-+  if (GPA_STREAM_OPERATION (op)->input_stream
-       && GPA_STREAM_OPERATION (op)->output_stream)
-     {
--      if (op->selected_protocol == GPGME_PROTOCOL_CMS)
-+      if (gpgme_data_get_encoding (GPA_STREAM_OPERATION(op)->output_stream))
-+        gpgme_data_set_encoding
-+          (GPA_STREAM_OPERATION (op)->output_stream,
-+           gpgme_data_get_encoding (GPA_STREAM_OPERATION(op)->output_stream));
-+      else if (op->selected_protocol == GPGME_PROTOCOL_CMS)
-         gpgme_data_set_encoding (GPA_STREAM_OPERATION (op)->output_stream,
-                                  GPGME_DATA_ENCODING_BASE64);
-       else
-@@ -358,8 +362,8 @@ start_encryption (GpaStreamEncryptOperation *op)
-           err = gpg_error (GPG_ERR_CONFLICT);
-           goto leave;
-         }
--
--      gpgme_set_protocol (GPA_OPERATION (op)->context->ctx,
-+
-+      gpgme_set_protocol (GPA_OPERATION (op)->context->ctx,
-                           op->selected_protocol);
-
-       /* We always trust the keys because the recipient selection
-@@ -376,7 +380,7 @@ start_encryption (GpaStreamEncryptOperation *op)
-
-       /* Show and update the progress dialog.  */
-       gtk_widget_show_all (GPA_STREAM_OPERATION (op)->progress_dialog);
--      gpa_progress_dialog_set_label
-+      gpa_progress_dialog_set_label
-         (GPA_PROGRESS_DIALOG (GPA_STREAM_OPERATION (op)->progress_dialog),
-          _("Message encryption"));
-     }
-@@ -394,13 +398,13 @@ start_encryption (GpaStreamEncryptOperation *op)
-
-
- /* The recipient key selection dialog has returned.  */
--static void
-+static void
- response_cb (GtkDialog *dialog, int response, void *user_data)
- {
-   GpaStreamEncryptOperation *op = user_data;
-
-   gtk_widget_hide (GTK_WIDGET (dialog));
--
-+
-   if (response != GTK_RESPONSE_OK)
-     {
-       /* The dialog was canceled, so we do nothing and complete the
-@@ -514,7 +518,7 @@ gpa_stream_encrypt_operation_get_keys (GpaStreamEncryptOperation *op,
-                                        gpgme_protocol_t *r_protocol)
- {
-   g_return_val_if_fail (op, NULL);
--
-+
-   if (r_protocol)
-     *r_protocol = op->selected_protocol;
-   return gpa_gpgme_copy_keyarray (op->keys);
-diff --git a/src/gpastreamsignop.c b/src/gpastreamsignop.c
-index 0b955eb..a19b0a3 100644
---- a/src/gpastreamsignop.c
-+++ b/src/gpastreamsignop.c
-@@ -28,19 +28,19 @@
-
-
-
--struct _GpaStreamSignOperation
-+struct _GpaStreamSignOperation
- {
-   GpaStreamOperation parent;
-
-   GtkWidget *sign_dialog;
--
-+
-   const char *sender;
-   gpgme_protocol_t requested_protocol;
-   gboolean detached;
- };
-
-
--struct _GpaStreamSignOperationClass
-+struct _GpaStreamSignOperationClass
- {
-   GpaStreamOperationClass parent_class;
- };
-@@ -48,7 +48,7 @@ struct _GpaStreamSignOperationClass
-
-
- /* Indentifiers for our properties. */
--enum
-+enum
-   {
-     PROP_0,
-     PROP_SENDER,
-@@ -76,7 +76,7 @@ gpa_stream_sign_operation_get_property (GObject *object, guint prop_id,
-                                            GValue *value, GParamSpec *pspec)
- {
-   GpaStreamSignOperation *op = GPA_STREAM_SIGN_OPERATION (object);
--
-+
-   switch (prop_id)
-     {
-     case PROP_SENDER:
-@@ -122,7 +122,7 @@ gpa_stream_sign_operation_set_property (GObject *object, guint prop_id,
-
- static void
- gpa_stream_sign_operation_finalize (GObject *object)
--{
-+{
- /*   GpaStreamSignOperation *op = GPA_STREAM_SIGN_OPERATION (object); */
-
-   G_OBJECT_CLASS (parent_class)->finalize (object);
-@@ -171,7 +171,7 @@ gpa_stream_sign_operation_ctor (GType type, guint n_construct_properties,
-   g_signal_connect (G_OBJECT (GPA_OPERATION (op)->context), "done",
-                   G_CALLBACK (done_cb), op);
-
--  gtk_window_set_title
-+  gtk_window_set_title
-     (GTK_WINDOW (GPA_STREAM_OPERATION (op)->progress_dialog),
-                       _("Signing message ..."));
-
-@@ -186,7 +186,7 @@ static void
- gpa_stream_sign_operation_class_init (GpaStreamSignOperationClass *klass)
- {
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
--
-+
-   parent_class = g_type_class_peek_parent (klass);
-
-   object_class->constructor = gpa_stream_sign_operation_ctor;
-@@ -194,22 +194,22 @@ gpa_stream_sign_operation_class_init (GpaStreamSignOperationClass *klass)
-   object_class->set_property = gpa_stream_sign_operation_set_property;
-   object_class->get_property = gpa_stream_sign_operation_get_property;
-
--  g_object_class_install_property
-+  g_object_class_install_property
-     (object_class, PROP_SENDER,
--     g_param_spec_pointer
-+     g_param_spec_pointer
-      ("sender", "Sender",
-       "The sender of the message in rfc-822 mailbox format or NULL.",
-       G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY));
--  g_object_class_install_property
-+  g_object_class_install_property
-     (object_class, PROP_PROTOCOL,
--     g_param_spec_int
-+     g_param_spec_int
-      ("protocol", "Protocol",
-       "The requested gpgme protocol.",
-       GPGME_PROTOCOL_OpenPGP, GPGME_PROTOCOL_UNKNOWN, GPGME_PROTOCOL_UNKNOWN,
-       G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY));
--  g_object_class_install_property
-+  g_object_class_install_property
-     (object_class, PROP_DETACHED,
--     g_param_spec_boolean
-+     g_param_spec_boolean
-      ("detached", "Detached",
-       "Flag requesting a detached signature.",
-       FALSE,
-@@ -221,7 +221,7 @@ GType
- gpa_stream_sign_operation_get_type (void)
- {
-   static GType stream_sign_operation_type = 0;
--
-+
-   if (!stream_sign_operation_type)
-     {
-       static const GTypeInfo stream_sign_operation_info =
-@@ -236,12 +236,12 @@ gpa_stream_sign_operation_get_type (void)
-         0,    /* n_preallocs */
-         (GInstanceInitFunc) gpa_stream_sign_operation_init,
-       };
--
--      stream_sign_operation_type = g_type_register_static
-+
-+      stream_sign_operation_type = g_type_register_static
-       (GPA_STREAM_OPERATION_TYPE, "GpaStreamSignOperation",
-        &stream_sign_operation_info, 0);
-     }
--
-+
-   return stream_sign_operation_type;
- }
-
-@@ -274,11 +274,11 @@ set_signers (GpaStreamSignOperation *op, GList *signers)
-         {
-           /* Should not happen because the selection dialog should
-              have not allowed to select different key types.  */
--          gpa_window_error
-+          gpa_window_error
-             (_("The selected certificates are not all of the same type."
-                " That is, you mixed OpenPGP and X.509 certificates."
-                " Please make sure to select only certificates of the"
--               " same type."),
-+               " same type."),
-              GPA_OPERATION (op)->window);
-           return FALSE;
-         }
-@@ -311,7 +311,7 @@ start_signing (GpaStreamSignOperation *op)
-   GList *signers;
-   gpgme_protocol_t protocol;
-
--  signers = gpa_file_sign_dialog_signers
-+  signers = gpa_file_sign_dialog_signers
-     (GPA_FILE_SIGN_DIALOG (op->sign_dialog));
-   if (!set_signers (op, signers))
-     {
-@@ -332,29 +332,33 @@ start_signing (GpaStreamSignOperation *op)
-     goto leave;
-
-   /* Set the output encoding.  */
--  if (GPA_STREAM_OPERATION (op)->input_stream
-+  if (GPA_STREAM_OPERATION (op)->input_stream
-       && GPA_STREAM_OPERATION (op)->output_stream)
-     {
--      if (protocol == GPGME_PROTOCOL_CMS)
-+      if (gpgme_data_get_encoding (GPA_STREAM_OPERATION(op)->output_stream))
-+        gpgme_data_set_encoding
-+          (GPA_STREAM_OPERATION (op)->output_stream,
-+           gpgme_data_get_encoding (GPA_STREAM_OPERATION(op)->output_stream));
-+      else if (protocol == GPGME_PROTOCOL_CMS)
-         gpgme_data_set_encoding (GPA_STREAM_OPERATION (op)->output_stream,
-                                  GPGME_DATA_ENCODING_BASE64);
-       else
-         gpgme_set_armor (GPA_OPERATION (op)->context->ctx, 1);
-
--      err = gpgme_op_sign_start (GPA_OPERATION (op)->context->ctx,
-+      err = gpgme_op_sign_start (GPA_OPERATION (op)->context->ctx,
-                                  GPA_STREAM_OPERATION (op)->input_stream,
-                                  GPA_STREAM_OPERATION (op)->output_stream,
-                                  (op->detached? GPGME_SIG_MODE_DETACH
--                                  /* */       : GPGME_SIG_MODE_NORMAL));
-+                                  /* */       : GPGME_SIG_MODE_NORMAL));
-       if (err)
-         {
-           gpa_gpgme_warning (err);
-           goto leave;
-         }
--
-+
-       /* Show and update the progress dialog.  */
-       gtk_widget_show_all (GPA_STREAM_OPERATION (op)->progress_dialog);
--      gpa_progress_dialog_set_label
-+      gpa_progress_dialog_set_label
-         (GPA_PROGRESS_DIALOG (GPA_STREAM_OPERATION (op)->progress_dialog),
-          _("Message signing"));
-     }
-@@ -372,13 +376,13 @@ start_signing (GpaStreamSignOperation *op)
-
-
- /* The recipient key selection dialog has returned.  */
--static void
-+static void
- response_cb (GtkDialog *dialog, int response, void *user_data)
- {
-   GpaStreamSignOperation *op = user_data;
-
-   gtk_widget_hide (GTK_WIDGET (dialog));
--
-+
-   if (response != GTK_RESPONSE_OK)
-     {
-       /* The dialog was canceled, so we do nothing and complete the
-@@ -448,7 +452,7 @@ done_cb (GpaContext *context, gpg_error_t err, GpaStreamSignOperation *op)
-           {
-             char *str;
-             char *algo_name;
--
-+
-             str = g_strdup_printf
-               ("%s%s", (protocol == GPGME_PROTOCOL_OpenPGP) ? "pgp-" : "",
-                gpgme_hash_algo_name (sig->hash_algo));
-diff --git a/src/server.c b/src/server.c
-index ee4ec8f..d220ccb 100644
---- a/src/server.c
-+++ b/src/server.c
-@@ -78,6 +78,9 @@ struct conn_ctrl_s
-   /* File descriptor set with the MESSAGE command.  */
-   int message_fd;
-
-+  /* Flag indicating the the output shall be binary.  */
-+  int output_binary;
-+
-   /* Channels used with the gpgme callbacks.  */
-   GIOChannel *input_channel;
-   GIOChannel *output_channel;
-@@ -535,6 +538,8 @@ prepare_io_streams (assuan_context_t ctx,
-       err = gpgme_data_new_from_cbs (r_output_data, &my_gpgme_data_cbs, ctrl);
-       if (err)
-         goto leave;
-+      if (ctrl->output_binary)
-+        gpgme_data_set_encoding (*r_output_data, GPGME_DATA_ENCODING_BINARY);
-     }
-   if (ctrl->message_channel)
-     {
-@@ -1637,6 +1642,7 @@ reset_notify (assuan_context_t ctx, char *line)
-   assuan_close_output_fd (ctx);
-   ctrl->input_fd = -1;
-   ctrl->output_fd = -1;
-+  ctrl->output_binary = 0;
-   if (ctrl->gpa_op)
-     {
-       g_object_unref (ctrl->gpa_op);
-@@ -1648,6 +1654,22 @@ reset_notify (assuan_context_t ctx, char *line)
-   return 0;
- }
-
-+
-+static gpg_error_t
-+output_notify (assuan_context_t ctx, char *line)
-+{
-+  conn_ctrl_t ctrl = assuan_get_pointer (ctx);
-+
-+  if (strstr (line, "--binary"))
-+    ctrl->output_binary = 1;
-+  else
-+    ctrl->output_binary = 0;
-+  /* Note: We also allow --armor and --base64 but because we don't
-+     check for errors we don't need to parse them.  */
-+  return 0;
-+}
-+
-+
\f
- /* Tell libassuan about our commands.   */
- static int
-@@ -1738,6 +1760,7 @@ connection_startup (assuan_fd_t fd)
-   assuan_set_pointer (ctx, ctrl);
-   assuan_set_log_stream (ctx, stderr);
-   assuan_register_reset_notify (ctx, reset_notify);
-+  assuan_register_output_notify (ctx, output_notify);
-   ctrl->message_fd = -1;
-
-   connection_counter++;
---
-1.7.7.1
diff --git a/patches/gpa-0.9.4/02-cms-detection.patch b/patches/gpa-0.9.4/02-cms-detection.patch
deleted file mode 100755 (executable)
index 6c2ffc7..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-#! /bin/sh
-patch -p1 -l -f $* < $0
-exit $?
-
-From 3a8458ae7c083fd46e8d5e165997422a35bdd21f Mon Sep 17 00:00:00 2001
-From: Werner Koch <wk@gnupg.org>
-Date: Fri, 9 Aug 2013 19:46:10 +0200
-Subject: [PATCH 1/2] Improve detection of CMS objects.
-
-* configure.ac: Detect gpgme_data_identify.
-* src/filetype.c (is_cms_data, is_cms_file): Use gpgme_data_identify
-is available.
---
-
-The gpgme_data_identify function has the advantage that it also
-detects X.509 certificates.  This offers way to detect certificate
-files and import them.  As of now the import function does only work
-with PGP.
----
- configure.ac   |    9 +++++++++
- src/filetype.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
- 2 files changed, 62 insertions(+), 1 deletions(-)
-
-diff --git a/configure.ac b/configure.ac
-index 57d677f..9f5213d 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -244,6 +244,15 @@ else
-                 have_gpgme=yes,have_gpgme=no)
- fi
-
-+_save_libs=$LIBS
-+_save_cflags=$CFLAGS
-+LIBS="$LIBS $GPGME_LIBS"
-+CFLAGS="$CFLAGS $GPGME_CFLAGS"
-+AC_CHECK_FUNCS([gpgme_data_identify])
-+LIBS=$_save_libs
-+CFLAGS="$_save_cflags"
-+
-+
- dnl The tests below are not anymore used because we now depend on a
- dnl gpgme which has all these features.  However, I keep the code here
- dnl for future work.
-diff --git a/src/filetype.c b/src/filetype.c
-index c59dde7..4e68d27 100644
---- a/src/filetype.c
-+++ b/src/filetype.c
-@@ -22,6 +22,7 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#include <gpgme.h>
-
- #include "parsetlv.h"
- #include "filetype.h"
-@@ -32,6 +33,7 @@
-
-
- /* Warning: DATA may be binary but there must be a Nul before DATALEN.  */
-+#ifndef HAVE_GPGME_DATA_IDENTIFY
- static int
- detect_cms (const char *data, size_t datalen)
- {
-@@ -90,6 +92,7 @@ detect_cms (const char *data, size_t datalen)
-
-   return 0;
- }
-+#endif /*!HAVE_GPGME_DATA_IDENTIFY*/
-
-
- /* Return true if the file FNAME looks like an CMS file.  There is no
-@@ -98,6 +101,34 @@ detect_cms (const char *data, size_t datalen)
- int
- is_cms_file (const char *fname)
- {
-+#ifdef HAVE_GPGME_DATA_IDENTIFY
-+  FILE *fp;
-+  gpgme_data_t dh;
-+  gpgme_data_type_t dt;
-+
-+  fp = fopen (fname, "rb");
-+  if (!fp)
-+    return 0; /* Not found - can't be a CMS file.  */
-+  if (gpgme_data_new_from_stream (&dh, fp))
-+    {
-+      fclose (fp);
-+      return 0;
-+    }
-+  dt = gpgme_data_identify (dh, 0);
-+  gpgme_data_release (dh);
-+  fclose (fp);
-+  switch (dt)
-+    {
-+    case GPGME_DATA_TYPE_CMS_SIGNED:
-+    case GPGME_DATA_TYPE_CMS_ENCRYPTED:
-+    case GPGME_DATA_TYPE_CMS_OTHER:
-+    case GPGME_DATA_TYPE_X509_CERT:
-+    case GPGME_DATA_TYPE_PKCS12:
-+      return 1;
-+    default:
-+      return 0;
-+    }
-+#else
-   int result;
-   FILE *fp;
-   char *data;
-@@ -121,6 +152,7 @@ is_cms_file (const char *fname)
-   result = detect_cms (data, datalen);
-   free (data);
-   return result;
-+#endif
- }
-
-
-@@ -129,9 +161,28 @@ is_cms_file (const char *fname)
- int
- is_cms_data (const char *data, size_t datalen)
- {
-+#ifdef HAVE_GPGME_DATA_IDENTIFY
-+  gpgme_data_t dh;
-+  gpgme_data_type_t dt;
-+
-+  if (gpgme_data_new_from_mem (&dh, data, datalen, 0))
-+    return 0;
-+  dt = gpgme_data_identify (dh, 0);
-+  gpgme_data_release (dh);
-+  switch (dt)
-+    {
-+    case GPGME_DATA_TYPE_CMS_SIGNED:
-+    case GPGME_DATA_TYPE_CMS_ENCRYPTED:
-+    case GPGME_DATA_TYPE_CMS_OTHER:
-+    case GPGME_DATA_TYPE_X509_CERT:
-+    case GPGME_DATA_TYPE_PKCS12:
-+      return 1;
-+    default:
-+      return 0;
-+    }
-+#else
-   int result;
-   char *buffer;
--
-   if (datalen < 24)
-     return 0; /* Too short - don't bother to copy the buffer.  */
-
-@@ -147,4 +198,5 @@ is_cms_data (const char *data, size_t datalen)
-   result = detect_cms (buffer, datalen);
-   free (buffer);
-   return result;
-+#endif
- }
---
-1.7.7.1
diff --git a/patches/gpa-0.9.4/02-x509-import.patch b/patches/gpa-0.9.4/02-x509-import.patch
deleted file mode 100755 (executable)
index 8891d8c..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-#! /bin/sh
-patch -p1 -l -f $* < $0
-exit $?
-
-From 6742525110270b0098e41157edfb13e36483f1ca Mon Sep 17 00:00:00 2001
-From: Werner Koch <wk@gnupg.org>
-Date: Sat, 10 Aug 2013 08:34:38 +0200
-Subject: [PATCH] Allow import and export of X.509 certificates.
-
-* src/filetype.c (is_cms_data_ext): New.
-* src/gpaimportop.c (gpa_import_operation_idle_cb): Set the
-appropriate protocol.
-* src/gpaexportop.c (gpa_export_operation_idle_cb): Ditto.
----
- src/filetype.c    |   23 +++++++++++++++++++++++
- src/filetype.h    |    1 +
- src/gpaexportop.c |   41 +++++++++++++++++++++++++++++------------
- src/gpaimportop.c |   26 +++++++++++++++-----------
- 4 files changed, 68 insertions(+), 23 deletions(-)
-
-diff --git a/src/filetype.c b/src/filetype.c
-index 4e68d27..58b4145 100644
---- a/src/filetype.c
-+++ b/src/filetype.c
-@@ -200,3 +200,26 @@ is_cms_data (const char *data, size_t datalen)
-   return result;
- #endif
- }
-+
-+/* New version of is_cms_data which requires a decent version of
-+   gpgme.  In contrast to is_cms_data this works directly on a gpgme
-+   data object.  */
-+int
-+is_cms_data_ext (gpgme_data_t dh)
-+{
-+#ifdef HAVE_GPGME_DATA_IDENTIFY
-+  switch (gpgme_data_identify (dh, 0))
-+    {
-+    case GPGME_DATA_TYPE_CMS_SIGNED:
-+    case GPGME_DATA_TYPE_CMS_ENCRYPTED:
-+    case GPGME_DATA_TYPE_CMS_OTHER:
-+    case GPGME_DATA_TYPE_X509_CERT:
-+    case GPGME_DATA_TYPE_PKCS12:
-+      return 1;
-+    default:
-+      return 0;
-+    }
-+#else
-+  return 0;
-+#endif
-+}
-diff --git a/src/filetype.h b/src/filetype.h
-index 6c88c68..8ba4c2e 100644
---- a/src/filetype.h
-+++ b/src/filetype.h
-@@ -20,6 +20,7 @@
-
- int is_cms_file (const char *fname);
- int is_cms_data (const char *data, size_t datalen);
-+int is_cms_data_ext (gpgme_data_t dh);
-
-
- #endif /*FILETYPE_H*/
-diff --git a/src/gpaexportop.c b/src/gpaexportop.c
-index 51df806..9caf49f 100644
---- a/src/gpaexportop.c
-+++ b/src/gpaexportop.c
-@@ -38,7 +38,7 @@ enum
- static gboolean gpa_export_operation_idle_cb (gpointer data);
- static void gpa_export_operation_done_cb (GpaContext *context, gpg_error_t err,
-                             GpaExportOperation *op);
--static void gpa_export_operation_done_error_cb (GpaContext *context,
-+static void gpa_export_operation_done_error_cb (GpaContext *context,
-                                               gpg_error_t err,
-                                               GpaExportOperation *op);
-
-@@ -97,7 +97,7 @@ gpa_export_operation_finalize (GObject *object)
-     {
-       gpgme_data_release (op->dest);
-     }
--
-+
-   G_OBJECT_CLASS (parent_class)->finalize (object);
- }
-
-@@ -138,14 +138,14 @@ static void
- gpa_export_operation_class_init (GpaExportOperationClass *klass)
- {
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
--
-+
-   parent_class = g_type_class_peek_parent (klass);
-
-   object_class->constructor = gpa_export_operation_constructor;
-   object_class->finalize = gpa_export_operation_finalize;
-   object_class->set_property = gpa_export_operation_set_property;
-   object_class->get_property = gpa_export_operation_get_property;
--
-+
-   /* Virtual methods */
-   klass->get_destination = NULL;
-   klass->complete_export = NULL;
-@@ -153,7 +153,7 @@ gpa_export_operation_class_init (GpaExportOperationClass *klass)
-   /* Properties */
-   g_object_class_install_property (object_class,
-                                  PROP_KEYS,
--                                 g_param_spec_pointer
-+                                 g_param_spec_pointer
-                                  ("keys", "Keys",
-                                   "Keys",
-                                   G_PARAM_WRITABLE|G_PARAM_CONSTRUCT_ONLY));
-@@ -163,7 +163,7 @@ GType
- gpa_export_operation_get_type (void)
- {
-   static GType file_operation_type = 0;
--
-+
-   if (!file_operation_type)
-     {
-       static const GTypeInfo file_operation_info =
-@@ -178,12 +178,12 @@ gpa_export_operation_get_type (void)
-         0,              /* n_preallocs */
-         (GInstanceInitFunc) gpa_export_operation_init,
-       };
--
-+
-       file_operation_type = g_type_register_static (GPA_OPERATION_TYPE,
-                                                   "GpaExportOperation",
-                                                   &file_operation_info, 0);
-     }
--
-+
-   return file_operation_type;
- }
-
-@@ -198,10 +198,11 @@ gpa_export_operation_idle_cb (gpointer data)
-   if (GPA_EXPORT_OPERATION_GET_CLASS (op)->get_destination (op, &op->dest,
-                                                           &armor))
-     {
--      gpg_error_t err;
-+      gpg_error_t err = 0;
-       const char **patterns;
-       GList *k;
-       int i;
-+      gpgme_protocol_t prot = GPGME_PROTOCOL_UNKNOWN;
-
-       gpgme_set_armor (GPA_OPERATION (op)->context->ctx, armor);
-       /* Create the set of keys to export */
-@@ -210,17 +211,33 @@ gpa_export_operation_idle_cb (gpointer data)
-       {
-         gpgme_key_t key = (gpgme_key_t) k->data;
-         patterns[i] = key->subkeys->fpr;
-+          if (prot == GPGME_PROTOCOL_UNKNOWN)
-+            prot = key->protocol;
-+          else if (prot != key->protocol)
-+            {
-+              gpa_window_error
-+                (_("Only keys of the same procotol may be exported"
-+                   " as a collection."), NULL);
-+              g_signal_emit_by_name (GPA_OPERATION (op), "completed", err);
-+              goto cleanup;
-+            }
-       }
-+      if (prot == GPGME_PROTOCOL_UNKNOWN)
-+        {
-+          g_signal_emit_by_name (GPA_OPERATION (op), "completed", err);
-+          goto cleanup;  /* No keys.  */
-+        }
-+      gpgme_set_protocol (GPA_OPERATION (op)->context->ctx, prot);
-       /* Export to the gpgme_data_t */
--      err = gpgme_op_export_ext_start (GPA_OPERATION (op)->context->ctx,
-+      err = gpgme_op_export_ext_start (GPA_OPERATION (op)->context->ctx,
-                                      patterns, 0, op->dest);
-       if (err)
-       {
-         gpa_gpgme_warning (err);
-         g_signal_emit_by_name (GPA_OPERATION (op), "completed", err);
-       }
--      /* Clean up */
--      g_free (patterns);
-+    cleanup:
-+      g_free (patterns);
-     }
-   else
-     /* Abort the operation.  */
-diff --git a/src/gpaimportop.c b/src/gpaimportop.c
-index 81ed769..0680a21 100644
---- a/src/gpaimportop.c
-+++ b/src/gpaimportop.c
-@@ -25,6 +25,7 @@
- #include "i18n.h"
- #include "gtktools.h"
- #include "gpaimportop.h"
-+#include "filetype.h"
-
- static GObjectClass *parent_class = NULL;
-
-@@ -40,7 +41,7 @@ static guint signals [LAST_SIGNAL] = { 0 };
- static gboolean gpa_import_operation_idle_cb (gpointer data);
- static void gpa_import_operation_done_cb (GpaContext *context, gpg_error_t err,
-                             GpaImportOperation *op);
--static void gpa_import_operation_done_error_cb (GpaContext *context,
-+static void gpa_import_operation_done_error_cb (GpaContext *context,
-                                               gpg_error_t err,
-                                               GpaImportOperation *op);
-
-@@ -56,7 +57,7 @@ gpa_import_operation_finalize (GObject *object)
-     {
-       gpgme_data_release (op->source);
-     }
--
-+
-   G_OBJECT_CLASS (parent_class)->finalize (object);
- }
-
-@@ -95,12 +96,12 @@ static void
- gpa_import_operation_class_init (GpaImportOperationClass *klass)
- {
-   GObjectClass *object_class = G_OBJECT_CLASS (klass);
--
-+
-   parent_class = g_type_class_peek_parent (klass);
-
-   object_class->constructor = gpa_import_operation_constructor;
-   object_class->finalize = gpa_import_operation_finalize;
--
-+
-   /* Virtual methods */
-   klass->get_source = NULL;
-   klass->complete_import = NULL;
-@@ -130,7 +131,7 @@ GType
- gpa_import_operation_get_type (void)
- {
-   static GType file_operation_type = 0;
--
-+
-   if (!file_operation_type)
-     {
-       static const GTypeInfo file_operation_info =
-@@ -145,12 +146,12 @@ gpa_import_operation_get_type (void)
-         0,              /* n_preallocs */
-         (GInstanceInitFunc) gpa_import_operation_init,
-       };
--
-+
-       file_operation_type = g_type_register_static (GPA_OPERATION_TYPE,
-                                                   "GpaImportOperation",
-                                                   &file_operation_info, 0);
-     }
--
-+
-   return file_operation_type;
- }
-
-@@ -164,7 +165,10 @@ gpa_import_operation_idle_cb (gpointer data)
-   if (GPA_IMPORT_OPERATION_GET_CLASS (op)->get_source (op, &op->source))
-     {
-       gpg_error_t err;
--
-+
-+      gpgme_set_protocol (GPA_OPERATION (op)->context->ctx,
-+                          is_cms_data_ext (op->source)?
-+                          GPGME_PROTOCOL_CMS : GPGME_PROTOCOL_OpenPGP);
-       err = gpgme_op_import_start (GPA_OPERATION (op)->context->ctx,
-                                  op->source);
-       if (err)
-@@ -181,8 +185,8 @@ gpa_import_operation_idle_cb (gpointer data)
-   return FALSE;
- }
-
--static void
--key_import_results_dialog_run (GtkWidget *parent,
-+static void
-+key_import_results_dialog_run (GtkWidget *parent,
-                              gpgme_import_result_t info)
- {
-   GtkWidget *dialog;
-@@ -211,7 +215,7 @@ key_import_results_dialog_run (GtkWidget *parent,
-                                        info->unchanged, info->secret_read,
-                                        info->secret_imported,
-                                      info->secret_unchanged);
--    }
-+    }
-
-   /* Run the dialog */
-   gtk_widget_show_all (dialog);
---
-1.7.7.1
diff --git a/patches/gpa-0.9.4/03-homedir-via-gpgconf.patch b/patches/gpa-0.9.4/03-homedir-via-gpgconf.patch
deleted file mode 100755 (executable)
index 6f83e98..0000000
+++ /dev/null
@@ -1,1032 +0,0 @@
-#! /bin/sh
-patch -p1 -l -f $* < $0
-exit $?
-
-From 398fd028c762dd6c0fc7a5945f55eb2dbd2edaec Mon Sep 17 00:00:00 2001
-From: Werner Koch <wk@gnupg.org>
-Date: Mon, 12 Aug 2013 18:44:06 +0200
-Subject: [PATCH] Detect default homedir via gpgconf.
-
-* src/server.c (decode_percent_string): Move to ..
-* src/utils.c (decode_percent_string): here.
-* src/gpgmetools.c (gpa_start_simple_gpg_command): Add arg use_stderr
-and change all callers.
-(gpg_simple_stdio_cb): Implement the !use_stderr case.
-* src/get-path.c: Include string.h and gpa.h.
-(struct homedir_from_gpgconf_s): New.
-(homedir_from_gpgconf_parser): New.
-(homedir_from_gpgconf): New.
-(default_homedir): First try to detect via gpgconf.
---
-
-It would be useful to equip GPGME with a function to parse the output
-of "gpgconf --list-dir".  Until then we need to go into some length to
-read it.
----
- src/cm-netkey.c  |  132 +++++++++++++++++++++++++++---------------------------
- src/get-path.c   |   85 ++++++++++++++++++++++++++++++++---
- src/gpa.h        |    1 +
- src/gpgmetools.c |   75 ++++++++++++++++++++-----------
- src/gpgmetools.h |    1 +
- src/server.c     |   47 -------------------
- src/utils.c      |   65 +++++++++++++++++++++++----
- 7 files changed, 252 insertions(+), 154 deletions(-)
-
-diff --git a/src/cm-netkey.c b/src/cm-netkey.c
-index 8b4aba2..8ddbcb7 100644
---- a/src/cm-netkey.c
-+++ b/src/cm-netkey.c
-@@ -14,7 +14,7 @@
-  * License for more details.
-  *
-  * You should have received a copy of the GNU General Public License
-- * along with this program; if not, see <http://www.gnu.org/licenses/>.
-+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
-  */
-
- #ifdef HAVE_CONFIG_H
-@@ -26,7 +26,7 @@
- #include <string.h>
- #include <assert.h>
-
--#include "gpa.h"
-+#include "gpa.h"
- #include "gtktools.h"
- #include "convert.h"
- #include "gpa-key-details.h"
-@@ -49,7 +49,7 @@ enum
-     ENTRY_SIGG_PUK_RETRYCOUNTER,
-
-     ENTRY_LAST
--  };
-+  };
-
-
- /* A structure for PIN information.  */
-@@ -65,7 +65,7 @@ struct pininfo_s
-
-
- /* Object's class definition.  */
--struct _GpaCMNetkeyClass
-+struct _GpaCMNetkeyClass
- {
-   GpaCMObjectClass parent_class;
- };
-@@ -106,7 +106,7 @@ static void gpa_cm_netkey_finalize (GObject *object);
-
-
\f
--/************************************************************
-+/************************************************************
-  *******************   Implementation   *********************
-  ************************************************************/
-
-@@ -127,13 +127,13 @@ clear_card_data (GpaCMNetkey *card)
- /* Put the PIN information into the field with ENTRY_ID.  If BUTTON is
-    not NULL its sensitivity is set as well. */
- static void
--update_entry_retry_counter (GpaCMNetkey *card, int entry_id,
-+update_entry_retry_counter (GpaCMNetkey *card, int entry_id,
-                             struct pininfo_s *info, int any_isnull,
-                             int is_puk, GtkWidget *button)
- {
-   char numbuf[50];
-   const char *string;
--
-+
-   if (!info->valid)
-     string = _("unknown");
-   else if (info->nullpin)
-@@ -150,12 +150,12 @@ update_entry_retry_counter (GpaCMNetkey *card, int entry_id,
-   gtk_label_set_text (GTK_LABEL (card->entries[entry_id]), string);
-   if (button)
-     {
--      gtk_button_set_label (GTK_BUTTON (button),
-+      gtk_button_set_label (GTK_BUTTON (button),
-                             (info->valid && !info->nullpin
-                              && (info->blocked || !info->tries_left))
-                             ? (is_puk? _("Reset PUK") : _("Reset PIN"))
-                             : (is_puk? _("Change PUK"): _("Change PIN")));
--      gtk_widget_set_sensitive (button,
-+      gtk_widget_set_sensitive (button,
-                                 (info->valid && !any_isnull
-                                  && !info->nullpin && !info->blocked
-                                  && !info->nopin));
-@@ -168,12 +168,12 @@ update_entry_retry_counter (GpaCMNetkey *card, int entry_id,
- static void
- update_entry_chv_status (GpaCMNetkey *card, int entry_id, char *string)
- {
--  struct {
-+  struct {
-     int info_idx;
-     int is_puk;
-     int entry_id;
-     GtkWidget *widget;
--  } tbl[] =
-+  } tbl[] =
-     {
-       {  0, 0, ENTRY_PIN_RETRYCOUNTER },
-       {  1, 1, ENTRY_PUK_RETRYCOUNTER  },
-@@ -190,7 +190,7 @@ update_entry_chv_status (GpaCMNetkey *card, int entry_id, char *string)
-   tbl[3].widget = card->change_sigg_puk_btn;
-
-   (void)entry_id; /* Not used.  */
--
-+
-   for (idx=0; idx < DIM (card->pininfo); idx++)
-     memset (&card->pininfo[idx], 0, sizeof card->pininfo[0]);
-
-@@ -203,7 +203,7 @@ update_entry_chv_status (GpaCMNetkey *card, int entry_id, char *string)
-         string++;
-       while (spacep (string))
-         string++;
--
-+
-       card->pininfo[idx].valid = 1;
-       if (value >= 0)
-         card->pininfo[idx].tries_left = value;
-@@ -224,7 +224,7 @@ update_entry_chv_status (GpaCMNetkey *card, int entry_id, char *string)
-     if (tbl[idx].info_idx < DIM (card->pininfo))
-       update_entry_retry_counter (card, tbl[idx].entry_id,
-                                   &card->pininfo[tbl[idx].info_idx],
--                                  any_isnull,
-+                                  any_isnull,
-                                   tbl[idx].is_puk, tbl[idx].widget);
-
-   gtk_widget_set_no_show_all (card->warning_frame, FALSE);
-@@ -371,7 +371,7 @@ reload_more_data (GpaCMNetkey *card)
-
-       align = gtk_alignment_new (0.5, 0, 0, 0);
-       button = gtk_button_new_with_label (_("Learn keys"));
--      gpa_add_tooltip
-+      gpa_add_tooltip
-         (button, _("For some or all of the keys available on the card, "
-                    "the GnuPG crypto engine does not yet know the "
-                    "corresponding certificates.\n"
-@@ -404,7 +404,7 @@ static gboolean
- reload_more_data_idle_cb (void *user_data)
- {
-   GpaCMNetkey *card = user_data;
--
-+
-   if (card->reloading)
-     {
-       g_debug ("already reloading (count=%d)", card->reloading);
-@@ -414,7 +414,7 @@ reload_more_data_idle_cb (void *user_data)
-
-   card->reloading++;
-   reload_more_data (card);
--  g_object_unref (card);
-+  g_object_unref (card);
-   card->reloading--;
-
-   return FALSE;  /* Remove us from the idle queue.  */
-@@ -450,17 +450,17 @@ scd_getattr_cb (void *opaque, const char *status, const char *args)
-           if (parm->updfnc)
-             parm->updfnc (parm->card, entry_id, tmp);
-           else if (GTK_IS_LABEL (parm->card->entries[entry_id]))
--            gtk_label_set_text
-+            gtk_label_set_text
-               (GTK_LABEL (parm->card->entries[entry_id]), tmp);
-           else
--            gtk_entry_set_text
-+            gtk_entry_set_text
-               (GTK_ENTRY (parm->card->entries[entry_id]), tmp);
-           xfree (tmp);
-         }
-     }
-
-   return 0;
--}
-+}
-
-
- /* Use the assuan machinery to load the bulk of the OpenPGP card data.  */
-@@ -509,7 +509,7 @@ reload_data (GpaCMNetkey *card)
-         {
-           /* The NKS-VERSION is only supported by GnuPG > 2.0.11
-              thus we ignore the error.  */
--          gtk_label_set_text
-+          gtk_label_set_text
-             (GTK_LABEL (card->entries[attrtbl[attridx].entry_id]),
-              _("unknown"));
-         }
-@@ -519,7 +519,7 @@ reload_data (GpaCMNetkey *card)
-             ; /* Lost the card.  */
-           else
-             {
--              g_debug ("assuan command `%s' failed: %s <%s>\n",
-+              g_debug ("assuan command `%s' failed: %s <%s>\n",
-                        command, gpg_strerror (err), gpg_strsource (err));
-             }
-           clear_card_data (card);
-@@ -537,7 +537,7 @@ reload_data (GpaCMNetkey *card)
-
-
- /* A structure used to pass data to the learn_keys_gpg_status_cb.  */
--struct learn_keys_gpg_status_parm
-+struct learn_keys_gpg_status_parm
- {
-   GpaCMNetkey    *card;
-   GtkWidget      *button;
-@@ -546,11 +546,11 @@ struct learn_keys_gpg_status_parm
-
-
- /* Helper for learn_keys_clicked_cb.  */
--static gboolean
-+static gboolean
- learn_keys_gpg_status_cb (void *opaque, char *line)
- {
-   struct learn_keys_gpg_status_parm *parm = opaque;
--
-+
-   if (!line)
-     {
-       /* We are finished with the command.  */
-@@ -590,7 +590,7 @@ learn_keys_clicked_cb (GtkButton *button, void *user_data)
-
-   widget = gtk_progress_bar_new ();
-   gtk_container_add (GTK_CONTAINER (button), widget);
--  gtk_progress_bar_set_text (GTK_PROGRESS_BAR (widget),
-+  gtk_progress_bar_set_text (GTK_PROGRESS_BAR (widget),
-                               _("Learning keys ..."));
-   gtk_widget_show_all (GTK_WIDGET (button));
-
-@@ -600,8 +600,8 @@ learn_keys_clicked_cb (GtkButton *button, void *user_data)
-   parm->button = GTK_WIDGET (button);
-   parm->pbar = GTK_PROGRESS_BAR (widget);
-
--  err = gpa_start_simple_gpg_command
--    (learn_keys_gpg_status_cb, parm, GPGME_PROTOCOL_CMS,
-+  err = gpa_start_simple_gpg_command
-+    (learn_keys_gpg_status_cb, parm, GPGME_PROTOCOL_CMS, 1,
-      "--learn-card", "-v", NULL);
-   if (err)
-     {
-@@ -633,7 +633,7 @@ change_nullpin (GpaCMNetkey *card)
-   else
-     return; /* Oops: No NullPIN.  */
-
--  string = g_strdup_printf
-+  string = g_strdup_printf
-     (_("<b>Setting the Initial PIN</b> (%s)\n\n"
-        "You selected to set the initial PIN of your card.  "
-        "The PIN is currently set to the NullPIN.  Setting an "
-@@ -653,12 +653,12 @@ change_nullpin (GpaCMNetkey *card)
-          "PIN to the same value as used for the NKS keys.")
-      : _("You are now setting the PIN for the NKS keys used for standard "
-          "signatures, encryption and authentication."));
--
-+
-   /* FIXME:  How do we figure out our GtkWindow?  */
-   dialog = gtk_message_dialog_new_with_markup (NULL /*GTK_WINDOW (card)*/,
-                                                GTK_DIALOG_DESTROY_WITH_PARENT,
--                                               GTK_MESSAGE_INFO,
--                                               GTK_BUTTONS_OK_CANCEL,
-+                                               GTK_MESSAGE_INFO,
-+                                               GTK_BUTTONS_OK_CANCEL,
-                                                NULL);
-   gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), string);
-   g_free (string);
-@@ -679,7 +679,7 @@ change_nullpin (GpaCMNetkey *card)
-         okay = 0; /* No need to reload the data.  */
-       else if (err)
-         {
--          char *message = g_strdup_printf
-+          char *message = g_strdup_printf
-             (_("Error changing the NullPIN.\n"
-                "(%s <%s>)"), gpg_strerror (err), gpg_strsource (err));
-           gpa_window_error (message, NULL);
-@@ -709,7 +709,7 @@ change_or_reset_pin (GpaCMNetkey *card, int info_idx)
-   g_return_if_fail (gpgagent);
-   g_return_if_fail (info_idx < DIM (card->pininfo));
-
--  if (!card->pininfo[info_idx].valid
-+  if (!card->pininfo[info_idx].valid
-       || card->pininfo[info_idx].nopin
-       || card->pininfo[info_idx].nullpin)
-     {
-@@ -741,7 +741,7 @@ change_or_reset_pin (GpaCMNetkey *card, int info_idx)
-                 "of the PIN and the corresponding PUK are both down "
-                 "to zero, the keys controlled by the PIN are not anymore "
-                 "usable and there is no way to unblock them!")
--            : is_puk
-+            : is_puk
-             ? _("<b>Resetting a PUK</b>\n"
-                 "\n"
-                 "Although <i>PUK</i> stands for <i>PIN Unblocking Code</i> "
-@@ -766,12 +766,12 @@ change_or_reset_pin (GpaCMNetkey *card, int info_idx)
-                 "value of the PUK and then to enter a new value for the "
-                 "blocked PIN and repeat that new value at another prompt.")
-             );
--
-+
-   /* FIXME:  How do we figure out our GtkWindow?  */
-   dialog = gtk_message_dialog_new_with_markup (NULL /*GTK_WINDOW (card)*/,
-                                                GTK_DIALOG_DESTROY_WITH_PARENT,
--                                               GTK_MESSAGE_INFO,
--                                               GTK_BUTTONS_OK_CANCEL,
-+                                               GTK_MESSAGE_INFO,
-+                                               GTK_BUTTONS_OK_CANCEL,
-                                                NULL);
-   gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), string);
-   okay = (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK);
-@@ -783,13 +783,13 @@ change_or_reset_pin (GpaCMNetkey *card, int info_idx)
-                 reset_mode? " --reset":"", pwidstr);
-       err = gpgme_op_assuan_transact (gpgagent, command,
-                                       NULL, NULL, NULL, NULL, NULL, NULL);
--      if (!err)
-+      if (!err)
-         err = gpgme_op_assuan_result (gpgagent)->err;
-       if (gpg_err_code (err) == GPG_ERR_CANCELED)
-         okay = 0; /* No need to reload the data.  */
--      else if (err)
-+      else if (err)
-         {
--          char *message = g_strdup_printf
-+          char *message = g_strdup_printf
-             (_("Error changing or resetting the PIN/PUK.\n"
-                "(%s <%s>)"), gpg_strerror (err), gpg_strsource (err));
-           gpa_window_error (message, NULL);
-@@ -840,12 +840,12 @@ add_table_row (GtkWidget *table, int *rowidx,
-   label = gtk_label_new (labelstr);
-   gtk_label_set_width_chars  (GTK_LABEL (label), 22);
-   gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
--  gtk_table_attach (GTK_TABLE (table), label, 0, 1,
--                    *rowidx, *rowidx + 1, GTK_FILL, GTK_SHRINK, 0, 0);
-+  gtk_table_attach (GTK_TABLE (table), label, 0, 1,
-+                    *rowidx, *rowidx + 1, GTK_FILL, GTK_SHRINK, 0, 0);
-
-   if (is_label)
-     gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
--
-+
-   if (readonly)
-     {
-       if (!is_label && GTK_IS_ENTRY (widget))
-@@ -859,7 +859,7 @@ add_table_row (GtkWidget *table, int *rowidx,
-       if (is_label)
-         gtk_label_set_selectable (GTK_LABEL (widget), TRUE);
-     }
--
-+
-   gtk_table_attach (GTK_TABLE (table), widget, 1, 2,
-                     *rowidx, *rowidx + 1, GTK_FILL, GTK_SHRINK, 0, 0);
-   if (widget2)
-@@ -893,17 +893,17 @@ construct_data_widget (GpaCMNetkey *card)
-   gtk_container_set_border_width (GTK_CONTAINER (table), 10);
-   gtk_container_add (GTK_CONTAINER (frame), table);
-   rowidx = 0;
--
-+
-   card->entries[ENTRY_SERIALNO] = gtk_label_new (NULL);
-   add_table_row (table, &rowidx, _("Serial number:"),
-                  card->entries[ENTRY_SERIALNO], NULL, 0);
-
-   card->entries[ENTRY_NKS_VERSION] = gtk_label_new (NULL);
--  add_table_row (table, &rowidx, _("Card version:"),
-+  add_table_row (table, &rowidx, _("Card version:"),
-                  card->entries[ENTRY_NKS_VERSION], NULL, 0);
-
-   gtk_box_pack_start (GTK_BOX (card), frame, FALSE, TRUE, 0);
--
-+
-
-   /* Warning frame.  */
-   frame = gtk_frame_new (NULL);
-@@ -939,7 +939,7 @@ construct_data_widget (GpaCMNetkey *card)
-      widgets are added while figuring out the keys of the card.  */
-   label = gtk_label_new (_("scanning ..."));
-   gtk_container_add (GTK_CONTAINER (frame), label);
--
-+
-   gtk_box_pack_start (GTK_BOX (card), frame, FALSE, TRUE, 0);
-   card->keys_frame = frame;
-
-@@ -957,42 +957,42 @@ construct_data_widget (GpaCMNetkey *card)
-
-   card->entries[ENTRY_PIN_RETRYCOUNTER] = gtk_label_new (NULL);
-   button = gtk_button_new ();
--  add_table_row (table, &rowidx, _("PIN retry counter:"),
-+  add_table_row (table, &rowidx, _("PIN retry counter:"),
-                  card->entries[ENTRY_PIN_RETRYCOUNTER], button, 1);
--  card->change_pin_btn = button;
-+  card->change_pin_btn = button;
-   g_signal_connect (G_OBJECT (button), "clicked",
-                     G_CALLBACK (change_pin_clicked_cb), card);
-
-   card->entries[ENTRY_PUK_RETRYCOUNTER] = gtk_label_new (NULL);
-   button = gtk_button_new ();
--  add_table_row (table, &rowidx, _("PUK retry counter:"),
-+  add_table_row (table, &rowidx, _("PUK retry counter:"),
-                  card->entries[ENTRY_PUK_RETRYCOUNTER], button, 1);
--  card->change_puk_btn = button;
-+  card->change_puk_btn = button;
-   g_signal_connect (G_OBJECT (button), "clicked",
-                     G_CALLBACK (change_pin_clicked_cb), card);
-
-   card->entries[ENTRY_SIGG_PIN_RETRYCOUNTER] = gtk_label_new (NULL);
-   button = gtk_button_new ();
--  add_table_row (table, &rowidx, _("SigG PIN retry counter:"),
-+  add_table_row (table, &rowidx, _("SigG PIN retry counter:"),
-                  card->entries[ENTRY_SIGG_PIN_RETRYCOUNTER], button, 1);
--  card->change_sigg_pin_btn = button;
-+  card->change_sigg_pin_btn = button;
-   g_signal_connect (G_OBJECT (button), "clicked",
-                     G_CALLBACK (change_pin_clicked_cb), card);
-
-   card->entries[ENTRY_SIGG_PUK_RETRYCOUNTER] = gtk_label_new (NULL);
-   button = gtk_button_new ();
--  add_table_row (table, &rowidx, _("SigG PUK retry counter:"),
-+  add_table_row (table, &rowidx, _("SigG PUK retry counter:"),
-                  card->entries[ENTRY_SIGG_PUK_RETRYCOUNTER], button, 1);
--  card->change_sigg_puk_btn = button;
-+  card->change_sigg_puk_btn = button;
-   g_signal_connect (G_OBJECT (button), "clicked",
-                     G_CALLBACK (change_pin_clicked_cb), card);
--
-+
-   gtk_box_pack_start (GTK_BOX (card), frame, FALSE, TRUE, 0);
- }
-
-
\f
--/************************************************************
-+/************************************************************
-  ******************   Object Management  ********************
-  ************************************************************/
-
-@@ -1002,7 +1002,7 @@ gpa_cm_netkey_class_init (void *class_ptr, void *class_data)
-   GpaCMNetkeyClass *klass = class_ptr;
-
-   parent_class = g_type_class_peek_parent (klass);
--
-+
-   G_OBJECT_CLASS (klass)->finalize = gpa_cm_netkey_finalize;
- }
-
-@@ -1019,7 +1019,7 @@ gpa_cm_netkey_init (GTypeInstance *instance, void *class_ptr)
-
- static void
- gpa_cm_netkey_finalize (GObject *object)
--{
-+{
- /*   GpaCMNetkey *card = GPA_CM_NETKEY (object); */
-
-   parent_class->finalize (object);
-@@ -1031,7 +1031,7 @@ GType
- gpa_cm_netkey_get_type (void)
- {
-   static GType this_type = 0;
--
-+
-   if (!this_type)
-     {
-       static const GTypeInfo this_info =
-@@ -1046,23 +1046,23 @@ gpa_cm_netkey_get_type (void)
-         0,    /* n_preallocs */
-         gpa_cm_netkey_init
-       };
--
-+
-       this_type = g_type_register_static (GPA_CM_OBJECT_TYPE,
-                                           "GpaCMNetkey",
-                                           &this_info, 0);
-     }
--
-+
-   return this_type;
- }
-
\f
--/************************************************************
-+/************************************************************
-  **********************  Public API  ************************
-  ************************************************************/
- GtkWidget *
- gpa_cm_netkey_new ()
- {
--  return GTK_WIDGET (g_object_new (GPA_CM_NETKEY_TYPE, NULL));
-+  return GTK_WIDGET (g_object_new (GPA_CM_NETKEY_TYPE, NULL));
- }
-
-
-diff --git a/src/get-path.c b/src/get-path.c
-index f50e21b..71fe0e1 100644
---- a/src/get-path.c
-+++ b/src/get-path.c
-@@ -1,6 +1,6 @@
- /* get-path.c - Find a system path.
-    Copyright (C) 2000-2002 G-N-U GmbH.
--   Copyright (C) 2005, 2008 g10 Code GmbH.
-+   Copyright (C) 2005, 2008, 2013 g10 Code GmbH.
-
-    This file is part of GPA.
-
-@@ -23,7 +23,10 @@
- #endif
-
- #include <glib.h>
-+#include <string.h>
-+#include <gpgme.h>
-
-+#include "gpa.h"
- #include "get-path.h"
-
\f
-@@ -31,7 +34,7 @@
-
- #include <unistd.h>
-
--#include <windows.h>
-+#include <windows.h>
-
- #include "w32reg.h"
-
-@@ -55,7 +58,7 @@ w32_strerror (int w32_errno)
- {
-   static char strerr[256];
-   int ec = (int) GetLastError ();
--
-+
-   if (w32_errno == 0)
-     w32_errno = ec;
-   FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, w32_errno,
-@@ -103,7 +106,7 @@ dlclose (void *hd)
-       return 0;
-     }
-   return -1;
--}
-+}
-
-
- static HRESULT
-@@ -143,13 +146,83 @@ w32_shgetfolderpath (HWND a, int b, HANDLE c, DWORD d, LPSTR e)
-
- #endif        /* G_OS_WIN32 */
-
-+
-+
-+
\f
-+struct homedir_from_gpgconf_s
-+{
-+  GMainLoop *loop;
-+  char *homedir;
-+};
-+
-+static gboolean
-+homedir_from_gpgconf_parser (void *opaque, char *line)
-+{
-+  struct homedir_from_gpgconf_s *parm = opaque;
-+  char *value, *p;
-+
-+  if (!line)
-+    {
-+      /* We are finished with the command.  Stop the loop.  */
-+      g_main_loop_quit (parm->loop);
-+      return FALSE; /* (The return code does not matter here.)  */
-+    }
-+
-+  value = strchr (line, ':');
-+  if (!value)
-+    return TRUE; /* Invalid line - keep on running.  */;
-+  *value++ = 0;
-+  if (strcmp (line, "homedir"))
-+    return TRUE; /* Not the right item - keep on running.  */
-+
-+  p = strchr (value, ':');
-+  if (p)
-+    *p = 0;
-+  decode_percent_string (value);
-+  parm->homedir = g_strdup (value);
-+  return FALSE; /* Ready - force an EOF.  */
-+}
-+
-+
-+/* Retrieve the default home directory via gpgconf and return it as a
-+   malloced string.  If this is not possible, return NULL.  */
-+static char *
-+homedir_from_gpgconf (void)
-+{
-+  struct homedir_from_gpgconf_s parm;
-+
-+  memset (&parm, 0, sizeof parm);
-+
-+  parm.loop = g_main_loop_new (NULL, TRUE);
-+
-+  if (gpa_start_simple_gpg_command
-+      (homedir_from_gpgconf_parser, &parm,
-+       GPGME_PROTOCOL_GPGCONF, 0, "--list-dirs", NULL))
-+    {
-+      g_main_loop_unref (parm.loop);
-+      return NULL;
-+    }
-+
-+  g_main_loop_run (parm.loop);
-+  g_main_loop_unref (parm.loop);
-+  return parm.homedir;
-+}
-+
-+
- /* Get the path to the default home directory.  */
- gchar *
- default_homedir (void)
- {
-   gchar *dir;
-
-+  dir = homedir_from_gpgconf ();
-+  if (dir)
-+    {
-+      g_debug ("Found homedir '%s' via gpgconf", dir);
-+      return dir;
-+    }
-+
-   /* g_getenv returns string in filename encoding.  */
-   dir = (gchar *) g_getenv ("GNUPGHOME");
-   if (dir && dir[0])
-@@ -166,7 +239,7 @@ default_homedir (void)
-         dir = NULL;
-       }
-     }
--
-+
-   if (! dir)
-     {
-       char path[MAX_PATH];
-@@ -178,7 +251,7 @@ default_homedir (void)
-          using a system roaming serives might be better than to let
-          them do it manually.  A security conscious user will anyway
-          use the registry entry to have better control.  */
--      if (w32_shgetfolderpath (NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE,
-+      if (w32_shgetfolderpath (NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE,
-                                NULL, 0, path) >= 0)
-         {
-         dir = g_build_filename (path, "gnupg", NULL);
-diff --git a/src/gpa.h b/src/gpa.h
-index a20d704..a321698 100644
---- a/src/gpa.h
-+++ b/src/gpa.h
-@@ -131,6 +131,7 @@ char *decode_c_string (const char *src);
- char *percent_escape (const char *string,
-                       const char *delimiters, int space2plus);
- size_t percent_unescape (char *string, int plus2space);
-+void decode_percent_string (char *str);
-
-
- /*-- Convenience macros. -- */
-diff --git a/src/gpgmetools.c b/src/gpgmetools.c
-index 5d4beae..a6ff3d8 100644
---- a/src/gpgmetools.c
-+++ b/src/gpgmetools.c
-@@ -1435,20 +1435,21 @@ is_gpg_version_at_least (const char *need_version)
- }
-
-
--/* Structure used to communicate with gpg_simple_stderr_cb.  */
--struct gpg_simple_stderr_parm_s
-+/* Structure used to communicate with gpg_simple_stdio_cb.  */
-+struct gpg_simple_stdio_parm_s
- {
-   gboolean (*cb)(void *opaque, char *line);
-   void *cb_arg;
-   GString *string;
-+  int only_status_lines;
- };
-
- /* Helper for gpa_start_simple_gpg_command.  */
- static gboolean
--gpg_simple_stderr_cb (GIOChannel *channel, GIOCondition condition,
--                      void *user_data)
-+gpg_simple_stdio_cb (GIOChannel *channel, GIOCondition condition,
-+                     void *user_data)
- {
--  struct gpg_simple_stderr_parm_s *parm = user_data;
-+  struct gpg_simple_stdio_parm_s *parm = user_data;
-   GIOStatus status;
-   char *line, *p;
-
-@@ -1461,27 +1462,41 @@ gpg_simple_stderr_cb (GIOChannel *channel, GIOCondition condition,
-         {
-           line = parm->string->str;
-
-+          /* Strip line terminator.  */
-+          p = strchr (line, '\n');
-+          if (p)
-+            {
-+              if (p > line && p[-1] == '\r')
-+                p[-1] = 0;
-+              else
-+                *p = 0;
-+            }
-+
-           /* We care only about status lines.  */
--          if (!strncmp (line, "[GNUPG:] ", 9))
-+          if (parm->only_status_lines && !strncmp (line, "[GNUPG:] ", 9))
-             {
-               line += 9;
-
--              /* Strip line terminator.  */
--              p = strchr (line, '\n');
--              if (p)
-+              /* Call user callback.  */
-+              if (parm->cb && !parm->cb (parm->cb_arg, line))
-                 {
--                  if (p > line && p[-1] == '\r')
--                    p[-1] = 0;
--                  else
--                    *p = 0;
-+                  /* User requested EOF.  */
-+                  goto cleanup;
-                 }
--
-+              /* Return direct so that we do not run into the G_IO_HUP
-+                 check.  This is required to read all buffered input.  */
-+              return TRUE;  /* Keep on watching this channel. */
-+            }
-+          else if (!parm->only_status_lines)
-+            {
-               /* Call user callback.  */
-               if (parm->cb && !parm->cb (parm->cb_arg, line))
-                 {
-                   /* User requested EOF.  */
-                   goto cleanup;
-                 }
-+
-+              return TRUE;  /* Keep on watching this channel. */
-             }
-         }
-       if (status != G_IO_STATUS_NORMAL && status != G_IO_STATUS_AGAIN )
-@@ -1517,20 +1532,22 @@ gpg_simple_stderr_cb (GIOChannel *channel, GIOCondition condition,
-    is used to call gpg-connect-agent.
-
-    If the function returns success the provided callback CB is called
--   for each line received on STDERR.  EOF is send to this callback by
--   passing a LINE argument of NULL.  The callback may use this for
--   cleanup. If the callback returns FALSE, an EOF is forced with the
--   result that the callback is called once more with LINE set to NULL.  */
-+   for each line received on stdout (respective stderr if USE_STADERR
-+   is true).  EOF is send to this callback by passing a LINE as NULL.
-+   The callback may use this for cleanup.  If the callback returns
-+   FALSE, an EOF is forced so that the callback is called once more
-+   with LINE set to NULL.  */
- gpg_error_t
- gpa_start_simple_gpg_command (gboolean (*cb)(void *opaque, char *line),
-                               void *cb_arg, gpgme_protocol_t protocol,
-+                              int use_stderr,
-                               const char *first_arg, ...)
- {
-   char *argv[24];
-   int argc;
--  int fd_stderr;
-+  int fd_stdio;
-   GIOChannel *channel;
--  struct gpg_simple_stderr_parm_s *parm = NULL;
-+  struct gpg_simple_stdio_parm_s *parm = NULL;
-   char *freeme = NULL;
-
-   if (protocol == GPGME_PROTOCOL_OpenPGP)
-@@ -1571,11 +1588,17 @@ gpa_start_simple_gpg_command (gboolean (*cb)(void *opaque, char *line),
-   parm->cb = cb;
-   parm->cb_arg = cb_arg;
-   parm->string = g_string_sized_new (200);
-+  parm->only_status_lines = use_stderr;
-
-   if (!g_spawn_async_with_pipes (NULL, argv, NULL,
--                                 (G_SPAWN_STDOUT_TO_DEV_NULL),
-+                                 (use_stderr
-+                                  ? G_SPAWN_STDOUT_TO_DEV_NULL
-+                                  : G_SPAWN_STDERR_TO_DEV_NULL),
-                                  NULL, NULL, NULL,
--                                 NULL, NULL, &fd_stderr, NULL))
-+                                 NULL,
-+                                 use_stderr? NULL : &fd_stdio,
-+                                 use_stderr? &fd_stdio : NULL,
-+                                 NULL))
-     {
-       gpa_window_error (_("Calling the crypto engine program failed."), NULL);
-       xfree (parm);
-@@ -1584,9 +1607,9 @@ gpa_start_simple_gpg_command (gboolean (*cb)(void *opaque, char *line),
-     }
-   g_free (freeme);
- #ifdef G_OS_WIN32
--  channel = g_io_channel_win32_new_fd (fd_stderr);
-+  channel = g_io_channel_win32_new_fd (fd_stdio);
- #else
--  channel = g_io_channel_unix_new (fd_stderr);
-+  channel = g_io_channel_unix_new (fd_stdio);
- #endif
-   g_io_channel_set_encoding (channel, NULL, NULL);
-   /* Note that we need a buffered channel, so that we can use the read
-@@ -1595,7 +1618,7 @@ gpa_start_simple_gpg_command (gboolean (*cb)(void *opaque, char *line),
-
-   /* Create a watch for the channel.  */
-   if (!g_io_add_watch (channel, (G_IO_IN|G_IO_HUP),
--                       gpg_simple_stderr_cb, parm))
-+                       gpg_simple_stdio_cb, parm))
-     {
-       g_debug ("error creating watch for gpg command");
-       g_io_channel_unref (channel);
-@@ -1613,7 +1636,7 @@ gpa_start_simple_gpg_command (gboolean (*cb)(void *opaque, char *line),
- void
- gpa_start_agent (void)
- {
--  gpa_start_simple_gpg_command (NULL, NULL, GPGME_PROTOCOL_ASSUAN,
-+  gpa_start_simple_gpg_command (NULL, NULL, GPGME_PROTOCOL_ASSUAN, 1,
-                                 "NOP", "/bye", NULL);
- }
-
-diff --git a/src/gpgmetools.h b/src/gpgmetools.h
-index 2953362..e8b2c34 100644
---- a/src/gpgmetools.h
-+++ b/src/gpgmetools.h
-@@ -209,6 +209,7 @@ gpg_error_t gpa_start_simple_gpg_command (gboolean (*cb)
-                                           (void *opaque, char *line),
-                                           void *cb_arg,
-                                           gpgme_protocol_t protocol,
-+                                          int use_stderr,
-                                           const char *first_arg, ...
-                                           ) G_GNUC_NULL_TERMINATED;
-
-diff --git a/src/server.c b/src/server.c
-index d220ccb..1ce9a89 100644
---- a/src/server.c
-+++ b/src/server.c
-@@ -1255,53 +1255,6 @@ hextobyte (const char *str)
- }
-
-
--/* Decode the percent escaped string STR in place.  */
--static void
--decode_percent_string (char *str)
--{
--  char *src = str;
--  char *dest = str;
--
--  /* Convert the string.  */
--  while (*src)
--    {
--      if (*src != '%')
--        {
--          *(dest++) = *(src++);
--          continue;
--        }
--      else
--        {
--          int val = hextobyte (&src[1]);
--
--          if (val == -1)
--            {
--              /* Should not happen.  */
--              *(dest++) = *(src++);
--              if (*src)
--                *(dest++) = *(src++);
--              if (*src)
--                *(dest++) = *(src++);
--            }
--          else
--            {
--              if (!val)
--                {
--                  /* A binary zero is not representable in a C
--                     string.  */
--                  *(dest++) = '\\';
--                  *(dest++) = '0';
--                }
--              else
--                *((unsigned char *) dest++) = val;
--              src += 3;
--            }
--        }
--    }
--  *(dest++) = 0;
--}
--
--
- /* FILE <file> [--continued]
-
-    Set the files on which to operate.
-diff --git a/src/utils.c b/src/utils.c
-index 1b8dbaa..0d3379f 100644
---- a/src/utils.c
-+++ b/src/utils.c
-@@ -65,7 +65,7 @@ xcalloc (size_t n, size_t m)
-     memset (p, 0, nbytes);
-   else
-     {
--      g_error ("%s: failed to allocate %lu bytes",
-+      g_error ("%s: failed to allocate %lu bytes",
-                G_STRLOC, (unsigned long)nbytes);
-       abort (); /* Just in case g_error returns.  */
-     }
-@@ -97,7 +97,7 @@ translate_sys2libc_fd (assuan_fd_t fd, int for_write)
-
-   if (fd == ASSUAN_INVALID_FD)
-     return -1;
--
-+
-   /* Note that _open_osfhandle is currently defined to take and return
-      a long.  */
-   x = _open_osfhandle ((long)fd, for_write ? 1 : 0);
-@@ -111,15 +111,15 @@ translate_sys2libc_fd (assuan_fd_t fd, int for_write)
-
-
- #ifdef HAVE_W32_SYSTEM
--int
-+int
- inet_aton (const char *cp, struct in_addr *inp)
- {
-   if (!cp || !*cp || !inp)
-     {
-       errno = EINVAL;
--      return 0;
-+      return 0;
-     }
--
-+
-   if (!strcmp(cp, "255.255.255.255"))
-     {
-       /*  Although this is a valid address, the old inet_addr function
-@@ -127,7 +127,7 @@ inet_aton (const char *cp, struct in_addr *inp)
-         inp->s_addr = INADDR_NONE;
-         return 1;
-     }
--
-+
-   inp->s_addr = inet_addr (cp);
-   return (inp->s_addr != INADDR_NONE);
- }
-@@ -226,9 +226,9 @@ decode_c_string (const char *src)
-                      this will also never be larger than the source
-                      string.  */
-                   *(dest++) = '\\';
--                  *(dest++) = '0';
-+                  *(dest++) = '0';
-                 }
--              else
-+              else
-                 *((unsigned char *) dest++) = val;
-               src += 4;
-             }
-@@ -322,7 +322,7 @@ percent_unescape (char *string, int plus2space)
-   while (*string)
-     {
-       if (*string == '%' && string[1] && string[2])
--        {
-+        {
-           string++;
-           *p++ = xtoi_2 (string);
-           n++;
-@@ -345,3 +345,50 @@ percent_unescape (char *string, int plus2space)
- }
-
-
-+/* Decode the percent escaped string STR in place.  In contrast to
-+   percent_unescape, this make sure that the result is a string and in
-+   addition escapes embedded nuls. */
-+void
-+decode_percent_string (char *str)
-+{
-+  char *src = str;
-+  char *dest = str;
-+
-+  /* Convert the string.  */
-+  while (*src)
-+    {
-+      if (*src != '%')
-+        {
-+          *(dest++) = *(src++);
-+          continue;
-+        }
-+      else
-+        {
-+          int val = hextobyte (&src[1]);
-+
-+          if (val == -1)
-+            {
-+              /* Should not happen.  */
-+              *(dest++) = *(src++);
-+              if (*src)
-+                *(dest++) = *(src++);
-+              if (*src)
-+                *(dest++) = *(src++);
-+            }
-+          else
-+            {
-+              if (!val)
-+                {
-+                  /* A binary zero is not representable in a C
-+                     string.  */
-+                  *(dest++) = '\\';
-+                  *(dest++) = '0';
-+                }
-+              else
-+                *((unsigned char *) dest++) = val;
-+              src += 3;
-+            }
-+        }
-+    }
-+  *(dest++) = 0;
-+}
---
-1.7.7.1
diff --git a/patches/gpa-0.9.4/04-utf-clip-crash.patch b/patches/gpa-0.9.4/04-utf-clip-crash.patch
deleted file mode 100755 (executable)
index 3460a62..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-#! /bin/sh
-patch -p1 -l -f $* < $0
-exit $?
-
-
-From d3f20e7883f2fb9e52e487fd516bdc7b9bc695ed Mon Sep 17 00:00:00 2001
-From: Werner Koch <wk@gnupg.org>
-Date: Fri, 16 Aug 2013 15:18:57 +0200
-Subject: [PATCH] w32: Fix crash due to bad conversions of utf-8 in the
- clipboard.
-
-* src/gpgmetools.c (dos_to_unix): Remove.  Remove all calls.
-(dump_data_to_clipboard): Return an error code instead of calling
-exit.
-* src/gpaexportclipop.c
-(gpa_export_clipboard_operation_complete_export): Print success
-message only on success.
---
-
-The removal of dos_to_unix is possible due to the patch
-https://bugzilla.gnome.org/show_bug.cgi?id=649390 which will go into
-the next Gtk+ 2.24 version.dos_to_unix was anyway not correct because
-it scanned for an embedded nul but it is not guaranteed that it is
-always called with one.
-
-The other patch which will be helpful is:
-https://bugzilla.gnome.org/show_bug.cgi?id=696232
-(g_utf8_to_utf16() is not guaranteed to succeed. Check the error and
- return if it failed.)
-
-Gpg4win uses both patches.
-
-GnuPG-bug-id: 1525
----
- src/clipboard.c       |   12 ------------
- src/gpaexportclipop.c |    8 ++++----
- src/gpgmetools.c      |   43 +++++++------------------------------------
- src/gpgmetools.h      |    5 -----
- 4 files changed, 11 insertions(+), 57 deletions(-)
-
-diff --git a/src/clipboard.c b/src/clipboard.c
-index 682bd34..01b6058 100644
---- a/src/clipboard.c
-+++ b/src/clipboard.c
-@@ -283,10 +283,6 @@ file_created_cb (GpaFileOperation *op, gpa_file_item_t item, gpointer data)
-                        NULL, &len, NULL);
-       if (str)
-         {
--#ifdef G_OS_WIN32
--          dos_to_unix (str, &item->direct_out_len);
--#endif
--
-           gtk_text_buffer_set_text (clipboard->text_buffer, str, len);
-           g_free (str);
-           return;
-@@ -296,10 +292,6 @@ file_created_cb (GpaFileOperation *op, gpa_file_item_t item, gpointer data)
-       /* Enough warnings: Try to show even with invalid encoding.  */
-     }
-
--#ifdef G_OS_WIN32
--  dos_to_unix (item->direct_out, &item->direct_out_len);
--#endif
--
-   gtk_text_buffer_set_text (clipboard->text_buffer,
-                           item->direct_out, item->direct_out_len);
- }
-@@ -481,10 +473,6 @@ file_open (GtkAction *action, gpointer param)
-       return;
-     }
-
--#ifdef G_OS_WIN32
--  dos_to_unix (contents, &length);
--#endif
--
-   gtk_text_buffer_set_text (clipboard->text_buffer, contents, length);
-   g_free (contents);
- }
-diff --git a/src/gpaexportclipop.c b/src/gpaexportclipop.c
-index 0ce88af..62edb12 100644
---- a/src/gpaexportclipop.c
-+++ b/src/gpaexportclipop.c
-@@ -134,10 +134,10 @@ static void
- gpa_export_clipboard_operation_complete_export (GpaExportOperation *operation)
- {
-   GpaExportClipboardOperation *op = GPA_EXPORT_CLIPBOARD_OPERATION (operation);
--  dump_data_to_clipboard (operation->dest, gtk_clipboard_get
--                        (GDK_SELECTION_CLIPBOARD));
--  gpa_window_message (_("The keys have been copied to the clipboard."),
--                    GPA_OPERATION (op)->window);
-+  if (!dump_data_to_clipboard (operation->dest, gtk_clipboard_get
-+                               (GDK_SELECTION_CLIPBOARD)))
-+    gpa_window_message (_("The keys have been copied to the clipboard."),
-+                        GPA_OPERATION (op)->window);
- }
-
- /* API */
-diff --git a/src/gpgmetools.c b/src/gpgmetools.c
-index 2b4be56..63f6b8d 100644
---- a/src/gpgmetools.c
-+++ b/src/gpgmetools.c
-@@ -294,37 +294,12 @@ gpa_gpgme_data_new_from_file (gpgme_data_t *data,
- }
-
-
--#ifdef G_OS_WIN32
--/* Convert newlines.  */
--void
--dos_to_unix (gchar *str, gsize *len)
--{
--  /* On Windows 2000, we need to convert \r\n to \n in the output for
--     cut & paste to work properly (otherwise, extra newlines will be
--     inserted).  */
--  gchar *src;
--  gchar *dst;
--
--  src = str;
--  dst = str;
--  while (*src)
--    {
--      if (src[0] == '\r' && src[1] == '\n')
--      src++;
--      *(dst++) = *(src++);
--    }
--  *dst = '\0';
--  *len = dst - str;
--}
--#endif
--
--
- /* Write the contents of the gpgme_data_t into the clipboard.  Assumes
--   that the data is ASCII.  */
--void
-+   that the data is ASCII.  Return 0 on success.  */
-+int
- dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard)
- {
--  char buffer[128];
-+  char buffer[512];
-   int nread;
-   gchar *text = NULL;
-   size_t len = 0;
-@@ -333,27 +308,23 @@ dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard)
-   if (nread == -1)
-     {
-       gpa_window_error (strerror (errno), NULL);
--      exit (EXIT_FAILURE);
-+      return -1;
-     }
-   while ((nread = gpgme_data_read (data, buffer, sizeof (buffer))) > 0)
-     {
--      text = g_realloc (text, len + nread);
-+      text = g_realloc (text, len + nread + 1);
-       strncpy (text + len, buffer, nread);
-       len += nread;
-     }
-   if (nread == -1)
-     {
-       gpa_window_error (strerror (errno), NULL);
--      exit (EXIT_FAILURE);
-+      return -1;
-     }
-
--#ifdef G_OS_WIN32
--  dos_to_unix (text, &len);
--#endif
--
-   gtk_clipboard_set_text (clipboard, text, (int)len);
-   g_free (text);
--  return;
-+  return 0;
- }
-
-
---- a/src/gpgmetools.h 2013-08-16 16:12:46.648003898 +0200
-+++ b/src/gpgmetools.h 2013-08-16 16:13:14.836003193 +0200
-@@ -112,13 +112,8 @@
- int gpa_open_input (const char *filename, gpgme_data_t *data,
-                    GtkWidget *parent);
-
--#ifdef G_OS_WIN32
--/* Convert newlines.  */
--void dos_to_unix (gchar *str, gsize *len);
--#endif
--
- /* Write the contents of the gpgme_data_t into the clipboard.  */
--void dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard);
-+int dump_data_to_clipboard (gpgme_data_t data, GtkClipboard *clipboard);
-
- /* Begin generation of a key with the given parameters.  It prepares
-    the parameters required by Gpgme and returns whatever
diff --git a/patches/gpa-0.9.4/05-event-done.patch b/patches/gpa-0.9.4/05-event-done.patch
deleted file mode 100755 (executable)
index a9c68c2..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#! /bin/sh
-patch -p1 -l -f $* < $0
-exit $?
-
-From 45eb36a00e0bb39fd02cb065e79cbc53945e7103 Mon Sep 17 00:00:00 2001
-From: Werner Koch <wk@gnupg.org>
-Date: Mon, 19 Aug 2013 20:29:25 +0200
-Subject: [PATCH] Fix wrong use of GPGME_EVENT_DONE.
-
-* src/gpacontext.c (gpa_context_event_cb): Fix use of TYPE_DATA.  Add
-debug output.
---
-
-With GPGME commit c8e934b2 (2009-10-26) gpgme_io_event_done_data_t was
-introduced to replace the use of gpg_error_t with GPGME_EVENT_DONE.
-Unfortunately this was not documented.  Maybe at that time the event
-code was considered internal and its use in GPA was not known.  Too
-bad.
----
- src/gpacontext.c |   13 +++++++++----
- 1 files changed, 9 insertions(+), 4 deletions(-)
-
-diff --git a/src/gpacontext.c b/src/gpacontext.c
-index e021d5f..b049f84 100644
---- a/src/gpacontext.c
-+++ b/src/gpacontext.c
-@@ -405,16 +405,21 @@ static void
- gpa_context_event_cb (void *data, gpgme_event_io_t type, void *type_data)
- {
-   GpaContext *context = data;
--  gpg_error_t *err;
--
-+  gpg_error_t err, op_err;
-+
-   switch (type)
-     {
-     case GPGME_EVENT_START:
-       g_signal_emit (context, signals[START], 0);
-       break;
-     case GPGME_EVENT_DONE:
--      err = type_data;
--      g_signal_emit (context, signals[DONE], 0, *err);
-+      err = ((gpgme_io_event_done_data_t)type_data)->err;
-+      op_err = ((gpgme_io_event_done_data_t)type_data)->op_err;
-+      g_debug ("EVENT_DONE: err=%s op_err=%s",
-+               gpg_strerror (err), gpg_strerror (op_err));
-+      if (!err)
-+        err = op_err;
-+      g_signal_emit (context, signals[DONE], 0, err);
-       break;
-     case GPGME_EVENT_NEXT_KEY:
-       g_signal_emit (context, signals[NEXT_KEY], 0, type_data);
---
-1.7.7.1