Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2024, 2026 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU General Public License as
7 : published by the Free Software Foundation; either version 3, or
8 : (at your option) any later version.
9 :
10 : TALER is distributed in the hope that it will be useful, but
11 : WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : GNU General Public License for more details.
14 :
15 : You should have received a copy of the GNU General Public
16 : License along with TALER; see the file COPYING. If not, see
17 : <http://www.gnu.org/licenses/>
18 : */
19 :
20 : /**
21 : * @file testing/testing_api_cmd_get_kyc_info.c
22 : * @brief Implement the testing CMDs for the GET /kyc_info operation.
23 : * @author Christian Grothoff
24 : */
25 : #include "taler/platform.h"
26 : #include "taler/taler_json_lib.h"
27 : #include <gnunet/gnunet_curl_lib.h>
28 :
29 : /**
30 : * State for a GET kyc-info CMD.
31 : */
32 : struct GetKycInfoState;
33 :
34 : #define TALER_EXCHANGE_GET_KYC_INFO_RESULT_CLOSURE \
35 : struct GetKycInfoState
36 : #include "taler/taler-exchange/get-kyc-info-ACCESS_TOKEN.h"
37 : #include "taler/taler_testing_lib.h"
38 :
39 : /**
40 : * State for a GET kyc-info CMD.
41 : */
42 : struct GetKycInfoState
43 : {
44 :
45 : /**
46 : * Command to get the account access token from.
47 : */
48 : const char *kyc_check_reference;
49 :
50 : /**
51 : * Expected HTTP response code.
52 : */
53 : unsigned int expected_response_code;
54 :
55 : /**
56 : * Handle to the GET /kyc-info pending operation.
57 : */
58 : struct TALER_EXCHANGE_GetKycInfoHandle *kwh;
59 :
60 : /**
61 : * Interpreter state.
62 : */
63 : struct TALER_TESTING_Interpreter *is;
64 :
65 : /**
66 : * Array of IDs for possible KYC processes we could
67 : * start according to the response.
68 : */
69 : char **ids;
70 :
71 : /**
72 : * Length of the @e ids array.
73 : */
74 : unsigned int num_ids;
75 : };
76 :
77 :
78 : /**
79 : * Handle response to the command.
80 : *
81 : * @param kcg our state
82 : * @param kpci GET KYC status response details
83 : */
84 : static void
85 11 : kyc_info_cb (
86 : TALER_EXCHANGE_GET_KYC_INFO_RESULT_CLOSURE *kcg,
87 : const struct TALER_EXCHANGE_GetKycInfoResponse *kpci)
88 : {
89 11 : struct TALER_TESTING_Interpreter *is = kcg->is;
90 :
91 11 : kcg->kwh = NULL;
92 11 : if (kcg->expected_response_code != kpci->hr.http_status)
93 : {
94 0 : TALER_TESTING_unexpected_status (
95 : is,
96 : kpci->hr.http_status,
97 : kcg->expected_response_code);
98 0 : return;
99 : }
100 11 : switch (kpci->hr.http_status)
101 : {
102 11 : case MHD_HTTP_OK:
103 11 : kcg->num_ids = kpci->details.ok.requirements_length;
104 11 : kcg->ids = GNUNET_new_array (kcg->num_ids,
105 : char *);
106 22 : for (unsigned int i = 0; i<kcg->num_ids; i++)
107 11 : kcg->ids[i] = GNUNET_strdup (
108 : kpci->details.ok.requirements[i].id);
109 11 : break;
110 0 : case MHD_HTTP_NO_CONTENT:
111 0 : break;
112 0 : default:
113 0 : GNUNET_break (0);
114 0 : break;
115 : }
116 11 : TALER_TESTING_interpreter_next (kcg->is);
117 : }
118 :
119 :
120 : /**
121 : * Run the command.
122 : *
123 : * @param cls closure.
124 : * @param cmd the command to execute.
125 : * @param is the interpreter state.
126 : */
127 : static void
128 11 : get_kyc_info_run (void *cls,
129 : const struct TALER_TESTING_Command *cmd,
130 : struct TALER_TESTING_Interpreter *is)
131 : {
132 11 : struct GetKycInfoState *kcg = cls;
133 : const struct TALER_TESTING_Command *res_cmd;
134 : const struct TALER_AccountAccessTokenP *token;
135 :
136 : (void) cmd;
137 11 : kcg->is = is;
138 11 : res_cmd = TALER_TESTING_interpreter_lookup_command (
139 : kcg->is,
140 : kcg->kyc_check_reference);
141 11 : if (NULL == res_cmd)
142 : {
143 0 : GNUNET_break (0);
144 0 : TALER_TESTING_interpreter_fail (kcg->is);
145 0 : return;
146 : }
147 11 : if (GNUNET_OK !=
148 11 : TALER_TESTING_get_trait_account_access_token (
149 : res_cmd,
150 : &token))
151 : {
152 0 : GNUNET_break (0);
153 0 : TALER_TESTING_interpreter_fail (kcg->is);
154 0 : return;
155 : }
156 11 : kcg->kwh = TALER_EXCHANGE_get_kyc_info_create (
157 : TALER_TESTING_interpreter_get_context (is),
158 : TALER_TESTING_get_exchange_url (is),
159 : token);
160 11 : GNUNET_assert (NULL != kcg->kwh);
161 : {
162 : enum TALER_ErrorCode ec;
163 :
164 11 : ec = TALER_EXCHANGE_get_kyc_info_start (kcg->kwh,
165 : &kyc_info_cb,
166 : kcg);
167 11 : if (TALER_EC_NONE != ec)
168 : {
169 0 : GNUNET_break (0);
170 0 : kcg->kwh = NULL;
171 0 : TALER_TESTING_interpreter_fail (kcg->is);
172 0 : return;
173 : }
174 : }
175 : }
176 :
177 :
178 : /**
179 : * Cleanup the state from a "track transaction" CMD, and possibly
180 : * cancel a operation thereof.
181 : *
182 : * @param cls closure.
183 : * @param cmd the command which is being cleaned up.
184 : */
185 : static void
186 11 : get_kyc_info_cleanup (
187 : void *cls,
188 : const struct TALER_TESTING_Command *cmd)
189 : {
190 11 : struct GetKycInfoState *kcg = cls;
191 :
192 11 : if (NULL != kcg->kwh)
193 : {
194 0 : TALER_TESTING_command_incomplete (kcg->is,
195 : cmd->label);
196 0 : TALER_EXCHANGE_get_kyc_info_cancel (kcg->kwh);
197 0 : kcg->kwh = NULL;
198 : }
199 22 : for (unsigned int i = 0; i<kcg->num_ids; i++)
200 11 : GNUNET_free (kcg->ids[i]);
201 11 : GNUNET_free (kcg->ids);
202 11 : GNUNET_free (kcg);
203 11 : }
204 :
205 :
206 : /**
207 : * Offer internal data from a "check KYC" CMD.
208 : *
209 : * @param cls closure.
210 : * @param[out] ret result (could be anything).
211 : * @param trait name of the trait.
212 : * @param index index number of the object to offer.
213 : * @return #GNUNET_OK on success.
214 : */
215 : static enum GNUNET_GenericReturnValue
216 32 : get_kyc_info_traits (void *cls,
217 : const void **ret,
218 : const char *trait,
219 : unsigned int index)
220 : {
221 32 : struct GetKycInfoState *kcg = cls;
222 : struct TALER_TESTING_Trait traits[] = {
223 32 : TALER_TESTING_make_trait_kyc_id (index,
224 32 : kcg->ids[index]),
225 32 : TALER_TESTING_trait_end ()
226 : };
227 :
228 32 : if (index >= kcg->num_ids)
229 0 : return GNUNET_NO;
230 32 : return TALER_TESTING_get_trait (traits,
231 : ret,
232 : trait,
233 : index);
234 : }
235 :
236 :
237 : struct TALER_TESTING_Command
238 11 : TALER_TESTING_cmd_get_kyc_info (
239 : const char *label,
240 : const char *kyc_check_reference,
241 : unsigned int expected_response_code)
242 : {
243 : struct GetKycInfoState *kcg;
244 :
245 11 : kcg = GNUNET_new (struct GetKycInfoState);
246 11 : kcg->kyc_check_reference = kyc_check_reference;
247 11 : kcg->expected_response_code = expected_response_code;
248 : {
249 11 : struct TALER_TESTING_Command cmd = {
250 : .cls = kcg,
251 : .label = label,
252 : .run = &get_kyc_info_run,
253 : .cleanup = &get_kyc_info_cleanup,
254 : .traits = &get_kyc_info_traits
255 : };
256 :
257 11 : return cmd;
258 : }
259 : }
260 :
261 :
262 : /* end of testing_api_cmd_get_kyc_info.c */
|