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