exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

testing_api_cmd_kyc_check_get.c (6687B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2021-2023 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 /**
     21  * @file testing/testing_api_cmd_kyc_check_get.c
     22  * @brief Implement the testing CMDs for the /kyc_check/ GET operations.
     23  * @author Christian Grothoff
     24  */
     25 #include "taler/platform.h"
     26 #include "taler/taler_json_lib.h"
     27 #include <gnunet/gnunet_curl_lib.h>
     28 #include "taler/taler_testing_lib.h"
     29 
     30 /**
     31  * State for a "track transaction" CMD.
     32  */
     33 struct KycCheckGetState
     34 {
     35 
     36   /**
     37    * Set to the KYC URL *if* the exchange replied with
     38    * a request for KYC (#MHD_HTTP_ACCEPTED or #MHD_HTTP_OK).
     39    */
     40   struct TALER_AccountAccessTokenP access_token;
     41 
     42   /**
     43    * Handle to the "track transaction" pending operation.
     44    */
     45   struct TALER_EXCHANGE_KycCheckHandle *kwh;
     46 
     47   /**
     48    * Interpreter state.
     49    */
     50   struct TALER_TESTING_Interpreter *is;
     51 
     52   /**
     53    * Command to get a reserve private key from.
     54    */
     55   const char *payment_target_reference;
     56 
     57   /**
     58    * Command to get an account private key from.
     59    */
     60   const char *account_reference;
     61 
     62   /**
     63    * Expected HTTP response code.
     64    */
     65   unsigned int expected_response_code;
     66 
     67   /**
     68    * What are we waiting for when long-polling?
     69    */
     70   enum TALER_EXCHANGE_KycLongPollTarget lpt;
     71 
     72 };
     73 
     74 
     75 /**
     76  * Handle response to the command.
     77  *
     78  * @param cls closure.
     79  * @param ks GET KYC status response details
     80  */
     81 static void
     82 check_kyc_cb (void *cls,
     83               const struct TALER_EXCHANGE_KycStatus *ks)
     84 {
     85   struct KycCheckGetState *kcg = cls;
     86   struct TALER_TESTING_Interpreter *is = kcg->is;
     87 
     88   kcg->kwh = NULL;
     89   if (kcg->expected_response_code != ks->hr.http_status)
     90   {
     91     TALER_TESTING_unexpected_status (is,
     92                                      ks->hr.http_status,
     93                                      kcg->expected_response_code);
     94     return;
     95   }
     96   switch (ks->hr.http_status)
     97   {
     98   case MHD_HTTP_OK:
     99     kcg->access_token = ks->details.ok.access_token;
    100     break;
    101   case MHD_HTTP_ACCEPTED:
    102     kcg->access_token = ks->details.accepted.access_token;
    103     break;
    104   case MHD_HTTP_NO_CONTENT:
    105     break;
    106   default:
    107     GNUNET_break (0);
    108     break;
    109   }
    110   TALER_TESTING_interpreter_next (kcg->is);
    111 }
    112 
    113 
    114 /**
    115  * Run the command.
    116  *
    117  * @param cls closure.
    118  * @param cmd the command to execute.
    119  * @param is the interpreter state.
    120  */
    121 static void
    122 check_kyc_run (void *cls,
    123                const struct TALER_TESTING_Command *cmd,
    124                struct TALER_TESTING_Interpreter *is)
    125 {
    126   struct KycCheckGetState *kcg = cls;
    127   const struct TALER_TESTING_Command *res_cmd;
    128   const struct TALER_TESTING_Command *acc_cmd;
    129   const struct TALER_NormalizedPaytoHashP *h_payto;
    130   const union TALER_AccountPrivateKeyP *account_priv;
    131 
    132   (void) cmd;
    133   kcg->is = is;
    134   res_cmd = TALER_TESTING_interpreter_lookup_command (
    135     kcg->is,
    136     kcg->payment_target_reference);
    137   if (NULL == res_cmd)
    138   {
    139     GNUNET_break (0);
    140     TALER_TESTING_interpreter_fail (kcg->is);
    141     return;
    142   }
    143   acc_cmd = TALER_TESTING_interpreter_lookup_command (
    144     kcg->is,
    145     kcg->account_reference);
    146   if (NULL == acc_cmd)
    147   {
    148     GNUNET_break (0);
    149     TALER_TESTING_interpreter_fail (kcg->is);
    150     return;
    151   }
    152   if (GNUNET_OK !=
    153       TALER_TESTING_get_trait_h_normalized_payto (
    154         res_cmd,
    155         &h_payto))
    156   {
    157     GNUNET_break (0);
    158     TALER_TESTING_interpreter_fail (kcg->is);
    159     return;
    160   }
    161   if (GNUNET_OK !=
    162       TALER_TESTING_get_trait_account_priv (acc_cmd,
    163                                             &account_priv))
    164   {
    165     GNUNET_break (0);
    166     TALER_TESTING_interpreter_fail (kcg->is);
    167     return;
    168   }
    169   if (0 == h_payto)
    170   {
    171     GNUNET_break (0);
    172     TALER_TESTING_interpreter_fail (kcg->is);
    173     return;
    174   }
    175   kcg->kwh = TALER_EXCHANGE_kyc_check (
    176     TALER_TESTING_interpreter_get_context (is),
    177     TALER_TESTING_get_exchange_url (is),
    178     h_payto,
    179     account_priv,
    180     kcg->lpt,
    181     0,
    182     TALER_EXCHANGE_KLPT_NONE == kcg->lpt
    183     ? GNUNET_TIME_UNIT_ZERO
    184     : GNUNET_TIME_UNIT_MINUTES,
    185     &check_kyc_cb,
    186     kcg);
    187   GNUNET_assert (NULL != kcg->kwh);
    188 }
    189 
    190 
    191 /**
    192  * Cleanup the state from a "track transaction" CMD, and possibly
    193  * cancel a operation thereof.
    194  *
    195  * @param cls closure.
    196  * @param cmd the command which is being cleaned up.
    197  */
    198 static void
    199 check_kyc_cleanup (void *cls,
    200                    const struct TALER_TESTING_Command *cmd)
    201 {
    202   struct KycCheckGetState *kcg = cls;
    203 
    204   if (NULL != kcg->kwh)
    205   {
    206     TALER_TESTING_command_incomplete (kcg->is,
    207                                       cmd->label);
    208     TALER_EXCHANGE_kyc_check_cancel (kcg->kwh);
    209     kcg->kwh = NULL;
    210   }
    211   GNUNET_free (kcg);
    212 }
    213 
    214 
    215 /**
    216  * Offer internal data from a "check KYC" CMD.
    217  *
    218  * @param cls closure.
    219  * @param[out] ret result (could be anything).
    220  * @param trait name of the trait.
    221  * @param index index number of the object to offer.
    222  * @return #GNUNET_OK on success.
    223  */
    224 static enum GNUNET_GenericReturnValue
    225 check_kyc_traits (void *cls,
    226                   const void **ret,
    227                   const char *trait,
    228                   unsigned int index)
    229 {
    230   struct KycCheckGetState *kcg = cls;
    231   struct TALER_TESTING_Trait traits[] = {
    232     TALER_TESTING_make_trait_account_access_token (&kcg->access_token),
    233     TALER_TESTING_trait_end ()
    234   };
    235 
    236   return TALER_TESTING_get_trait (traits,
    237                                   ret,
    238                                   trait,
    239                                   index);
    240 }
    241 
    242 
    243 struct TALER_TESTING_Command
    244 TALER_TESTING_cmd_check_kyc_get (
    245   const char *label,
    246   const char *payment_target_reference,
    247   const char *account_reference,
    248   enum TALER_EXCHANGE_KycLongPollTarget lpt,
    249   unsigned int expected_response_code)
    250 {
    251   struct KycCheckGetState *kcg;
    252 
    253   kcg = GNUNET_new (struct KycCheckGetState);
    254   kcg->payment_target_reference = payment_target_reference;
    255   kcg->account_reference = account_reference;
    256   kcg->expected_response_code = expected_response_code;
    257   kcg->lpt = lpt;
    258   {
    259     struct TALER_TESTING_Command cmd = {
    260       .cls = kcg,
    261       .label = label,
    262       .run = &check_kyc_run,
    263       .cleanup = &check_kyc_cleanup,
    264       .traits = &check_kyc_traits
    265     };
    266 
    267     return cmd;
    268   }
    269 }
    270 
    271 
    272 /* end of testing_api_cmd_kyc_check_get.c */