diff options
| author | Ingo Klöcker <[email protected]> | 2021-12-13 15:52:23 +0000 | 
|---|---|---|
| committer | Ingo Klöcker <[email protected]> | 2021-12-13 15:52:23 +0000 | 
| commit | 60880adafa93e1a1e8e9fecf03c14d56bbd55345 (patch) | |
| tree | 881579c7b75cbaaa800224eb981e6c15e15b4b9e /src | |
| parent | doc: Fix a few errors in the documentation of gpgme_op_import_* (diff) | |
| download | gpgme-60880adafa93e1a1e8e9fecf03c14d56bbd55345.tar.gz gpgme-60880adafa93e1a1e8e9fecf03c14d56bbd55345.zip | |
core: Allow specifiying a key origin when importing keys
* src/context.h (struct gpgme_context): New field key_origin.
* src/engine-backend.h (struct engine_ops): Add arg key_origin to
field 'import'.
* src/engine-gpg.c (gpg_import): Add arg key_origin and pass option
--key-origin with argument value to gpg. Adjust all callers.
* src/engine-gpgsm.c (gpgsm_import): Add dummy arg key_origin.
* src/gpgme.c (gpgme_release): Free 'key_origin'.
(gpgme_set_ctx_flag, gpgme_get_ctx_flag): New flag "key-origin".
* tests/run-import.c (main): Add option --key-origin.
* tests/gpg/t-import.c (main): Set and verify key origin.
--
This makes the --key-origin option available in the GPGME API for
key imports.
GnuPG-bug-id: 5733
Diffstat (limited to '')
| -rw-r--r-- | src/context.h | 3 | ||||
| -rw-r--r-- | src/engine-backend.h | 3 | ||||
| -rw-r--r-- | src/engine-gpg.c | 9 | ||||
| -rw-r--r-- | src/engine-gpgsm.c | 4 | ||||
| -rw-r--r-- | src/engine.c | 4 | ||||
| -rw-r--r-- | src/engine.h | 3 | ||||
| -rw-r--r-- | src/gpgme.c | 12 | ||||
| -rw-r--r-- | src/import.c | 4 | 
8 files changed, 34 insertions, 8 deletions
| diff --git a/src/context.h b/src/context.h index 2792a160..10d297f6 100644 --- a/src/context.h +++ b/src/context.h @@ -177,6 +177,9 @@ struct gpgme_context    /* The optional expiration date of a certification.  */    char *cert_expire; +  /* The optional key origin.  */ +  char *key_origin; +    /* The operation data hooked into the context.  */    ctx_op_data_t op_data; diff --git a/src/engine-backend.h b/src/engine-backend.h index 8f90b6c7..d4047fbf 100644 --- a/src/engine-backend.h +++ b/src/engine-backend.h @@ -95,7 +95,8 @@ struct engine_ops                             unsigned int extraflags,  			   gpgme_data_t pubkey, gpgme_data_t seckey);    gpgme_error_t (*import) (void *engine, gpgme_data_t keydata, -                           gpgme_key_t *keyarray); +                           gpgme_key_t *keyarray, +                           const char *key_origin);    gpgme_error_t (*keylist) (void *engine, const char *pattern,  			    int secret_only, gpgme_keylist_mode_t mode,  			    int engine_flags); diff --git a/src/engine-gpg.c b/src/engine-gpg.c index ff037920..9591c60a 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -2766,7 +2766,8 @@ 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) +gpg_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray, +            const char *key_origin)  {    engine_gpg_t gpg = engine;    gpgme_error_t err; @@ -2830,6 +2831,12 @@ gpg_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray)    else      {        err = add_arg (gpg, "--import"); +      if (!err && key_origin) +        { +          err = add_arg (gpg, "--key-origin"); +          if (!err) +            err = add_arg (gpg, key_origin); +        }        if (!err)          err = add_arg (gpg, "--");        if (!err) diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index d5f0d7a9..647734fe 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -1696,13 +1696,15 @@ gpgsm_genkey (void *engine,  static gpgme_error_t -gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray) +gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray, const char *key_origin)  {    engine_gpgsm_t gpgsm = engine;    gpgme_error_t err;    gpgme_data_encoding_t dataenc;    int idx; +  (void)key_origin; +    if (!gpgsm)      return gpg_error (GPG_ERR_INV_VALUE); diff --git a/src/engine.c b/src/engine.c index 96b8d3a8..6baf1842 100644 --- a/src/engine.c +++ b/src/engine.c @@ -850,7 +850,7 @@ _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) +                         gpgme_key_t *keyarray, const char *key_origin)  {    if (!engine)      return gpg_error (GPG_ERR_INV_VALUE); @@ -858,7 +858,7 @@ _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); +  return (*engine->ops->import) (engine->engine, keydata, keyarray, key_origin);  } diff --git a/src/engine.h b/src/engine.h index d7ff542c..038c67cc 100644 --- a/src/engine.h +++ b/src/engine.h @@ -141,7 +141,8 @@ gpgme_error_t _gpgme_engine_op_tofu_policy (engine_t engine,                                              gpgme_tofu_policy_t policy);  gpgme_error_t _gpgme_engine_op_import (engine_t engine,  				       gpgme_data_t keydata, -                                       gpgme_key_t *keyarray); +                                       gpgme_key_t *keyarray, +                                       const char *key_origin);  gpgme_error_t _gpgme_engine_op_keylist (engine_t engine,  					const char *pattern,  					int secret_only, diff --git a/src/gpgme.c b/src/gpgme.c index 255d1165..2703cd72 100644 --- a/src/gpgme.c +++ b/src/gpgme.c @@ -254,6 +254,7 @@ gpgme_release (gpgme_ctx_t ctx)    free (ctx->auto_key_locate);    free (ctx->trust_model);    free (ctx->cert_expire); +  free (ctx->key_origin);    _gpgme_engine_info_release (ctx->engine_info);    ctx->engine_info = NULL;    DESTROY_LOCK (ctx->lock); @@ -586,6 +587,13 @@ gpgme_set_ctx_flag (gpgme_ctx_t ctx, const char *name, const char *value)        if (!ctx->cert_expire)          err = gpg_error_from_syserror ();      } +  else if (!strcmp (name, "key-origin")) +    { +      free (ctx->key_origin); +      ctx->key_origin = strdup (value); +      if (!ctx->key_origin) +        err = gpg_error_from_syserror (); +    }    else      err = gpg_error (GPG_ERR_UNKNOWN_NAME); @@ -659,6 +667,10 @@ gpgme_get_ctx_flag (gpgme_ctx_t ctx, const char *name)      {        return ctx->cert_expire? ctx->cert_expire : "";      } +  else if (!strcmp (name, "key-origin")) +    { +      return ctx->key_origin? ctx->key_origin : ""; +    }    else      return NULL;  } diff --git a/src/import.c b/src/import.c index 2834aec2..5dc74907 100644 --- a/src/import.c +++ b/src/import.c @@ -282,7 +282,7 @@ _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); +  return _gpgme_engine_op_import (ctx->engine, keydata, NULL, ctx->key_origin);  } @@ -365,7 +365,7 @@ _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); +  return _gpgme_engine_op_import (ctx->engine, NULL, keys, ctx->key_origin);  } | 
