LCOV - code coverage report
Current view: top level - bank-lib - fakebank_common_make_admin_transfer.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 60 64 93.8 %
Date: 2025-06-22 12:09:43 Functions: 2 2 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_common_make_admin_transfer.c
      21             :  * @brief routine to create transfers to the exchange
      22             :  * @author Christian Grothoff <christian@grothoff.org>
      23             :  */
      24             : #include "taler/platform.h"
      25             : #include <pthread.h>
      26             : #include "taler/taler_fakebank_lib.h"
      27             : #include "taler/taler_bank_service.h"
      28             : #include "taler/taler_mhd_lib.h"
      29             : #include <gnunet/gnunet_mhd_compat.h>
      30             : #include "fakebank.h"
      31             : #include "fakebank_common_make_admin_transfer.h"
      32             : #include "fakebank_common_lookup.h"
      33             : #include "fakebank_common_lp.h"
      34             : #include "fakebank_common_transact.h"
      35             : 
      36             : 
      37             : enum GNUNET_GenericReturnValue
      38          58 : TALER_FAKEBANK_make_admin_transfer_ (
      39             :   struct TALER_FAKEBANK_Handle *h,
      40             :   const char *debit_account,
      41             :   const char *credit_account,
      42             :   const struct TALER_Amount *amount,
      43             :   const struct TALER_ReservePublicKeyP *reserve_pub,
      44             :   uint64_t *row_id,
      45             :   struct GNUNET_TIME_Timestamp *timestamp)
      46             : {
      47             :   struct Transaction *t;
      48             :   const struct GNUNET_PeerIdentity *pid;
      49             :   struct Account *debit_acc;
      50             :   struct Account *credit_acc;
      51             : 
      52             :   GNUNET_static_assert (sizeof (*pid) ==
      53             :                         sizeof (*reserve_pub));
      54          58 :   pid = (const struct GNUNET_PeerIdentity *) reserve_pub;
      55          58 :   GNUNET_assert (NULL != debit_account);
      56          58 :   GNUNET_assert (NULL != credit_account);
      57          58 :   GNUNET_assert (0 == strcasecmp (amount->currency,
      58             :                                   h->currency));
      59          58 :   GNUNET_break (0 != strncasecmp ("payto://",
      60             :                                   debit_account,
      61             :                                   strlen ("payto://")));
      62          58 :   GNUNET_break (0 != strncasecmp ("payto://",
      63             :                                   credit_account,
      64             :                                   strlen ("payto://")));
      65          58 :   debit_acc = TALER_FAKEBANK_lookup_account_ (h,
      66             :                                               debit_account,
      67             :                                               debit_account);
      68          58 :   credit_acc = TALER_FAKEBANK_lookup_account_ (h,
      69             :                                                credit_account,
      70             :                                                credit_account);
      71          58 :   GNUNET_assert (0 ==
      72             :                  pthread_mutex_lock (&h->rpubs_lock));
      73          58 :   t = GNUNET_CONTAINER_multipeermap_get (h->rpubs,
      74             :                                          pid);
      75          58 :   GNUNET_assert (0 ==
      76             :                  pthread_mutex_unlock (&h->rpubs_lock));
      77          58 :   if (NULL != t)
      78             :   {
      79             :     /* duplicate reserve public key not allowed */
      80           1 :     GNUNET_break_op (0);
      81           1 :     return GNUNET_NO;
      82             :   }
      83             : 
      84          57 :   t = GNUNET_new (struct Transaction);
      85          57 :   t->unchecked = true;
      86          57 :   t->debit_account = debit_acc;
      87          57 :   t->credit_account = credit_acc;
      88          57 :   t->amount = *amount;
      89          57 :   t->date = GNUNET_TIME_timestamp_get ();
      90          57 :   if (NULL != timestamp)
      91          57 :     *timestamp = t->date;
      92          57 :   t->type = T_CREDIT;
      93          57 :   t->subject.credit.reserve_pub = *reserve_pub;
      94          57 :   GNUNET_assert (0 ==
      95             :                  pthread_mutex_lock (&h->rpubs_lock));
      96          57 :   if (GNUNET_OK !=
      97          57 :       GNUNET_CONTAINER_multipeermap_put (
      98             :         h->rpubs,
      99             :         pid,
     100             :         t,
     101             :         GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY))
     102             :   {
     103             :     /* duplicate reserve public key not allowed */
     104           0 :     GNUNET_break_op (0);
     105           0 :     GNUNET_free (t);
     106           0 :     GNUNET_assert (0 ==
     107             :                    pthread_mutex_unlock (&h->rpubs_lock));
     108           0 :     return GNUNET_NO;
     109             :   }
     110          57 :   GNUNET_assert (0 ==
     111             :                  pthread_mutex_unlock (&h->rpubs_lock));
     112          57 :   TALER_FAKEBANK_transact_ (h,
     113             :                             t);
     114          57 :   if (NULL != row_id)
     115          57 :     *row_id = t->row_id;
     116          57 :   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
     117             :               "Making transfer from %s to %s over %s and subject %s at row %llu\n",
     118             :               debit_account,
     119             :               credit_account,
     120             :               TALER_amount2s (amount),
     121             :               TALER_B2S (reserve_pub),
     122             :               (unsigned long long) t->row_id);
     123          57 :   TALER_FAKEBANK_notify_transaction_ (h,
     124             :                                       t);
     125          57 :   return GNUNET_OK;
     126             : }
     127             : 
     128             : 
     129             : enum GNUNET_GenericReturnValue
     130          16 : TALER_FAKEBANK_make_kycauth_transfer_ (
     131             :   struct TALER_FAKEBANK_Handle *h,
     132             :   const char *debit_account,
     133             :   const char *credit_account,
     134             :   const struct TALER_Amount *amount,
     135             :   const union TALER_AccountPublicKeyP *account_pub,
     136             :   uint64_t *row_id,
     137             :   struct GNUNET_TIME_Timestamp *timestamp)
     138             : {
     139             :   struct Transaction *t;
     140             :   const struct GNUNET_PeerIdentity *pid;
     141             :   struct Account *debit_acc;
     142             :   struct Account *credit_acc;
     143             : 
     144             :   GNUNET_static_assert (sizeof (*pid) ==
     145             :                         sizeof (*account_pub));
     146          16 :   pid = (const struct GNUNET_PeerIdentity *) account_pub;
     147          16 :   GNUNET_assert (NULL != debit_account);
     148          16 :   GNUNET_assert (NULL != credit_account);
     149          16 :   GNUNET_assert (0 == strcasecmp (amount->currency,
     150             :                                   h->currency));
     151          16 :   GNUNET_break (0 != strncasecmp ("payto://",
     152             :                                   debit_account,
     153             :                                   strlen ("payto://")));
     154          16 :   GNUNET_break (0 != strncasecmp ("payto://",
     155             :                                   credit_account,
     156             :                                   strlen ("payto://")));
     157          16 :   debit_acc = TALER_FAKEBANK_lookup_account_ (h,
     158             :                                               debit_account,
     159             :                                               debit_account);
     160          16 :   credit_acc = TALER_FAKEBANK_lookup_account_ (h,
     161             :                                                credit_account,
     162             :                                                credit_account);
     163          16 :   t = GNUNET_new (struct Transaction);
     164          16 :   t->unchecked = true;
     165          16 :   t->debit_account = debit_acc;
     166          16 :   t->credit_account = credit_acc;
     167          16 :   t->amount = *amount;
     168          16 :   t->date = GNUNET_TIME_timestamp_get ();
     169          16 :   if (NULL != timestamp)
     170          16 :     *timestamp = t->date;
     171          16 :   t->type = T_AUTH;
     172          16 :   t->subject.auth.account_pub = *account_pub;
     173          16 :   TALER_FAKEBANK_transact_ (h,
     174             :                             t);
     175          16 :   if (NULL != row_id)
     176          16 :     *row_id = t->row_id;
     177          16 :   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
     178             :               "Making transfer from %s to %s over %s and subject %s at row %llu\n",
     179             :               debit_account,
     180             :               credit_account,
     181             :               TALER_amount2s (amount),
     182             :               TALER_B2S (account_pub),
     183             :               (unsigned long long) t->row_id);
     184          16 :   TALER_FAKEBANK_notify_transaction_ (h,
     185             :                                       t);
     186          16 :   return GNUNET_OK;
     187             : }

Generated by: LCOV version 1.16