fakebank_tbi.c (6386B)
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_tbi.c 21 * @brief main entry point to the Taler Bank Integration (TBI) API implementation 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 "fakebank.h" 30 #include "fakebank_tbi.h" 31 #include "fakebank_tbi_get_withdrawal_operation.h" 32 #include "fakebank_tbi_post_withdrawal_operation.h" 33 34 35 MHD_RESULT 36 TALER_FAKEBANK_tbi_main_ (struct TALER_FAKEBANK_Handle *h, 37 struct MHD_Connection *connection, 38 const char *url, 39 const char *method, 40 const char *upload_data, 41 size_t *upload_data_size, 42 void **con_cls) 43 { 44 if (0 == strcasecmp (method, 45 MHD_HTTP_METHOD_HEAD)) 46 method = MHD_HTTP_METHOD_GET; 47 if ( (0 == strcmp (url, 48 "/config")) && 49 (0 == strcasecmp (method, 50 MHD_HTTP_METHOD_GET)) ) 51 { 52 struct TALER_Amount zero; 53 54 GNUNET_assert (GNUNET_OK == 55 TALER_amount_set_zero (h->currency, 56 &zero)); 57 return TALER_MHD_REPLY_JSON_PACK ( 58 connection, 59 MHD_HTTP_OK, 60 GNUNET_JSON_pack_string ("version", 61 "1:0:1"), 62 GNUNET_JSON_pack_string ("currency", 63 h->currency), 64 GNUNET_JSON_pack_string ("implementation", 65 "urn:net:taler:specs:bank:fakebank"), 66 GNUNET_JSON_pack_bool ("allow_conversion", 67 false), 68 GNUNET_JSON_pack_bool ("allow_registrations", 69 true), 70 GNUNET_JSON_pack_bool ("allow_deletions", 71 false), 72 GNUNET_JSON_pack_bool ("allow_edit_name", 73 false), 74 GNUNET_JSON_pack_bool ("allow_edit_cashout_payto_uri", 75 false), 76 TALER_JSON_pack_amount ("default_debit_threshold", 77 &zero), 78 GNUNET_JSON_pack_array_steal ("supported_tan_channels", 79 json_array ()), 80 GNUNET_JSON_pack_object_steal ( 81 "currency_specification", 82 GNUNET_JSON_PACK ( 83 GNUNET_JSON_pack_string ("name", 84 h->currency), 85 GNUNET_JSON_pack_string ("currency", 86 h->currency), 87 GNUNET_JSON_pack_uint64 ("num_fractional_input_digits", 88 2), 89 GNUNET_JSON_pack_uint64 ("num_fractional_normal_digits", 90 2), 91 GNUNET_JSON_pack_uint64 ("num_fractional_trailing_zero_digits", 92 2), 93 GNUNET_JSON_pack_object_steal ( 94 "alt_unit_names", 95 GNUNET_JSON_PACK ( 96 GNUNET_JSON_pack_string ("0", 97 h->currency))), 98 GNUNET_JSON_pack_string ("name", 99 h->currency))), 100 GNUNET_JSON_pack_string ("name", 101 "taler-bank-integration")); 102 } 103 if ( (0 == strncmp (url, 104 "/withdrawal-operation/", 105 strlen ("/withdrawal-operation/"))) && 106 (0 == strcasecmp (method, 107 MHD_HTTP_METHOD_GET)) ) 108 { 109 const char *wopid = &url[strlen ("/withdrawal-operation/")]; 110 const char *lp_s 111 = MHD_lookup_connection_value (connection, 112 MHD_GET_ARGUMENT_KIND, 113 "long_poll_ms"); 114 struct GNUNET_TIME_Relative lp = GNUNET_TIME_UNIT_ZERO; 115 116 if (NULL != lp_s) 117 { 118 unsigned long long d; 119 char dummy; 120 121 if (1 != sscanf (lp_s, 122 "%llu%c", 123 &d, 124 &dummy)) 125 { 126 GNUNET_break_op (0); 127 return TALER_MHD_reply_with_error (connection, 128 MHD_HTTP_BAD_REQUEST, 129 TALER_EC_GENERIC_PARAMETER_MALFORMED, 130 "long_poll_ms"); 131 } 132 lp = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 133 d); 134 } 135 return TALER_FAKEBANK_tbi_get_withdrawal_operation_ (h, 136 connection, 137 wopid, 138 lp, 139 con_cls); 140 141 } 142 if ( (0 == strncmp (url, 143 "/withdrawal-operation/", 144 strlen ("/withdrawal-operation/"))) && 145 (0 == strcasecmp (method, 146 MHD_HTTP_METHOD_POST)) ) 147 { 148 const char *wopid = &url[strlen ("/withdrawal-operation/")]; 149 150 return TALER_FAKEBANK_tbi_post_withdrawal (h, 151 connection, 152 wopid, 153 upload_data, 154 upload_data_size, 155 con_cls); 156 } 157 158 TALER_LOG_ERROR ("Breaking URL: %s %s\n", 159 method, 160 url); 161 GNUNET_break_op (0); 162 return TALER_MHD_reply_with_error ( 163 connection, 164 MHD_HTTP_NOT_FOUND, 165 TALER_EC_GENERIC_ENDPOINT_UNKNOWN, 166 url); 167 }