json: Add with-sec-fprs param to export
* src/gpgme-json.c (add_secret_fprs): New helper. (op_export, hlp_export): Extend for with-sec fprs. -- This is a request from Mailvelope, to import an export they need the information for which keys from the export a secret key is also available. For simplicity it is much preferred to get this information in a single call without the need to do and parse a keylisting additionally in a second native-messaging call. So we make it optional to include that info in the export.
This commit is contained in:
parent
0e760e396f
commit
6cc842c9aa
@ -720,6 +720,54 @@ create_keylist_patterns (cjson_t request, const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Do a secret keylisting for protocol proto and add the fingerprints of
|
||||||
|
the secret keys for patterns to the result as "sec-fprs" array. */
|
||||||
|
static gpg_error_t
|
||||||
|
add_secret_fprs (const char **patterns, gpgme_protocol_t protocol,
|
||||||
|
cjson_t result)
|
||||||
|
{
|
||||||
|
gpgme_ctx_t ctx;
|
||||||
|
gpg_error_t err;
|
||||||
|
gpgme_key_t key = NULL;
|
||||||
|
cjson_t j_fprs = xjson_CreateArray ();
|
||||||
|
|
||||||
|
ctx = create_onetime_context (protocol);
|
||||||
|
|
||||||
|
gpgme_set_keylist_mode (ctx, GPGME_KEYLIST_MODE_LOCAL |
|
||||||
|
GPGME_KEYLIST_MODE_WITH_SECRET);
|
||||||
|
|
||||||
|
err = gpgme_op_keylist_ext_start (ctx, patterns, 1, 0);
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
gpg_error_object (result, err, "Error listing keys: %s",
|
||||||
|
gpg_strerror (err));
|
||||||
|
goto leave;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!(err = gpgme_op_keylist_next (ctx, &key)))
|
||||||
|
{
|
||||||
|
if (!key || !key->fpr)
|
||||||
|
continue;
|
||||||
|
cJSON_AddItemToArray (j_fprs, cJSON_CreateString (key->fpr));
|
||||||
|
gpgme_key_unref (key);
|
||||||
|
key = NULL;
|
||||||
|
}
|
||||||
|
err = 0;
|
||||||
|
|
||||||
|
release_onetime_context (ctx);
|
||||||
|
ctx = NULL;
|
||||||
|
|
||||||
|
xjson_AddItemToObject (result, "sec-fprs", j_fprs);
|
||||||
|
|
||||||
|
leave:
|
||||||
|
release_onetime_context (ctx);
|
||||||
|
gpgme_key_unref (key);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Create sigsum json array */
|
/* Create sigsum json array */
|
||||||
static cjson_t
|
static cjson_t
|
||||||
sigsum_to_json (gpgme_sigsum_t summary)
|
sigsum_to_json (gpgme_sigsum_t summary)
|
||||||
@ -2438,13 +2486,17 @@ static const char hlp_export[] =
|
|||||||
"minimal: Add EXPORT_MODE_MINIMAL.\n"
|
"minimal: Add EXPORT_MODE_MINIMAL.\n"
|
||||||
"raw: Add EXPORT_MODE_RAW.\n"
|
"raw: Add EXPORT_MODE_RAW.\n"
|
||||||
"pkcs12: Add EXPORT_MODE_PKCS12.\n"
|
"pkcs12: Add EXPORT_MODE_PKCS12.\n"
|
||||||
|
"with-sec-fprs: Add the sec-fprs array to the result.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Response on success:\n"
|
"Response on success:\n"
|
||||||
"type: \"keys\"\n"
|
"type: \"keys\"\n"
|
||||||
"data: Unless armor mode is used a Base64 encoded binary.\n"
|
"data: Unless armor mode is used a Base64 encoded binary.\n"
|
||||||
" In armor mode a string with an armored\n"
|
" In armor mode a string with an armored\n"
|
||||||
" OpenPGP or a PEM / PKCS12 key.\n"
|
" OpenPGP or a PEM / PKCS12 key.\n"
|
||||||
"base64: Boolean indicating whether data is base64 encoded.\n";
|
"base64: Boolean indicating whether data is base64 encoded.\n"
|
||||||
|
"sec-fprs: Optional, only if with-secret is set. An array containing\n"
|
||||||
|
" the fingerprints of the keys in the export for which a secret\n"
|
||||||
|
" key is available";
|
||||||
static gpg_error_t
|
static gpg_error_t
|
||||||
op_export (cjson_t request, cjson_t result)
|
op_export (cjson_t request, cjson_t result)
|
||||||
{
|
{
|
||||||
@ -2453,6 +2505,7 @@ op_export (cjson_t request, cjson_t result)
|
|||||||
gpgme_protocol_t protocol;
|
gpgme_protocol_t protocol;
|
||||||
char **patterns = NULL;
|
char **patterns = NULL;
|
||||||
int abool;
|
int abool;
|
||||||
|
int with_secret = 0;
|
||||||
gpgme_export_mode_t mode = 0;
|
gpgme_export_mode_t mode = 0;
|
||||||
gpgme_data_t output = NULL;
|
gpgme_data_t output = NULL;
|
||||||
|
|
||||||
@ -2493,6 +2546,11 @@ op_export (cjson_t request, cjson_t result)
|
|||||||
if (abool)
|
if (abool)
|
||||||
mode |= GPGME_EXPORT_MODE_PKCS12;
|
mode |= GPGME_EXPORT_MODE_PKCS12;
|
||||||
|
|
||||||
|
if ((err = get_boolean_flag (request, "with-sec-fprs", 0, &abool)))
|
||||||
|
goto leave;
|
||||||
|
if (abool)
|
||||||
|
with_secret = 1;
|
||||||
|
|
||||||
/* Get the export patterns. */
|
/* Get the export patterns. */
|
||||||
patterns = create_keylist_patterns (request, "keys");
|
patterns = create_keylist_patterns (request, "keys");
|
||||||
|
|
||||||
@ -2519,6 +2577,11 @@ op_export (cjson_t request, cjson_t result)
|
|||||||
"keys", !gpgme_get_armor (ctx));
|
"keys", !gpgme_get_armor (ctx));
|
||||||
output = NULL;
|
output = NULL;
|
||||||
|
|
||||||
|
if (!err && with_secret)
|
||||||
|
{
|
||||||
|
err = add_secret_fprs ((const char **) patterns, protocol, result);
|
||||||
|
}
|
||||||
|
|
||||||
leave:
|
leave:
|
||||||
xfree_array (patterns);
|
xfree_array (patterns);
|
||||||
release_context (ctx);
|
release_context (ctx);
|
||||||
|
Loading…
Reference in New Issue
Block a user