aboutsummaryrefslogtreecommitdiffstats
path: root/src/import.c
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2022-01-31 14:59:55 +0000
committerIngo Klöcker <[email protected]>2022-02-03 14:56:30 +0000
commit3c2cff74b535422532e1256ee8177fa9c03eaf18 (patch)
treee4d10ecb036e2ce0d15ba845e77be08b2b954970 /src/import.c
parentdoc: Fixed type of an object member (diff)
downloadgpgme-3c2cff74b535422532e1256ee8177fa9c03eaf18.tar.gz
gpgme-3c2cff74b535422532e1256ee8177fa9c03eaf18.zip
core: New function gpgme_op_receive_keys
* src/gpgme.h.in (gpgme_op_receive_keys_start, gpgme_op_receive_keys): New. * src/gpgme.def, src/libgpgme.vers: Add them. * src/engine-backend.h (struct engine_ops): Add arg keyids to field 'import'. * src/engine.h, src/engine.c (_gpgme_engine_op_import): Add arg keyids. * src/engine.c (_gpgme_engine_op_import): Forward new arg keyids. * src/import.c: (_gpgme_op_import_start, _gpgme_op_import_keys_start): Pass NULL to new arg of _gpgme_op_import_start. (_gpgme_op_receive_keys_start, gpgme_op_receive_keys_start, gpgme_op_receive_keys): New. * src/engine-gpg.c (gpg_import): Add arg keyids. Extend check for valid arguments. Build command line if keyids are given. * src/engine-gpgsm.c (gpgsm_import): Add arg keyids. Return error if keyids is not NULL. tests/run-receive-keys.c: New. tests/Makefile.am (noinst_PROGRAMS): Add new test runner. -- The new function allows importing keys given by their key ids or fingerprints from a keyserver (like gpg's --recv-keys command). GnuPG-bug-id: 5808
Diffstat (limited to 'src/import.c')
-rw-r--r--src/import.c96
1 files changed, 92 insertions, 4 deletions
diff --git a/src/import.c b/src/import.c
index ae7b972a..85c459b1 100644
--- a/src/import.c
+++ b/src/import.c
@@ -334,8 +334,8 @@ _gpgme_op_import_start (gpgme_ctx_t ctx, int synchronous, gpgme_data_t keydata)
_gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx);
- return _gpgme_engine_op_import (ctx->engine, keydata, NULL, ctx->import_filter,
- ctx->key_origin);
+ return _gpgme_engine_op_import (ctx->engine, keydata, NULL, NULL,
+ ctx->import_filter, ctx->key_origin);
}
@@ -418,8 +418,8 @@ _gpgme_op_import_keys_start (gpgme_ctx_t ctx, int synchronous,
_gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx);
- return _gpgme_engine_op_import (ctx->engine, NULL, keys, ctx->import_filter,
- ctx->key_origin);
+ return _gpgme_engine_op_import (ctx->engine, NULL, keys, NULL,
+ ctx->import_filter, ctx->key_origin);
}
@@ -492,6 +492,94 @@ gpgme_op_import_keys (gpgme_ctx_t ctx, gpgme_key_t *keys)
}
+static gpgme_error_t
+_gpgme_op_receive_keys_start (gpgme_ctx_t ctx, int synchronous, const char *keyids[])
+{
+ gpgme_error_t err;
+ void *hook;
+ op_data_t opd;
+
+ err = _gpgme_op_reset (ctx, synchronous);
+ if (err)
+ return err;
+
+ err = _gpgme_op_data_lookup (ctx, OPDATA_IMPORT, &hook,
+ sizeof (*opd), release_op_data);
+ opd = hook;
+ if (err)
+ return err;
+ opd->lastp = &opd->result.imports;
+
+ if (!keyids || !*keyids)
+ return gpg_error (GPG_ERR_NO_DATA);
+
+ _gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx);
+
+ return _gpgme_engine_op_import (ctx->engine, NULL, NULL, keyids,
+ ctx->import_filter, ctx->key_origin);
+}
+
+
+/* Asynchronous version of gpgme_op_receive_keys. */
+gpgme_error_t
+gpgme_op_receive_keys_start (gpgme_ctx_t ctx, const char *keyids[])
+{
+ gpgme_error_t err;
+
+ TRACE_BEG (DEBUG_CTX, "gpgme_op_receive_keys_start", ctx, "");
+
+ if (!ctx)
+ return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
+ if (_gpgme_debug_trace () && keyids)
+ {
+ int i = 0;
+
+ while (keyids[i] && *keyids[i])
+ {
+ TRACE_LOG ("keyids[%i] = %s", i, keyids[i]);
+ i++;
+ }
+ }
+
+ err = _gpgme_op_receive_keys_start (ctx, 1, keyids);
+ return TRACE_ERR (err);
+}
+
+
+/* Retrieve the keys from the array KEYIDS from a keyserver and import
+ them into the keyring.
+
+ KEYIDS is a NULL terminated array of . The result
+ is the usual import result structure. */
+gpgme_error_t
+gpgme_op_receive_keys (gpgme_ctx_t ctx, const char *keyids[])
+{
+ gpgme_error_t err;
+
+ TRACE_BEG (DEBUG_CTX, "gpgme_op_receive_keys", ctx, "");
+
+ if (!ctx)
+ return TRACE_ERR (gpg_error (GPG_ERR_INV_VALUE));
+
+ if (_gpgme_debug_trace () && keyids)
+ {
+ int i = 0;
+
+ while (keyids[i] && *keyids[i])
+ {
+ TRACE_LOG ("keyids[%i] = %s", i, keyids[i]);
+ i++;
+ }
+ }
+
+ err = _gpgme_op_receive_keys_start (ctx, 1, keyids);
+ if (!err)
+ err = _gpgme_wait_one (ctx);
+ return TRACE_ERR (err);
+}
+
+
/* Deprecated interface. */
gpgme_error_t
gpgme_op_import_ext (gpgme_ctx_t ctx, gpgme_data_t keydata, int *nr)