Support --locate-keys feature of gpg.
authorWerner Koch <wk@gnupg.org>
Wed, 7 May 2008 15:41:14 +0000 (15:41 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 7 May 2008 15:41:14 +0000 (15:41 +0000)
trunk/NEWS
trunk/TODO
trunk/doc/gpgme.texi
trunk/gpgme/ChangeLog
trunk/gpgme/engine-gpgconf.c
trunk/gpgme/gpgme.h
trunk/gpgme/rungpg.c

index 845509176ee7b6473670034dad94ec90cc12a88d..0fb12fc5a869cb77c8ae47e5fa3a7b874e7ed267 100644 (file)
@@ -1,6 +1,10 @@
 Noteworthy changes in version 1.1.7 (unreleased)
 ------------------------------------------------
 
+ * Using GPGME_KEYLIST_MODE_LOCAL combined with
+   GPGME_KEYLIST_MODE_EXTERN is now supported; it uses the
+   --locate-keys feature of gpg (>= 2.0.10).
+   
  * The encoding of gpgme_data_t objects can affect the output encoding
    of export, sign and encrypt operations now (the same operations
    that are also affected by the ASCII mode switch).  We believe this
index 2c180e035295055ef1ff11d1ccbfd4c9cc63dcd4..bd961a5a3bee120db1f2e1bc28f6577f328b6583 100644 (file)
@@ -148,6 +148,10 @@ Hey Emacs, this is -*- outline -*- mode!
 ** Map ASSUAN/GpgSM ERR error values in a better way than is done now. !!
 ** Some error values should identify the source more correctly (mostly error
    values derived from status messages).
+** In rungpg.c we need to check the version of the engine
+   This requires a way to get the cached version number from the
+   engine layer.
+
 
 * Tests
 ** Write a fake gpg-agent so that we can supply known passphrases to
index 1f1a8a6cb4cdd5990cf3c4378993c6ec9a85e80c..cb59355a4f5eb848aa5d0fc534f87d8cbdf47357 100644 (file)
@@ -2180,10 +2180,10 @@ is the default.
 
 @item GPGME_KEYLIST_MODE_EXTERN
 The @code{GPGME_KEYLIST_MODE_EXTERN} symbol specifies that an external
-source should be searched for keys in the keylisting
-operation.  The type of external source is dependant on the crypto
-engine used.  For example, it can be a remote keyserver or LDAP
-certificate server.
+source should be searched for keys in the keylisting operation.  The
+type of external source is dependant on the crypto engine used and
+whether it is combined with @code{GPGME_KEYLIST_MODE_LOCAL}.  For
+example, it can be a remote keyserver or LDAP certificate server.
 
 @item GPGME_KEYLIST_MODE_SIGS
 The @code{GPGME_KEYLIST_MODE_SIGS} symbol specifies that the key
@@ -2208,7 +2208,7 @@ At least one of @code{GPGME_KEYLIST_MODE_LOCAL} and
 @code{GPGME_KEYLIST_MODE_EXTERN} must be specified.  For future binary
 compatibility, you should get the current mode with
 @code{gpgme_get_keylist_mode} and modify it by setting or clearing the
-appropriate bits, and then using that calulcated value in the
+appropriate bits, and then using that calculated value in the
 @code{gpgme_set_keylisting_mode} operation.  This will leave all other
 bits in the mode value intact (in particular those that are not used
 in the current version of the library).
index 23b5c5d2d0149166d0b85c262b2ca49b6205fcff..7c47da874e87e70578ddcc47fcc9cf0a9240d56b 100644 (file)
@@ -1,3 +1,14 @@
+2008-05-07  Werner Koch  <wk@g10code.com>
+
+       * engine-gpgconf.c (gpgconf_write): Change argv[0] to a
+       self-explaining string.  Needs a proper fix, though.
+
+       * rungpg.c (gpg_keylist, gpg_keylist_ext): Factor common code out
+       to ..
+       (gpg_build_keylist_options): .. new. Allow combination of extern
+       and intern mode.
+       (gpg_new): DFT_TTYNAME is an array, thus check the first character.
+
 2008-05-06  Werner Koch  <wk@g10code.com>
 
        * version.c (extract_version_string): New.
index 456f330cb89d227f40b562ab84c3d543c7724d26..ede2c9cf98d73d3ae01342711f43ecfdee48db03 100644 (file)
@@ -628,7 +628,7 @@ gpgconf_write (void *engine, char *arg1, char *arg2, gpgme_data_t conf)
 
   /* _gpgme_engine_new guarantees that this is not NULL.  */
   argv[0] = gpgconf->file_name;
-  argv[0] = "/home/marcus/g10/install/bin/gpgconf";
+  argv[0] = "/nowhere/path-needs-to-be-fixed/gpgconf";
 
   if (_gpgme_io_pipe (rp, 0) < 0)
     return gpg_error_from_syserror ();
index af6b239c3643bb2e66b55f4a86456b47a61c18d0..7bd8aae50a4182a7bc5f3f68abb7b5a988123742 100644 (file)
@@ -72,7 +72,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 "1.1.7-svn1307"
+#define GPGME_VERSION "1.1.7-svn1311"
 
 
 \f
index 64a8ee2001d9c574e2f78173f02f947f25d2897c..f4ca2ad512a96f7fea908c4298c19f97efe04ace 100644 (file)
@@ -486,7 +486,7 @@ gpg_new (void **engine, const char *file_name, const char *home_dir)
        rc = gpg_error_from_errno (errno);
       else
        {
-          if (dft_ttyname)
+          if (*dft_ttyname)
             {
               rc = add_arg (gpg, "--ttyname");
               if (!rc)
@@ -1872,20 +1872,12 @@ gpg_keylist_preprocess (char *line, char **r_line)
 }
 
 
-static gpgme_error_t
-gpg_keylist (void *engine, const char *pattern, int secret_only,
-            gpgme_keylist_mode_t mode)
+static gpg_error_t
+gpg_keylist_build_options (engine_gpg_t gpg, int secret_only,
+                           gpgme_keylist_mode_t mode)
 {
-  engine_gpg_t gpg = engine;
-  gpgme_error_t err;
+  gpg_error_t err;
 
-  if (mode & GPGME_KEYLIST_MODE_EXTERN)
-    {
-      if ((mode & GPGME_KEYLIST_MODE_LOCAL)
-         || secret_only)
-       return gpg_error (GPG_ERR_NOT_SUPPORTED);
-    }
-  
   err = add_arg (gpg, "--with-colons");
   if (!err)
     err = add_arg (gpg, "--fixed-list-mode");
@@ -1893,7 +1885,8 @@ gpg_keylist (void *engine, const char *pattern, int secret_only,
     err = add_arg (gpg, "--with-fingerprint");
   if (!err)
     err = add_arg (gpg, "--with-fingerprint");
-  if (!err && (mode & GPGME_KEYLIST_MODE_SIGS)
+  if (!err
+      && (mode & GPGME_KEYLIST_MODE_SIGS)
       && (mode & GPGME_KEYLIST_MODE_SIG_NOTATIONS))
     {
       err = add_arg (gpg, "--list-options");
@@ -1902,22 +1895,51 @@ gpg_keylist (void *engine, const char *pattern, int secret_only,
     }
   if (!err)
     {
-      if (mode & GPGME_KEYLIST_MODE_EXTERN)
+      if ( (mode & GPGME_KEYLIST_MODE_EXTERN) )
        {
-         err = add_arg (gpg, "--search-keys");
-         gpg->colon.preprocess_fnc = gpg_keylist_preprocess;
+          if (secret_only)
+            err = gpg_error (GPG_ERR_NOT_SUPPORTED);
+          else if ( (mode & GPGME_KEYLIST_MODE_LOCAL))
+            {
+              /* The local+extern mode is special.  It works only with
+                 gpg >= 2.0.10.  FIXME: We should check that we have
+                 such a version to that we can return a proper error
+                 code.  The problem is that we don't know the context
+                 here and thus can't accesses the cached version
+                 number for the engine info structure.  */
+              err = add_arg (gpg, "--locate-keys");
+              if ((mode & GPGME_KEYLIST_MODE_SIGS))
+                err = add_arg (gpg, "--with-sig-check");
+            }
+          else
+            {
+              err = add_arg (gpg, "--search-keys");
+              gpg->colon.preprocess_fnc = gpg_keylist_preprocess;
+            }
        }
       else
-       {
-         err = add_arg (gpg, secret_only ? "--list-secret-keys"
-                        : ((mode & GPGME_KEYLIST_MODE_SIGS)
-                           ? "--check-sigs" : "--list-keys"));
-       }
+        {
+          err = add_arg (gpg, secret_only ? "--list-secret-keys"
+                         : ((mode & GPGME_KEYLIST_MODE_SIGS)
+                            ? "--check-sigs" : "--list-keys"));
+        }
     }
-
-  /* Tell the gpg object about the data.  */
   if (!err)
     err = add_arg (gpg, "--");
+  
+  return err;
+}
+                           
+
+static gpgme_error_t
+gpg_keylist (void *engine, const char *pattern, int secret_only,
+            gpgme_keylist_mode_t mode)
+{
+  engine_gpg_t gpg = engine;
+  gpgme_error_t err;
+
+  err = gpg_keylist_build_options (gpg, secret_only, mode);
+
   if (!err && pattern && *pattern)
     err = add_arg (gpg, pattern);
 
@@ -1938,26 +1960,7 @@ gpg_keylist_ext (void *engine, const char *pattern[], int secret_only,
   if (reserved)
     return gpg_error (GPG_ERR_INV_VALUE);
 
-  err = add_arg (gpg, "--with-colons");
-  if (!err)
-    err = add_arg (gpg, "--fixed-list-mode");
-  if (!err)
-    err = add_arg (gpg, "--with-fingerprint");
-  if (!err)
-    err = add_arg (gpg, "--with-fingerprint");
-  if (!err && (mode & GPGME_KEYLIST_MODE_SIGS)
-      && (mode & GPGME_KEYLIST_MODE_SIG_NOTATIONS))
-    {
-      err = add_arg (gpg, "--list-options");
-      if (!err)
-       err = add_arg (gpg, "show-sig-subpackets=\"20,26\"");
-    }
-  if (!err)
-    err = add_arg (gpg, secret_only ? "--list-secret-keys"
-                  : ((mode & GPGME_KEYLIST_MODE_SIGS)
-                     ? "--check-sigs" : "--list-keys"));
-  if (!err)
-    err = add_arg (gpg, "--");
+  err = gpg_keylist_build_options (gpg, secret_only, mode);
 
   if (pattern)
     {