Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2021 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 : * @file src/testing/testing_api_cmd_kyc_get.c
21 : * @brief command to test kyc_get request
22 : * @author Christian Grothoff
23 : */
24 : #include "platform.h"
25 : struct KycGetState;
26 : #define TALER_MERCHANT_GET_PRIVATE_KYC_RESULT_CLOSURE struct KycGetState
27 : #include <taler/taler_exchange_service.h>
28 : #include <taler/taler_testing_lib.h>
29 : #include "taler/taler_merchant_service.h"
30 : #include "taler/taler_merchant_testing_lib.h"
31 : #include <taler/merchant/get-private-kyc.h>
32 :
33 :
34 : /**
35 : * State for a "/kyc" GET CMD.
36 : */
37 : struct KycGetState
38 : {
39 : /**
40 : * Operation handle for a GET /private/kyc GET request.
41 : */
42 : struct TALER_MERCHANT_GetPrivateKycHandle *kgh;
43 :
44 : /**
45 : * Base URL of the merchant serving the request.
46 : */
47 : const char *merchant_url;
48 :
49 : /**
50 : * Instance to query, NULL if part of @e merchant_url
51 : */
52 : const char *instance_id;
53 :
54 : /**
55 : * Reference to command providing wire hash, NULL to
56 : * query all accounts.
57 : */
58 : const char *h_wire_ref;
59 :
60 : /**
61 : * URL of exchange to query.
62 : */
63 : const char *exchange_url;
64 :
65 : /**
66 : * Set to the payto hash of the first account
67 : * for which we failed to pass the KYC check.
68 : */
69 : struct TALER_NormalizedPaytoHashP h_payto;
70 :
71 : /**
72 : * Access token the user needs to start a KYC process.
73 : */
74 : struct TALER_AccountAccessTokenP access_token;
75 :
76 : /**
77 : * Expected HTTP response code.
78 : */
79 : unsigned int expected_http_status;
80 :
81 : /**
82 : * Target for long-polling.
83 : */
84 : enum TALER_EXCHANGE_KycLongPollTarget lpt;
85 :
86 : /**
87 : * Expected KYC state.
88 : */
89 : bool expected_kyc_state;
90 :
91 : /**
92 : * Expected KYC state.
93 : */
94 : bool have_access_token;
95 :
96 : /**
97 : * Interpreter state.
98 : */
99 : struct TALER_TESTING_Interpreter *is;
100 :
101 : };
102 :
103 :
104 : /**
105 : * Free the state of a "/kyc" GET CMD, and
106 : * possibly cancel a pending "kyc" GET operation.
107 : *
108 : * @param cls closure with the `struct KycGetState`
109 : * @param cmd command currently being freed.
110 : */
111 : static void
112 9 : kyc_get_cleanup (void *cls,
113 : const struct TALER_TESTING_Command *cmd)
114 : {
115 9 : struct KycGetState *cs = cls;
116 :
117 9 : if (NULL != cs->kgh)
118 : {
119 0 : TALER_LOG_WARNING ("/kyc GET operation did not complete\n");
120 0 : TALER_MERCHANT_get_private_kyc_cancel (cs->kgh);
121 : }
122 9 : GNUNET_free (cs);
123 9 : }
124 :
125 :
126 : /**
127 : * Process "GET /public/kyc_get" (lookup) response.
128 : *
129 : * @param cls closure
130 : * @param kr response we got
131 : */
132 : static void
133 9 : kyc_get_cb (struct KycGetState *cs,
134 : const struct TALER_MERCHANT_GetPrivateKycResponse *kr)
135 : {
136 :
137 9 : cs->kgh = NULL;
138 9 : if (kr->hr.http_status != cs->expected_http_status)
139 : {
140 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
141 : "Expected status %u, got %u\n",
142 : cs->expected_http_status,
143 : kr->hr.http_status);
144 0 : TALER_TESTING_FAIL (cs->is);
145 : }
146 9 : switch (kr->hr.http_status)
147 : {
148 7 : case MHD_HTTP_OK:
149 7 : if (! cs->expected_kyc_state)
150 : {
151 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
152 : "Expected KYC state %u, got %u\n",
153 : cs->expected_kyc_state,
154 : kr->details.ok.kycs_length);
155 0 : TALER_TESTING_FAIL (cs->is);
156 : }
157 7 : for (unsigned int i = 0; i<kr->details.ok.kycs_length; i++)
158 : {
159 : struct TALER_FullPayto payto_uri;
160 :
161 7 : payto_uri = kr->details.ok.kycs[i].payto_uri;
162 7 : if (NULL == payto_uri.full_payto)
163 : {
164 0 : continue;
165 : }
166 7 : TALER_full_payto_normalize_and_hash (payto_uri,
167 : &cs->h_payto);
168 7 : if (! kr->details.ok.kycs[i].no_access_token)
169 : {
170 : cs->access_token
171 4 : = kr->details.ok.kycs[i].access_token;
172 4 : cs->have_access_token = true;
173 : }
174 7 : break;
175 : }
176 7 : break;
177 : }
178 9 : TALER_TESTING_interpreter_next (cs->is);
179 : }
180 :
181 :
182 : /**
183 : * Run the "kyc_get" CMD.
184 : *
185 : * @param cls closure.
186 : * @param cmd command being currently run.
187 : * @param is interpreter state.
188 : */
189 : static void
190 9 : kyc_get_run (void *cls,
191 : const struct TALER_TESTING_Command *cmd,
192 : struct TALER_TESTING_Interpreter *is)
193 : {
194 9 : struct KycGetState *cs = cls;
195 9 : const struct TALER_MerchantWireHashP *h_wire = NULL;
196 :
197 9 : cs->is = is;
198 9 : if (NULL != cs->h_wire_ref)
199 : {
200 : const struct TALER_TESTING_Command *wire_cmd;
201 :
202 2 : if (NULL ==
203 : (wire_cmd =
204 2 : TALER_TESTING_interpreter_lookup_command (cs->is,
205 : cs->h_wire_ref)))
206 : {
207 0 : TALER_TESTING_FAIL (cs->is);
208 : }
209 : /* Note: at the time of writing, no command offers an h_wire trait,
210 : so for now this code is dead and 'h_wire_ref' must always be NULL... */
211 2 : if (GNUNET_OK !=
212 2 : TALER_TESTING_get_trait_h_wire (wire_cmd,
213 : &h_wire))
214 : {
215 0 : TALER_TESTING_FAIL (cs->is);
216 : }
217 : }
218 9 : cs->kgh = TALER_MERCHANT_get_private_kyc_create (
219 : TALER_TESTING_interpreter_get_context (is),
220 : cs->merchant_url);
221 9 : GNUNET_assert (NULL != cs->kgh);
222 9 : if (NULL != cs->instance_id)
223 0 : TALER_MERCHANT_get_private_kyc_set_options (
224 : cs->kgh,
225 : TALER_MERCHANT_get_private_kyc_option_instance_id (
226 : cs->instance_id));
227 9 : if (NULL != h_wire)
228 2 : TALER_MERCHANT_get_private_kyc_set_options (
229 : cs->kgh,
230 : TALER_MERCHANT_get_private_kyc_option_h_wire (h_wire));
231 9 : if (NULL != cs->exchange_url)
232 9 : TALER_MERCHANT_get_private_kyc_set_options (
233 : cs->kgh,
234 : TALER_MERCHANT_get_private_kyc_option_exchange_url (
235 : cs->exchange_url));
236 9 : if (TALER_EXCHANGE_KLPT_NONE != cs->lpt)
237 : {
238 4 : TALER_MERCHANT_get_private_kyc_set_options (
239 : cs->kgh,
240 : TALER_MERCHANT_get_private_kyc_option_lpt (cs->lpt),
241 : TALER_MERCHANT_get_private_kyc_option_timeout (
242 : GNUNET_TIME_UNIT_MINUTES));
243 : }
244 : {
245 : enum TALER_ErrorCode ec;
246 :
247 9 : ec = TALER_MERCHANT_get_private_kyc_start (cs->kgh,
248 : &kyc_get_cb,
249 : cs);
250 9 : GNUNET_assert (TALER_EC_NONE == ec);
251 : }
252 : }
253 :
254 :
255 : /**
256 : * Offer internal data from "KYC" GET CMD.
257 : *
258 : * @param cls closure.
259 : * @param[out] ret result (could be anything).
260 : * @param trait name of the trait.
261 : * @param index index number of the object to offer.
262 : * @return #GNUNET_OK on success.
263 : */
264 : static enum GNUNET_GenericReturnValue
265 2 : kyc_get_traits (void *cls,
266 : const void **ret,
267 : const char *trait,
268 : unsigned int index)
269 : {
270 2 : struct KycGetState *cs = cls;
271 : struct TALER_TESTING_Trait traits[] = {
272 : /* Must be first, skipped if we have no token! */
273 2 : TALER_TESTING_make_trait_account_access_token (
274 2 : &cs->access_token),
275 2 : TALER_TESTING_make_trait_h_normalized_payto (
276 2 : &cs->h_payto),
277 2 : TALER_TESTING_trait_end ()
278 : };
279 :
280 4 : return TALER_TESTING_get_trait (
281 2 : &traits[cs->have_access_token
282 : ? 0
283 2 : : 1],
284 : ret,
285 : trait,
286 : index);
287 : }
288 :
289 :
290 : struct TALER_TESTING_Command
291 9 : TALER_TESTING_cmd_merchant_kyc_get (
292 : const char *label,
293 : const char *merchant_url,
294 : const char *instance_id,
295 : const char *h_wire_ref,
296 : const char *exchange_url,
297 : enum TALER_EXCHANGE_KycLongPollTarget lpt,
298 : unsigned int expected_http_status,
299 : bool expected_kyc_state)
300 : {
301 : struct KycGetState *cs;
302 :
303 9 : cs = GNUNET_new (struct KycGetState);
304 9 : cs->merchant_url = merchant_url;
305 9 : cs->instance_id = instance_id;
306 9 : cs->h_wire_ref = h_wire_ref;
307 9 : cs->exchange_url = exchange_url;
308 9 : cs->lpt = lpt;
309 9 : cs->expected_http_status = expected_http_status;
310 9 : cs->expected_kyc_state = expected_kyc_state;
311 : {
312 9 : struct TALER_TESTING_Command cmd = {
313 : .cls = cs,
314 : .label = label,
315 : .run = &kyc_get_run,
316 : .cleanup = &kyc_get_cleanup,
317 : .traits = &kyc_get_traits
318 : };
319 :
320 9 : return cmd;
321 : }
322 : }
323 :
324 :
325 : /* end of testing_api_cmd_kyc_get.c */
|