Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2014-2024 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 testing/test_kyc_api.c
21 : * @brief testcase to test the KYC processes
22 : * @author Christian Grothoff
23 : */
24 : #include "taler/platform.h"
25 : #include "taler/taler_util.h"
26 : #include "taler/taler_attributes.h"
27 : #include "taler/taler_signatures.h"
28 : #include "taler/taler_exchange_service.h"
29 : #include "taler/taler_json_lib.h"
30 : #include <gnunet/gnunet_util_lib.h>
31 : #include <microhttpd.h>
32 : #include "taler/taler_bank_service.h"
33 : #include "taler/taler_fakebank_lib.h"
34 : #include "taler/taler_testing_lib.h"
35 :
36 :
37 : /**
38 : * Configuration file we use. One (big) configuration is used
39 : * for the various components for this test.
40 : */
41 : #define CONFIG_FILE "test_kyc_api.conf"
42 :
43 : /**
44 : * Our credentials.
45 : */
46 : struct TALER_TESTING_Credentials cred;
47 :
48 :
49 : /**
50 : * Execute the taler-exchange-wirewatch command with
51 : * our configuration file.
52 : *
53 : * @param label label to use for the command.
54 : */
55 : #define CMD_EXEC_WIREWATCH(label) \
56 : TALER_TESTING_cmd_exec_wirewatch2 ( \
57 : label, \
58 : CONFIG_FILE, \
59 : "exchange-account-2")
60 :
61 : /**
62 : * Execute the taler-exchange-aggregator, closer and transfer commands with
63 : * our configuration file.
64 : *
65 : * @param label label to use for the command.
66 : */
67 : #define CMD_EXEC_AGGREGATOR(label) \
68 : TALER_TESTING_cmd_sleep ( \
69 : label "-sleep", 1), \
70 : TALER_TESTING_cmd_exec_aggregator_with_kyc ( \
71 : label, CONFIG_FILE), \
72 : TALER_TESTING_cmd_exec_transfer ( \
73 : label, CONFIG_FILE)
74 :
75 : /**
76 : * Run wire transfer of funds from some user's account to the
77 : * exchange.
78 : *
79 : * @param label label to use for the command.
80 : * @param amount amount to transfer, i.e. "EUR:1"
81 : */
82 : #define CMD_TRANSFER_TO_EXCHANGE(label,amount) \
83 : TALER_TESTING_cmd_admin_add_incoming ( \
84 : label, \
85 : amount, \
86 : &cred.ba, \
87 : cred.user42_payto)
88 :
89 : /**
90 : * Main function that will tell the interpreter what commands to
91 : * run.
92 : *
93 : * @param cls closure
94 : */
95 : static void
96 1 : run (void *cls,
97 : struct TALER_TESTING_Interpreter *is)
98 : {
99 : struct TALER_TESTING_Command withdraw[] = {
100 1 : CMD_TRANSFER_TO_EXCHANGE (
101 : "create-reserve-1",
102 : "EUR:15.02"),
103 1 : TALER_TESTING_cmd_check_bank_admin_transfer (
104 : "check-create-reserve-1",
105 : "EUR:15.02",
106 : cred.user42_payto,
107 : cred.exchange_payto,
108 : "create-reserve-1"),
109 1 : CMD_EXEC_WIREWATCH ("wirewatch-1"),
110 1 : TALER_TESTING_cmd_withdraw_amount (
111 : "withdraw-coin-1-no-kyc",
112 : "create-reserve-1",
113 : "EUR:10",
114 : 0, /* age restriction off */
115 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
116 1 : TALER_TESTING_cmd_withdraw_amount (
117 : "withdraw-coin-1",
118 : "create-reserve-1",
119 : "EUR:5",
120 : 0, /* age restriction off */
121 : MHD_HTTP_OK),
122 1 : TALER_TESTING_cmd_end ()
123 : };
124 :
125 : /**
126 : * Test withdraw with KYC.
127 : */
128 : struct TALER_TESTING_Command withdraw_kyc[] = {
129 1 : CMD_TRANSFER_TO_EXCHANGE (
130 : "create-reserve-kyc",
131 : "EUR:15.02"),
132 1 : TALER_TESTING_cmd_check_bank_admin_transfer (
133 : "check-create-reserve-kyc",
134 : "EUR:15.02",
135 : cred.user42_payto,
136 : cred.exchange_payto,
137 : "create-reserve-kyc"),
138 1 : CMD_EXEC_WIREWATCH ("wirewatch-kyc"),
139 1 : TALER_TESTING_cmd_withdraw_amount (
140 : "withdraw-coin-1-lacking-kyc",
141 : "create-reserve-kyc",
142 : "EUR:10",
143 : 0, /* age restriction off */
144 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
145 1 : TALER_TESTING_cmd_admin_add_kycauth (
146 : "setup-account-key-withdraw",
147 : "EUR:0.01",
148 : &cred.ba,
149 : cred.user42_payto,
150 : NULL /* create new key */),
151 1 : CMD_EXEC_WIREWATCH (
152 : "import-kyc-account-withdraw"),
153 1 : TALER_TESTING_cmd_check_kyc_get (
154 : "check-kyc-withdraw",
155 : "withdraw-coin-1-lacking-kyc",
156 : "setup-account-key-withdraw",
157 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
158 : MHD_HTTP_ACCEPTED),
159 1 : TALER_TESTING_cmd_get_kyc_info (
160 : "get-kyc-info-withdraw",
161 : "check-kyc-withdraw",
162 : MHD_HTTP_OK),
163 1 : TALER_TESTING_cmd_post_kyc_start (
164 : "start-kyc-process-withdraw",
165 : "get-kyc-info-withdraw",
166 : 0,
167 : MHD_HTTP_OK),
168 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
169 : "proof-kyc-withdraw-oauth2",
170 : "withdraw-coin-1-lacking-kyc",
171 : "test-oauth2",
172 : "pass",
173 : MHD_HTTP_SEE_OTHER),
174 1 : TALER_TESTING_cmd_withdraw_with_age_proof (
175 : "age-withdraw-coin-1-with-kyc",
176 : "create-reserve-kyc",
177 : 1,
178 : MHD_HTTP_CREATED,
179 : "EUR:5",
180 : NULL),
181 1 : TALER_TESTING_cmd_withdraw_reveal_age_proof (
182 : "reveal-age-withdraw-coin-1-with-kyc",
183 : "age-withdraw-coin-1-with-kyc",
184 : MHD_HTTP_OK),
185 : /* Attestations above are bound to the originating *bank* account,
186 : not to the reserve (!). Hence, they are NOT found here! */
187 1 : TALER_TESTING_cmd_reserve_get_attestable (
188 : "reserve-get-attestable",
189 : "create-reserve-kyc",
190 : MHD_HTTP_NOT_FOUND,
191 : NULL),
192 1 : TALER_TESTING_cmd_end ()
193 : };
194 : struct TALER_TESTING_Command spend[] = {
195 1 : TALER_TESTING_cmd_set_var (
196 : "account-priv",
197 : TALER_TESTING_cmd_deposit (
198 : "deposit-simple-fail-kyc",
199 : "withdraw-coin-1",
200 : 0,
201 : cred.user43_payto,
202 : "{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
203 1 : GNUNET_TIME_UNIT_ZERO,
204 : "EUR:5",
205 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS)),
206 1 : TALER_TESTING_cmd_admin_add_kycauth (
207 : "kyc-auth-transfer",
208 : "EUR:0.01",
209 : &cred.ba,
210 : cred.user42_payto,
211 : "deposit-simple-fail-kyc"),
212 1 : TALER_TESTING_cmd_admin_add_kycauth (
213 : "kyc-auth-transfer",
214 : "EUR:0.01",
215 : &cred.ba,
216 : cred.user43_payto,
217 : "deposit-simple-fail-kyc"),
218 1 : CMD_EXEC_WIREWATCH (
219 : "import-kyc-account"),
220 1 : TALER_TESTING_cmd_deposit (
221 : "deposit-simple",
222 : "withdraw-coin-1",
223 : 0,
224 : cred.user43_payto,
225 : "{\"items\":[{\"name\":\"ice cream\",\"value\":1}]}",
226 1 : GNUNET_TIME_UNIT_ZERO,
227 : "EUR:5",
228 : MHD_HTTP_OK),
229 1 : TALER_TESTING_cmd_deposits_get (
230 : "track-deposit",
231 : "deposit-simple",
232 : 0,
233 : MHD_HTTP_ACCEPTED,
234 : NULL),
235 1 : TALER_TESTING_cmd_end ()
236 : };
237 :
238 :
239 : struct TALER_TESTING_Command track[] = {
240 1 : CMD_EXEC_AGGREGATOR ("run-aggregator-before-kyc"),
241 1 : TALER_TESTING_cmd_check_bank_empty (
242 : "check_bank_empty-no-kyc"),
243 1 : TALER_TESTING_cmd_deposits_get (
244 : "track-deposit-kyc-ready",
245 : "deposit-simple",
246 : 0,
247 : MHD_HTTP_ACCEPTED,
248 : NULL),
249 1 : TALER_TESTING_cmd_admin_add_kycauth (
250 : "setup-account-key-deposit",
251 : "EUR:0.01",
252 : &cred.ba,
253 : cred.user43_payto,
254 : NULL /* create new key */),
255 1 : CMD_EXEC_WIREWATCH (
256 : "import-kyc-account-deposit"),
257 1 : TALER_TESTING_cmd_check_kyc_get (
258 : "check-kyc-deposit",
259 : "track-deposit-kyc-ready",
260 : "setup-account-key-deposit",
261 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
262 : MHD_HTTP_ACCEPTED),
263 1 : TALER_TESTING_cmd_get_kyc_info (
264 : "get-kyc-info-deposit",
265 : "check-kyc-deposit",
266 : MHD_HTTP_OK),
267 1 : TALER_TESTING_cmd_post_kyc_start (
268 : "start-kyc-process-deposit",
269 : "get-kyc-info-deposit",
270 : 0,
271 : MHD_HTTP_OK),
272 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
273 : "proof-kyc-no-service",
274 : "track-deposit-kyc-ready",
275 : "test-oauth2",
276 : "bad",
277 : MHD_HTTP_BAD_GATEWAY),
278 1 : TALER_TESTING_cmd_oauth_with_birthdate (
279 : "start-oauth-service",
280 : "2005-00-00",
281 : 6666),
282 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
283 : "proof-kyc-fail",
284 : "track-deposit-kyc-ready",
285 : "test-oauth2",
286 : "bad",
287 : MHD_HTTP_FORBIDDEN),
288 1 : TALER_TESTING_cmd_check_kyc_get (
289 : "check-kyc-deposit-again",
290 : "track-deposit-kyc-ready",
291 : "setup-account-key-deposit",
292 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
293 : MHD_HTTP_ACCEPTED),
294 1 : TALER_TESTING_cmd_get_kyc_info (
295 : "get-kyc-info-deposit-again",
296 : "check-kyc-deposit-again",
297 : MHD_HTTP_OK),
298 1 : TALER_TESTING_cmd_post_kyc_start (
299 : "start-kyc-process-deposit-again",
300 : "get-kyc-info-deposit-again",
301 : 0,
302 : MHD_HTTP_OK),
303 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
304 : "proof-kyc-pass",
305 : "track-deposit-kyc-ready",
306 : "test-oauth2",
307 : "pass",
308 : MHD_HTTP_SEE_OTHER),
309 1 : CMD_EXEC_AGGREGATOR (
310 : "run-aggregator-after-kyc"),
311 1 : TALER_TESTING_cmd_check_bank_transfer (
312 : "check_bank_transfer-499c",
313 1 : cred.exchange_url,
314 : "EUR:4.98",
315 : cred.exchange_payto,
316 : cred.user43_payto),
317 1 : TALER_TESTING_cmd_check_bank_empty (
318 : "check_bank_empty"),
319 1 : TALER_TESTING_cmd_end ()
320 : };
321 :
322 : struct TALER_TESTING_Command wallet_kyc[] = {
323 1 : TALER_TESTING_cmd_wallet_kyc_get (
324 : "wallet-kyc-fail",
325 : NULL,
326 : "EUR:1000000",
327 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
328 1 : TALER_TESTING_cmd_check_kyc_get (
329 : "check-kyc-wallet",
330 : "wallet-kyc-fail",
331 : "wallet-kyc-fail",
332 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
333 : MHD_HTTP_ACCEPTED),
334 1 : TALER_TESTING_cmd_get_kyc_info (
335 : "get-kyc-info-kyc-wallet",
336 : "check-kyc-wallet",
337 : MHD_HTTP_OK),
338 1 : TALER_TESTING_cmd_post_kyc_start (
339 : "start-kyc-wallet",
340 : "get-kyc-info-kyc-wallet",
341 : 0,
342 : MHD_HTTP_OK),
343 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
344 : "proof-wallet-kyc",
345 : "wallet-kyc-fail",
346 : "test-oauth2",
347 : "pass",
348 : MHD_HTTP_SEE_OTHER),
349 1 : TALER_TESTING_cmd_check_kyc_get (
350 : "wallet-kyc-check",
351 : "wallet-kyc-fail",
352 : "wallet-kyc-fail",
353 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
354 : MHD_HTTP_OK),
355 1 : TALER_TESTING_cmd_reserve_get_attestable (
356 : "wallet-get-attestable",
357 : "wallet-kyc-fail",
358 : MHD_HTTP_OK,
359 : TALER_ATTRIBUTE_FULL_NAME,
360 : NULL),
361 1 : TALER_TESTING_cmd_reserve_attest (
362 : "wallet-get-attest",
363 : "wallet-kyc-fail",
364 : MHD_HTTP_OK,
365 : TALER_ATTRIBUTE_FULL_NAME,
366 : NULL),
367 1 : TALER_TESTING_cmd_end ()
368 : };
369 :
370 : /**
371 : * Test withdrawal for P2P
372 : */
373 : struct TALER_TESTING_Command p2p_withdraw[] = {
374 : /**
375 : * Move money to the exchange's bank account.
376 : */
377 1 : CMD_TRANSFER_TO_EXCHANGE (
378 : "p2p_create-reserve-1",
379 : "EUR:5.04"),
380 1 : CMD_TRANSFER_TO_EXCHANGE (
381 : "p2p_create-reserve-2",
382 : "EUR:5.01"),
383 1 : CMD_TRANSFER_TO_EXCHANGE (
384 : "p2p_create-reserve-3",
385 : "EUR:0.03"),
386 1 : TALER_TESTING_cmd_reserve_poll (
387 : "p2p_poll-reserve-1",
388 : "p2p_create-reserve-1",
389 : "EUR:5.04",
390 : GNUNET_TIME_UNIT_MINUTES,
391 : MHD_HTTP_OK),
392 1 : TALER_TESTING_cmd_check_bank_admin_transfer (
393 : "p2p_check-create-reserve-1",
394 : "EUR:5.04",
395 : cred.user42_payto,
396 : cred.exchange_payto,
397 : "p2p_create-reserve-1"),
398 1 : TALER_TESTING_cmd_check_bank_admin_transfer (
399 : "p2p_check-create-reserve-2",
400 : "EUR:5.01",
401 : cred.user42_payto,
402 : cred.exchange_payto,
403 : "p2p_create-reserve-2"),
404 : /**
405 : * Make a reserve exist, according to the previous
406 : * transfer.
407 : */
408 1 : CMD_EXEC_WIREWATCH ("p2p_wirewatch-1"),
409 1 : TALER_TESTING_cmd_reserve_poll_finish (
410 : "p2p_finish-poll-reserve-1",
411 : GNUNET_TIME_UNIT_SECONDS,
412 : "p2p_poll-reserve-1"),
413 : /**
414 : * Withdraw EUR:5.
415 : */
416 1 : TALER_TESTING_cmd_withdraw_amount (
417 : "p2p_withdraw-coin-1",
418 : "p2p_create-reserve-1",
419 : "EUR:5",
420 : 0, /* age restriction off */
421 : MHD_HTTP_OK),
422 : /**
423 : * Check the reserve is depleted.
424 : */
425 1 : TALER_TESTING_cmd_status (
426 : "p2p_status-1",
427 : "p2p_create-reserve-1",
428 : "EUR:0.03",
429 : MHD_HTTP_OK),
430 1 : TALER_TESTING_cmd_end ()
431 : };
432 : struct TALER_TESTING_Command push[] = {
433 1 : TALER_TESTING_cmd_purse_create_with_deposit (
434 : "purse-with-deposit",
435 : MHD_HTTP_OK,
436 : "{\"amount\":\"EUR:1\",\"summary\":\"ice cream\"}",
437 : true, /* upload contract */
438 : GNUNET_TIME_UNIT_MINUTES, /* expiration */
439 : "p2p_withdraw-coin-1",
440 : "EUR:1.01",
441 : NULL),
442 1 : TALER_TESTING_cmd_coin_history (
443 : "coin-history-purse-with-deposit",
444 : "p2p_withdraw-coin-1#0",
445 : "EUR:3.99",
446 : MHD_HTTP_OK),
447 1 : TALER_TESTING_cmd_purse_poll (
448 : "push-poll-purse-before-merge",
449 : MHD_HTTP_OK,
450 : "purse-with-deposit",
451 : "EUR:1",
452 : true,
453 : GNUNET_TIME_UNIT_MINUTES),
454 1 : TALER_TESTING_cmd_contract_get (
455 : "push-get-contract",
456 : MHD_HTTP_OK,
457 : true, /* for merge */
458 : "purse-with-deposit"),
459 1 : TALER_TESTING_cmd_purse_merge (
460 : "purse-merge-into-reserve",
461 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS,
462 : "push-get-contract",
463 : "p2p_create-reserve-1"),
464 1 : TALER_TESTING_cmd_check_kyc_get (
465 : "check-kyc-purse-merge",
466 : "purse-merge-into-reserve",
467 : "p2p_create-reserve-1",
468 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
469 : MHD_HTTP_ACCEPTED),
470 1 : TALER_TESTING_cmd_get_kyc_info (
471 : "get-kyc-info-purse-merge-into-reserve",
472 : "check-kyc-purse-merge",
473 : MHD_HTTP_OK),
474 1 : TALER_TESTING_cmd_post_kyc_start (
475 : "start-kyc-process-purse-merge-into-reserve",
476 : "get-kyc-info-purse-merge-into-reserve",
477 : 0,
478 : MHD_HTTP_OK),
479 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
480 : "p2p_proof-kyc",
481 : "purse-merge-into-reserve",
482 : "test-oauth2",
483 : "pass",
484 : MHD_HTTP_SEE_OTHER),
485 1 : TALER_TESTING_cmd_purse_merge (
486 : "purse-merge-into-reserve",
487 : MHD_HTTP_OK,
488 : "push-get-contract",
489 : "p2p_create-reserve-1"),
490 1 : TALER_TESTING_cmd_purse_poll_finish (
491 : "push-merge-purse-poll-finish",
492 : GNUNET_TIME_relative_multiply (
493 : GNUNET_TIME_UNIT_SECONDS,
494 : 5),
495 : "push-poll-purse-before-merge"),
496 1 : TALER_TESTING_cmd_status (
497 : "push-check-post-merge-reserve-balance-get",
498 : "p2p_create-reserve-1",
499 : "EUR:1.03",
500 : MHD_HTTP_OK),
501 1 : TALER_TESTING_cmd_reserve_history (
502 : "push-check-post-merge-reserve-balance-post",
503 : "p2p_create-reserve-1",
504 : "EUR:1.03",
505 : MHD_HTTP_OK),
506 :
507 1 : TALER_TESTING_cmd_end ()
508 : };
509 : struct TALER_TESTING_Command pull[] = {
510 1 : TALER_TESTING_cmd_purse_create_with_reserve (
511 : "purse-create-with-reserve",
512 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS,
513 : "{\"amount\":\"EUR:1\",\"summary\":\"ice cream\"}",
514 : true /* upload contract */,
515 : true /* pay purse fee */,
516 : GNUNET_TIME_UNIT_MINUTES, /* expiration */
517 : "p2p_create-reserve-3"),
518 1 : TALER_TESTING_cmd_check_kyc_get (
519 : "check-kyc-purse-create",
520 : "purse-create-with-reserve",
521 : "purse-create-with-reserve",
522 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
523 : MHD_HTTP_ACCEPTED),
524 1 : TALER_TESTING_cmd_get_kyc_info (
525 : "get-kyc-info-purse-create",
526 : "check-kyc-purse-create",
527 : MHD_HTTP_OK),
528 1 : TALER_TESTING_cmd_post_kyc_start (
529 : "start-kyc-process-purse-create",
530 : "get-kyc-info-purse-create",
531 : 0,
532 : MHD_HTTP_OK),
533 1 : TALER_TESTING_cmd_proof_kyc_oauth2 (
534 : "p2p_proof-kyc-pull",
535 : "purse-create-with-reserve",
536 : "test-oauth2",
537 : "pass",
538 : MHD_HTTP_SEE_OTHER),
539 1 : TALER_TESTING_cmd_purse_create_with_reserve (
540 : "purse-create-with-reserve",
541 : MHD_HTTP_OK,
542 : "{\"amount\":\"EUR:1\",\"summary\":\"ice cream\"}",
543 : true /* upload contract */,
544 : true /* pay purse fee */,
545 : GNUNET_TIME_UNIT_MINUTES, /* expiration */
546 : "p2p_create-reserve-3"),
547 1 : TALER_TESTING_cmd_contract_get (
548 : "pull-get-contract",
549 : MHD_HTTP_OK,
550 : false, /* for deposit */
551 : "purse-create-with-reserve"),
552 1 : TALER_TESTING_cmd_purse_poll (
553 : "pull-poll-purse-before-deposit",
554 : MHD_HTTP_OK,
555 : "purse-create-with-reserve",
556 : "EUR:1",
557 : false,
558 : GNUNET_TIME_UNIT_MINUTES),
559 1 : TALER_TESTING_cmd_purse_deposit_coins (
560 : "purse-deposit-coins",
561 : MHD_HTTP_OK,
562 : 0 /* min age */,
563 : "purse-create-with-reserve",
564 : "p2p_withdraw-coin-1",
565 : "EUR:1.01",
566 : NULL),
567 1 : TALER_TESTING_cmd_coin_history (
568 : "coin-history-purse-pull-deposit",
569 : "p2p_withdraw-coin-1#0",
570 : "EUR:2.98",
571 : MHD_HTTP_OK),
572 1 : TALER_TESTING_cmd_purse_poll_finish (
573 : "pull-deposit-purse-poll-finish",
574 : GNUNET_TIME_relative_multiply (
575 : GNUNET_TIME_UNIT_SECONDS,
576 : 5),
577 : "pull-poll-purse-before-deposit"),
578 1 : TALER_TESTING_cmd_status (
579 : "pull-check-post-merge-reserve-balance-get-2",
580 : "p2p_create-reserve-3",
581 : "EUR:1.03",
582 : MHD_HTTP_OK),
583 1 : TALER_TESTING_cmd_reserve_history (
584 : "push-check-post-merge-reserve-balance-post-2",
585 : "p2p_create-reserve-3",
586 : "EUR:1.03",
587 : MHD_HTTP_OK),
588 1 : TALER_TESTING_cmd_end ()
589 : };
590 : struct TALER_TESTING_Command aml[] = {
591 1 : TALER_TESTING_cmd_set_officer (
592 : "create-aml-officer-1",
593 : NULL,
594 : "Peter Falk",
595 : true,
596 : true),
597 1 : TALER_TESTING_cmd_check_aml_decisions (
598 : "check-decisions-none-normal",
599 : "create-aml-officer-1",
600 : NULL,
601 : MHD_HTTP_OK),
602 : /* Trigger something upon which an AML officer could act */
603 1 : TALER_TESTING_cmd_wallet_kyc_get (
604 : "wallet-trigger-kyc-for-aml",
605 : NULL,
606 : "EUR:1000",
607 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
608 1 : TALER_TESTING_cmd_get_active_legitimization_measures (
609 : "check-decisions-wallet-pending",
610 : "create-aml-officer-1",
611 : "wallet-trigger-kyc-for-aml",
612 : MHD_HTTP_OK,
613 : "{\"measures\": [{\"check_name\": \"oauth-test-id\", \"prog_name\": \"oauth-output-check\", \"context\": {}}], \"is_and_combinator\": true, \"verboten\": false}"),
614 : /* Test that we are not allowed to take AML decisions as our
615 : AML staff account is on read-only */
616 1 : TALER_TESTING_cmd_take_aml_decision (
617 : "aml-decide-while-disabled",
618 : "create-aml-officer-1",
619 : "wallet-trigger-kyc-for-aml",
620 : true /* keep investigating */,
621 : GNUNET_TIME_UNIT_HOURS /* expiration */,
622 : NULL /* successor measure: default */,
623 : "{\"rules\":["
624 : "{\"timeframe\":{\"d_us\":3600000000},"
625 : " \"threshold\":\"EUR:10000\","
626 : " \"operation_type\":\"BALANCE\","
627 : " \"verboten\":true"
628 : "}"
629 : "]}" /* new rules */,
630 : "{}" /* properties */,
631 : "party time",
632 : MHD_HTTP_FORBIDDEN),
633 : /* Check that no decision was taken, but that we are allowed
634 : to read this information */
635 1 : TALER_TESTING_cmd_check_aml_decisions (
636 : "check-aml-decision-empty",
637 : "create-aml-officer-1",
638 : "aml-decide-while-disabled",
639 : MHD_HTTP_NO_CONTENT),
640 1 : TALER_TESTING_cmd_sleep (
641 : "sleep-1b",
642 : 1),
643 1 : TALER_TESTING_cmd_set_officer (
644 : "create-aml-officer-1-enable",
645 : "create-aml-officer-1",
646 : "Peter Falk",
647 : true,
648 : false),
649 1 : TALER_TESTING_cmd_take_aml_decision (
650 : "aml-decide",
651 : "create-aml-officer-1",
652 : "wallet-trigger-kyc-for-aml",
653 : true /* keep investigating */,
654 : GNUNET_TIME_UNIT_HOURS /* expiration */,
655 : NULL /* successor measure: default */,
656 : "{\"rules\":["
657 : "{\"timeframe\":{\"d_us\":3600000000},"
658 : " \"threshold\":\"EUR:10000\","
659 : " \"operation_type\":\"BALANCE\","
660 : " \"verboten\":true"
661 : "}"
662 : "]}" /* new rules */,
663 : "{}" /* properties */,
664 : "party time",
665 : MHD_HTTP_NO_CONTENT),
666 1 : TALER_TESTING_cmd_check_aml_decisions (
667 : "check-decisions-one-normal",
668 : "create-aml-officer-1",
669 : "aml-decide",
670 : MHD_HTTP_OK),
671 1 : TALER_TESTING_cmd_wallet_kyc_get (
672 : "wallet-trigger-kyc-for-aml-allowed",
673 : "wallet-trigger-kyc-for-aml",
674 : "EUR:1000",
675 : MHD_HTTP_OK),
676 1 : TALER_TESTING_cmd_wallet_kyc_get (
677 : "wallet-trigger-kyc-for-aml-denied-high",
678 : "wallet-trigger-kyc-for-aml",
679 : "EUR:20000",
680 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
681 1 : TALER_TESTING_cmd_sleep (
682 : "sleep-1d",
683 : 1),
684 1 : TALER_TESTING_cmd_set_officer (
685 : "create-aml-officer-1-disable",
686 : "create-aml-officer-1",
687 : "Peter Falk",
688 : false,
689 : true),
690 : /* Test that we are NOT allowed to read AML decisions now that
691 : our AML staff account is disabled */
692 1 : TALER_TESTING_cmd_check_aml_decisions (
693 : "check-aml-decision-disabled",
694 : "create-aml-officer-1",
695 : "aml-decide",
696 : MHD_HTTP_FORBIDDEN),
697 1 : TALER_TESTING_cmd_end ()
698 : };
699 :
700 : struct TALER_TESTING_Command aml_form[] = {
701 1 : TALER_TESTING_cmd_set_officer (
702 : "create-aml-form-officer-1",
703 : NULL,
704 : "Peter Falk",
705 : true,
706 : false),
707 : /* Trigger something upon which an AML officer could act */
708 1 : TALER_TESTING_cmd_wallet_kyc_get (
709 : "wallet-trigger-kyc-for-form-aml",
710 : NULL,
711 : "EUR:1000",
712 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
713 1 : TALER_TESTING_cmd_wallet_kyc_get (
714 : "wallet-trigger-kyc-for-form-aml-disallowed",
715 : "wallet-trigger-kyc-for-form-aml",
716 : "EUR:500",
717 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
718 : /* AML officer switches from Oauth2 to form */
719 1 : TALER_TESTING_cmd_take_aml_decision (
720 : "aml-decide-form",
721 : "create-aml-form-officer-1",
722 : "wallet-trigger-kyc-for-form-aml",
723 : false /* just awaiting KYC, no investigation */,
724 : GNUNET_TIME_UNIT_HOURS /* expiration */,
725 : NULL /* successor measure: default */,
726 : "{\"rules\":"
727 : " ["
728 : " {"
729 : " \"timeframe\":{\"d_us\":3600000000}"
730 : " ,\"threshold\":\"EUR:0\""
731 : " ,\"operation_type\":\"BALANCE\""
732 : " ,\"display_priority\":65536"
733 : " ,\"measures\":[\"form-measure\"]"
734 : " ,\"verboten\":false"
735 : " }"
736 : " ]" /* end new rules */
737 : ",\"new_measures\":\"form-measure\""
738 : ",\"custom_measures\":"
739 : " {"
740 : " \"form-measure\":"
741 : " {"
742 : " \"check_name\":\"test-form\""
743 : " ,\"prog_name\":\"test-form-check\""
744 : " }"
745 : " }" /* end custom measures */
746 : "}",
747 : "{}" /* properties */,
748 : "form time",
749 : MHD_HTTP_NO_CONTENT),
750 : /* Wallet learns about form submission */
751 1 : TALER_TESTING_cmd_check_kyc_get (
752 : "check-kyc-form",
753 : "wallet-trigger-kyc-for-form-aml",
754 : "wallet-trigger-kyc-for-form-aml",
755 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
756 : MHD_HTTP_ACCEPTED),
757 1 : TALER_TESTING_cmd_get_kyc_info (
758 : "get-kyc-info-form",
759 : "check-kyc-form",
760 : MHD_HTTP_OK),
761 1 : TALER_TESTING_cmd_post_kyc_form (
762 : "wallet-post-kyc-form",
763 : "get-kyc-info-form",
764 : 0, /* requirement index */
765 : "application/json",
766 : "{\"form_id\":\"test\",\"FULL_NAME\":\"Bob\",\"DATE_OF_BIRTH\":\"1990-00-00\"}",
767 : MHD_HTTP_NO_CONTENT),
768 : /* now this should be allowed */
769 1 : TALER_TESTING_cmd_wallet_kyc_get (
770 : "wallet-trigger-kyc-for-form-aml-allowed",
771 : "wallet-trigger-kyc-for-form-aml",
772 : "EUR:500",
773 : MHD_HTTP_OK),
774 1 : TALER_TESTING_cmd_end ()
775 : };
776 :
777 :
778 : struct TALER_TESTING_Command commands[] = {
779 1 : TALER_TESTING_cmd_run_fakebank (
780 : "run-fakebank",
781 1 : cred.cfg,
782 : "exchange-account-2"),
783 1 : TALER_TESTING_cmd_system_start (
784 : "start-taler",
785 : CONFIG_FILE,
786 : "-e",
787 : NULL),
788 1 : TALER_TESTING_cmd_get_exchange (
789 : "get-exchange",
790 1 : cred.cfg,
791 : NULL,
792 : true,
793 : true),
794 1 : TALER_TESTING_cmd_batch (
795 : "withdraw",
796 : withdraw),
797 1 : TALER_TESTING_cmd_batch (
798 : "spend",
799 : spend),
800 1 : TALER_TESTING_cmd_batch (
801 : "track",
802 : track),
803 1 : TALER_TESTING_cmd_batch (
804 : "withdraw-kyc",
805 : withdraw_kyc),
806 1 : TALER_TESTING_cmd_batch (
807 : "wallet-kyc",
808 : wallet_kyc),
809 1 : TALER_TESTING_cmd_batch (
810 : "p2p_withdraw",
811 : p2p_withdraw),
812 1 : TALER_TESTING_cmd_batch (
813 : "push",
814 : push),
815 1 : TALER_TESTING_cmd_batch (
816 : "pull",
817 : pull),
818 1 : TALER_TESTING_cmd_batch ("aml",
819 : aml),
820 1 : TALER_TESTING_cmd_batch ("aml-form",
821 : aml_form),
822 1 : TALER_TESTING_cmd_end ()
823 : };
824 :
825 : (void) cls;
826 1 : TALER_TESTING_run (is,
827 : commands);
828 1 : }
829 :
830 :
831 : int
832 1 : main (int argc,
833 : char *const *argv)
834 : {
835 : (void) argc;
836 1 : return TALER_TESTING_main (
837 : argv,
838 : "INFO",
839 : CONFIG_FILE,
840 : "exchange-account-2",
841 : TALER_TESTING_BS_FAKEBANK,
842 : &cred,
843 : &run,
844 : NULL);
845 : }
846 :
847 :
848 : /* end of test_kyc_api.c */
|