LCOV - code coverage report
Current view: top level - bank-lib - fakebank_bank.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 26 142 18.3 %
Date: 2025-06-22 12:09:43 Functions: 1 1 100.0 %

          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         580 : 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         580 :   if (0 == strcasecmp (method,
      53             :                        MHD_HTTP_METHOD_HEAD))
      54           0 :     method = MHD_HTTP_METHOD_GET;
      55             : 
      56         580 :   if ( (0 == strcmp (url,
      57           2 :                      "/")) &&
      58           2 :        (0 == strcasecmp (method,
      59             :                          MHD_HTTP_METHOD_GET)) )
      60             :   {
      61             :     /* GET / */
      62           2 :     return TALER_FAKEBANK_bank_get_root_ (h,
      63             :                                           connection);
      64             :   }
      65             : 
      66         578 :   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         578 :   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         578 :   if ( (0 == strcmp (url,
     120          21 :                      "/accounts")) &&
     121          21 :        (0 == strcasecmp (method,
     122             :                          MHD_HTTP_METHOD_POST)) )
     123             :   {
     124             :     /* POST /accounts */
     125          21 :     return TALER_FAKEBANK_bank_testing_register_ (h,
     126             :                                                   connection,
     127             :                                                   upload_data,
     128             :                                                   upload_data_size,
     129             :                                                   con_cls);
     130             :   }
     131             : 
     132         557 :   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         557 :   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         557 :   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         557 :   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         557 :   if (0 == strncmp (url,
     190             :                     "/accounts/",
     191             :                     strlen ("/accounts/")))
     192             :   {
     193         557 :     const char *acc_name = &url[strlen ("/accounts/")];
     194         557 :     const char *end_acc = strchr (acc_name,
     195             :                                   '/');
     196             : 
     197         557 :     if ( (NULL != end_acc) &&
     198         557 :          (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         557 :       acc = GNUNET_strndup (acc_name,
     207             :                             end_acc - acc_name);
     208         557 :       end_acc += strlen ("/taler-wire-gateway");
     209         557 :       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         557 :       GNUNET_free (acc);
     218         557 :       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 1.16