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

Generated by: LCOV version 2.0-1