aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2023-02-02 17:16:13 +0100
committerChristian Grothoff <christian@grothoff.org>2023-02-02 17:16:13 +0100
commita703171f083bab8bb5f316edc47bcffced1f171a (patch)
treeb50dd83a94f0cba92a4b1518dcf79dc7245a7199 /src/lib
parentf60b09f8efbab6b6f30ffc63b52c7520bcd74226 (diff)
downloadexchange-a703171f083bab8bb5f316edc47bcffced1f171a.tar.gz
exchange-a703171f083bab8bb5f316edc47bcffced1f171a.tar.bz2
exchange-a703171f083bab8bb5f316edc47bcffced1f171a.zip
add logic to parse AML decisions response
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/exchange_api_lookup_aml_decision.c16
-rw-r--r--src/lib/exchange_api_lookup_aml_decisions.c78
2 files changed, 84 insertions, 10 deletions
diff --git a/src/lib/exchange_api_lookup_aml_decision.c b/src/lib/exchange_api_lookup_aml_decision.c
index 537101b1c..31c772a56 100644
--- a/src/lib/exchange_api_lookup_aml_decision.c
+++ b/src/lib/exchange_api_lookup_aml_decision.c
@@ -123,12 +123,14 @@ parse_kyc_attributes (const json_t *kyc_attributes,
json_array_foreach (kyc_attributes, idx, obj)
{
struct TALER_EXCHANGE_KycHistoryDetail *kyc = &kyc_attributes_ar[idx];
- json_t *attributes;
+ json_t *attributes = NULL;
struct GNUNET_JSON_Specification spec[] = {
GNUNET_JSON_spec_timestamp ("collection_time",
&kyc->collection_time),
- GNUNET_JSON_spec_json ("attributes",
- &attributes),
+ GNUNET_JSON_spec_mark_optional (
+ GNUNET_JSON_spec_json ("attributes",
+ &attributes),
+ NULL),
GNUNET_JSON_spec_string ("provider_section",
&kyc->provider_section),
GNUNET_JSON_spec_end ()
@@ -187,10 +189,10 @@ parse_decision_ok (struct TALER_EXCHANGE_LookupAmlDecision *lh,
lr.details.success.aml_history_length = json_array_size (aml_history);
lr.details.success.kyc_attributes_length = json_array_size (kyc_attributes);
{
- struct TALER_EXCHANGE_AmlDecisionDetail aml_history_ar
- [GNUNET_NZL (lr.details.success.aml_history_length)];
- struct TALER_EXCHANGE_KycHistoryDetail kyc_attributes_ar
- [lr.details.success.kyc_attributes_length];
+ struct TALER_EXCHANGE_AmlDecisionDetail aml_history_ar[
+ GNUNET_NZL (lr.details.success.aml_history_length)];
+ struct TALER_EXCHANGE_KycHistoryDetail kyc_attributes_ar[
+ lr.details.success.kyc_attributes_length];
enum GNUNET_GenericReturnValue ret = GNUNET_SYSERR;
lr.details.success.aml_history = aml_history_ar;
diff --git a/src/lib/exchange_api_lookup_aml_decisions.c b/src/lib/exchange_api_lookup_aml_decisions.c
index fb5bfaa2e..da17aa784 100644
--- a/src/lib/exchange_api_lookup_aml_decisions.c
+++ b/src/lib/exchange_api_lookup_aml_decisions.c
@@ -64,6 +64,49 @@ struct TALER_EXCHANGE_LookupAmlDecisions
/**
+ * Parse AML decision summary array.
+ *
+ * @param decisions JSON array with AML decision summaries
+ * @param[out] decision_ar where to write the result
+ * @return #GNUNET_OK on success
+ */
+static enum GNUNET_GenericReturnValue
+parse_aml_decisions (const json_t *decisions,
+ struct TALER_EXCHANGE_AmlDecisionSummary *decision_ar)
+{
+ json_t *obj;
+ size_t idx;
+
+ json_array_foreach (decisions, idx, obj)
+ {
+ struct TALER_EXCHANGE_AmlDecisionSummary *decision = &decision_ar[idx];
+ uint32_t state32;
+ struct GNUNET_JSON_Specification spec[] = {
+ GNUNET_JSON_spec_timestamp ("last_decision_time",
+ &decision->last_decision_time),
+ GNUNET_JSON_spec_fixed_auto ("h_payto",
+ &decision->h_payto),
+ GNUNET_JSON_spec_uint32 ("current_state",
+ &state32),
+ GNUNET_JSON_spec_end ()
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (obj,
+ spec,
+ NULL,
+ NULL))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ decision->current_state = (enum TALER_AmlDecisionState) state32;
+ }
+ return GNUNET_OK;
+}
+
+
+/**
* Parse the provided decision data from the "200 OK" response.
*
* @param[in,out] lh handle (callback may be zero'ed out)
@@ -78,10 +121,39 @@ parse_decisions_ok (struct TALER_EXCHANGE_LookupAmlDecisions *lh,
.hr.reply = json,
.hr.http_status = MHD_HTTP_OK
};
- int ret = GNUNET_SYSERR;
+ json_t *records;
+ struct GNUNET_JSON_Specification spec[] = {
+ GNUNET_JSON_spec_json ("records",
+ &records),
+ GNUNET_JSON_spec_end ()
+ };
+
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (json,
+ spec,
+ NULL,
+ NULL))
+ {
+ GNUNET_break_op (0);
+ return GNUNET_SYSERR;
+ }
+ lr.details.success.decisions_length = json_array_size (records);
+ {
+ struct TALER_EXCHANGE_AmlDecisionSummary decisions[
+ GNUNET_NZL (lr.details.success.decisions_length)];
+ enum GNUNET_GenericReturnValue ret = GNUNET_SYSERR;
- GNUNET_break (0); // FIXME: parse response!
- return ret;
+ lr.details.success.decisions = decisions;
+ ret = parse_aml_decisions (records,
+ decisions);
+ if (GNUNET_OK == ret)
+ {
+ lh->decisions_cb (lh->decisions_cb_cls,
+ &lr);
+ lh->decisions_cb = NULL;
+ }
+ return ret;
+ }
}