From 7c37719d79345a665ec2f4570e3f257033b58c62 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Wed, 14 Sep 2016 20:21:19 +0200 Subject: 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 --- src/engine-gpg.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/engine-gpg.c') 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 @@ -2732,6 +2732,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, @@ -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, -- cgit v1.2.3