LCOV - code coverage report
Current view: top level - testing - test_kyc_api.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 142 142 100.0 %
Date: 2025-06-05 21:03:14 Functions: 2 2 100.0 %

          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 */

Generated by: LCOV version 1.16