Line data Source code
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_bank.c
21 : * @brief Main dispatcher for the Taler Bank API
22 : * @author Christian Grothoff <christian@grothoff.org>
23 : */
24 : #include "taler/taler_fakebank_lib.h"
25 : #include "taler/taler_bank_service.h"
26 : #include "taler/taler_mhd_lib.h"
27 : #include <gnunet/gnunet_mhd_compat.h>
28 : #include "fakebank.h"
29 : #include "fakebank_bank.h"
30 : #include "fakebank_tbr.h"
31 : #include "fakebank_twg.h"
32 : #include "fakebank_bank_get_accounts.h"
33 : #include "fakebank_bank_get_withdrawals.h"
34 : #include "fakebank_bank_get_root.h"
35 : #include "fakebank_bank_post_accounts_token.h"
36 : #include "fakebank_bank_post_accounts_withdrawals.h"
37 : #include "fakebank_bank_post_withdrawals_id_op.h"
38 : #include "fakebank_bank_testing_register.h"
39 :
40 :
41 : MHD_RESULT
42 618 : TALER_FAKEBANK_bank_main_ (
43 : struct TALER_FAKEBANK_Handle *h,
44 : struct MHD_Connection *connection,
45 : const char *url,
46 : const char *method,
47 : const char *upload_data,
48 : size_t *upload_data_size,
49 : void **con_cls)
50 : {
51 618 : if (0 == strcasecmp (method,
52 : MHD_HTTP_METHOD_HEAD))
53 0 : method = MHD_HTTP_METHOD_GET;
54 :
55 618 : if ( (0 == strcmp (url,
56 3 : "/")) &&
57 3 : (0 == strcasecmp (method,
58 : MHD_HTTP_METHOD_GET)) )
59 : {
60 : /* GET / */
61 3 : return TALER_FAKEBANK_bank_get_root_ (h,
62 : connection);
63 : }
64 :
65 615 : if ( (0 == strcmp (url,
66 0 : "/config")) &&
67 0 : (0 == strcasecmp (method,
68 : MHD_HTTP_METHOD_GET)) )
69 : {
70 : /* GET /config */
71 0 : return TALER_MHD_REPLY_JSON_PACK (
72 : connection,
73 : MHD_HTTP_OK,
74 : GNUNET_JSON_pack_string ("version",
75 : "8:0:0"),
76 : GNUNET_JSON_pack_string ("currency",
77 : h->currency),
78 : GNUNET_JSON_pack_string ("implementation",
79 : "urn:net:taler:specs:bank:fakebank"),
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-corebank"));
102 : }
103 :
104 615 : if ( (0 == strcmp (url,
105 0 : "/public-accounts")) &&
106 0 : (0 == strcasecmp (method,
107 : MHD_HTTP_METHOD_GET)) )
108 : {
109 : /* GET /public-accounts */
110 0 : return TALER_MHD_REPLY_JSON_PACK (
111 : connection,
112 : MHD_HTTP_OK,
113 : GNUNET_JSON_pack_array_steal ("public_accounts",
114 : json_array ()));
115 : }
116 :
117 : /* account registration API */
118 615 : if ( (0 == strcmp (url,
119 42 : "/accounts")) &&
120 42 : (0 == strcasecmp (method,
121 : MHD_HTTP_METHOD_POST)) )
122 : {
123 : /* POST /accounts */
124 42 : return TALER_FAKEBANK_bank_testing_register_ (h,
125 : connection,
126 : upload_data,
127 : upload_data_size,
128 : con_cls);
129 : }
130 :
131 573 : if ( (0 == strcmp (url,
132 0 : "/accounts")) &&
133 0 : (0 == strcasecmp (method,
134 : MHD_HTTP_METHOD_GET)) )
135 : {
136 : /* GET /accounts */
137 0 : GNUNET_break (0); /* not implemented */
138 0 : return TALER_MHD_reply_with_error (
139 : connection,
140 : MHD_HTTP_NOT_IMPLEMENTED,
141 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
142 : url);
143 : }
144 :
145 573 : if ( (0 == strcmp (url,
146 0 : "/cashout-rate")) &&
147 0 : (0 == strcasecmp (method,
148 : MHD_HTTP_METHOD_GET)) )
149 : {
150 : /* GET /cashout-rate */
151 0 : GNUNET_break (0); /* not implemented */
152 0 : return TALER_MHD_reply_with_error (
153 : connection,
154 : MHD_HTTP_NOT_IMPLEMENTED,
155 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
156 : url);
157 : }
158 :
159 573 : if ( (0 == strcmp (url,
160 0 : "/cashouts")) &&
161 0 : (0 == strcasecmp (method,
162 : MHD_HTTP_METHOD_GET)) )
163 : {
164 : /* GET /cashouts */
165 0 : GNUNET_break (0); /* not implemented */
166 0 : return TALER_MHD_reply_with_error (
167 : connection,
168 : MHD_HTTP_NOT_IMPLEMENTED,
169 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
170 : url);
171 : }
172 :
173 573 : if ( (0 == strncmp (url,
174 : "/withdrawals/",
175 0 : strlen ("/withdrawals/"))) &&
176 0 : (0 == strcasecmp (method,
177 : MHD_HTTP_METHOD_GET)) )
178 : {
179 : /* GET /withdrawals/$WID */
180 : const char *wid;
181 :
182 0 : wid = &url[strlen ("/withdrawals/")];
183 0 : return TALER_FAKEBANK_bank_get_withdrawals_ (h,
184 : connection,
185 : wid);
186 : }
187 :
188 573 : if (0 == strncmp (url,
189 : "/accounts/",
190 : strlen ("/accounts/")))
191 : {
192 573 : const char *acc_name = &url[strlen ("/accounts/")];
193 573 : const char *end_acc = strchr (acc_name,
194 : '/');
195 :
196 573 : if ( (NULL != end_acc) &&
197 573 : (0 == strncmp (end_acc,
198 : "/taler-wire-gateway/",
199 : strlen ("/taler-wire-gateway/"))) )
200 : {
201 : /* $METHOD /accounts/$ACCOUNT/taler-wire-gateway/ */
202 : char *acc;
203 : MHD_RESULT ret;
204 :
205 573 : acc = GNUNET_strndup (acc_name,
206 : end_acc - acc_name);
207 573 : end_acc += strlen ("/taler-wire-gateway");
208 573 : ret = TALER_FAKEBANK_twg_main_ (h,
209 : connection,
210 : acc,
211 : end_acc,
212 : method,
213 : upload_data,
214 : upload_data_size,
215 : con_cls);
216 573 : GNUNET_free (acc);
217 573 : return ret;
218 : }
219 :
220 0 : if ( (NULL != end_acc) &&
221 0 : (0 == strncmp (end_acc,
222 : "/taler-revenue/",
223 : strlen ("/taler-revenue/"))) )
224 : {
225 : /* $METHOD /accounts/$ACCOUNT/taler-revenue/ */
226 : char *acc;
227 : MHD_RESULT ret;
228 :
229 0 : acc = GNUNET_strndup (acc_name,
230 : end_acc - acc_name);
231 0 : end_acc += strlen ("/taler-revenue");
232 0 : ret = TALER_FAKEBANK_tbr_main_ (h,
233 : connection,
234 : acc,
235 : end_acc,
236 : method,
237 : upload_data,
238 : upload_data_size,
239 : con_cls);
240 0 : GNUNET_free (acc);
241 0 : return ret;
242 : }
243 :
244 0 : if ( (NULL != end_acc) &&
245 0 : (0 == strcasecmp (method,
246 0 : MHD_HTTP_METHOD_POST)) &&
247 0 : (0 == strncmp (end_acc,
248 : "/token",
249 : strlen ("/token"))) )
250 : {
251 : /* POST /accounts/$ACCOUNT/token */
252 : char *acc;
253 : MHD_RESULT ret;
254 :
255 0 : acc = GNUNET_strndup (acc_name,
256 : end_acc - acc_name);
257 0 : ret = TALER_FAKEBANK_bank_post_accounts_token_ (h,
258 : connection,
259 : acc,
260 : upload_data,
261 : upload_data_size,
262 : con_cls);
263 0 : GNUNET_free (acc);
264 0 : return ret;
265 : }
266 :
267 0 : if ( (NULL == end_acc) &&
268 0 : (0 == strcasecmp (method,
269 : MHD_HTTP_METHOD_GET)) )
270 : {
271 : /* GET /accounts/$ACCOUNT */
272 0 : return TALER_FAKEBANK_bank_get_accounts_ (h,
273 : connection,
274 : acc_name);
275 : }
276 :
277 0 : if ( (NULL == end_acc) &&
278 0 : (0 == strcasecmp (method,
279 : MHD_HTTP_METHOD_PATCH)) )
280 : {
281 : /* PATCH /accounts/$USERNAME */
282 0 : GNUNET_break (0); /* not implemented */
283 0 : return TALER_MHD_reply_with_error (
284 : connection,
285 : MHD_HTTP_NOT_IMPLEMENTED,
286 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
287 : url);
288 : }
289 :
290 0 : if ( (NULL == end_acc) &&
291 0 : (0 == strcasecmp (method,
292 : MHD_HTTP_METHOD_DELETE)) )
293 : {
294 : /* DELETE /accounts/$USERNAME */
295 0 : GNUNET_break (0); /* not implemented */
296 0 : return TALER_MHD_reply_with_error (
297 : connection,
298 : MHD_HTTP_NOT_IMPLEMENTED,
299 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
300 : url);
301 : }
302 :
303 0 : if ( (NULL != end_acc) &&
304 0 : (0 == strcmp ("/auth",
305 0 : end_acc)) &&
306 0 : (0 == strcasecmp (method,
307 : MHD_HTTP_METHOD_PATCH)) )
308 : {
309 : /* PATCH /accounts/$USERNAME/auth */
310 0 : GNUNET_break (0); /* not implemented */
311 0 : return TALER_MHD_reply_with_error (
312 : connection,
313 : MHD_HTTP_NOT_IMPLEMENTED,
314 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
315 : url);
316 : }
317 :
318 0 : if ( (NULL != end_acc) &&
319 0 : (0 == strcasecmp (method,
320 : MHD_HTTP_METHOD_GET)) )
321 : {
322 : /* GET /accounts/$ACCOUNT/+ */
323 :
324 0 : if (0 == strcmp (end_acc,
325 : "/transactions"))
326 : {
327 : /* GET /accounts/$USERNAME/transactions */
328 0 : GNUNET_break (0); /* not implemented */
329 0 : return TALER_MHD_reply_with_error (
330 : connection,
331 : MHD_HTTP_NOT_IMPLEMENTED,
332 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
333 : url);
334 : }
335 0 : if (0 == strncmp (end_acc,
336 : "/transactions/",
337 : strlen ("/transactions/")))
338 : {
339 : /* GET /accounts/$USERNAME/transactions/$TID */
340 0 : GNUNET_break (0); /* not implemented */
341 0 : return TALER_MHD_reply_with_error (
342 : connection,
343 : MHD_HTTP_NOT_IMPLEMENTED,
344 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
345 : url);
346 : }
347 0 : if (0 == strcmp (end_acc,
348 : "/withdrawals"))
349 : {
350 : /* GET /accounts/$USERNAME/withdrawals */
351 0 : GNUNET_break (0); /* not implemented */
352 0 : return TALER_MHD_reply_with_error (
353 : connection,
354 : MHD_HTTP_NOT_IMPLEMENTED,
355 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
356 : url);
357 : }
358 0 : if (0 == strcmp (end_acc,
359 : "/cashouts"))
360 : {
361 : /* GET /accounts/$USERNAME/cashouts */
362 0 : GNUNET_break (0); /* not implemented */
363 0 : return TALER_MHD_reply_with_error (
364 : connection,
365 : MHD_HTTP_NOT_IMPLEMENTED,
366 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
367 : url);
368 : }
369 0 : if (0 == strncmp (end_acc,
370 : "/cashouts/",
371 : strlen ("/cashouts/")))
372 : {
373 : /* GET /accounts/$USERNAME/cashouts/$CID */
374 0 : GNUNET_break (0); /* not implemented */
375 0 : return TALER_MHD_reply_with_error (
376 : connection,
377 : MHD_HTTP_NOT_IMPLEMENTED,
378 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
379 : url);
380 : }
381 :
382 :
383 0 : GNUNET_break_op (0);
384 0 : return TALER_MHD_reply_with_error (connection,
385 : MHD_HTTP_NOT_FOUND,
386 : TALER_EC_GENERIC_ENDPOINT_UNKNOWN,
387 : acc_name);
388 : }
389 :
390 0 : if ( (NULL != end_acc) &&
391 0 : (0 == strcasecmp (method,
392 : MHD_HTTP_METHOD_POST)) )
393 : {
394 : /* POST /accounts/$ACCOUNT/+ */
395 : char *acc;
396 :
397 0 : acc = GNUNET_strndup (acc_name,
398 : end_acc - acc_name);
399 0 : if (0 == strcmp (end_acc,
400 : "/cashouts"))
401 : {
402 : /* POST /accounts/$USERNAME/cashouts */
403 0 : GNUNET_break (0); /* not implemented */
404 0 : GNUNET_free (acc);
405 0 : return TALER_MHD_reply_with_error (
406 : connection,
407 : MHD_HTTP_NOT_IMPLEMENTED,
408 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
409 : url);
410 : }
411 0 : if (0 == strncmp (end_acc,
412 : "/cashouts/",
413 : strlen ("/cashouts/")))
414 : {
415 : /* POST /accounts/$USERNAME/cashouts/+ */
416 0 : const char *cid = end_acc + strlen ("/cashouts/");
417 0 : const char *opid = strchr (cid,
418 : '/');
419 : char *ci;
420 :
421 0 : if (NULL == opid)
422 : {
423 : /* POST /accounts/$ACCOUNT/cashouts/$CID (not defined) */
424 0 : GNUNET_break_op (0);
425 0 : GNUNET_free (acc);
426 0 : return TALER_MHD_reply_with_error (connection,
427 : MHD_HTTP_NOT_FOUND,
428 : TALER_EC_GENERIC_ENDPOINT_UNKNOWN,
429 : acc_name);
430 : }
431 0 : ci = GNUNET_strndup (cid,
432 : opid - cid);
433 0 : if (0 == strcmp (opid,
434 : "/abort"))
435 : {
436 0 : GNUNET_break (0); /* not implemented */
437 0 : GNUNET_free (ci);
438 0 : GNUNET_free (acc);
439 0 : return TALER_MHD_reply_with_error (
440 : connection,
441 : MHD_HTTP_NOT_IMPLEMENTED,
442 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
443 : url);
444 : }
445 0 : if (0 == strcmp (opid,
446 : "/confirm"))
447 : {
448 0 : GNUNET_break (0); /* not implemented */
449 0 : GNUNET_free (ci);
450 0 : GNUNET_free (acc);
451 0 : return TALER_MHD_reply_with_error (
452 : connection,
453 : MHD_HTTP_NOT_IMPLEMENTED,
454 : TALER_EC_GENERIC_CLIENT_INTERNAL_ERROR,
455 : url);
456 : }
457 : }
458 :
459 0 : if (0 == strcmp (end_acc,
460 : "/withdrawals"))
461 : {
462 : /* POST /accounts/$ACCOUNT/withdrawals */
463 : MHD_RESULT ret;
464 :
465 0 : ret = TALER_FAKEBANK_bank_post_account_withdrawals_ (
466 : h,
467 : connection,
468 : acc,
469 : upload_data,
470 : upload_data_size,
471 : con_cls);
472 0 : GNUNET_free (acc);
473 0 : return ret;
474 : }
475 :
476 0 : if (0 == strncmp (end_acc,
477 : "/withdrawals/",
478 : strlen ("/withdrawals/")))
479 : {
480 : /* POST /accounts/$ACCOUNT/withdrawals/$WID/$OP */
481 : MHD_RESULT ret;
482 0 : const char *pos = &end_acc[strlen ("/withdrawals/")];
483 0 : const char *op = strchr (pos, '/');
484 :
485 0 : if (NULL != op)
486 : {
487 0 : char *wid = GNUNET_strndup (pos,
488 : op - pos);
489 :
490 0 : ret = TALER_FAKEBANK_bank_withdrawals_id_op_ (
491 : h,
492 : connection,
493 : acc,
494 : wid,
495 : op,
496 : upload_data,
497 : upload_data_size,
498 : con_cls);
499 0 : GNUNET_free (wid);
500 0 : GNUNET_free (acc);
501 0 : return ret;
502 : }
503 0 : GNUNET_free (acc);
504 : }
505 : }
506 : }
507 :
508 0 : GNUNET_break_op (0);
509 0 : TALER_LOG_ERROR ("Breaking URL: %s %s\n",
510 : method,
511 : url);
512 0 : return TALER_MHD_reply_with_error (connection,
513 : MHD_HTTP_NOT_FOUND,
514 : TALER_EC_GENERIC_ENDPOINT_UNKNOWN,
515 : url);
516 : }
|