diff options
author | Christian Grothoff <christian@grothoff.org> | 2023-02-02 17:16:13 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2023-02-02 17:16:13 +0100 |
commit | a703171f083bab8bb5f316edc47bcffced1f171a (patch) | |
tree | b50dd83a94f0cba92a4b1518dcf79dc7245a7199 | |
parent | f60b09f8efbab6b6f30ffc63b52c7520bcd74226 (diff) | |
download | exchange-a703171f083bab8bb5f316edc47bcffced1f171a.tar.xz |
add logic to parse AML decisions response
-rw-r--r-- | src/lib/exchange_api_lookup_aml_decision.c | 16 | ||||
-rw-r--r-- | src/lib/exchange_api_lookup_aml_decisions.c | 78 |
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; + } } |