merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

testing_api_cmd_kyc_get.c (7610B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2021 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_api_cmd_kyc_get.c
     21  * @brief command to test kyc_get request
     22  * @author Christian Grothoff
     23  */
     24 #include "platform.h"
     25 #include <taler/taler_exchange_service.h>
     26 #include <taler/taler_testing_lib.h>
     27 #include "taler_merchant_service.h"
     28 #include "taler_merchant_testing_lib.h"
     29 
     30 
     31 /**
     32  * State for a "/kyc" GET CMD.
     33  */
     34 struct KycGetState
     35 {
     36   /**
     37    * Operation handle for a GET /private/kyc GET request.
     38    */
     39   struct TALER_MERCHANT_KycGetHandle *kgh;
     40 
     41   /**
     42    * Base URL of the merchant serving the request.
     43    */
     44   const char *merchant_url;
     45 
     46   /**
     47    * Instance to query, NULL if part of @e merchant_url
     48    */
     49   const char *instance_id;
     50 
     51   /**
     52    * Reference to command providing wire hash, NULL to
     53    * query all accounts.
     54    */
     55   const char *h_wire_ref;
     56 
     57   /**
     58    * URL of exchange to query.
     59    */
     60   const char *exchange_url;
     61 
     62   /**
     63    * Set to the payto hash of the first account
     64    * for which we failed to pass the KYC check.
     65    */
     66   struct TALER_NormalizedPaytoHashP h_payto;
     67 
     68   /**
     69    * Access token the user needs to start a KYC process.
     70    */
     71   struct TALER_AccountAccessTokenP access_token;
     72 
     73   /**
     74    * Expected HTTP response code.
     75    */
     76   unsigned int expected_http_status;
     77 
     78   /**
     79    * Target for long-polling.
     80    */
     81   enum TALER_EXCHANGE_KycLongPollTarget lpt;
     82 
     83   /**
     84    * Expected KYC state.
     85    */
     86   bool expected_kyc_state;
     87 
     88   /**
     89    * Expected KYC state.
     90    */
     91   bool have_access_token;
     92 
     93   /**
     94    * Interpreter state.
     95    */
     96   struct TALER_TESTING_Interpreter *is;
     97 
     98 };
     99 
    100 
    101 /**
    102  * Free the state of a "/kyc" GET CMD, and
    103  * possibly cancel a pending "kyc" GET operation.
    104  *
    105  * @param cls closure with the `struct KycGetState`
    106  * @param cmd command currently being freed.
    107  */
    108 static void
    109 kyc_get_cleanup (void *cls,
    110                  const struct TALER_TESTING_Command *cmd)
    111 {
    112   struct KycGetState *cs = cls;
    113 
    114   if (NULL != cs->kgh)
    115   {
    116     TALER_LOG_WARNING ("/kyc GET operation did not complete\n");
    117     TALER_MERCHANT_kyc_get_cancel (cs->kgh);
    118   }
    119   GNUNET_free (cs);
    120 }
    121 
    122 
    123 /**
    124  * Process "GET /public/kyc_get" (lookup) response.
    125  *
    126  * @param cls closure
    127  * @param kr response we got
    128  */
    129 static void
    130 kyc_get_cb (void *cls,
    131             const struct TALER_MERCHANT_KycResponse *kr)
    132 {
    133   struct KycGetState *cs = cls;
    134 
    135   cs->kgh = NULL;
    136   if (kr->hr.http_status != cs->expected_http_status)
    137   {
    138     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    139                 "Expected status %u, got %u\n",
    140                 cs->expected_http_status,
    141                 kr->hr.http_status);
    142     TALER_TESTING_FAIL (cs->is);
    143   }
    144   switch (kr->hr.http_status)
    145   {
    146   case MHD_HTTP_OK:
    147     if (! cs->expected_kyc_state)
    148     {
    149       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    150                   "Expected KYC state %u, got %u\n",
    151                   cs->expected_kyc_state,
    152                   kr->details.ok.kycs_length);
    153       TALER_TESTING_FAIL (cs->is);
    154     }
    155     for (unsigned int i = 0; i<kr->details.ok.kycs_length; i++)
    156     {
    157       struct TALER_FullPayto payto_uri;
    158 
    159       payto_uri = kr->details.ok.kycs[i].payto_uri;
    160       if (NULL == payto_uri.full_payto)
    161       {
    162         continue;
    163       }
    164       TALER_full_payto_normalize_and_hash (payto_uri,
    165                                            &cs->h_payto);
    166       if (! kr->details.ok.kycs[i].no_access_token)
    167       {
    168         cs->access_token
    169           = kr->details.ok.kycs[i].access_token;
    170         cs->have_access_token = true;
    171       }
    172       break;
    173     }
    174     break;
    175   }
    176   TALER_TESTING_interpreter_next (cs->is);
    177 }
    178 
    179 
    180 /**
    181  * Run the "kyc_get" CMD.
    182  *
    183  * @param cls closure.
    184  * @param cmd command being currently run.
    185  * @param is interpreter state.
    186  */
    187 static void
    188 kyc_get_run (void *cls,
    189              const struct TALER_TESTING_Command *cmd,
    190              struct TALER_TESTING_Interpreter *is)
    191 {
    192   struct KycGetState *cs = cls;
    193   const struct TALER_MerchantWireHashP *h_wire = NULL;
    194 
    195   cs->is = is;
    196   if (NULL != cs->h_wire_ref)
    197   {
    198     const struct TALER_TESTING_Command *wire_cmd;
    199 
    200     if (NULL ==
    201         (wire_cmd =
    202            TALER_TESTING_interpreter_lookup_command (cs->is,
    203                                                      cs->h_wire_ref)))
    204     {
    205       TALER_TESTING_FAIL (cs->is);
    206     }
    207     /* Note: at the time of writing, no command offers an h_wire trait,
    208        so for now this code is dead and 'h_wire_ref' must always be NULL... */
    209     if (GNUNET_OK !=
    210         TALER_TESTING_get_trait_h_wire (wire_cmd,
    211                                         &h_wire))
    212     {
    213       TALER_TESTING_FAIL (cs->is);
    214     }
    215   }
    216   if (NULL == cs->instance_id)
    217     cs->kgh = TALER_MERCHANT_kyc_get (
    218       TALER_TESTING_interpreter_get_context (is),
    219       cs->merchant_url,
    220       h_wire,
    221       cs->exchange_url,
    222       cs->lpt,
    223       TALER_EXCHANGE_KLPT_NONE == cs->lpt
    224       ? GNUNET_TIME_UNIT_ZERO
    225       : GNUNET_TIME_UNIT_MINUTES,
    226       &kyc_get_cb,
    227       cs);
    228   else
    229     cs->kgh = TALER_MERCHANT_management_kyc_get (
    230       TALER_TESTING_interpreter_get_context (is),
    231       cs->merchant_url,
    232       cs->instance_id,
    233       h_wire,
    234       cs->exchange_url,
    235       cs->lpt,
    236       TALER_EXCHANGE_KLPT_NONE == cs->lpt
    237       ? GNUNET_TIME_UNIT_ZERO
    238       : GNUNET_TIME_UNIT_MINUTES,
    239       &kyc_get_cb,
    240       cs);
    241 
    242   GNUNET_assert (NULL != cs->kgh);
    243 }
    244 
    245 
    246 /**
    247  * Offer internal data from "KYC" GET CMD.
    248  *
    249  * @param cls closure.
    250  * @param[out] ret result (could be anything).
    251  * @param trait name of the trait.
    252  * @param index index number of the object to offer.
    253  * @return #GNUNET_OK on success.
    254  */
    255 static enum GNUNET_GenericReturnValue
    256 kyc_get_traits (void *cls,
    257                 const void **ret,
    258                 const char *trait,
    259                 unsigned int index)
    260 {
    261   struct KycGetState *cs = cls;
    262   struct TALER_TESTING_Trait traits[] = {
    263     /* Must be first, skipped if we have no token! */
    264     TALER_TESTING_make_trait_account_access_token (
    265       &cs->access_token),
    266     TALER_TESTING_make_trait_h_normalized_payto (
    267       &cs->h_payto),
    268     TALER_TESTING_trait_end ()
    269   };
    270 
    271   return TALER_TESTING_get_trait (
    272     &traits[cs->have_access_token
    273             ? 0
    274             : 1],
    275     ret,
    276     trait,
    277     index);
    278 }
    279 
    280 
    281 struct TALER_TESTING_Command
    282 TALER_TESTING_cmd_merchant_kyc_get (
    283   const char *label,
    284   const char *merchant_url,
    285   const char *instance_id,
    286   const char *h_wire_ref,
    287   const char *exchange_url,
    288   enum TALER_EXCHANGE_KycLongPollTarget lpt,
    289   unsigned int expected_http_status,
    290   bool expected_kyc_state)
    291 {
    292   struct KycGetState *cs;
    293 
    294   cs = GNUNET_new (struct KycGetState);
    295   cs->merchant_url = merchant_url;
    296   cs->instance_id = instance_id;
    297   cs->h_wire_ref = h_wire_ref;
    298   cs->exchange_url = exchange_url;
    299   cs->lpt = lpt;
    300   cs->expected_http_status = expected_http_status;
    301   cs->expected_kyc_state = expected_kyc_state;
    302   {
    303     struct TALER_TESTING_Command cmd = {
    304       .cls = cs,
    305       .label = label,
    306       .run = &kyc_get_run,
    307       .cleanup = &kyc_get_cleanup,
    308       .traits = &kyc_get_traits
    309     };
    310 
    311     return cmd;
    312   }
    313 }
    314 
    315 
    316 /* end of testing_api_cmd_kyc_get.c */