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 "platform.h"
25 : #include "taler_util.h"
26 : #include "taler_attributes.h"
27 : #include "taler_signatures.h"
28 : #include "taler_exchange_service.h"
29 : #include "taler_json_lib.h"
30 : #include <gnunet/gnunet_util_lib.h>
31 : #include <microhttpd.h>
32 : #include "taler_bank_service.h"
33 : #include "taler_fakebank_lib.h"
34 : #include "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 : #if FIXME_LATER_9027
609 : /* FIXME: the above created a legitimization_measure, but NOT
610 : an actual *decision*, hence no decisions show up here!
611 : Design issue: we may want _some_ way to expose _measures_ to AML staff!
612 : What we have: wire_targets JOIN legitimization_measures
613 : USING (account_token) WHERE wire_targets.wire_target_h_payto=$ACCT
614 : will show that a _measure_ was triggered for the account.
615 : */
616 : TALER_TESTING_cmd_check_aml_decisions (
617 : "check-decisions-wallet-pending",
618 : "create-aml-officer-1",
619 : "wallet-trigger-kyc-for-aml",
620 : MHD_HTTP_OK),
621 : #endif
622 : /* Test that we are not allowed to take AML decisions as our
623 : AML staff account is on read-only */
624 1 : TALER_TESTING_cmd_take_aml_decision (
625 : "aml-decide-while-disabled",
626 : "create-aml-officer-1",
627 : "wallet-trigger-kyc-for-aml",
628 : true /* keep investigating */,
629 : GNUNET_TIME_UNIT_HOURS /* expiration */,
630 : NULL /* successor measure: default */,
631 : "{\"rules\":["
632 : "{\"timeframe\":{\"d_us\":3600000000},"
633 : " \"threshold\":\"EUR:10000\","
634 : " \"operation_type\":\"BALANCE\","
635 : " \"verboten\":true"
636 : "}"
637 : "]}" /* new rules */,
638 : "{}" /* properties */,
639 : "party time",
640 : MHD_HTTP_FORBIDDEN),
641 : /* Check that no decision was taken, but that we are allowed
642 : to read this information */
643 1 : TALER_TESTING_cmd_check_aml_decisions (
644 : "check-aml-decision-empty",
645 : "create-aml-officer-1",
646 : "aml-decide-while-disabled",
647 : MHD_HTTP_NO_CONTENT),
648 1 : TALER_TESTING_cmd_sleep (
649 : "sleep-1b",
650 : 1),
651 1 : TALER_TESTING_cmd_set_officer (
652 : "create-aml-officer-1-enable",
653 : "create-aml-officer-1",
654 : "Peter Falk",
655 : true,
656 : false),
657 1 : TALER_TESTING_cmd_take_aml_decision (
658 : "aml-decide",
659 : "create-aml-officer-1",
660 : "wallet-trigger-kyc-for-aml",
661 : true /* keep investigating */,
662 : GNUNET_TIME_UNIT_HOURS /* expiration */,
663 : NULL /* successor measure: default */,
664 : "{\"rules\":["
665 : "{\"timeframe\":{\"d_us\":3600000000},"
666 : " \"threshold\":\"EUR:10000\","
667 : " \"operation_type\":\"BALANCE\","
668 : " \"verboten\":true"
669 : "}"
670 : "]}" /* new rules */,
671 : "{}" /* properties */,
672 : "party time",
673 : MHD_HTTP_NO_CONTENT),
674 1 : TALER_TESTING_cmd_check_aml_decisions (
675 : "check-decisions-one-normal",
676 : "create-aml-officer-1",
677 : "aml-decide",
678 : MHD_HTTP_OK),
679 1 : TALER_TESTING_cmd_wallet_kyc_get (
680 : "wallet-trigger-kyc-for-aml-allowed",
681 : "wallet-trigger-kyc-for-aml",
682 : "EUR:1000",
683 : MHD_HTTP_OK),
684 1 : TALER_TESTING_cmd_wallet_kyc_get (
685 : "wallet-trigger-kyc-for-aml-denied-high",
686 : "wallet-trigger-kyc-for-aml",
687 : "EUR:20000",
688 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
689 1 : TALER_TESTING_cmd_sleep (
690 : "sleep-1d",
691 : 1),
692 1 : TALER_TESTING_cmd_set_officer (
693 : "create-aml-officer-1-disable",
694 : "create-aml-officer-1",
695 : "Peter Falk",
696 : false,
697 : true),
698 : /* Test that we are NOT allowed to read AML decisions now that
699 : our AML staff account is disabled */
700 1 : TALER_TESTING_cmd_check_aml_decisions (
701 : "check-aml-decision-disabled",
702 : "create-aml-officer-1",
703 : "aml-decide",
704 : MHD_HTTP_FORBIDDEN),
705 1 : TALER_TESTING_cmd_end ()
706 : };
707 :
708 : struct TALER_TESTING_Command aml_form[] = {
709 1 : TALER_TESTING_cmd_set_officer (
710 : "create-aml-form-officer-1",
711 : NULL,
712 : "Peter Falk",
713 : true,
714 : false),
715 : /* Trigger something upon which an AML officer could act */
716 1 : TALER_TESTING_cmd_wallet_kyc_get (
717 : "wallet-trigger-kyc-for-form-aml",
718 : NULL,
719 : "EUR:1000",
720 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
721 1 : TALER_TESTING_cmd_wallet_kyc_get (
722 : "wallet-trigger-kyc-for-form-aml-disallowed",
723 : "wallet-trigger-kyc-for-form-aml",
724 : "EUR:500",
725 : MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS),
726 : /* AML officer switches from Oauth2 to form */
727 1 : TALER_TESTING_cmd_take_aml_decision (
728 : "aml-decide-form",
729 : "create-aml-form-officer-1",
730 : "wallet-trigger-kyc-for-form-aml",
731 : false /* just awaiting KYC, no investigation */,
732 : GNUNET_TIME_UNIT_HOURS /* expiration */,
733 : NULL /* successor measure: default */,
734 : "{\"rules\":"
735 : " ["
736 : " {"
737 : " \"timeframe\":{\"d_us\":3600000000}"
738 : " ,\"threshold\":\"EUR:0\""
739 : " ,\"operation_type\":\"BALANCE\""
740 : " ,\"display_priority\":65536"
741 : " ,\"measures\":[\"form-measure\"]"
742 : " ,\"verboten\":false"
743 : " }"
744 : " ]" /* end new rules */
745 : ",\"new_measures\":\"form-measure\""
746 : ",\"custom_measures\":"
747 : " {"
748 : " \"form-measure\":"
749 : " {"
750 : " \"check_name\":\"test-form\""
751 : " ,\"prog_name\":\"test-form-check\""
752 : " }"
753 : " }" /* end custom measures */
754 : "}",
755 : "{}" /* properties */,
756 : "form time",
757 : MHD_HTTP_NO_CONTENT),
758 : /* Wallet learns about form submission */
759 1 : TALER_TESTING_cmd_check_kyc_get (
760 : "check-kyc-form",
761 : "wallet-trigger-kyc-for-form-aml",
762 : "wallet-trigger-kyc-for-form-aml",
763 : TALER_EXCHANGE_KLPT_KYC_AUTH_TRANSFER,
764 : MHD_HTTP_ACCEPTED),
765 1 : TALER_TESTING_cmd_get_kyc_info (
766 : "get-kyc-info-form",
767 : "check-kyc-form",
768 : MHD_HTTP_OK),
769 1 : TALER_TESTING_cmd_post_kyc_form (
770 : "wallet-post-kyc-form",
771 : "get-kyc-info-form",
772 : 0, /* requirement index */
773 : "application/json",
774 : "{\"form_id\":\"test\",\"full_name\":\"Bob\",\"birthdate\":\"1990-00-00\"}",
775 : MHD_HTTP_NO_CONTENT),
776 : /* now this should be allowed */
777 1 : TALER_TESTING_cmd_wallet_kyc_get (
778 : "wallet-trigger-kyc-for-form-aml-allowed",
779 : "wallet-trigger-kyc-for-form-aml",
780 : "EUR:500",
781 : MHD_HTTP_OK),
782 1 : TALER_TESTING_cmd_end ()
783 : };
784 :
785 :
786 : struct TALER_TESTING_Command commands[] = {
787 1 : TALER_TESTING_cmd_run_fakebank (
788 : "run-fakebank",
789 1 : cred.cfg,
790 : "exchange-account-2"),
791 1 : TALER_TESTING_cmd_system_start (
792 : "start-taler",
793 : CONFIG_FILE,
794 : "-e",
795 : NULL),
796 1 : TALER_TESTING_cmd_get_exchange (
797 : "get-exchange",
798 1 : cred.cfg,
799 : NULL,
800 : true,
801 : true),
802 1 : TALER_TESTING_cmd_batch (
803 : "withdraw",
804 : withdraw),
805 1 : TALER_TESTING_cmd_batch (
806 : "spend",
807 : spend),
808 1 : TALER_TESTING_cmd_batch (
809 : "track",
810 : track),
811 1 : TALER_TESTING_cmd_batch (
812 : "withdraw-kyc",
813 : withdraw_kyc),
814 1 : TALER_TESTING_cmd_batch (
815 : "wallet-kyc",
816 : wallet_kyc),
817 1 : TALER_TESTING_cmd_batch (
818 : "p2p_withdraw",
819 : p2p_withdraw),
820 1 : TALER_TESTING_cmd_batch (
821 : "push",
822 : push),
823 1 : TALER_TESTING_cmd_batch (
824 : "pull",
825 : pull),
826 1 : TALER_TESTING_cmd_batch ("aml",
827 : aml),
828 1 : TALER_TESTING_cmd_batch ("aml-form",
829 : aml_form),
830 1 : TALER_TESTING_cmd_end ()
831 : };
832 :
833 : (void) cls;
834 1 : TALER_TESTING_run (is,
835 : commands);
836 1 : }
837 :
838 :
839 : int
840 1 : main (int argc,
841 : char *const *argv)
842 : {
843 : (void) argc;
844 1 : return TALER_TESTING_main (
845 : argv,
846 : "INFO",
847 : CONFIG_FILE,
848 : "exchange-account-2",
849 : TALER_TESTING_BS_FAKEBANK,
850 : &cred,
851 : &run,
852 : NULL);
853 : }
854 :
855 :
856 : /* end of test_kyc_api.c */
|