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) | |
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 537101b1..31c772a5 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 fb5bfaa2..da17aa78 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; +  }  }  | 
