diff options
author | Werner Koch <[email protected]> | 2017-03-21 18:02:20 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2017-03-21 18:03:58 +0000 |
commit | 421ddd1e6706046c5062417fd69a87e10c9fc0a9 (patch) | |
tree | a48e37f5fd1c22c2f295c5f63537a8726ab5c9fd /src | |
parent | python: Wrap 'gpgme_op_keylist_from_data_start'. (diff) | |
download | gpgme-421ddd1e6706046c5062417fd69a87e10c9fc0a9.tar.gz gpgme-421ddd1e6706046c5062417fd69a87e10c9fc0a9.zip |
core: New API gpgme_op_set_uid_flag.
* src/gpgme.h.in (gpgme_op_set_uid_flag_start): New.
(gpgme_op_set_uid_flag_start): New.
* src/gpgme.def, src/libgpgme.vers: Add them.
* src/genkey.c (addrevuid_start): Change arg revoke to a flag.
(gpgme_op_revuid_start): Pass GENKEY_EXTRAFLAG_REVOKE for the fomer
revoke parameter.
(gpgme_op_revuid): Ditto.
(set_uid_flag): New.
(gpgme_op_set_uid_flag_start): New.
(gpgme_op_set_uid_flag): New.
* src/engine.h (GENKEY_EXTRAFLAG_SETPRIMARY): new.
* src/engine-gpg.c (gpg_adduid): Implement that flag.
* tests/run-genkey.c (main): New command --set-primary.
--
GnuPG-bug-id: 2931
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/engine-gpg.c | 11 | ||||
-rw-r--r-- | src/engine.h | 5 | ||||
-rw-r--r-- | src/genkey.c | 62 | ||||
-rw-r--r-- | src/gpgme.def | 3 | ||||
-rw-r--r-- | src/gpgme.h.in | 7 | ||||
-rw-r--r-- | src/libgpgme.vers | 3 |
6 files changed, 82 insertions, 9 deletions
diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 6024529b..6e4b8339 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -2222,7 +2222,14 @@ gpg_adduid (engine_gpg_t gpg, if (!key || !key->fpr || !userid) return gpg_error (GPG_ERR_INV_ARG); - if ((extraflags & GENKEY_EXTRAFLAG_REVOKE)) + if ((extraflags & GENKEY_EXTRAFLAG_SETPRIMARY)) + { + if (!have_gpg_version (gpg, "2.1.20")) + err = gpg_error (GPG_ERR_NOT_SUPPORTED); + else + err = add_arg (gpg, "--quick-set-primary-uid"); + } + else if ((extraflags & GENKEY_EXTRAFLAG_REVOKE)) err = add_arg (gpg, "--quick-revuid"); else err = add_arg (gpg, "--quick-adduid"); @@ -2262,7 +2269,7 @@ gpg_genkey (void *engine, * USERID && !KEY - Create a new keyblock. * !USERID && KEY - Add a new subkey to KEY (gpg >= 2.1.14) * USERID && KEY && !ALGO - Add a new user id to KEY (gpg >= 2.1.14). - * + * or set a flag on a user id. */ if (help_data) { diff --git a/src/engine.h b/src/engine.h index f456812e..1064f5ed 100644 --- a/src/engine.h +++ b/src/engine.h @@ -25,8 +25,9 @@ #include "gpgme.h" /* Flags used by the EXTRAFLAGS arg of _gpgme_engine_op_genkey. */ -#define GENKEY_EXTRAFLAG_ARMOR 1 -#define GENKEY_EXTRAFLAG_REVOKE 2 +#define GENKEY_EXTRAFLAG_ARMOR 1 +#define GENKEY_EXTRAFLAG_REVOKE 2 +#define GENKEY_EXTRAFLAG_SETPRIMARY 4 struct engine; diff --git a/src/genkey.c b/src/genkey.c index ea3f1ea4..710b58ff 100644 --- a/src/genkey.c +++ b/src/genkey.c @@ -489,7 +489,7 @@ gpgme_op_createsubkey (gpgme_ctx_t ctx, gpgme_key_t key, const char *algo, static gpgme_error_t -addrevuid_start (gpgme_ctx_t ctx, int synchronous, int revoke, +addrevuid_start (gpgme_ctx_t ctx, int synchronous, int extraflags, gpgme_key_t key, const char *userid, unsigned int flags) { gpgme_error_t err; @@ -512,7 +512,7 @@ addrevuid_start (gpgme_ctx_t ctx, int synchronous, int revoke, if (err) return err; - opd->uidmode = revoke? 2 : 1; + opd->uidmode = extraflags? 2 : 1; _gpgme_engine_set_status_handler (ctx->engine, genkey_status_handler, ctx); @@ -528,7 +528,7 @@ addrevuid_start (gpgme_ctx_t ctx, int synchronous, int revoke, userid, NULL, 0, 0, key, flags, NULL, - revoke? GENKEY_EXTRAFLAG_REVOKE : 0, + extraflags, NULL, NULL); } @@ -584,7 +584,7 @@ gpgme_op_revuid_start (gpgme_ctx_t ctx, if (!ctx) return TRACE_ERR (gpg_error (GPG_ERR_INV_ARG)); - err = addrevuid_start (ctx, 0, 1, key, userid, flags); + err = addrevuid_start (ctx, 0, GENKEY_EXTRAFLAG_REVOKE, key, userid, flags); return TRACE_ERR (err); } @@ -601,8 +601,60 @@ gpgme_op_revuid (gpgme_ctx_t ctx, if (!ctx) return TRACE_ERR (gpg_error (GPG_ERR_INV_ARG)); - err = addrevuid_start (ctx, 1, 1, key, userid, flags); + err = addrevuid_start (ctx, 1, GENKEY_EXTRAFLAG_REVOKE, key, userid, flags); if (!err) err = _gpgme_wait_one (ctx); return TRACE_ERR (err); } + + +/* Set a flag on the USERID of KEY. The only supported flag right now + * is "primary" to mark the primary key. */ +static gpg_error_t +set_uid_flag (gpgme_ctx_t ctx, int synchronous, + gpgme_key_t key, const char *userid, + const char *name, const char *value) +{ + gpgme_error_t err; + + TRACE_BEG4 (DEBUG_CTX, "gpgme_op_set_uid_flag", ctx, + "%d uid='%s' '%s'='%s'", synchronous, userid, name, value); + + if (!ctx || !name || !key || !userid) + return TRACE_ERR (gpg_error (GPG_ERR_INV_ARG)); + + if (!strcmp (name, "primary")) + { + if (value) + err = gpg_error (GPG_ERR_INV_ARG); + else + err = addrevuid_start (ctx, synchronous, + GENKEY_EXTRAFLAG_SETPRIMARY, key, userid, 0); + } + else + return err = gpg_error (GPG_ERR_UNKNOWN_NAME); + + if (synchronous && !err) + err = _gpgme_wait_one (ctx); + return TRACE_ERR (err); +} + + +/* See set_uid_flag. */ +gpgme_error_t +gpgme_op_set_uid_flag_start (gpgme_ctx_t ctx, + gpgme_key_t key, const char *userid, + const char *name, const char *value) +{ + return set_uid_flag (ctx, 0, key, userid, name, value); +} + + +/* See set_uid_flag. Thsi is the synchronous variant. */ +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) +{ + return set_uid_flag (ctx, 1, key, userid, name, value); +} diff --git a/src/gpgme.def b/src/gpgme.def index ddd57d35..9faffb85 100644 --- a/src/gpgme.def +++ b/src/gpgme.def @@ -256,5 +256,8 @@ EXPORTS gpgme_op_keylist_from_data_start @192 + gpgme_op_set_uid_flag_start @193 + gpgme_op_set_uid_flag @194 + ; END diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 16191ebc..e9ee6e2f 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -1726,6 +1726,13 @@ gpgme_error_t gpgme_op_revuid (gpgme_ctx_t ctx, gpgme_key_t key, const char *userid, unsigned int reserved); +/* Set a flag on the USERID of KEY. See the manual for supported flags. */ +gpgme_error_t gpgme_op_set_uid_flag_start (gpgme_ctx_t ctx, + gpgme_key_t key, const char *userid, + const char *name, const char *value); +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); /* Retrieve a pointer to the result of a genkey, createkey, or diff --git a/src/libgpgme.vers b/src/libgpgme.vers index 9344a752..037a6ae2 100644 --- a/src/libgpgme.vers +++ b/src/libgpgme.vers @@ -126,6 +126,9 @@ GPGME_1.1 { gpgme_op_query_swdb; gpgme_op_query_swdb_result; + + gpgme_op_set_uid_flag_start; + gpgme_op_set_uid_flag; }; |