diff options
| author | Andre Heinecke <[email protected]> | 2019-10-29 15:11:54 +0000 | 
|---|---|---|
| committer | Andre Heinecke <[email protected]> | 2019-10-29 15:11:54 +0000 | 
| commit | 0224408c6332648461bdbba562f1a61c947c8ed3 (patch) | |
| tree | a2a057e151cb4b0c563ddb796b8b7835d6a42750 /src | |
| parent | cpp: Minor coding style fix (diff) | |
| download | gpgme-0224408c6332648461bdbba562f1a61c947c8ed3.tar.gz gpgme-0224408c6332648461bdbba562f1a61c947c8ed3.zip | |
core: Add cert-notation support and extended-edit
* src/context.h (gpgme_context): Add new flag for extended-edit.
* src/engine-gpg.c (append_args_from_sig_notations): Add flags to
control the kind of notations.
(gpg_edit): Respect extended-edit and notations.
(gpg_encrypt_sign, gpg_sign): Update call to
append_args_from_sig_notations.
* src/gpgme.c (gpgme_set_ctx_flag, gpgme_get_ctx_flag): Support
extended-edit.
* NEWS, doc/gpgme.texi: Mention extended-edit.
--
This provides a way to get the extended key-edit interface without
breaking bad state machines that rely on the current command flow.
A use case for this is to enable multiple local signatures, which
can be used together with annotations for:
GnuPG-Bug-Id: T4734
Diffstat (limited to '')
| -rw-r--r-- | src/context.h | 3 | ||||
| -rw-r--r-- | src/engine-gpg.c | 27 | ||||
| -rw-r--r-- | src/gpgme.c | 8 | 
3 files changed, 33 insertions, 5 deletions
| diff --git a/src/context.h b/src/context.h index d65bf9b5..93c4c2cc 100644 --- a/src/context.h +++ b/src/context.h @@ -128,6 +128,9 @@ struct gpgme_context     * after the operation.  */    unsigned int ignore_mdc_error : 1; +  /* Pass --expert to gpg edit key. */ +  unsigned int extended_edit : 1; +    /* Flags for keylist mode.  */    gpgme_keylist_mode_t keylist_mode; diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 93d0fc56..5c335cb2 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -1848,8 +1848,13 @@ append_args_from_sender (engine_gpg_t gpg, gpgme_ctx_t ctx)  } +#define NOTATION_FLAG_SIG  1 /* Use --sig-notation (default)*/ +#define NOTATION_FLAG_CERT 2 /* Use --cert-notation */ +#define NOTATION_FLAG_SET  3 /* Use --set-notation */ +  static gpgme_error_t -append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */) +append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */, +                                int flags)  {    gpgme_error_t err = 0;    gpgme_sig_notation_t notation; @@ -1890,7 +1895,14 @@ append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */)  	    }  	  if (!err) -	    err = add_arg (gpg, "--sig-notation"); +            { +              if ((flags & NOTATION_FLAG_SET)) +                err = add_arg (gpg, "--set-notation"); +              else if ((flags & NOTATION_FLAG_CERT)) +                err = add_arg (gpg, "--cert-notation"); +              else +                err = add_arg (gpg, "--sig-notation"); +            }  	  if (!err)  	    err = add_arg (gpg, arg); @@ -1941,10 +1953,15 @@ gpg_edit (void *engine, int type, gpgme_key_t key, gpgme_data_t out,    gpgme_error_t err;    err = add_arg (gpg, "--with-colons"); + +  if (!err && ctx->extended_edit) +    err = add_arg (gpg, "--expert");    if (!err)      err = append_args_from_signers (gpg, ctx);    if (!err) -  err = add_arg (gpg, type == 0 ? "--edit-key" : "--card-edit"); +    err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_CERT); +  if (!err) +    err = add_arg (gpg, type == 0 ? "--edit-key" : "--card-edit");    if (!err)      err = add_data (gpg, out, 1, 1);    if (!err) @@ -2254,7 +2271,7 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[],      err = append_args_from_sender (gpg, ctx);    if (!err) -    err = append_args_from_sig_notations (gpg, ctx); +    err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_SIG);    /* Tell the gpg object about the data.  */    if (!err) @@ -3228,7 +3245,7 @@ gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,    if (!err)      err = append_args_from_sender (gpg, ctx);    if (!err) -    err = append_args_from_sig_notations (gpg, ctx); +    err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_SIG);    if (gpgme_data_get_file_name (in))      { diff --git a/src/gpgme.c b/src/gpgme.c index 65a2e309..8f4d5f3e 100644 --- a/src/gpgme.c +++ b/src/gpgme.c @@ -566,6 +566,10 @@ gpgme_set_ctx_flag (gpgme_ctx_t ctx, const char *name, const char *value)        if (!ctx->trust_model)          err = gpg_error_from_syserror ();      } +  else if (!strcmp (name, "extended-edit")) +    { +      ctx->extended_edit = abool; +    }    else      err = gpg_error (GPG_ERR_UNKNOWN_NAME); @@ -623,6 +627,10 @@ gpgme_get_ctx_flag (gpgme_ctx_t ctx, const char *name)      {        return ctx->auto_key_locate? ctx->auto_key_locate : "";      } +  else if (!strcmp (name, "extended-edit")) +    { +      return ctx->extended_edit ? "1":""; +    }    else      return NULL;  } | 
