exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

fakebank_twg_admin_add_kycauth.c (5410B)


      1 /*
      2   This file is part of TALER
      3   (C) 2016-2024 Taler Systems SA
      4 
      5   TALER is free software; you can redistribute it and/or
      6   modify it under the terms of the GNU General Public License
      7   as published by the Free Software Foundation; either version 3,
      8   or (at your option) any later version.
      9 
     10   TALER is distributed in the hope that it will be useful,
     11   but 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,
     17   see <http://www.gnu.org/licenses/>
     18 */
     19 /**
     20  * @file bank-lib/fakebank_twg_admin_add_kycauth.c
     21  * @brief library that fakes being a Taler bank for testcases
     22  * @author Christian Grothoff <christian@grothoff.org>
     23  */
     24 #include "taler/platform.h"
     25 #include "taler/taler_fakebank_lib.h"
     26 #include "taler/taler_bank_service.h"
     27 #include "taler/taler_mhd_lib.h"
     28 #include <gnunet/gnunet_mhd_compat.h>
     29 #include <gnunet/gnunet_mhd_lib.h>
     30 #include "fakebank.h"
     31 #include "fakebank_common_make_admin_transfer.h"
     32 #include "fakebank_twg_admin_add_kycauth.h"
     33 
     34 
     35 MHD_RESULT
     36 TALER_FAKEBANK_twg_admin_add_kycauth_ (
     37   struct TALER_FAKEBANK_Handle *h,
     38   struct MHD_Connection *connection,
     39   const char *account,
     40   const char *upload_data,
     41   size_t *upload_data_size,
     42   void **con_cls)
     43 {
     44   struct ConnectionContext *cc = *con_cls;
     45   enum GNUNET_MHD_PostResult pr;
     46   json_t *json;
     47   uint64_t row_id;
     48   struct GNUNET_TIME_Timestamp timestamp;
     49 
     50   if (NULL == cc)
     51   {
     52     cc = GNUNET_new (struct ConnectionContext);
     53     cc->ctx_cleaner = &GNUNET_MHD_post_parser_cleanup;
     54     *con_cls = cc;
     55   }
     56   pr = GNUNET_MHD_post_parser (REQUEST_BUFFER_MAX,
     57                                connection,
     58                                &cc->ctx,
     59                                upload_data,
     60                                upload_data_size,
     61                                &json);
     62   switch (pr)
     63   {
     64   case GNUNET_MHD_PR_OUT_OF_MEMORY:
     65     GNUNET_break (0);
     66     return MHD_NO;
     67   case GNUNET_MHD_PR_CONTINUE:
     68     return MHD_YES;
     69   case GNUNET_MHD_PR_REQUEST_TOO_LARGE:
     70     GNUNET_break (0);
     71     return MHD_NO;
     72   case GNUNET_MHD_PR_JSON_INVALID:
     73     GNUNET_break (0);
     74     return MHD_NO;
     75   case GNUNET_MHD_PR_SUCCESS:
     76     break;
     77   }
     78   {
     79     struct TALER_FullPayto debit_account;
     80     struct TALER_Amount amount;
     81     union TALER_AccountPublicKeyP account_pub;
     82     char *debit;
     83     enum GNUNET_GenericReturnValue ret;
     84     struct GNUNET_JSON_Specification spec[] = {
     85       GNUNET_JSON_spec_fixed_auto ("account_pub",
     86                                    &account_pub),
     87       TALER_JSON_spec_full_payto_uri ("debit_account",
     88                                       &debit_account),
     89       TALER_JSON_spec_amount ("amount",
     90                               h->currency,
     91                               &amount),
     92       GNUNET_JSON_spec_end ()
     93     };
     94 
     95     if (GNUNET_OK !=
     96         (ret = TALER_MHD_parse_json_data (connection,
     97                                           json,
     98                                           spec)))
     99     {
    100       GNUNET_break_op (0);
    101       json_decref (json);
    102       return (GNUNET_NO == ret) ? MHD_YES : MHD_NO;
    103     }
    104     if (0 != strcasecmp (amount.currency,
    105                          h->currency))
    106     {
    107       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
    108                   "Currency `%s' does not match our configuration\n",
    109                   amount.currency);
    110       json_decref (json);
    111       return TALER_MHD_reply_with_error (
    112         connection,
    113         MHD_HTTP_CONFLICT,
    114         TALER_EC_GENERIC_CURRENCY_MISMATCH,
    115         NULL);
    116     }
    117     debit = TALER_xtalerbank_account_from_payto (debit_account);
    118     if (NULL == debit)
    119     {
    120       GNUNET_break_op (0);
    121       return TALER_MHD_reply_with_error (
    122         connection,
    123         MHD_HTTP_BAD_REQUEST,
    124         TALER_EC_GENERIC_PAYTO_URI_MALFORMED,
    125         debit_account.full_payto);
    126     }
    127     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
    128                 "Receiving kycauth wire transfer: %s->%s, subject: %s, amount: %s\n",
    129                 debit,
    130                 account,
    131                 TALER_B2S (&account_pub),
    132                 TALER_amount2s (&amount));
    133     ret = TALER_FAKEBANK_make_kycauth_transfer_ (h,
    134                                                  debit,
    135                                                  account,
    136                                                  &amount,
    137                                                  &account_pub,
    138                                                  &row_id,
    139                                                  &timestamp);
    140     GNUNET_free (debit);
    141     if (GNUNET_OK != ret)
    142     {
    143       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
    144                   "Failed to make wire transfer\n");
    145       json_decref (json);
    146       return TALER_MHD_reply_with_error (
    147         connection,
    148         MHD_HTTP_INTERNAL_SERVER_ERROR,
    149         TALER_EC_GENERIC_ALLOCATION_FAILURE,
    150         NULL);
    151     }
    152   }
    153   json_decref (json);
    154 
    155   /* Finally build response object */
    156   return TALER_MHD_REPLY_JSON_PACK (connection,
    157                                     MHD_HTTP_OK,
    158                                     GNUNET_JSON_pack_uint64 ("row_id",
    159                                                              row_id),
    160                                     GNUNET_JSON_pack_timestamp ("timestamp",
    161                                                                 timestamp));
    162 }