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_wire_add.c (6965B)


      1 /*
      2   This file is part of TALER
      3   Copyright (C) 2020-2024 Taler Systems SA
      4 
      5   TALER is free software; you can redistribute it and/or modify it
      6   under the terms of the GNU General Public License as published by
      7   the Free Software Foundation; either version 3, or (at your
      8   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 GNU
     13   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/testing_api_cmd_wire_add.c
     21  * @brief command for testing POST to /management/wire
     22  * @author Christian Grothoff
     23  */
     24 #include "taler/taler_json_lib.h"
     25 #include <gnunet/gnunet_curl_lib.h>
     26 struct WireAddState;
     27 #define TALER_EXCHANGE_POST_MANAGEMENT_WIRE_RESULT_CLOSURE struct WireAddState
     28 #include "taler/exchange/post-management-wire.h"
     29 #include "taler/taler_testing_lib.h"
     30 
     31 
     32 /**
     33  * State for a "wire_add" CMD.
     34  */
     35 struct WireAddState
     36 {
     37 
     38   /**
     39    * Wire enable handle while operation is running.
     40    */
     41   struct TALER_EXCHANGE_PostManagementWireHandle *dh;
     42 
     43   /**
     44    * Our interpreter.
     45    */
     46   struct TALER_TESTING_Interpreter *is;
     47 
     48   /**
     49    * Account to add.
     50    */
     51   struct TALER_FullPayto payto_uri;
     52 
     53   /**
     54    * Expected HTTP response code.
     55    */
     56   unsigned int expected_response_code;
     57 
     58   /**
     59    * Should we make the request with a bad master_sig signature?
     60    */
     61   bool bad_sig;
     62 };
     63 
     64 
     65 /**
     66  * Callback to analyze the /management/wire response, just used to check
     67  * if the response code is acceptable.
     68  *
     69  * @param ds closure.
     70  * @param wer response details
     71  */
     72 static void
     73 wire_add_cb (struct WireAddState *ds,
     74              const struct TALER_EXCHANGE_PostManagementWireResponse *wer)
     75 {
     76   const struct TALER_EXCHANGE_HttpResponse *hr = &wer->hr;
     77 
     78   ds->dh = NULL;
     79   if (ds->expected_response_code != hr->http_status)
     80   {
     81     TALER_TESTING_unexpected_status (ds->is,
     82                                      hr->http_status,
     83                                      ds->expected_response_code);
     84     return;
     85   }
     86   TALER_TESTING_interpreter_next (ds->is);
     87 }
     88 
     89 
     90 /**
     91  * Run the command.
     92  *
     93  * @param cls closure.
     94  * @param cmd the command to execute.
     95  * @param is the interpreter state.
     96  */
     97 static void
     98 wire_add_run (void *cls,
     99               const struct TALER_TESTING_Command *cmd,
    100               struct TALER_TESTING_Interpreter *is)
    101 {
    102   struct WireAddState *ds = cls;
    103   struct TALER_MasterSignatureP master_sig1;
    104   struct TALER_MasterSignatureP master_sig2;
    105   struct GNUNET_TIME_Timestamp now;
    106   json_t *credit_rest;
    107   json_t *debit_rest;
    108   const char *exchange_url;
    109 
    110   (void) cmd;
    111   {
    112     const struct TALER_TESTING_Command *exchange_cmd;
    113 
    114     exchange_cmd = TALER_TESTING_interpreter_get_command (is,
    115                                                           "exchange");
    116     if (NULL == exchange_cmd)
    117     {
    118       GNUNET_break (0);
    119       TALER_TESTING_interpreter_fail (is);
    120       return;
    121     }
    122     GNUNET_assert (GNUNET_OK ==
    123                    TALER_TESTING_get_trait_exchange_url (exchange_cmd,
    124                                                          &exchange_url));
    125   }
    126   now = GNUNET_TIME_timestamp_get ();
    127   ds->is = is;
    128   debit_rest = json_array ();
    129   credit_rest = json_array ();
    130   if (ds->bad_sig)
    131   {
    132     memset (&master_sig1,
    133             42,
    134             sizeof (master_sig1));
    135     memset (&master_sig2,
    136             42,
    137             sizeof (master_sig2));
    138   }
    139   else
    140   {
    141     const struct TALER_TESTING_Command *exchange_cmd;
    142     const struct TALER_MasterPrivateKeyP *master_priv;
    143 
    144     exchange_cmd = TALER_TESTING_interpreter_get_command (is,
    145                                                           "exchange");
    146     if (NULL == exchange_cmd)
    147     {
    148       GNUNET_break (0);
    149       TALER_TESTING_interpreter_fail (is);
    150       return;
    151     }
    152     GNUNET_assert (GNUNET_OK ==
    153                    TALER_TESTING_get_trait_master_priv (exchange_cmd,
    154                                                         &master_priv));
    155     TALER_exchange_offline_wire_add_sign (ds->payto_uri,
    156                                           NULL,
    157                                           NULL,
    158                                           NULL,
    159                                           debit_rest,
    160                                           credit_rest,
    161                                           now,
    162                                           master_priv,
    163                                           &master_sig1);
    164     TALER_exchange_wire_signature_make (ds->payto_uri,
    165                                         NULL,
    166                                         NULL,
    167                                         NULL,
    168                                         debit_rest,
    169                                         credit_rest,
    170                                         master_priv,
    171                                         &master_sig2);
    172   }
    173   ds->dh = TALER_EXCHANGE_post_management_wire_create (
    174     TALER_TESTING_interpreter_get_context (is),
    175     exchange_url,
    176     ds->payto_uri,
    177     now,
    178     &master_sig1,
    179     &master_sig2);
    180   if (NULL == ds->dh)
    181   {
    182     GNUNET_break (0);
    183     TALER_TESTING_interpreter_fail (is);
    184     return;
    185   }
    186   TALER_EXCHANGE_post_management_wire_set_options (
    187     ds->dh,
    188     TALER_EXCHANGE_post_management_wire_option_bank_label ("test-account"),
    189     TALER_EXCHANGE_post_management_wire_option_debit_restrictions (
    190       debit_rest),
    191     TALER_EXCHANGE_post_management_wire_option_credit_restrictions (
    192       credit_rest));
    193   json_decref (debit_rest);
    194   json_decref (credit_rest);
    195   TALER_EXCHANGE_post_management_wire_start (ds->dh, &wire_add_cb, ds);
    196 }
    197 
    198 
    199 /**
    200  * Free the state of a "wire_add" CMD, and possibly cancel a
    201  * pending operation thereof.
    202  *
    203  * @param cls closure, must be a `struct WireAddState`.
    204  * @param cmd the command which is being cleaned up.
    205  */
    206 static void
    207 wire_add_cleanup (void *cls,
    208                   const struct TALER_TESTING_Command *cmd)
    209 {
    210   struct WireAddState *ds = cls;
    211 
    212   if (NULL != ds->dh)
    213   {
    214     TALER_TESTING_command_incomplete (ds->is,
    215                                       cmd->label);
    216     TALER_EXCHANGE_post_management_wire_cancel (ds->dh);
    217     ds->dh = NULL;
    218   }
    219   GNUNET_free (ds);
    220 }
    221 
    222 
    223 struct TALER_TESTING_Command
    224 TALER_TESTING_cmd_wire_add (const char *label,
    225                             struct TALER_FullPayto payto_uri,
    226                             unsigned int expected_http_status,
    227                             bool bad_sig)
    228 {
    229   struct WireAddState *ds;
    230 
    231   ds = GNUNET_new (struct WireAddState);
    232   ds->expected_response_code = expected_http_status;
    233   ds->bad_sig = bad_sig;
    234   ds->payto_uri = payto_uri;
    235   {
    236     struct TALER_TESTING_Command cmd = {
    237       .cls = ds,
    238       .label = label,
    239       .run = &wire_add_run,
    240       .cleanup = &wire_add_cleanup
    241     };
    242 
    243     return cmd;
    244   }
    245 }
    246 
    247 
    248 /* end of testing_api_cmd_wire_add.c */