aboutsummaryrefslogtreecommitdiffstats
path: root/src/genkey.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/genkey.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/genkey.c')
-rw-r--r--src/genkey.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/genkey.c b/src/genkey.c
index 77576b18..981a0093 100644
--- a/src/genkey.c
+++ b/src/genkey.c
@@ -663,3 +663,55 @@ gpgme_op_set_uid_flag (gpgme_ctx_t ctx,
{
return set_uid_flag (ctx, 1, key, userid, name, value);
}
+
+/* Set the expiration time of a key or its subkeys. See
+ --quick-set-expire in the gnupg documentation. */
+static gpg_error_t
+setexpire (gpgme_ctx_t ctx, int synchronous,
+ gpgme_key_t key,
+ unsigned long expires,
+ const char *subfprs,
+ unsigned int reserved)
+{
+ gpgme_error_t err = 0;
+
+ TRACE_BEG (DEBUG_CTX, "gpgme_op_setexpire", ctx,
+ "%d key=%p expiry: %lu subkeys: '%s' reserved=0x%x",
+ synchronous, key, expires, subfprs, reserved);
+
+ if (!ctx || !key)
+ return TRACE_ERR (gpg_error (GPG_ERR_INV_ARG));
+
+ err = _gpgme_op_reset (ctx, synchronous);
+ if (err)
+ return err;
+
+ err = _gpgme_engine_op_setexpire (ctx->engine, key, expires, subfprs, reserved);
+
+ if (synchronous && !err)
+ err = _gpgme_wait_one (ctx);
+ return TRACE_ERR (err);
+}
+
+/* See setexpire. */
+gpgme_error_t
+gpgme_op_setexpire_start (gpgme_ctx_t ctx,
+ gpgme_key_t key,
+ unsigned long expires,
+ const char *subfprs,
+ unsigned int reserved)
+{
+ return setexpire (ctx, 0, key, expires, subfprs, reserved);
+}
+
+
+/* See setexpire. This is the synchronous variant. */
+gpgme_error_t
+gpgme_op_setexpire (gpgme_ctx_t ctx,
+ gpgme_key_t key,
+ unsigned long expires,
+ const char *subfprs,
+ unsigned int reserved)
+{
+ return setexpire (ctx, 1, key, expires, subfprs, reserved);
+}