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_wallet_get.c (8406B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2021-2026 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_wallet_get.c
     22  * @brief Implement the testing CMDs for the /kyc_wallet/ 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 
     29 /**
     30  * State for a "/kyc-wallet" GET CMD.
     31  */
     32 struct KycWalletGetState;
     33 
     34 #define TALER_EXCHANGE_POST_KYC_WALLET_RESULT_CLOSURE \
     35         struct KycWalletGetState
     36 #include "taler/taler-exchange/post-kyc-wallet.h"
     37 #include "taler/taler_testing_lib.h"
     38 
     39 /**
     40  * State for a "/kyc-wallet" GET CMD.
     41  */
     42 struct KycWalletGetState
     43 {
     44 
     45   /**
     46    * Private key of the reserve (account).
     47    */
     48   union TALER_AccountPrivateKeyP account_priv;
     49 
     50   /**
     51    * Public key of the reserve (account).
     52    */
     53   union TALER_AccountPublicKeyP account_pub;
     54 
     55   /**
     56    * Payto URI of the reserve of the wallet.
     57    */
     58   struct TALER_NormalizedPayto reserve_payto_uri;
     59 
     60   /**
     61    * Our command.
     62    */
     63   const struct TALER_TESTING_Command *cmd;
     64 
     65   /**
     66    * Command to get a reserve private key from.
     67    */
     68   const char *reserve_reference;
     69 
     70   /**
     71    * Expected HTTP response code.
     72    */
     73   unsigned int expected_response_code;
     74 
     75   /**
     76    * Set to the KYC requirement payto hash *if* the exchange replied with a
     77    * request for KYC (#MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS).
     78    */
     79   struct TALER_NormalizedPaytoHashP h_payto;
     80 
     81   /**
     82    * Set to the KYC requirement row *if* the exchange replied with
     83    * request for KYC (#MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS).
     84    */
     85   uint64_t requirement_row;
     86 
     87   /**
     88    * Handle to the "track transaction" pending operation.
     89    */
     90   struct TALER_EXCHANGE_PostKycWalletHandle *kwh;
     91 
     92   /**
     93    * Balance to pass to the exchange.
     94    */
     95   struct TALER_Amount balance;
     96 
     97   /**
     98    * Interpreter state.
     99    */
    100   struct TALER_TESTING_Interpreter *is;
    101 };
    102 
    103 
    104 /**
    105  * Handle response to the command.
    106  *
    107  * @param kwg our state
    108  * @param wkr GET deposit response details
    109  */
    110 static void
    111 wallet_kyc_cb (
    112   struct KycWalletGetState *kwg,
    113   const struct TALER_EXCHANGE_PostKycWalletResponse *wkr)
    114 {
    115   struct TALER_TESTING_Interpreter *is = kwg->is;
    116 
    117   kwg->kwh = NULL;
    118   if (kwg->expected_response_code != wkr->hr.http_status)
    119   {
    120     TALER_TESTING_unexpected_status (is,
    121                                      wkr->hr.http_status,
    122                                      kwg->expected_response_code);
    123     return;
    124   }
    125   switch (wkr->hr.http_status)
    126   {
    127   case MHD_HTTP_OK:
    128     break;
    129   case MHD_HTTP_NO_CONTENT:
    130     break;
    131   case MHD_HTTP_FORBIDDEN:
    132     GNUNET_break (0);
    133     TALER_TESTING_interpreter_fail (is);
    134     return;
    135   case MHD_HTTP_UNAVAILABLE_FOR_LEGAL_REASONS:
    136     kwg->requirement_row
    137       = wkr->details.unavailable_for_legal_reasons.requirement_row;
    138     kwg->h_payto
    139       = wkr->details.unavailable_for_legal_reasons.h_payto;
    140     break;
    141   default:
    142     GNUNET_break (0);
    143     break;
    144   }
    145   TALER_TESTING_interpreter_next (kwg->is);
    146 }
    147 
    148 
    149 /**
    150  * Run the command.
    151  *
    152  * @param cls closure.
    153  * @param cmd the command to execute.
    154  * @param is the interpreter state.
    155  */
    156 static void
    157 wallet_kyc_run (void *cls,
    158                 const struct TALER_TESTING_Command *cmd,
    159                 struct TALER_TESTING_Interpreter *is)
    160 {
    161   struct KycWalletGetState *kwg = cls;
    162   const char *exchange_url;
    163 
    164   kwg->cmd = cmd;
    165   kwg->is = is;
    166   exchange_url = TALER_TESTING_get_exchange_url (is);
    167   if (NULL == exchange_url)
    168   {
    169     GNUNET_break (0);
    170     return;
    171   }
    172   if (NULL != kwg->reserve_reference)
    173   {
    174     const struct TALER_TESTING_Command *res_cmd;
    175     const struct TALER_ReservePrivateKeyP *reserve_priv;
    176 
    177     res_cmd
    178       = TALER_TESTING_interpreter_lookup_command (kwg->is,
    179                                                   kwg->reserve_reference);
    180     if (NULL == res_cmd)
    181     {
    182       GNUNET_break (0);
    183       TALER_TESTING_interpreter_fail (kwg->is);
    184       return;
    185     }
    186     if (GNUNET_OK !=
    187         TALER_TESTING_get_trait_reserve_priv (
    188           res_cmd,
    189           &reserve_priv))
    190     {
    191       GNUNET_break (0);
    192       TALER_TESTING_interpreter_fail (kwg->is);
    193       return;
    194     }
    195     kwg->account_priv.reserve_priv = *reserve_priv;
    196   }
    197   else
    198   {
    199     GNUNET_CRYPTO_eddsa_key_create (
    200       &kwg->account_priv.reserve_priv.eddsa_priv);
    201   }
    202   GNUNET_CRYPTO_eddsa_key_get_public (
    203     &kwg->account_priv.reserve_priv.eddsa_priv,
    204     &kwg->account_pub.reserve_pub.eddsa_pub);
    205   kwg->reserve_payto_uri
    206     = TALER_reserve_make_payto (exchange_url,
    207                                 &kwg->account_pub.reserve_pub);
    208   kwg->kwh = TALER_EXCHANGE_post_kyc_wallet_create (
    209     TALER_TESTING_interpreter_get_context (is),
    210     exchange_url,
    211     &kwg->account_priv.reserve_priv,
    212     &kwg->balance);
    213   GNUNET_assert (NULL != kwg->kwh);
    214   {
    215     enum TALER_ErrorCode ec;
    216 
    217     ec = TALER_EXCHANGE_post_kyc_wallet_start (kwg->kwh,
    218                                                &wallet_kyc_cb,
    219                                                kwg);
    220     if (TALER_EC_NONE != ec)
    221     {
    222       GNUNET_break (0);
    223       kwg->kwh = NULL;
    224       TALER_TESTING_interpreter_fail (is);
    225       return;
    226     }
    227   }
    228 }
    229 
    230 
    231 /**
    232  * Cleanup the state from a "track transaction" CMD, and possibly
    233  * cancel a operation thereof.
    234  *
    235  * @param cls closure with our `struct KycWalletGetState`
    236  * @param cmd the command which is being cleaned up.
    237  */
    238 static void
    239 wallet_kyc_cleanup (
    240   void *cls,
    241   const struct TALER_TESTING_Command *cmd)
    242 {
    243   struct KycWalletGetState *kwg = cls;
    244 
    245   if (NULL != kwg->kwh)
    246   {
    247     TALER_TESTING_command_incomplete (kwg->is,
    248                                       cmd->label);
    249     TALER_EXCHANGE_post_kyc_wallet_cancel (kwg->kwh);
    250     kwg->kwh = NULL;
    251   }
    252   GNUNET_free (kwg->reserve_payto_uri.normalized_payto);
    253   GNUNET_free (kwg);
    254 }
    255 
    256 
    257 /**
    258  * Offer internal data from a "wallet KYC" CMD.
    259  *
    260  * @param cls closure.
    261  * @param[out] ret result (could be anything).
    262  * @param trait name of the trait.
    263  * @param index index number of the object to offer.
    264  * @return #GNUNET_OK on success.
    265  */
    266 static enum GNUNET_GenericReturnValue
    267 wallet_kyc_traits (void *cls,
    268                    const void **ret,
    269                    const char *trait,
    270                    unsigned int index)
    271 {
    272   struct KycWalletGetState *kwg = cls;
    273   struct TALER_TESTING_Trait traits[] = {
    274     TALER_TESTING_make_trait_account_priv (
    275       &kwg->account_priv),
    276     TALER_TESTING_make_trait_account_pub (
    277       &kwg->account_pub),
    278     TALER_TESTING_make_trait_reserve_priv (
    279       &kwg->account_priv.reserve_priv),
    280     TALER_TESTING_make_trait_reserve_pub (
    281       &kwg->account_pub.reserve_pub),
    282     TALER_TESTING_make_trait_legi_requirement_row (
    283       &kwg->requirement_row),
    284     TALER_TESTING_make_trait_h_normalized_payto (
    285       &kwg->h_payto),
    286     TALER_TESTING_make_trait_normalized_payto_uri (
    287       &kwg->reserve_payto_uri),
    288     TALER_TESTING_trait_end ()
    289   };
    290 
    291   return TALER_TESTING_get_trait (traits,
    292                                   ret,
    293                                   trait,
    294                                   index);
    295 }
    296 
    297 
    298 struct TALER_TESTING_Command
    299 TALER_TESTING_cmd_wallet_kyc_get (
    300   const char *label,
    301   const char *reserve_reference,
    302   const char *threshold_balance,
    303   unsigned int expected_response_code)
    304 {
    305   struct KycWalletGetState *kwg;
    306 
    307   kwg = GNUNET_new (struct KycWalletGetState);
    308   kwg->reserve_reference = reserve_reference;
    309   kwg->expected_response_code = expected_response_code;
    310   GNUNET_assert (GNUNET_OK ==
    311                  TALER_string_to_amount (threshold_balance,
    312                                          &kwg->balance));
    313   {
    314     struct TALER_TESTING_Command cmd = {
    315       .cls = kwg,
    316       .label = label,
    317       .run = &wallet_kyc_run,
    318       .cleanup = &wallet_kyc_cleanup,
    319       .traits = &wallet_kyc_traits
    320     };
    321 
    322     return cmd;
    323   }
    324 }
    325 
    326 
    327 /* end of testing_api_cmd_kyc_wallet_get.c */