* engine-gpgsm.c (_gpgme_gpgsm_op_sign): Implement signer
authorWerner Koch <wk@gnupg.org>
Thu, 29 Aug 2002 11:57:53 +0000 (11:57 +0000)
committerWerner Koch <wk@gnupg.org>
Thu, 29 Aug 2002 11:57:53 +0000 (11:57 +0000)
selection.
* vasprintf.c (va_copy): Define macro if not yet defined.

gpgme/ChangeLog
gpgme/engine-gpgsm.c
gpgme/gpgme.h

index e64a7fa1f4defa462f900d27e70a0222aca087c9..3e5846db3ab7b9e2a4eaa81abf7dc080253d8cf2 100644 (file)
@@ -1,3 +1,9 @@
+2002-08-29  Werner Koch  <wk@gnupg.org>
+
+       * engine-gpgsm.c (_gpgme_gpgsm_op_sign): Implement signer
+       selection.
+       * vasprintf.c (va_copy): Define macro if not yet defined.
+
 2002-08-29  Marcus Brinkmann  <marcus@g10code.de>
 
        * passphrase.c (_gpgme_passphrase_status_handler): Reset
index 1d7ef2ed7d6a357da41bd721e4307009f6c0864c..0e2a7ce4682c34e3da88c46e088278efac425485 100644 (file)
@@ -1076,6 +1076,8 @@ _gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out,
 {
   GpgmeError err;
   char *assuan_cmd;
+  int i;
+  GpgmeKey key;
 
   if (!gpgsm)
     return mk_error (Invalid_Value);
@@ -1087,11 +1089,36 @@ _gpgme_gpgsm_op_sign (GpgsmObject gpgsm, GpgmeData in, GpgmeData out,
 
   if (asprintf (&assuan_cmd, "OPTION include-certs %i", include_certs) < 0)
     return mk_error (Out_Of_Core);
-  err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, assuan_cmd, NULL, NULL);
+  err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, assuan_cmd, NULL,NULL);
   free (assuan_cmd);
   if (err)
     return err;
 
+  /* We must do a reset becuase we need to reset the list of signers.  Note
+     that RESET does not reset OPTION commands. */
+  err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, "RESET", NULL, NULL);
+  if (err)
+    return err;
+
+  for (i = 0; (key = gpgme_signers_enum (ctx, i)); i++)
+    {
+      const char *s = gpgme_key_get_string_attr (key, GPGME_ATTR_FPR,
+                                                NULL, 0);
+      if (s && strlen (s) < 80)
+       {
+          char buf[100];
+
+          strcpy (stpcpy (buf, "SIGNER "), s);
+          err = gpgsm_assuan_simple_command (gpgsm->assuan_ctx, buf,
+                                             NULL, NULL);
+       }
+      else
+        err = GPGME_Invalid_Key;
+      gpgme_key_unref (key);
+      if (err) 
+        return err;
+    }
+
   gpgsm->input_cb.data = in;
   err = gpgsm_set_fd (gpgsm->assuan_ctx, "INPUT", gpgsm->input_fd_server,
                       map_input_enc (gpgsm->input_cb.data));
index ed82ecfe7a5d82fa5a2448ce2a70f0c7c868d498..2fc4d67ee6b3188a98afdc83fb26470f5ebc1a8b 100644 (file)
@@ -43,7 +43,7 @@ extern "C" {
    AM_PATH_GPGME macro) check that this header matches the installed
    library.  Warning: Do not edit the next line.  configure will do
    that for you!  */
-#define GPGME_VERSION "0.3.9"
+#define GPGME_VERSION "0.3.10"
 
 
 /* The opaque data types used by GPGME.  */