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 (6999B)


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