diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/engine-assuan.c | 1 | ||||
-rw-r--r-- | src/engine-backend.h | 3 | ||||
-rw-r--r-- | src/engine-g13.c | 1 | ||||
-rw-r--r-- | src/engine-gpg.c | 54 | ||||
-rw-r--r-- | src/engine-gpgconf.c | 1 | ||||
-rw-r--r-- | src/engine-gpgsm.c | 1 | ||||
-rw-r--r-- | src/engine-spawn.c | 1 | ||||
-rw-r--r-- | src/engine-uiserver.c | 1 | ||||
-rw-r--r-- | src/engine.c | 14 | ||||
-rw-r--r-- | src/engine.h | 5 | ||||
-rw-r--r-- | src/genkey.c | 52 | ||||
-rw-r--r-- | src/gpgme.def | 3 | ||||
-rw-r--r-- | src/gpgme.h.in | 7 | ||||
-rw-r--r-- | src/libgpgme.vers | 3 |
14 files changed, 147 insertions, 0 deletions
diff --git a/src/engine-assuan.c b/src/engine-assuan.c index a40328f7..b51c17e3 100644 --- a/src/engine-assuan.c +++ b/src/engine-assuan.c @@ -828,6 +828,7 @@ struct engine_ops _gpgme_engine_ops_assuan = NULL, /* sign */ NULL, /* verify */ NULL, /* getauditlog */ + NULL, /* setexpire */ llass_transact, /* opassuan_transact */ NULL, /* conf_load */ NULL, /* conf_save */ diff --git a/src/engine-backend.h b/src/engine-backend.h index c8bfad96..791dd3f9 100644 --- a/src/engine-backend.h +++ b/src/engine-backend.h @@ -120,6 +120,9 @@ struct engine_ops gpgme_ctx_t ctx); gpgme_error_t (*getauditlog) (void *engine, gpgme_data_t output, unsigned int flags); + gpgme_error_t (*setexpire) (void *engine, gpgme_key_t key, + unsigned long expires, const char *subfprs, + unsigned int reserved); gpgme_error_t (*opassuan_transact) (void *engine, const char *command, gpgme_assuan_data_cb_t data_cb, diff --git a/src/engine-g13.c b/src/engine-g13.c index 45f6c94b..82f26305 100644 --- a/src/engine-g13.c +++ b/src/engine-g13.c @@ -808,6 +808,7 @@ struct engine_ops _gpgme_engine_ops_g13 = NULL, /* sign */ NULL, /* verify */ NULL, /* getauditlog */ + NULL, /* setexpire */ g13_transact, NULL, /* conf_load */ NULL, /* conf_save */ 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 */ diff --git a/src/engine-gpgconf.c b/src/engine-gpgconf.c index d4465e97..fba8f23b 100644 --- a/src/engine-gpgconf.c +++ b/src/engine-gpgconf.c @@ -1306,6 +1306,7 @@ struct engine_ops _gpgme_engine_ops_gpgconf = NULL, /* sign */ NULL, /* verify */ NULL, /* getauditlog */ + NULL, /* setexpire */ NULL, /* opassuan_transact */ gpgconf_conf_load, gpgconf_conf_save, diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 671b3857..c92320e1 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -2326,6 +2326,7 @@ struct engine_ops _gpgme_engine_ops_gpgsm = gpgsm_sign, gpgsm_verify, gpgsm_getauditlog, + NULL, /* setexpire */ NULL, /* opassuan_transact */ NULL, /* conf_load */ NULL, /* conf_save */ diff --git a/src/engine-spawn.c b/src/engine-spawn.c index 0eeaeb1f..4025b83a 100644 --- a/src/engine-spawn.c +++ b/src/engine-spawn.c @@ -468,6 +468,7 @@ struct engine_ops _gpgme_engine_ops_spawn = NULL, /* sign */ NULL, /* verify */ NULL, /* getauditlog */ + NULL, /* setexpire */ NULL, /* opassuan_transact */ NULL, /* conf_load */ NULL, /* conf_save */ diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c index c908ad7f..3693dc3b 100644 --- a/src/engine-uiserver.c +++ b/src/engine-uiserver.c @@ -1439,6 +1439,7 @@ struct engine_ops _gpgme_engine_ops_uiserver = uiserver_sign, uiserver_verify, NULL, /* getauditlog */ + NULL, /* setexpire */ NULL, /* opassuan_transact */ NULL, /* conf_load */ NULL, /* conf_save */ diff --git a/src/engine.c b/src/engine.c index ded2f4d1..aeb30c67 100644 --- a/src/engine.c +++ b/src/engine.c @@ -1128,3 +1128,17 @@ _gpgme_engine_op_spawn (engine_t engine, return (*engine->ops->opspawn) (engine->engine, file, argv, datain, dataout, dataerr, flags); } + +gpgme_error_t +_gpgme_engine_op_setexpire (engine_t engine, gpgme_key_t key, + unsigned long expires, const char *subfprs, + unsigned int reserved) +{ + if (!engine) + return gpg_error (GPG_ERR_INV_VALUE); + + if (!engine->ops->setexpire) + return gpg_error (GPG_ERR_NOT_IMPLEMENTED); + + return (*engine->ops->setexpire) (engine->engine, key, expires, subfprs, reserved); +} diff --git a/src/engine.h b/src/engine.h index c512a252..74082851 100644 --- a/src/engine.h +++ b/src/engine.h @@ -210,6 +210,11 @@ gpgme_error_t _gpgme_engine_op_spawn (engine_t engine, gpgme_data_t dataout, gpgme_data_t dataerr, unsigned int flags); +gpgme_error_t _gpgme_engine_op_setexpire (engine_t engine, + gpgme_key_t key, + unsigned long expires, + const char *subfprs, + unsigned int reserved); /* The available engine option flags. */ #define GPGME_ENGINE_FLAG_OFFLINE 1 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); +} diff --git a/src/gpgme.def b/src/gpgme.def index c6902208..6666a1c7 100644 --- a/src/gpgme.def +++ b/src/gpgme.def @@ -274,5 +274,8 @@ EXPORTS gpgme_data_new_from_estream @204 + gpgme_op_setexpire @205 + gpgme_op_setexpire_start @206 + ; END diff --git a/src/gpgme.h.in b/src/gpgme.h.in index b4f817b4..d1bc30de 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1868,6 +1868,13 @@ gpgme_error_t gpgme_op_set_uid_flag (gpgme_ctx_t ctx, gpgme_key_t key, const char *userid, const char *name, const char *value); +/* Change the expiry of a key. */ +gpgme_error_t gpgme_op_setexpire_start (gpgme_ctx_t ctx, + gpgme_key_t key, unsigned long expires, + const char *subfprs, unsigned int reserved); +gpgme_error_t gpgme_op_setexpire (gpgme_ctx_t ctx, + gpgme_key_t key, unsigned long expires, + const char *subfprs, unsigned int reserved); /* Retrieve a pointer to the result of a genkey, createkey, or * createsubkey operation. */ diff --git a/src/libgpgme.vers b/src/libgpgme.vers index 79cbeef2..a740b72d 100644 --- a/src/libgpgme.vers +++ b/src/libgpgme.vers @@ -273,6 +273,9 @@ GPGME_1.0 { gpgme_err_code_from_syserror; gpgme_err_set_errno; + gpgme_op_setexpire; + gpgme_op_setexpire_start; + local: *; |