summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Heinecke <aheinecke@intevation.de>2018-05-25 12:17:46 +0200
committerAndre Heinecke <aheinecke@intevation.de>2018-05-25 12:17:46 +0200
commitaa59f4970ac106ccd17fa9fadfc264d11e4cd347 (patch)
tree76f48cbb2ca364890a5f52f0fd9be419fceb646f
parent546e3295eaade073c34364c4ea6ab007532824d8 (diff)
downloadgpgme-aa59f4970ac106ccd17fa9fadfc264d11e4cd347.tar.gz
json: Refactor signature and ei code
* src/gpgme-json.c (add_summary_to_object): Changed to: sigsum_to_json. (add_signature_to_object): Changed to signature_to_json. (add_signatures_to_object): Changed to verify_result_to_json. (add_ei_to_object): Changed to engine_info_to_json. (op_decrypt, op_verify, op_version): Use new functions. -- This pattern of gpgme_type to json object conversion is much cleaner then the error returning "add to object" functions.
-rw-r--r--src/gpgme-json.c243
1 files changed, 81 insertions, 162 deletions
diff --git a/src/gpgme-json.c b/src/gpgme-json.c
index 635294eb..99f7d425 100644
--- a/src/gpgme-json.c
+++ b/src/gpgme-json.c
@@ -646,46 +646,47 @@ data_from_base64_string (gpgme_data_t *r_data, cjson_t json)
}
-/* Helper for summary formatting */
-static void
-add_summary_to_object (cjson_t result, gpgme_sigsum_t summary)
+/* Create sigsum json array */
+static cjson_t
+sigsum_to_json (gpgme_sigsum_t summary)
{
- cjson_t response = xjson_CreateArray ();
+ cjson_t result = xjson_CreateArray ();
+
if ( (summary & GPGME_SIGSUM_VALID ))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("valid"));
if ( (summary & GPGME_SIGSUM_GREEN ))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("green"));
if ( (summary & GPGME_SIGSUM_RED ))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("red"));
if ( (summary & GPGME_SIGSUM_KEY_REVOKED))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("revoked"));
if ( (summary & GPGME_SIGSUM_KEY_EXPIRED))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("key-expired"));
if ( (summary & GPGME_SIGSUM_SIG_EXPIRED))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("sig-expired"));
if ( (summary & GPGME_SIGSUM_KEY_MISSING))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("key-missing"));
if ( (summary & GPGME_SIGSUM_CRL_MISSING))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("crl-missing"));
if ( (summary & GPGME_SIGSUM_CRL_TOO_OLD))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("crl-too-old"));
if ( (summary & GPGME_SIGSUM_BAD_POLICY ))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("bad-policy"));
if ( (summary & GPGME_SIGSUM_SYS_ERROR ))
- cJSON_AddItemToArray (response,
+ cJSON_AddItemToArray (result,
cJSON_CreateString ("sys-error"));
- cJSON_AddItemToObject (result, "summary", response);
+ return result;
}
@@ -930,145 +931,62 @@ key_to_json (gpgme_key_t key)
return result;
}
-/* Add a single signature to a json object */
-static gpg_error_t
-add_signature_to_object (cjson_t result, gpgme_signature_t sig)
+/* Create a signature json object */
+static cjson_t
+signature_to_json (gpgme_signature_t sig)
{
- gpg_error_t err = 0;
-
- if (!cJSON_AddStringToObject (result, "status",
- gpgme_strerror (sig->status)))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
-
- if (!cJSON_AddNumberToObject (result, "code", sig->status))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
-
- add_summary_to_object (result, sig->summary);
+ cjson_t result = xjson_CreateObject ();
- if (!cJSON_AddStringToObject (result, "fingerprint", sig->fpr))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
+ xjson_AddStringToObject0 (result, "status",
+ gpgme_strerror (sig->status));
- if (!cJSON_AddNumberToObject (result, "created", sig->timestamp))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
+ xjson_AddStringToObject0 (result, "validity",
+ validity_to_string (sig->validity));
+ xjson_AddStringToObject0 (result, "fingerprint", sig->fpr);
- if (!cJSON_AddNumberToObject (result, "expired", sig->exp_timestamp))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
+ xjson_AddItemToObject (result, "summary", sigsum_to_json (sig->summary));
- if (!cJSON_AddStringToObject (result, "validity",
- validity_to_string (sig->validity)))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
+ xjson_AddNumberToObject (result, "created", sig->timestamp);
+ xjson_AddNumberToObject (result, "expired", sig->exp_timestamp);
+ xjson_AddNumberToObject (result, "code", sig->status);
-leave:
- return err;
+ return result;
}
-
-/* Add multiple signatures as an array to a result */
-static gpg_error_t
-add_signatures_to_object (cjson_t result, gpgme_signature_t signatures)
+/* Create a JSON object from a gpgme_verify result */
+static cjson_t
+verify_result_to_json (gpgme_verify_result_t verify_result)
{
- cjson_t response = xjson_CreateArray ();
- gpg_error_t err = 0;
- gpgme_signature_t sig;
+ cjson_t response = xjson_CreateObject ();
- for (sig = signatures; sig; sig = sig->next)
+ if (verify_result->signatures)
{
- cjson_t sig_obj = xjson_CreateObject ();
- err = add_signature_to_object (sig_obj, sig);
- if (err)
- {
- cJSON_Delete (sig_obj);
- sig_obj = NULL;
- goto leave;
- }
-
- cJSON_AddItemToArray (response, sig_obj);
- }
+ cjson_t array = xjson_CreateArray ();
+ gpgme_signature_t sig;
- if (!cJSON_AddItemToObject (result, "signatures", response))
- {
- err = gpg_error_from_syserror ();
- cJSON_Delete (response);
- response = NULL;
- return err;
+ for (sig = verify_result->signatures; sig; sig = sig->next)
+ cJSON_AddItemToArray (array, signature_to_json (sig));
+ xjson_AddItemToObject (response, "signatures", array);
}
- response = NULL;
-leave:
- if (err && response)
- {
- cJSON_Delete (response);
- response = NULL;
- }
- return err;
+ return response;
}
-
-/* Add an array of signature informations under the name "name". */
-static gpg_error_t
-add_signatures_object (cjson_t result, const char *name,
- gpgme_verify_result_t verify_result)
+/* Create a JSON object from an engine_info */
+static cjson_t
+engine_info_to_json (gpgme_engine_info_t info)
{
- cjson_t response = xjson_CreateObject ();
- gpg_error_t err = 0;
-
- err = add_signatures_to_object (response, verify_result->signatures);
-
- if (err)
- {
- goto leave;
- }
-
- if (!cJSON_AddItemToObject (result, name, response))
- {
- err = gpg_error_from_syserror ();
- goto leave;
- }
- leave:
- if (err)
- {
- cJSON_Delete (response);
- response = NULL;
- }
- return err;
-}
+ cjson_t result = xjson_CreateObject ();
-static gpg_error_t
-add_ei_to_object (cjson_t result, gpgme_engine_info_t info)
-{
- if (!cJSON_AddStringToObject (result, "protocol",
- protocol_to_string (info->protocol)))
- return gpg_error_from_syserror ();
- if (!cJSON_AddStringToObject (result, "fname", info->file_name))
- return gpg_error_from_syserror ();
- if (!cJSON_AddStringToObject (result, "version", info->version))
- return gpg_error_from_syserror ();
- if (!cJSON_AddStringToObject (result, "req_version", info->req_version))
- return gpg_error_from_syserror ();
- if (!cJSON_AddStringToObject (result, "homedir",
- info->home_dir ?
- info->home_dir :
- "default"))
- return gpg_error_from_syserror ();
- return 0;
+ xjson_AddStringToObject0 (result, "protocol",
+ protocol_to_string (info->protocol));
+ xjson_AddStringToObject0 (result, "fname", info->file_name);
+ xjson_AddStringToObject0 (result, "version", info->version);
+ xjson_AddStringToObject0 (result, "req_version", info->req_version);
+ xjson_AddStringToObject0 (result, "homedir", info->home_dir ?
+ info->home_dir :
+ "default");
+ return result;
}
/* Create a gpgme_data from json string data named "name"
@@ -1371,6 +1289,17 @@ static const char hlp_decrypt[] =
"base64: Boolean indicating whether data is base64 encoded.\n"
"mime: A Boolean indicating whether the data is a MIME object.\n"
"info: An optional object with extra information.\n"
+ "info: An object with optional signature information.\n"
+ " Array values:\n"
+ " signatures\n"
+ " String values:\n"
+ " status: The status of the signature.\n"
+ " fingerprint: The fingerprint of the signing key.\n"
+ " validity: The validity as string.\n"
+ " Number values:\n"
+ " code: The status as a number.\n"
+ " Array values:\n"
+ " summary: A string array of the sig summary.\n"
"more: Optional boolean indicating that \"getmore\" is required.";
static gpg_error_t
op_decrypt (cjson_t request, cjson_t result)
@@ -1422,14 +1351,8 @@ op_decrypt (cjson_t request, cjson_t result)
verify_result = gpgme_op_verify_result (ctx);
if (verify_result && verify_result->signatures)
{
- err = add_signatures_object (result, "info", verify_result);
- }
-
- if (err)
- {
- gpg_error_object (result, err, "Info output failed: %s",
- gpg_strerror (err));
- goto leave;
+ xjson_AddItemToObject (result, "info",
+ verify_result_to_json (verify_result));
}
err = make_data_object (result, output, chunksize, "plaintext", -1);
@@ -1611,6 +1534,16 @@ static const char hlp_verify[] =
"data: The verified data. This may be base64 encoded.\n"
"base64: Boolean indicating whether data is base64 encoded.\n"
"info: An object with signature information.\n"
+ " Array values:\n"
+ " signatures\n"
+ " String values:\n"
+ " status: The status of the signature.\n"
+ " fingerprint: The fingerprint of the signing key.\n"
+ " validity: The validity as string.\n"
+ " Number values:\n"
+ " code: The status as a number.\n"
+ " Array values:\n"
+ " summary: A string array of the sig summary.\n"
"more: Optional boolean indicating that \"getmore\" is required.";
static gpg_error_t
op_verify (cjson_t request, cjson_t result)
@@ -1669,14 +1602,8 @@ op_verify (cjson_t request, cjson_t result)
verify_result = gpgme_op_verify_result (ctx);
if (verify_result && verify_result->signatures)
{
- err = add_signatures_object (result, "info", verify_result);
- }
-
- if (err)
- {
- gpg_error_object (result, err, "Info output failed: %s",
- gpg_strerror (err));
- goto leave;
+ xjson_AddItemToObject (result, "info",
+ verify_result_to_json (verify_result));
}
err = make_data_object (result, output, chunksize, "plaintext", -1);
@@ -1728,15 +1655,7 @@ op_version (cjson_t request, cjson_t result)
}
for (; ei; ei = ei->next)
- {
- cjson_t obj = xjson_CreateObject ();
- if ((err = add_ei_to_object (obj, ei)))
- {
- cJSON_Delete (infos);
- return err;
- }
- cJSON_AddItemToArray (infos, obj);
- }
+ cJSON_AddItemToArray (infos, engine_info_to_json (ei));
if (!cJSON_AddItemToObject (result, "info", infos))
{