core: Handle import status lines during keylist operation

* src/import.c (import_status_handler): Rename to ...
(_gpgme_import_status_handler): this. Make non-static.
(_gpgme_op_import_init_result): New.
(_gpgme_op_import_start, _gpgme_op_import_keys_start,
_gpgme_op_receive_keys_start): Call _gpgme_op_import_init_result.
* src/keylist.c (keylist_status_handler): Call
_gpgme_import_status_handler to handle import status lines.
(gpgme_op_keylist_start, gpgme_op_keylist_ext_start): Call
_gpgme_op_import_init_result.
* src/ops.h (_gpgme_op_import_init_result,
_gpgme_import_status_handler): New prototypes.
--

If a keylist operation with keylist mode GPGME_KEYLIST_MODE_LOCATE is
run, then gpg emits import status lines. Handling those status lines
allows users to retrieve the result of a --locate-(external)-keys
command.

GnuPG-bug-id: 5951
This commit is contained in:
Ingo Klöcker 2022-05-04 14:23:42 +02:00
parent d911a15364
commit f3ca57dfd7
3 changed files with 55 additions and 23 deletions

View File

@ -266,8 +266,8 @@ parse_error (char *args, gpgme_import_status_t *import_status)
} }
static gpgme_error_t gpgme_error_t
import_status_handler (void *priv, gpgme_status_code_t code, char *args) _gpgme_import_status_handler (void *priv, gpgme_status_code_t code, char *args)
{ {
gpgme_ctx_t ctx = (gpgme_ctx_t) priv; gpgme_ctx_t ctx = (gpgme_ctx_t) priv;
gpgme_error_t err; gpgme_error_t err;
@ -311,28 +311,42 @@ import_status_handler (void *priv, gpgme_status_code_t code, char *args)
} }
static gpgme_error_t gpgme_error_t
_gpgme_op_import_start (gpgme_ctx_t ctx, int synchronous, gpgme_data_t keydata) _gpgme_op_import_init_result (gpgme_ctx_t ctx)
{ {
gpgme_error_t err; gpgme_error_t err;
void *hook; void *hook;
op_data_t opd; op_data_t opd;
err = _gpgme_op_reset (ctx, synchronous);
if (err)
return err;
err = _gpgme_op_data_lookup (ctx, OPDATA_IMPORT, &hook, err = _gpgme_op_data_lookup (ctx, OPDATA_IMPORT, &hook,
sizeof (*opd), release_op_data); sizeof (*opd), release_op_data);
opd = hook; opd = hook;
if (err) if (err)
return err; return err;
opd->lastp = &opd->result.imports; opd->lastp = &opd->result.imports;
return 0;
}
static gpgme_error_t
_gpgme_op_import_start (gpgme_ctx_t ctx, int synchronous, gpgme_data_t keydata)
{
gpgme_error_t err;
err = _gpgme_op_reset (ctx, synchronous);
if (err)
return err;
err = _gpgme_op_import_init_result (ctx);
if (err)
return err;
if (!keydata) if (!keydata)
return gpg_error (GPG_ERR_NO_DATA); return gpg_error (GPG_ERR_NO_DATA);
_gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx); _gpgme_engine_set_status_handler (ctx->engine, _gpgme_import_status_handler,
ctx);
return _gpgme_engine_op_import (ctx->engine, keydata, NULL, NULL, return _gpgme_engine_op_import (ctx->engine, keydata, NULL, NULL,
ctx->import_filter, ctx->key_origin); ctx->import_filter, ctx->key_origin);
@ -380,20 +394,15 @@ _gpgme_op_import_keys_start (gpgme_ctx_t ctx, int synchronous,
gpgme_key_t *keys) gpgme_key_t *keys)
{ {
gpgme_error_t err; gpgme_error_t err;
void *hook;
op_data_t opd;
int idx, firstidx, nkeys; int idx, firstidx, nkeys;
err = _gpgme_op_reset (ctx, synchronous); err = _gpgme_op_reset (ctx, synchronous);
if (err) if (err)
return err; return err;
err = _gpgme_op_data_lookup (ctx, OPDATA_IMPORT, &hook, err = _gpgme_op_import_init_result (ctx);
sizeof (*opd), release_op_data);
opd = hook;
if (err) if (err)
return err; return err;
opd->lastp = &opd->result.imports;
if (!keys) if (!keys)
return gpg_error (GPG_ERR_NO_DATA); return gpg_error (GPG_ERR_NO_DATA);
@ -416,7 +425,8 @@ _gpgme_op_import_keys_start (gpgme_ctx_t ctx, int synchronous,
if (!nkeys) if (!nkeys)
return gpg_error (GPG_ERR_NO_DATA); return gpg_error (GPG_ERR_NO_DATA);
_gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx); _gpgme_engine_set_status_handler (ctx->engine, _gpgme_import_status_handler,
ctx);
return _gpgme_engine_op_import (ctx->engine, NULL, keys, NULL, return _gpgme_engine_op_import (ctx->engine, NULL, keys, NULL,
ctx->import_filter, ctx->key_origin); ctx->import_filter, ctx->key_origin);
@ -496,24 +506,20 @@ static gpgme_error_t
_gpgme_op_receive_keys_start (gpgme_ctx_t ctx, int synchronous, const char *keyids[]) _gpgme_op_receive_keys_start (gpgme_ctx_t ctx, int synchronous, const char *keyids[])
{ {
gpgme_error_t err; gpgme_error_t err;
void *hook;
op_data_t opd;
err = _gpgme_op_reset (ctx, synchronous); err = _gpgme_op_reset (ctx, synchronous);
if (err) if (err)
return err; return err;
err = _gpgme_op_data_lookup (ctx, OPDATA_IMPORT, &hook, err = _gpgme_op_import_init_result (ctx);
sizeof (*opd), release_op_data);
opd = hook;
if (err) if (err)
return err; return err;
opd->lastp = &opd->result.imports;
if (!keyids || !*keyids) if (!keyids || !*keyids)
return gpg_error (GPG_ERR_NO_DATA); return gpg_error (GPG_ERR_NO_DATA);
_gpgme_engine_set_status_handler (ctx->engine, import_status_handler, ctx); _gpgme_engine_set_status_handler (ctx->engine, _gpgme_import_status_handler,
ctx);
return _gpgme_engine_op_import (ctx->engine, NULL, NULL, keyids, return _gpgme_engine_op_import (ctx->engine, NULL, NULL, keyids,
ctx->import_filter, ctx->key_origin); ctx->import_filter, ctx->key_origin);

View File

@ -146,6 +146,12 @@ keylist_status_handler (void *priv, gpgme_status_code_t code, char *args)
err = 0; err = 0;
break; break;
case GPGME_STATUS_IMPORT_OK:
case GPGME_STATUS_IMPORT_PROBLEM:
case GPGME_STATUS_IMPORT_RES:
err = _gpgme_import_status_handler (priv, code, args);
break;
default: default:
break; break;
} }
@ -1125,6 +1131,10 @@ gpgme_op_keylist_start (gpgme_ctx_t ctx, const char *pattern, int secret_only)
if (err) if (err)
return TRACE_ERR (err); return TRACE_ERR (err);
err = _gpgme_op_import_init_result (ctx);
if (err)
return TRACE_ERR (err);
_gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx); _gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx);
err = _gpgme_engine_set_colon_line_handler (ctx->engine, err = _gpgme_engine_set_colon_line_handler (ctx->engine,
@ -1169,6 +1179,10 @@ gpgme_op_keylist_ext_start (gpgme_ctx_t ctx, const char *pattern[],
if (err) if (err)
return TRACE_ERR (err); return TRACE_ERR (err);
err = _gpgme_op_import_init_result (ctx);
if (err)
return TRACE_ERR (err);
_gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx); _gpgme_engine_set_status_handler (ctx->engine, keylist_status_handler, ctx);
err = _gpgme_engine_set_colon_line_handler (ctx->engine, err = _gpgme_engine_set_colon_line_handler (ctx->engine,
keylist_colon_handler, ctx); keylist_colon_handler, ctx);

View File

@ -192,4 +192,16 @@ gpgme_error_t _gpgme_parse_notation (gpgme_sig_notation_t *notationp,
int type, int pkflags, int len, int type, int pkflags, int len,
char *data); char *data);
/* From import.c. */
/* Create an initial op data object for import. Needs to be called
once before calling _gpgme_import_status_handler. */
gpgme_error_t _gpgme_op_import_init_result (gpgme_ctx_t ctx);
/* Process a status line for import operations. */
gpgme_error_t _gpgme_import_status_handler (void *priv,
gpgme_status_code_t code,
char *args);
#endif /* OPS_H */ #endif /* OPS_H */