diff options
Diffstat (limited to '')
| -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;  }; | 
