LCOV - code coverage report
Current view: top level - bank-lib - fakebank_bank.c (source / functions) Coverage Total Hit
Test: coverage.info Lines: 18.3 % 142 26
Test Date: 2026-04-14 15:39:31 Functions: 100.0 % 1 1

            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              : }
        

Generated by: LCOV version 2.0-1