diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/engine-backend.h | 1 | ||||
-rw-r--r-- | src/engine-gpg.c | 21 | ||||
-rw-r--r-- | src/engine-gpgsm.c | 6 | ||||
-rw-r--r-- | src/engine.c | 8 | ||||
-rw-r--r-- | src/engine.h | 1 | ||||
-rw-r--r-- | src/gpgme.def | 3 | ||||
-rw-r--r-- | src/gpgme.h.in | 6 | ||||
-rw-r--r-- | src/import.c | 96 | ||||
-rw-r--r-- | src/libgpgme.vers | 3 |
9 files changed, 133 insertions, 12 deletions
diff --git a/src/engine-backend.h b/src/engine-backend.h index d5d44a57..9b755a32 100644 --- a/src/engine-backend.h +++ b/src/engine-backend.h @@ -96,6 +96,7 @@ struct engine_ops gpgme_data_t pubkey, gpgme_data_t seckey); gpgme_error_t (*import) (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray, + const char *keyids[], const char *import_filter, const char *key_origin); gpgme_error_t (*keylist) (void *engine, const char *pattern, diff --git a/src/engine-gpg.c b/src/engine-gpg.c index f619a646..88a248d2 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -2770,19 +2770,34 @@ string_from_data (gpgme_data_t data, int delim, static gpgme_error_t gpg_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray, - const char *import_filter, const char *key_origin) + const char *keyids[], const char *import_filter, + const char *key_origin) { engine_gpg_t gpg = engine; gpgme_error_t err; int idx; gpgme_data_encoding_t dataenc; - if (keydata && keyarray) + if ((keydata && keyarray) || (keydata && keyids) || (keyarray && keyids)) return gpg_error (GPG_ERR_INV_VALUE); /* Only one is allowed. */ dataenc = gpgme_data_get_encoding (keydata); - if (keyarray) + if (keyids) + { + err = add_arg (gpg, "--recv-keys"); + if (!err && import_filter && have_gpg_version (gpg, "2.1.14")) + { + err = add_arg (gpg, "--import-filter"); + if (!err) + err = add_arg (gpg, import_filter); + } + if (!err) + err = add_arg (gpg, "--"); + while (!err && *keyids && **keyids) + err = add_arg (gpg, *(keyids++)); + } + else if (keyarray) { err = add_arg (gpg, "--recv-keys"); if (!err && import_filter && have_gpg_version (gpg, "2.1.14")) diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 182f6a39..9ab05551 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -1709,7 +1709,8 @@ gpgsm_genkey (void *engine, static gpgme_error_t gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray, - const char *import_filter, const char *key_origin) + const char *keyids[], const char *import_filter, + const char *key_origin) { engine_gpgsm_t gpgsm = engine; gpgme_error_t err; @@ -1722,6 +1723,9 @@ gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray, if (!gpgsm) return gpg_error (GPG_ERR_INV_VALUE); + if (keyids) + return gpg_error (GPG_ERR_NOT_IMPLEMENTED); + if (keydata && keyarray) return gpg_error (GPG_ERR_INV_VALUE); /* Only one is allowed. */ diff --git a/src/engine.c b/src/engine.c index 0b90d5b4..db594cb8 100644 --- a/src/engine.c +++ b/src/engine.c @@ -850,8 +850,8 @@ _gpgme_engine_op_tofu_policy (engine_t engine, gpgme_error_t _gpgme_engine_op_import (engine_t engine, gpgme_data_t keydata, - gpgme_key_t *keyarray, const char *import_filter, - const char *key_origin) + gpgme_key_t *keyarray, const char *keyids[], + const char *import_filter, const char *key_origin) { if (!engine) return gpg_error (GPG_ERR_INV_VALUE); @@ -859,8 +859,8 @@ _gpgme_engine_op_import (engine_t engine, gpgme_data_t keydata, if (!engine->ops->import) return gpg_error (GPG_ERR_NOT_IMPLEMENTED); - return (*engine->ops->import) (engine->engine, keydata, keyarray, import_filter, - key_origin); + return (*engine->ops->import) (engine->engine, keydata, keyarray, keyids, + import_filter, key_origin); } diff --git a/src/engine.h b/src/engine.h index 087f3586..8b45e13a 100644 --- a/src/engine.h +++ b/src/engine.h @@ -142,6 +142,7 @@ gpgme_error_t _gpgme_engine_op_tofu_policy (engine_t engine, gpgme_error_t _gpgme_engine_op_import (engine_t engine, gpgme_data_t keydata, gpgme_key_t *keyarray, + const char *keyids[], const char *import_filter, const char *key_origin); gpgme_error_t _gpgme_engine_op_keylist (engine_t engine, diff --git a/src/gpgme.def b/src/gpgme.def index 6644caef..d8ccd4ca 100644 --- a/src/gpgme.def +++ b/src/gpgme.def @@ -280,5 +280,8 @@ EXPORTS gpgme_op_revsig @207 gpgme_op_revsig_start @208 + gpgme_op_receive_keys @209 + gpgme_op_receive_keys_start @210 + ; END diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 8a9cd259..0f7c3619 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1738,6 +1738,12 @@ gpgme_error_t gpgme_op_import (gpgme_ctx_t ctx, gpgme_data_t keydata); gpgme_error_t gpgme_op_import_keys_start (gpgme_ctx_t ctx, gpgme_key_t keys[]); gpgme_error_t gpgme_op_import_keys (gpgme_ctx_t ctx, gpgme_key_t keys[]); +/* Import the keys given by the array KEYIDS from a keyserver into the + * keyring. */ +gpgme_error_t gpgme_op_receive_keys_start (gpgme_ctx_t ctx, + const char *keyids[]); +gpgme_error_t gpgme_op_receive_keys (gpgme_ctx_t ctx, const char *keyids[]); + /* Export the keys found by PATTERN into KEYDATA. */ gpgme_error_t gpgme_op_export_start (gpgme_ctx_t ctx, const char *pattern, 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) diff --git a/src/libgpgme.vers b/src/libgpgme.vers index 8e86e4e4..86d2a5df 100644 --- a/src/libgpgme.vers +++ b/src/libgpgme.vers @@ -279,6 +279,9 @@ GPGME_1.0 { gpgme_op_revsig; gpgme_op_revsig_start; + gpgme_op_receive_keys; + gpgme_op_receive_keys_start; + local: *; |