diff --git a/NEWS b/NEWS index d799684f..03641ace 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ Noteworthy changes in version 1.14.0 (unreleased) ------------------------------------------------- + * New context flag "extended-edit" to enable expert key edit. [#4734] * Interface changes relative to the 1.13.1 release: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/gpgme.texi b/doc/gpgme.texi index 52abd4a7..36c2b32b 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -3150,6 +3150,10 @@ trust-model changes the default trust-model for future operations. A change in the trust-model also can have unintended side effects, like rebuilding the trust-db. +@item "extended-edit" +This flag passes the option @option{--expert} to gpg key edit. This +can be used to get additional callbacks in @code{gpgme_op_edit}. + @end table This function returns @code{0} on success. 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; }