aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine-gpg.c
diff options
context:
space:
mode:
authorIngo Klöcker <[email protected]>2020-08-04 12:32:31 +0000
committerIngo Klöcker <[email protected]>2020-08-04 14:51:56 +0000
commitdb82e99a8a40c57a237dad030928d0fcf6b03ad7 (patch)
treedfda54ea9e78429d8e2d89238a371395b8142ad7 /src/engine-gpg.c
parentPost release updates (diff)
downloadgpgme-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.c54
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 */