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_proof.c (7029B)


      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_proof.c
     22  * @brief Implement the testing CMDs for the /kyc-proof/ operation.
     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 "track transaction" CMD.
     31  */
     32 struct KycProofGetState;
     33 
     34 #define TALER_EXCHANGE_GET_KYC_PROOF_RESULT_CLOSURE \
     35         struct KycProofGetState
     36 #include "taler/taler-exchange/get-kyc-proof-PROVIDER_NAME.h"
     37 #include "taler/taler_testing_lib.h"
     38 
     39 /**
     40  * State for a "track transaction" CMD.
     41  */
     42 struct KycProofGetState
     43 {
     44 
     45   /**
     46    * Command to get a reserve private key from.
     47    */
     48   const char *payment_target_reference;
     49 
     50   /**
     51    * Code to pass.
     52    */
     53   const char *code;
     54 
     55   /**
     56    * Logic section name to pass to `/kyc-proof/` handler.
     57    */
     58   const char *logic;
     59 
     60   /**
     61    * Expected HTTP response code.
     62    */
     63   unsigned int expected_response_code;
     64 
     65   /**
     66    * Set to the KYC REDIRECT *if* the exchange replied with
     67    * success (#MHD_HTTP_OK).
     68    */
     69   char *redirect_url;
     70 
     71   /**
     72    * Additional URL arguments (e.g. "&code=..."), kept alive
     73    * for the lifetime of the request.
     74    */
     75   char *uargs;
     76 
     77   /**
     78    * Handle to the "track transaction" pending operation.
     79    */
     80   struct TALER_EXCHANGE_GetKycProofHandle *kph;
     81 
     82   /**
     83    * Interpreter state.
     84    */
     85   struct TALER_TESTING_Interpreter *is;
     86 };
     87 
     88 
     89 /**
     90  * Handle response to the command.
     91  *
     92  * @param kcg our state
     93  * @param kpr KYC proof response details
     94  */
     95 static void
     96 proof_kyc_cb (
     97   struct KycProofGetState *kcg,
     98   const struct TALER_EXCHANGE_GetKycProofResponse *kpr)
     99 {
    100   struct TALER_TESTING_Interpreter *is = kcg->is;
    101 
    102   kcg->kph = NULL;
    103   if (kcg->expected_response_code != kpr->hr.http_status)
    104   {
    105     TALER_TESTING_unexpected_status (is,
    106                                      kpr->hr.http_status,
    107                                      kcg->expected_response_code);
    108     return;
    109   }
    110   switch (kpr->hr.http_status)
    111   {
    112   case MHD_HTTP_SEE_OTHER:
    113     kcg->redirect_url = GNUNET_strdup (kpr->details.found.redirect_url);
    114     break;
    115   case MHD_HTTP_FORBIDDEN:
    116     break;
    117   case MHD_HTTP_BAD_GATEWAY:
    118     break;
    119   default:
    120     GNUNET_break (0);
    121     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    122                 "Unexpected response code %u to /kyc-proof\n",
    123                 kpr->hr.http_status);
    124     break;
    125   }
    126   TALER_TESTING_interpreter_next (kcg->is);
    127 }
    128 
    129 
    130 /**
    131  * Run the command.
    132  *
    133  * @param cls closure.
    134  * @param cmd the command to execute.
    135  * @param is the interpreter state.
    136  */
    137 static void
    138 proof_kyc_run (void *cls,
    139                const struct TALER_TESTING_Command *cmd,
    140                struct TALER_TESTING_Interpreter *is)
    141 {
    142   struct KycProofGetState *kps = cls;
    143   const struct TALER_TESTING_Command *res_cmd;
    144   const struct TALER_NormalizedPaytoHashP *h_payto;
    145   const char *exchange_url;
    146 
    147   (void) cmd;
    148   kps->is = is;
    149   exchange_url = TALER_TESTING_get_exchange_url (is);
    150   if (NULL == exchange_url)
    151   {
    152     GNUNET_break (0);
    153     return;
    154   }
    155   res_cmd = TALER_TESTING_interpreter_lookup_command (
    156     kps->is,
    157     kps->payment_target_reference);
    158   if (NULL == res_cmd)
    159   {
    160     GNUNET_break (0);
    161     TALER_TESTING_interpreter_fail (kps->is);
    162     return;
    163   }
    164   if (GNUNET_OK !=
    165       TALER_TESTING_get_trait_h_normalized_payto (res_cmd,
    166                                                   &h_payto))
    167   {
    168     GNUNET_break (0);
    169     TALER_TESTING_interpreter_fail (kps->is);
    170     return;
    171   }
    172   if (NULL != kps->code)
    173     GNUNET_asprintf (&kps->uargs,
    174                      "&code=%s",
    175                      kps->code);
    176   kps->kph = TALER_EXCHANGE_get_kyc_proof_create (
    177     TALER_TESTING_interpreter_get_context (is),
    178     exchange_url,
    179     h_payto,
    180     kps->logic);
    181   GNUNET_assert (NULL != kps->kph);
    182   if (NULL != kps->uargs)
    183     TALER_EXCHANGE_get_kyc_proof_set_options (
    184       kps->kph,
    185       TALER_EXCHANGE_get_kyc_proof_option_args (kps->uargs));
    186   {
    187     enum TALER_ErrorCode ec;
    188 
    189     ec = TALER_EXCHANGE_get_kyc_proof_start (kps->kph,
    190                                              &proof_kyc_cb,
    191                                              kps);
    192     if (TALER_EC_NONE != ec)
    193     {
    194       GNUNET_break (0);
    195       kps->kph = NULL;
    196       TALER_TESTING_interpreter_fail (kps->is);
    197       return;
    198     }
    199   }
    200 }
    201 
    202 
    203 /**
    204  * Cleanup the state from a "kyc proof" CMD, and possibly
    205  * cancel a operation thereof.
    206  *
    207  * @param cls closure.
    208  * @param cmd the command which is being cleaned up.
    209  */
    210 static void
    211 proof_kyc_cleanup (void *cls,
    212                    const struct TALER_TESTING_Command *cmd)
    213 {
    214   struct KycProofGetState *kps = cls;
    215 
    216   if (NULL != kps->kph)
    217   {
    218     TALER_TESTING_command_incomplete (kps->is,
    219                                       cmd->label);
    220     TALER_EXCHANGE_get_kyc_proof_cancel (kps->kph);
    221     kps->kph = NULL;
    222   }
    223   GNUNET_free (kps->redirect_url);
    224   GNUNET_free (kps->uargs);
    225   GNUNET_free (kps);
    226 }
    227 
    228 
    229 /**
    230  * Offer internal data from a "proof KYC" CMD.
    231  *
    232  * @param cls closure.
    233  * @param[out] ret result (could be anything).
    234  * @param trait name of the trait.
    235  * @param index index number of the object to offer.
    236  * @return #GNUNET_OK on success.
    237  */
    238 static enum GNUNET_GenericReturnValue
    239 proof_kyc_traits (void *cls,
    240                   const void **ret,
    241                   const char *trait,
    242                   unsigned int index)
    243 {
    244   struct KycProofGetState *kps = cls;
    245   struct TALER_TESTING_Trait traits[] = {
    246     TALER_TESTING_make_trait_web_url (kps->redirect_url),
    247     TALER_TESTING_trait_end ()
    248   };
    249 
    250   return TALER_TESTING_get_trait (traits,
    251                                   ret,
    252                                   trait,
    253                                   index);
    254 }
    255 
    256 
    257 struct TALER_TESTING_Command
    258 TALER_TESTING_cmd_proof_kyc_oauth2 (
    259   const char *label,
    260   const char *payment_target_reference,
    261   const char *logic_section,
    262   const char *code,
    263   unsigned int expected_response_code)
    264 {
    265   struct KycProofGetState *kps;
    266 
    267   kps = GNUNET_new (struct KycProofGetState);
    268   kps->code = code;
    269   kps->logic = logic_section;
    270   kps->payment_target_reference = payment_target_reference;
    271   kps->expected_response_code = expected_response_code;
    272   {
    273     struct TALER_TESTING_Command cmd = {
    274       .cls = kps,
    275       .label = label,
    276       .run = &proof_kyc_run,
    277       .cleanup = &proof_kyc_cleanup,
    278       .traits = &proof_kyc_traits
    279     };
    280 
    281     return cmd;
    282   }
    283 }
    284 
    285 
    286 /* end of testing_api_cmd_kyc_proof.c */