aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndre Heinecke <[email protected]>2017-03-21 08:38:11 +0000
committerWerner Koch <[email protected]>2017-03-21 08:50:23 +0000
commit35023f313622fb1b34108dd934e84831c58b81aa (patch)
tree8edded69231ac5addea605570ac237b1ae358313 /src
parentcore,cpp: New key flag 'is_de_vs'. (diff)
downloadgpgme-35023f313622fb1b34108dd934e84831c58b81aa.tar.gz
gpgme-35023f313622fb1b34108dd934e84831c58b81aa.zip
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 <[email protected]> GnuPG-bug-id: 2819
Diffstat (limited to '')
-rw-r--r--src/engine-assuan.c1
-rw-r--r--src/engine-backend.h1
-rw-r--r--src/engine-g13.c1
-rw-r--r--src/engine-gpg.c33
-rw-r--r--src/engine-gpgconf.c1
-rw-r--r--src/engine-gpgsm.c1
-rw-r--r--src/engine-spawn.c1
-rw-r--r--src/engine-uiserver.c1
-rw-r--r--src/engine.c13
-rw-r--r--src/engine.h2
-rw-r--r--src/gpgme.def7
-rw-r--r--src/gpgme.h.in15
-rw-r--r--src/keylist.c36
-rw-r--r--src/libgpgme.vers1
14 files changed, 110 insertions, 4 deletions
diff --git a/src/engine-assuan.c b/src/engine-assuan.c
index 78efb4cb..4beb41d7 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 a8457afd..635acb06 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 bb06d356..593177c2 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 59cf405a..4b87a8a0 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 3e463105..48919775 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 d5d29010..7652363a 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 1cd4421e..fa406d4c 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 ff5227ee..12efd270 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 75d9ff7b..a918a50d 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 29d2f259..f456812e 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 0d3ce74f..ddd57d35 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 b660cb51..2cf096b6 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 de9bbb2f..c88a7ca5 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 a55cd10a..9344a752 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;