diff options
author | Ingo Klöcker <[email protected]> | 2020-08-04 12:32:31 +0000 |
---|---|---|
committer | Ingo Klöcker <[email protected]> | 2020-08-04 14:51:56 +0000 |
commit | db82e99a8a40c57a237dad030928d0fcf6b03ad7 (patch) | |
tree | dfda54ea9e78429d8e2d89238a371395b8142ad7 /src/engine-gpg.c | |
parent | Post release updates (diff) | |
download | gpgme-db82e99a8a40c57a237dad030928d0fcf6b03ad7.tar.gz gpgme-db82e99a8a40c57a237dad030928d0fcf6b03ad7.zip |
core: New function gpgme_op_setexpire.
* src/gpgme.h.in (gpgme_op_setexpire_start, gpgme_op_setexpire): New.
* src/libgpgme.vers, src/gpgme.def: Add new functions.
* src/genkey.c (setexpire): New.
(gpgme_op_setexpire_start, gpgme_op_setexpire): New.
* src/engine.h, src/engine.c: (_gpgme_engine_op_setexpire): New.
* src/engine-backend.h (engine_ops): Add 'setexpire' and adjust all
engine initializers.
* src/engine-gpg.c (gpg_setexpire): New.
(_gpgme_engine_ops_gpg): Set setexpire to gpg_setexpire.
* doc/gpgme.texi: Document new functions.
* tests/run-genkey.c: Add option --setexpire.
--
This extends GPGME to support the --quick-set-expire command
added by GnuPG 2.1.22. This allows changing subkeys expiry
date without going through the editinteractor interface.
Co-authored-by: Andre Heinecke <[email protected]>
GnuPG-bug-id: 4999
Diffstat (limited to 'src/engine-gpg.c')
-rw-r--r-- | src/engine-gpg.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c index af2533d8..8832572a 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -3426,6 +3426,59 @@ gpg_getauditlog (void *engine, gpgme_data_t output, unsigned int flags) #undef MYBUFLEN } +static gpgme_error_t +gpg_setexpire (void *engine, gpgme_key_t key, unsigned long expires, + const char *subfprs, unsigned int reserved) +{ + engine_gpg_t gpg = engine; + gpgme_error_t err; + const char *s; + + if (reserved) + return gpg_error (GPG_ERR_INV_VALUE); + + if (!key || !key->fpr) + return gpg_error (GPG_ERR_INV_ARG); + + if (!have_gpg_version (gpg, "2.1.22")) + return gpg_error (GPG_ERR_NOT_SUPPORTED); + + err = add_arg (gpg, "--quick-set-expire"); + + if (!err) + err = add_arg (gpg, "--"); + + if (!err) + err = add_arg (gpg, key->fpr); + + if (!err) + { + char tmpbuf[8+20]; + snprintf (tmpbuf, sizeof tmpbuf, "seconds=%lu", expires); + err = add_arg (gpg, tmpbuf); + } + + if (!err && subfprs) + { + for (; !err && (s = strchr (subfprs, '\n')); subfprs = s + 1) + { + if ((s - subfprs)) + { + err = add_arg_len (gpg, NULL, subfprs, s - subfprs); + } + } + if (!err && *subfprs) + { + err = add_arg (gpg, subfprs); + } + } + + if (!err) + err = start (gpg); + + return err; +} + struct engine_ops _gpgme_engine_ops_gpg = @@ -3464,6 +3517,7 @@ struct engine_ops _gpgme_engine_ops_gpg = gpg_sign, gpg_verify, gpg_getauditlog, + gpg_setexpire, NULL, /* opassuan_transact */ NULL, /* conf_load */ NULL, /* conf_save */ |