[git] GPGME - branch, master, updated. gpgme-1.8.0-108-g35023f3

by Andre Heinecke cvs at cvs.gnupg.org
Tue Mar 21 09:53:51 CET 2017


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GnuPG Made Easy".

The branch, master has been updated
       via  35023f313622fb1b34108dd934e84831c58b81aa (commit)
      from  ea9686ec71a2dd2225ce2b6d6d4038821d36205f (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 35023f313622fb1b34108dd934e84831c58b81aa
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Tue Mar 21 09:38:11 2017 +0100

    core: New public API gpgme_op_keylist_from_data_start.
    
    * src/gpgme.h.in: New API gpgme_op_keylist_from_data_start.
    * src/libgpgme.vers, src/gpgme.def: Add it.
    * src/keylist.c (gpgme_op_keylist_from_data_start): New.
    * src/engine-backend.h (engine_ops): Add field 'keylist_data'.  Change
    all engines to pass NULL for it.
    * src/engine.c (_gpgme_engine_op_keylist_data): New.
    * src/engine-gpg.c (gpg_keylist_data): New.
    (_gpgme_engine_ops_gpg): Register gpg_keylist_data.
    
    * tests/run-keylist.c (main): New option --from-file.
    --
    
    Co-authored-by: Werner Koch <wk at gnupg.org>
    GnuPG-bug-id: 2819

diff --git a/NEWS b/NEWS
index f2ab0bf..cf02fc2 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,8 @@ Noteworthy changes in version 1.8.1 (unreleased)
  gpgme_op_createsubkey       CHANGED: Meaning of 'expire' parameter.
  GPGME_CREATE_NOEXPIRE       NEW.
  gpgme_subkey_t              EXTENDED: New field is_de_vs.
+ gpgme_op_keylist_from_data_start NEW.
+ gpgme_data_rewind                UN-DEPRECATE.
  cpp: Context::revUid(const Key&, const char*)      NEW.
  cpp: Context::startRevUid(const Key&, const char*) NEW.
  cpp: Context::addUid(const Key&, const char*)      NEW.
@@ -22,7 +24,6 @@ Noteworthy changes in version 1.8.1 (unreleased)
  cpp: Subkey::keyGrip                               NEW.
  cpp: Subkey::isDeVs                                NEW.
  qt: CryptoConfig::stringValueList()                NEW.
- gpgme_data_rewind                                  UN-DEPRECATE.
  py: Context.__init__        EXTENDED: New keyword arg home_dir.
  py: Context.home_dir        NEW.
  py: Context.keylist         EXTENDED: New keyword arg mode.
diff --git a/doc/gpgme.texi b/doc/gpgme.texi
index 337053f..edcbb98 100644
--- a/doc/gpgme.texi
+++ b/doc/gpgme.texi
@@ -3342,6 +3342,7 @@ This is a linked list with the notation data and policy URLs.
 @cindex key ring, search
 
 @deftypefun gpgme_error_t gpgme_op_keylist_start (@w{gpgme_ctx_t @var{ctx}}, @w{const char *@var{pattern}}, @w{int @var{secret_only}})
+
 The function @code{gpgme_op_keylist_start} initiates a key listing
 operation inside the context @var{ctx}.  It sets everything up so that
 subsequent invocations of @code{gpgme_op_keylist_next} return the keys
@@ -3369,6 +3370,7 @@ are reported by the crypto engine support routines.
 @end deftypefun
 
 @deftypefun gpgme_error_t gpgme_op_keylist_ext_start (@w{gpgme_ctx_t @var{ctx}}, @w{const char *@var{pattern}[]}, @w{int @var{secret_only}}, @w{int @var{reserved}})
+
 The function @code{gpgme_op_keylist_ext_start} initiates an extended
 key listing operation inside the context @var{ctx}.  It sets
 everything up so that subsequent invocations of
@@ -3399,7 +3401,36 @@ The function returns the error code @code{GPG_ERR_INV_VALUE} if
 are reported by the crypto engine support routines.
 @end deftypefun
 
+ at deftypefun gpgme_error_t gpgme_op_keylist_from_data @
+            (@w{gpgme_ctx_t @var{ctx}}, @
+             @w{gpgme_data_t @var{data}}, @
+             @w{int @var{reserved}})
+
+The function @code{gpgme_op_keylist_from_data_start} initiates a key
+listing operation inside the context @var{ctx}.  In contrast to the
+other key listing operation the keys are read from the supplied
+ at var{data} and not from the local key database.  The keys are also not
+imported into the local ley database. The function sets everything up
+so that subsequent invocations of @code{gpgme_op_keylist_next} return
+the keys from @var{data}.
+
+The value of @var{reserved} must be @code{0}.
+
+This function requires at least GnuPG version 2.1.14 and currently
+works only with OpenPGP keys.
+
+The context will be busy until either all keys are received (and
+ at code{gpgme_op_keylist_next} returns @code{GPG_ERR_EOF}), or
+ at code{gpgme_op_keylist_end} is called to finish the operation.
+While the context is busy @var{data} may not be released.
+
+The function returns the error code @code{GPG_ERR_INV_VALUE} if
+ at var{ctx} is not a valid pointer, and passes through any errors that
+are reported by the crypto engine support routines.
+ at end deftypefun
+
 @deftypefun gpgme_error_t gpgme_op_keylist_next (@w{gpgme_ctx_t @var{ctx}}, @w{gpgme_key_t *@var{r_key}})
+
 The function @code{gpgme_op_keylist_next} returns the next key in the
 list created by a previous @code{gpgme_op_keylist_start} operation in
 the context @var{ctx}.  The key will have one reference for the user.
@@ -3417,6 +3448,7 @@ The function returns the error code @code{GPG_ERR_INV_VALUE} if
 @end deftypefun
 
 @deftypefun gpgme_error_t gpgme_op_keylist_end (@w{gpgme_ctx_t @var{ctx}})
+
 The function @code{gpgme_op_keylist_end} ends a pending key list
 operation in the context @var{ctx}.
 
@@ -3431,7 +3463,7 @@ time during the operation there was not enough memory available.
 
 The following example illustrates how all keys containing a certain
 string (@code{g10code}) can be listed with their key ID and the name
-and e-mail address of the main user ID:
+and email address of the main user ID:
 
 @example
 gpgme_ctx_t ctx;
diff --git a/src/engine-assuan.c b/src/engine-assuan.c
index 78efb4c..4beb41d 100644
--- a/src/engine-assuan.c
+++ b/src/engine-assuan.c
@@ -787,6 +787,7 @@ struct engine_ops _gpgme_engine_ops_assuan =
     NULL,               /* import */
     NULL,               /* keylist */
     NULL,               /* keylist_ext */
+    NULL,               /* keylist_data */
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,               /* sign */
diff --git a/src/engine-backend.h b/src/engine-backend.h
index a8457af..635acb0 100644
--- a/src/engine-backend.h
+++ b/src/engine-backend.h
@@ -100,6 +100,7 @@ struct engine_ops
 				int secret_only, int reserved,
 				gpgme_keylist_mode_t mode,
 				int engine_flags);
+  gpgme_error_t (*keylist_data) (void *engine, gpgme_data_t data);
   gpgme_error_t (*keysign) (void *engine,
                             gpgme_key_t key, const char *userid,
                             unsigned long expires, unsigned int flags,
diff --git a/src/engine-g13.c b/src/engine-g13.c
index bb06d35..593177c 100644
--- a/src/engine-g13.c
+++ b/src/engine-g13.c
@@ -802,6 +802,7 @@ struct engine_ops _gpgme_engine_ops_g13 =
     NULL,               /* import */
     NULL,               /* keylist */
     NULL,               /* keylist_ext */
+    NULL,               /* keylist_data */
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,               /* sign */
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 59cf405..4b87a8a 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -2731,6 +2731,38 @@ gpg_keylist_ext (void *engine, const char *pattern[], int secret_only,
 
 
 static gpgme_error_t
+gpg_keylist_data (void *engine, gpgme_data_t data)
+{
+  engine_gpg_t gpg = engine;
+  gpgme_error_t err;
+
+  if (!have_gpg_version (gpg, "2.1.14"))
+    return gpg_error (GPG_ERR_NOT_SUPPORTED);
+
+  err = add_arg (gpg, "--with-colons");
+  if (!err)
+    err = add_arg (gpg, "--with-fingerprint");
+  if (!err)
+    err = add_arg (gpg, "--import-options");
+  if (!err)
+    err = add_arg (gpg, "import-show");
+  if (!err)
+    err = add_arg (gpg, "--dry-run");
+  if (!err)
+    err = add_arg (gpg, "--import");
+  if (!err)
+    err = add_arg (gpg, "--");
+  if (!err)
+    err = add_data (gpg, data, -1, 0);
+
+  if (!err)
+    err = start (gpg);
+
+  return err;
+}
+
+
+static gpgme_error_t
 gpg_keysign (void *engine, gpgme_key_t key, const char *userid,
              unsigned long expire, unsigned int flags,
              gpgme_ctx_t ctx)
@@ -3013,6 +3045,7 @@ struct engine_ops _gpgme_engine_ops_gpg =
     gpg_import,
     gpg_keylist,
     gpg_keylist_ext,
+    gpg_keylist_data,
     gpg_keysign,
     gpg_tofu_policy,    /* tofu_policy */
     gpg_sign,
diff --git a/src/engine-gpgconf.c b/src/engine-gpgconf.c
index 3e46310..4891977 100644
--- a/src/engine-gpgconf.c
+++ b/src/engine-gpgconf.c
@@ -1244,6 +1244,7 @@ struct engine_ops _gpgme_engine_ops_gpgconf =
     NULL,		/* import */
     NULL,		/* keylist */
     NULL,		/* keylist_ext */
+    NULL,               /* keylist_data */
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,		/* sign */
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
index d5d2901..7652363 100644
--- a/src/engine-gpgsm.c
+++ b/src/engine-gpgsm.c
@@ -2106,6 +2106,7 @@ struct engine_ops _gpgme_engine_ops_gpgsm =
     gpgsm_import,
     gpgsm_keylist,
     gpgsm_keylist_ext,
+    NULL,               /* keylist_data */
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     gpgsm_sign,
diff --git a/src/engine-spawn.c b/src/engine-spawn.c
index 1cd4421..fa406d4 100644
--- a/src/engine-spawn.c
+++ b/src/engine-spawn.c
@@ -460,6 +460,7 @@ struct engine_ops _gpgme_engine_ops_spawn =
     NULL,		/* import */
     NULL,		/* keylist */
     NULL,		/* keylist_ext */
+    NULL,               /* keylist_data */
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     NULL,		/* sign */
diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c
index ff5227e..12efd27 100644
--- a/src/engine-uiserver.c
+++ b/src/engine-uiserver.c
@@ -1394,6 +1394,7 @@ struct engine_ops _gpgme_engine_ops_uiserver =
     NULL,		/* import */
     NULL,		/* keylist */
     NULL,		/* keylist_ext */
+    NULL,               /* keylist_data */
     NULL,               /* keysign */
     NULL,               /* tofu_policy */
     uiserver_sign,
diff --git a/src/engine.c b/src/engine.c
index 75d9ff7..a918a50 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -876,6 +876,19 @@ _gpgme_engine_op_keylist_ext (engine_t engine, const char *pattern[],
 
 
 gpgme_error_t
+_gpgme_engine_op_keylist_data (engine_t engine, gpgme_data_t data)
+{
+  if (!engine)
+    return gpg_error (GPG_ERR_INV_VALUE);
+
+  if (!engine->ops->keylist_data)
+    return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+
+  return (*engine->ops->keylist_data) (engine->engine, data);
+}
+
+
+gpgme_error_t
 _gpgme_engine_op_sign (engine_t engine, gpgme_data_t in, gpgme_data_t out,
 		       gpgme_sig_mode_t mode, int use_armor,
 		       int use_textmode, int include_certs,
diff --git a/src/engine.h b/src/engine.h
index 29d2f25..f456812 100644
--- a/src/engine.h
+++ b/src/engine.h
@@ -148,6 +148,8 @@ gpgme_error_t _gpgme_engine_op_keylist_ext (engine_t engine,
 					    int reserved,
 					    gpgme_keylist_mode_t mode,
 					    int engine_flags);
+gpgme_error_t _gpgme_engine_op_keylist_data (engine_t engine,
+					     gpgme_data_t data);
 gpgme_error_t _gpgme_engine_op_sign (engine_t engine, gpgme_data_t in,
 				     gpgme_data_t out, gpgme_sig_mode_t mode,
 				     int use_armor, int use_textmode,
diff --git a/src/gpgme.def b/src/gpgme.def
index 0d3ce74..ddd57d3 100644
--- a/src/gpgme.def
+++ b/src/gpgme.def
@@ -177,8 +177,8 @@ EXPORTS
     gpgme_io_read                         @136
     gpgme_io_write                        @137
 
-    gpgme_result_ref                     @138
-    gpgme_result_unref                   @139
+    gpgme_result_ref                      @138
+    gpgme_result_unref                    @139
 
     gpgme_op_import_keys                  @140
     gpgme_op_import_keys_start            @141
@@ -253,5 +253,8 @@ EXPORTS
     gpgme_op_query_swdb_result            @190
 
     gpgme_get_ctx_flag                    @191
+
+    gpgme_op_keylist_from_data_start      @192
+
 ; END
 
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index b660cb5..2cf096b 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -1817,20 +1817,31 @@ typedef struct _gpgme_op_keylist_result *gpgme_keylist_result_t;
 gpgme_keylist_result_t gpgme_op_keylist_result (gpgme_ctx_t ctx);
 
 /* Start a keylist operation within CTX, searching for keys which
-   match PATTERN.  If SECRET_ONLY is true, only secret keys are
-   returned.  */
+ * match PATTERN.  If SECRET_ONLY is true, only secret keys are
+ * returned.  */
 gpgme_error_t gpgme_op_keylist_start (gpgme_ctx_t ctx, const char *pattern,
 				      int secret_only);
 gpgme_error_t gpgme_op_keylist_ext_start (gpgme_ctx_t ctx,
 					  const char *pattern[],
 					  int secret_only, int reserved);
 
+/* List the keys contained in DATA.  */
+gpgme_error_t gpgme_op_keylist_from_data_start (gpgme_ctx_t ctx,
+                                                gpgme_data_t data,
+                                                int reserved);
+
 /* Return the next key from the keylist in R_KEY.  */
 gpgme_error_t gpgme_op_keylist_next (gpgme_ctx_t ctx, gpgme_key_t *r_key);
 
 /* Terminate a pending keylist operation within CTX.  */
 gpgme_error_t gpgme_op_keylist_end (gpgme_ctx_t ctx);
 
+
+

+/*
+ * Protecting keys
+ */
+
 /* Change the passphrase for KEY.  FLAGS is reserved for future use
    and must be passed as 0.  */
 gpgme_error_t gpgme_op_passwd_start (gpgme_ctx_t ctx, gpgme_key_t key,
diff --git a/src/keylist.c b/src/keylist.c
index de9bbb2..c88a7ca 100644
--- a/src/keylist.c
+++ b/src/keylist.c
@@ -1142,6 +1142,42 @@ gpgme_op_keylist_ext_start (gpgme_ctx_t ctx, const char *pattern[],
 }
 
 
+/* Start a keylist operation within CTX to show keys contained
+ * in DATA.  */
+gpgme_error_t
+gpgme_op_keylist_from_data_start (gpgme_ctx_t ctx, gpgme_data_t data,
+                                  int reserved)
+{
+  gpgme_error_t err;
+  void *hook;
+  op_data_t opd;
+
+  TRACE_BEG (DEBUG_CTX, "gpgme_op_keylist_from_data_start", ctx);
+
+  if (!ctx || !data || reserved)
+    return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
+  err = _gpgme_op_reset (ctx, 2);
+  if (err)
+    return TRACE_ERR (err);
+
+  err = _gpgme_op_data_lookup (ctx, OPDATA_KEYLIST, &hook,
+                               sizeof (*opd), release_op_data);
+  opd = hook;
+  if (err)
+    return TRACE_ERR (err);
+
+  _gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx);
+  err = _gpgme_engine_set_colon_line_handler (ctx->engine,
+                                              keylist_colon_handler, ctx);
+  if (err)
+    return TRACE_ERR (err);
+
+  err = _gpgme_engine_op_keylist_data (ctx->engine, data);
+  return TRACE_ERR (err);
+}
+
+
 /* Return the next key from the keylist in R_KEY.  */
 gpgme_error_t
 gpgme_op_keylist_next (gpgme_ctx_t ctx, gpgme_key_t *r_key)
diff --git a/src/libgpgme.vers b/src/libgpgme.vers
index a55cd10..9344a75 100644
--- a/src/libgpgme.vers
+++ b/src/libgpgme.vers
@@ -223,6 +223,7 @@ GPGME_1.0 {
     gpgme_op_import_start;
     gpgme_op_keylist_end;
     gpgme_op_keylist_ext_start;
+    gpgme_op_keylist_from_data_start;
     gpgme_op_keylist_next;
     gpgme_op_keylist_result;
     gpgme_op_keylist_start;
diff --git a/tests/run-keylist.c b/tests/run-keylist.c
index fd9c7c2..aab4bb6 100644
--- a/tests/run-keylist.c
+++ b/tests/run-keylist.c
@@ -41,7 +41,7 @@ static int verbose;
 static int
 show_usage (int ex)
 {
-  fputs ("usage: " PGM " [options] [USERID]\n\n"
+  fputs ("usage: " PGM " [options] [USERID_or_FILE]\n\n"
          "Options:\n"
          "  --verbose        run in verbose mode\n"
          "  --openpgp        use the OpenPGP protocol (default)\n"
@@ -56,6 +56,7 @@ show_usage (int ex)
          "  --validate       use GPGME_KEYLIST_MODE_VALIDATE\n"
          "  --import         import all keys\n"
          "  --offline        use offline mode\n"
+         "  --from-file      list all keys in the given file\n"
          "  --require-gnupg  required at least the given GnuPG version\n"
          , stderr);
   exit (ex);
@@ -98,6 +99,9 @@ main (int argc, char **argv)
   gpgme_protocol_t protocol = GPGME_PROTOCOL_OpenPGP;
   int only_secret = 0;
   int offline = 0;
+  int from_file = 0;
+  gpgme_data_t data = NULL;
+
 
   if (argc)
     { argc--; argv++; }
@@ -177,6 +181,11 @@ main (int argc, char **argv)
           offline = 1;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--from-file"))
+        {
+          from_file = 1;
+          argc--; argv++;
+        }
       else if (!strcmp (*argv, "--require-gnupg"))
         {
           argc--; argv++;
@@ -191,6 +200,8 @@ main (int argc, char **argv)
 
   if (argc > 1)
     show_usage (1);
+  else if (from_file && !argc)
+    show_usage (1);
 
   init_gpgme (protocol);
 
@@ -202,7 +213,15 @@ main (int argc, char **argv)
 
   gpgme_set_offline (ctx, offline);
 
-  err = gpgme_op_keylist_start (ctx, argc? argv[0]:NULL, only_secret);
+  if (from_file)
+    {
+      err = gpgme_data_new_from_file (&data, *argv, 1);
+      fail_if_err (err);
+
+      err = gpgme_op_keylist_from_data_start (ctx, data, 0);
+    }
+  else
+    err = gpgme_op_keylist_start (ctx, argc? argv[0]:NULL, only_secret);
   fail_if_err (err);
 
   while (!(err = gpgme_op_keylist_next (ctx, &key)))
@@ -322,6 +341,7 @@ main (int argc, char **argv)
   err = gpgme_op_keylist_end (ctx);
   fail_if_err (err);
   keyarray[keyidx] = NULL;
+  gpgme_data_release (data);
 
   result = gpgme_op_keylist_result (ctx);
   if (result->truncated)

-----------------------------------------------------------------------

Summary of changes:
 NEWS                  |  3 ++-
 doc/gpgme.texi        | 34 +++++++++++++++++++++++++++++++++-
 src/engine-assuan.c   |  1 +
 src/engine-backend.h  |  1 +
 src/engine-g13.c      |  1 +
 src/engine-gpg.c      | 33 +++++++++++++++++++++++++++++++++
 src/engine-gpgconf.c  |  1 +
 src/engine-gpgsm.c    |  1 +
 src/engine-spawn.c    |  1 +
 src/engine-uiserver.c |  1 +
 src/engine.c          | 13 +++++++++++++
 src/engine.h          |  2 ++
 src/gpgme.def         |  7 +++++--
 src/gpgme.h.in        | 15 +++++++++++++--
 src/keylist.c         | 36 ++++++++++++++++++++++++++++++++++++
 src/libgpgme.vers     |  1 +
 tests/run-keylist.c   | 24 ++++++++++++++++++++++--
 17 files changed, 167 insertions(+), 8 deletions(-)


hooks/post-receive
-- 
GnuPG Made Easy
http://git.gnupg.org




More information about the Gnupg-commits mailing list