aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2017-03-21 18:02:20 +0000
committerWerner Koch <[email protected]>2017-03-21 18:03:58 +0000
commit421ddd1e6706046c5062417fd69a87e10c9fc0a9 (patch)
treea48e37f5fd1c22c2f295c5f63537a8726ab5c9fd /src
parentpython: Wrap 'gpgme_op_keylist_from_data_start'. (diff)
downloadgpgme-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.c11
-rw-r--r--src/engine.h5
-rw-r--r--src/genkey.c62
-rw-r--r--src/gpgme.def3
-rw-r--r--src/gpgme.h.in7
-rw-r--r--src/libgpgme.vers3
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;
};