diff options
| author | Werner Koch <[email protected]> | 2016-09-14 18:21:19 +0000 | 
|---|---|---|
| committer | Werner Koch <[email protected]> | 2016-09-14 18:21:19 +0000 | 
| commit | 7c37719d79345a665ec2f4570e3f257033b58c62 (patch) | |
| tree | 10cccebe681f29cbf6b83e27f2a7f805b6b6abe8 /src/engine-gpg.c | |
| parent | core: Defer implementation of gpgme_op_createkey with gpg < 2.1 (diff) | |
| download | gpgme-7c37719d79345a665ec2f4570e3f257033b58c62.tar.gz gpgme-7c37719d79345a665ec2f4570e3f257033b58c62.zip | |
core: New function gpgme_op_tofu_policy
* src/gpgme.h.in (gpgme_op_tofu_policy_start): New function.
(gpgme_op_tofu_policy): New function.
* src/libgpgme.vers, src/gpgme.def: Add new functions.
* src/tofupolicy.c: New.
* src/Makefile.am (main_sources): Add that file.
* src/context.h (ctx_op_data_id_t): Add OPDATA_TOFU_POLICY.
* src/engine.c (_gpgme_engine_op_tofu_policy): New.
* src/engine-backend.h (engine_ops): Add funcptr 'tofu_policy'.
Adjust all engine initializations.
* src/engine-gpg.c (gpg_tofu_policy): New.
(_gpgme_engine_ops_gpg): Register this function.
* tests/run-tofu.c: New.
* tests/Makefile.am (noinst_PROGRAMS): Add it.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src/engine-gpg.c')
| -rw-r--r-- | src/engine-gpg.c | 41 | 
1 files changed, 41 insertions, 0 deletions
| diff --git a/src/engine-gpg.c b/src/engine-gpg.c index ac85c4db..9a0dab0a 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -2733,6 +2733,46 @@ gpg_keysign (void *engine, gpgme_key_t key, const char *userid,  static gpgme_error_t +gpg_tofu_policy (void *engine, gpgme_key_t key, gpgme_tofu_policy_t policy) +{ +  engine_gpg_t gpg = engine; +  gpgme_error_t err; +  const char *policystr = NULL; + +  if (!key || !key->fpr) +    return gpg_error (GPG_ERR_INV_ARG); + +  switch (policy) +    { +    case GPGME_TOFU_POLICY_NONE:                           break; +    case GPGME_TOFU_POLICY_AUTO:    policystr = "auto";    break; +    case GPGME_TOFU_POLICY_GOOD:    policystr = "good";    break; +    case GPGME_TOFU_POLICY_BAD:     policystr = "bad";     break; +    case GPGME_TOFU_POLICY_ASK:     policystr = "ask";     break; +    case GPGME_TOFU_POLICY_UNKNOWN: policystr = "unknown"; break; +    } +  if (!policystr) +    return gpg_error (GPG_ERR_INV_VALUE); + +  if (!have_gpg_version (gpg, "2.1.10")) +    return gpg_error (GPG_ERR_NOT_SUPPORTED); + +  err = add_arg (gpg, "--tofu-policy"); +  if (!err) +    err = add_arg (gpg, "--"); +  if (!err) +    err = add_arg (gpg, policystr); +  if (!err) +    err = add_arg (gpg, key->fpr); + +  if (!err) +    err = start (gpg); + +  return err; +} + + +static gpgme_error_t  gpg_sign (void *engine, gpgme_data_t in, gpgme_data_t out,  	  gpgme_sig_mode_t mode, int use_armor, int use_textmode,  	  int include_certs, gpgme_ctx_t ctx /* FIXME */) @@ -2906,6 +2946,7 @@ struct engine_ops _gpgme_engine_ops_gpg =      gpg_keylist,      gpg_keylist_ext,      gpg_keysign, +    gpg_tofu_policy,    /* tofu_policy */      gpg_sign,      gpg_trustlist,      gpg_verify, | 
