json: Add op_createkey
* src/gpgme-json.c (hlp_createkey, op_createkey): New. (process_request, hlp_help): Add it. -- This uses an unrestricted context for now until GnuPG-Bug-Id: T4010 is implemented in GnuPG.
This commit is contained in:
parent
af8510fb7f
commit
6c74a59e88
@ -2768,6 +2768,89 @@ leave:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static const char hlp_createkey[] =
|
||||||
|
"op: \"createkey\"\n"
|
||||||
|
"userid: The user id. E.g. \"Foo Bar <foo@bar.baz>\"\n"
|
||||||
|
"\n"
|
||||||
|
"Optional parameters:\n"
|
||||||
|
"algo: Algo of the key as string. See doc for gpg --quick-gen-key.\n"
|
||||||
|
"expires: Seconds since epoch to expiry as Number. 0 means no expiry.\n"
|
||||||
|
"\n"
|
||||||
|
"Response on success:\n"
|
||||||
|
"success: Boolean true.\n"
|
||||||
|
"\n"
|
||||||
|
"Note: This interface does not allow key generation if the userid\n"
|
||||||
|
"of the new key already exists in the keyring.\n";
|
||||||
|
static gpg_error_t
|
||||||
|
op_createkey (cjson_t request, cjson_t result)
|
||||||
|
{
|
||||||
|
gpg_error_t err;
|
||||||
|
gpgme_ctx_t ctx = NULL;
|
||||||
|
unsigned int flags = 0;
|
||||||
|
unsigned long expires = 0;
|
||||||
|
cjson_t j_tmp;
|
||||||
|
const char *algo = "default";
|
||||||
|
const char *userid;
|
||||||
|
|
||||||
|
#ifdef GPG_AGENT_ALLOWS_KEYGEN_TRHOUGH_BROWSER
|
||||||
|
/* GnuPG forbids keygen through the browser socket so for
|
||||||
|
this we create an unrestricted context.
|
||||||
|
See GnuPG-Bug-Id: T4010 for more info */
|
||||||
|
ctx = get_context (GPGME_PROTOCOL_OpenPGP);
|
||||||
|
#else
|
||||||
|
err = gpgme_new (&ctx);
|
||||||
|
if (err)
|
||||||
|
log_fatal ("error creating GPGME context: %s\n", gpg_strerror (err));
|
||||||
|
gpgme_set_protocol (ctx, GPGME_PROTOCOL_OpenPGP);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
j_tmp = cJSON_GetObjectItem (request, "algo");
|
||||||
|
if (j_tmp && cjson_is_string (j_tmp))
|
||||||
|
{
|
||||||
|
algo = j_tmp->valuestring;
|
||||||
|
}
|
||||||
|
|
||||||
|
j_tmp = cJSON_GetObjectItem (request, "userid");
|
||||||
|
if (!j_tmp || !cjson_is_string (j_tmp))
|
||||||
|
{
|
||||||
|
err = gpg_error (GPG_ERR_INV_VALUE);
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
|
userid = j_tmp->valuestring;
|
||||||
|
|
||||||
|
j_tmp = cJSON_GetObjectItem (request, "expires");
|
||||||
|
if (j_tmp)
|
||||||
|
{
|
||||||
|
if (!cjson_is_number (j_tmp))
|
||||||
|
{
|
||||||
|
err = gpg_error (GPG_ERR_INV_VALUE);
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
expires = j_tmp->valueint;
|
||||||
|
|
||||||
|
if (!expires)
|
||||||
|
flags |= GPGME_CREATE_NOEXPIRE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ((err = gpgme_op_createkey (ctx, userid, algo, 0, expires, NULL, flags)))
|
||||||
|
goto leave;
|
||||||
|
|
||||||
|
xjson_AddBoolToObject (result, "success", 1);
|
||||||
|
|
||||||
|
leave:
|
||||||
|
#ifdef GPG_AGENT_ALLOWS_KEYGEN_TRHOUGH_BROWSER
|
||||||
|
release_context (ctx);
|
||||||
|
#else
|
||||||
|
gpgme_release (ctx);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const char hlp_getmore[] =
|
static const char hlp_getmore[] =
|
||||||
"op: \"getmore\"\n"
|
"op: \"getmore\"\n"
|
||||||
@ -2858,10 +2941,12 @@ static const char hlp_help[] =
|
|||||||
"returned. To list all operations it is allowed to leave out \"op\" in\n"
|
"returned. To list all operations it is allowed to leave out \"op\" in\n"
|
||||||
"help mode. Supported values for \"op\" are:\n\n"
|
"help mode. Supported values for \"op\" are:\n\n"
|
||||||
" config Read configuration values.\n"
|
" config Read configuration values.\n"
|
||||||
|
" config_opt Read a single configuration value.\n"
|
||||||
" decrypt Decrypt data.\n"
|
" decrypt Decrypt data.\n"
|
||||||
" delete Delete a key.\n"
|
" delete Delete a key.\n"
|
||||||
" encrypt Encrypt data.\n"
|
" encrypt Encrypt data.\n"
|
||||||
" export Export keys.\n"
|
" export Export keys.\n"
|
||||||
|
" createkey Generate a keypair (OpenPGP only).\n"
|
||||||
" import Import data.\n"
|
" import Import data.\n"
|
||||||
" keylist List keys.\n"
|
" keylist List keys.\n"
|
||||||
" sign Sign data.\n"
|
" sign Sign data.\n"
|
||||||
@ -2918,6 +3003,7 @@ process_request (const char *request)
|
|||||||
{ "export", op_export, hlp_export },
|
{ "export", op_export, hlp_export },
|
||||||
{ "decrypt", op_decrypt, hlp_decrypt },
|
{ "decrypt", op_decrypt, hlp_decrypt },
|
||||||
{ "delete", op_delete, hlp_delete },
|
{ "delete", op_delete, hlp_delete },
|
||||||
|
{ "createkey", op_createkey, hlp_createkey },
|
||||||
{ "keylist", op_keylist, hlp_keylist },
|
{ "keylist", op_keylist, hlp_keylist },
|
||||||
{ "import", op_import, hlp_import },
|
{ "import", op_import, hlp_import },
|
||||||
{ "sign", op_sign, hlp_sign },
|
{ "sign", op_sign, hlp_sign },
|
||||||
|
Loading…
Reference in New Issue
Block a user