move function to libtalerexchangedb, as planned

This commit is contained in:
Christian Grothoff 2020-01-16 22:40:12 +01:00
parent 0a415262da
commit 0305cf5f9e
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
18 changed files with 546 additions and 508 deletions

View File

@ -39,7 +39,7 @@
#include "platform.h"
#include <gnunet/gnunet_util_lib.h>
#include "taler_auditordb_plugin.h"
#include "taler_exchangedb_plugin.h"
#include "taler_exchangedb_lib.h"
#include "taler_json_lib.h"
#include "taler_bank_service.h"
#include "taler_signatures.h"

View File

@ -29,7 +29,7 @@
#include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_curl_lib.h>
#include "taler_auditordb_plugin.h"
#include "taler_exchangedb_plugin.h"
#include "taler_exchangedb_lib.h"
#include "taler_json_lib.h"
#include "taler_bank_service.h"
#include "taler_signatures.h"

View File

@ -1293,6 +1293,7 @@ schedule_httpd (struct TALER_FAKEBANK_Handle *h)
h);
}
#else
/**
* Schedule MHD. This function should be called initially when an

View File

@ -20,7 +20,7 @@
*/
#include "platform.h"
#include <gnunet/gnunet_util_lib.h>
#include "taler_exchangedb_plugin.h"
#include "taler_exchangedb_lib.h"
/**

View File

@ -165,123 +165,4 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
}
/**
* Calculate the total value of all transactions performed.
* Stores @a off plus the cost of all transactions in @a tl
* in @a ret.
*
* @param tl transaction list to process
* @param off offset to use as the starting value
* @param[out] ret where the resulting total is to be stored
* @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
*/
// FIXME: maybe move to another module, i.e. exchangedb???
int
TEH_DB_calculate_transaction_list_totals (struct
TALER_EXCHANGEDB_TransactionList *tl,
const struct TALER_Amount *off,
struct TALER_Amount *ret)
{
struct TALER_Amount spent = *off;
struct TALER_Amount refunded;
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (spent.currency,
&refunded));
for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos =
pos->next)
{
switch (pos->type)
{
case TALER_EXCHANGEDB_TT_DEPOSIT:
/* spent += pos->amount_with_fee */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.deposit->amount_with_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_REFRESH_MELT:
/* spent += pos->amount_with_fee */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.melt->session.amount_with_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_REFUND:
/* refunded += pos->refund_amount - pos->refund_fee */
if (GNUNET_OK !=
TALER_amount_add (&refunded,
&refunded,
&pos->details.refund->refund_amount))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
TALER_amount_subtract (&refunded,
&refunded,
&pos->details.refund->refund_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_OLD_COIN_PAYBACK:
/* refunded += pos->value */
if (GNUNET_OK !=
TALER_amount_add (&refunded,
&refunded,
&pos->details.old_coin_payback->value))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_PAYBACK:
/* spent += pos->value */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.payback->value))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_PAYBACK_REFRESH:
/* spent += pos->value */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.payback_refresh->value))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
}
}
/* spent = spent - refunded */
if (GNUNET_SYSERR ==
TALER_amount_subtract (&spent,
&spent,
&refunded))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
*ret = spent;
return GNUNET_OK;
}
/* end of taler-exchange-httpd_db.c */

View File

@ -107,23 +107,5 @@ TEH_DB_run_transaction (struct MHD_Connection *connection,
void *cb_cls);
/**
* Calculate the total value of all transactions performed.
* Stores @a off plus the cost of all transactions in @a tl
* in @a ret.
*
* @param tl transaction list to process
* @param off offset to use as the starting value
* @param[out] ret where the resulting total is to be stored
* @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
*/
// FIXME: maybe move to another module, i.e. exchangedb???
int
TEH_DB_calculate_transaction_list_totals (struct
TALER_EXCHANGEDB_TransactionList *tl,
const struct TALER_Amount *off,
struct TALER_Amount *ret);
#endif
/* TALER_EXCHANGE_HTTPD_DB_H */

View File

@ -193,7 +193,7 @@ deposit_transaction (void *cls,
if (0 > qs)
return qs;
if (GNUNET_OK !=
TEH_DB_calculate_transaction_list_totals (tl,
TALER_EXCHANGEDB_calculate_transaction_list_totals (tl,
&spent,
&spent))
{

View File

@ -312,7 +312,7 @@ payback_transaction (void *cls,
TALER_amount_get_zero (pc->value.currency,
&spent));
if (GNUNET_OK !=
TEH_DB_calculate_transaction_list_totals (tl,
TALER_EXCHANGEDB_calculate_transaction_list_totals (tl,
&spent,
&spent))
{

View File

@ -225,7 +225,7 @@ refresh_check_melt (struct MHD_Connection *connection,
}
}
if (GNUNET_OK !=
TEH_DB_calculate_transaction_list_totals (tl,
TALER_EXCHANGEDB_calculate_transaction_list_totals (tl,
&spent,
&spent))
{

View File

@ -46,8 +46,9 @@ libtalerexchangedb_la_SOURCES = \
exchangedb_auditorkeys.c \
exchangedb_denomkeys.c \
exchangedb_fees.c \
exchangedb_plugin.c \
exchangedb_signkeys.c \
exchangedb_plugin.c
exchangedb_transactions.c
libtalerexchangedb_la_LIBADD = \
$(top_builddir)/src/util/libtalerutil.la \

View File

@ -1,6 +1,6 @@
/*
This file is part of TALER
Copyright (C) 2017 GNUnet e.V.
Copyright (C) 2017 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software

View File

@ -0,0 +1,142 @@
/*
This file is part of TALER
Copyright (C) 2017-2020 Taler Systems SA
TALER is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
TALER is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
/**
* @file exchangedb/exchangedb_transactions.c
* @brief Logic to compute transaction totals of a transaction list for a coin
* @author Christian Grothoff
*/
#include "platform.h"
#include "taler_exchangedb_lib.h"
/**
* Calculate the total value of all transactions performed.
* Stores @a off plus the cost of all transactions in @a tl
* in @a ret.
*
* @param tl transaction list to process
* @param off offset to use as the starting value
* @param[out] ret where the resulting total is to be stored
* @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
*/
int
TALER_EXCHANGEDB_calculate_transaction_list_totals (struct
TALER_EXCHANGEDB_TransactionList
*tl,
const struct
TALER_Amount *off,
struct TALER_Amount *ret)
{
struct TALER_Amount spent = *off;
struct TALER_Amount refunded;
GNUNET_assert (GNUNET_OK ==
TALER_amount_get_zero (spent.currency,
&refunded));
for (struct TALER_EXCHANGEDB_TransactionList *pos = tl; NULL != pos; pos =
pos->next)
{
switch (pos->type)
{
case TALER_EXCHANGEDB_TT_DEPOSIT:
/* spent += pos->amount_with_fee */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.deposit->amount_with_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_REFRESH_MELT:
/* spent += pos->amount_with_fee */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.melt->session.amount_with_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_REFUND:
/* refunded += pos->refund_amount - pos->refund_fee */
if (GNUNET_OK !=
TALER_amount_add (&refunded,
&refunded,
&pos->details.refund->refund_amount))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
if (GNUNET_OK !=
TALER_amount_subtract (&refunded,
&refunded,
&pos->details.refund->refund_fee))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_OLD_COIN_PAYBACK:
/* refunded += pos->value */
if (GNUNET_OK !=
TALER_amount_add (&refunded,
&refunded,
&pos->details.old_coin_payback->value))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_PAYBACK:
/* spent += pos->value */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.payback->value))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
case TALER_EXCHANGEDB_TT_PAYBACK_REFRESH:
/* spent += pos->value */
if (GNUNET_OK !=
TALER_amount_add (&spent,
&spent,
&pos->details.payback_refresh->value))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
break;
}
}
/* spent = spent - refunded */
if (GNUNET_SYSERR ==
TALER_amount_subtract (&spent,
&spent,
&refunded))
{
GNUNET_break (0);
return GNUNET_SYSERR;
}
*ret = spent;
return GNUNET_OK;
}

View File

@ -23,9 +23,8 @@
#ifndef TALER_EXCHANGEDB_LIB_H
#define TALER_EXCHANGEDB_LIB_H
#include "taler_signatures.h"
#include "taler_exchangedb_plugin.h"
/**
* Subdirectroy under the exchange's base directory which contains
@ -40,81 +39,6 @@
#define TALER_EXCHANGEDB_DIR_DENOMINATION_KEYS "denomkeys"
GNUNET_NETWORK_STRUCT_BEGIN
/**
* @brief On disk format used for a exchange signing key. Signing keys are used
* by the exchange to affirm its messages, but not to create coins.
* Includes the private key followed by the public information about
* the signing key.
*/
struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP
{
/**
* Private key part of the exchange's signing key.
*/
struct TALER_ExchangePrivateKeyP signkey_priv;
/**
* Signature over @e issue
*/
struct TALER_MasterSignatureP master_sig;
/**
* Public information about a exchange signing key.
*/
struct TALER_ExchangeSigningKeyValidityPS issue;
};
/**
* Information about a denomination key.
*/
struct TALER_EXCHANGEDB_DenominationKeyInformationP
{
/**
* Signature over this struct to affirm the validity of the key.
*/
struct TALER_MasterSignatureP signature;
/**
* Signed properties of the denomination key.
*/
struct TALER_DenominationKeyValidityPS properties;
};
GNUNET_NETWORK_STRUCT_END
/**
* @brief All information about a denomination key (which is used to
* sign coins into existence).
*/
struct TALER_EXCHANGEDB_DenominationKeyIssueInformation
{
/**
* The private key of the denomination. Will be NULL if the private
* key is not available (this is the case after the key has expired
* for signing coins, but is still valid for depositing coins).
*/
struct TALER_DenominationPrivateKey denom_priv;
/**
* Decoded denomination public key (the hash of it is in
* @e issue, but we sometimes need the full public key as well).
*/
struct TALER_DenominationPublicKey denom_pub;
/**
* Signed public information about a denomination key.
*/
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
};
/**
* @brief Iterator over signing keys.
*
@ -525,4 +449,23 @@ TALER_EXCHANGEDB_find_accounts (const struct GNUNET_CONFIGURATION_Handle *cfg,
void *cb_cls);
/**
* Calculate the total value of all transactions performed.
* Stores @a off plus the cost of all transactions in @a tl
* in @a ret.
*
* @param tl transaction list to process
* @param off offset to use as the starting value
* @param[out] ret where the resulting total is to be stored
* @return #GNUNET_OK on success, #GNUNET_SYSERR on errors
*/
int
TALER_EXCHANGEDB_calculate_transaction_list_totals (struct
TALER_EXCHANGEDB_TransactionList
*tl,
const struct
TALER_Amount *off,
struct TALER_Amount *ret);
#endif

View File

@ -24,7 +24,82 @@
#include <jansson.h>
#include <gnunet/gnunet_util_lib.h>
#include <gnunet/gnunet_db_lib.h>
#include "taler_exchangedb_lib.h"
#include "taler_signatures.h"
GNUNET_NETWORK_STRUCT_BEGIN
/**
* @brief On disk format used for a exchange signing key. Signing keys are used
* by the exchange to affirm its messages, but not to create coins.
* Includes the private key followed by the public information about
* the signing key.
*/
struct TALER_EXCHANGEDB_PrivateSigningKeyInformationP
{
/**
* Private key part of the exchange's signing key.
*/
struct TALER_ExchangePrivateKeyP signkey_priv;
/**
* Signature over @e issue
*/
struct TALER_MasterSignatureP master_sig;
/**
* Public information about a exchange signing key.
*/
struct TALER_ExchangeSigningKeyValidityPS issue;
};
/**
* Information about a denomination key.
*/
struct TALER_EXCHANGEDB_DenominationKeyInformationP
{
/**
* Signature over this struct to affirm the validity of the key.
*/
struct TALER_MasterSignatureP signature;
/**
* Signed properties of the denomination key.
*/
struct TALER_DenominationKeyValidityPS properties;
};
GNUNET_NETWORK_STRUCT_END
/**
* @brief All information about a denomination key (which is used to
* sign coins into existence).
*/
struct TALER_EXCHANGEDB_DenominationKeyIssueInformation
{
/**
* The private key of the denomination. Will be NULL if the private
* key is not available (this is the case after the key has expired
* for signing coins, but is still valid for depositing coins).
*/
struct TALER_DenominationPrivateKey denom_priv;
/**
* Decoded denomination public key (the hash of it is in
* @e issue, but we sometimes need the full public key as well).
*/
struct TALER_DenominationPublicKey denom_pub;
/**
* Signed public information about a denomination key.
*/
struct TALER_EXCHANGEDB_DenominationKeyInformationP issue;
};
/**

View File

@ -1679,6 +1679,7 @@ TALER_TESTING_cmd_serialize_keys (const char *label);
struct TALER_TESTING_Command
TALER_TESTING_cmd_connect_with_state (const char *label,
const char *state_reference);
/**
* Make the "insert-deposit" CMD.
*
@ -1694,7 +1695,8 @@ TALER_TESTING_cmd_connect_with_state (const char *label,
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_insert_deposit (const char *label,
const struct TALER_TESTING_DatabaseConnection *dbc,
const struct
TALER_TESTING_DatabaseConnection *dbc,
const char *merchant_name,
const char *merchant_account,
struct GNUNET_TIME_Relative wire_deadline,

View File

@ -186,19 +186,22 @@ run (void *cls,
ec.exchange_url,
"EUR:0.89",
bc.exchange_payto,
TALER_payto_xtalerbank_make (bc.bank_url, "4")),
TALER_payto_xtalerbank_make (
bc.bank_url, "4")),
TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-3b",
ec.exchange_url,
"EUR:0.89",
bc.exchange_payto,
TALER_payto_xtalerbank_make (bc.bank_url, "4")),
TALER_payto_xtalerbank_make (
bc.bank_url, "4")),
TALER_TESTING_cmd_check_bank_transfer ("expect-deposit-3c",
ec.exchange_url,
"EUR:0.89",
bc.exchange_payto,
TALER_payto_xtalerbank_make (bc.bank_url, "5")),
TALER_payto_xtalerbank_make (
bc.bank_url, "5")),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-3"),
// checking that aggregator waits for the deadline.
@ -230,7 +233,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-4-early",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-4-fast"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-4-fast"),
TALER_TESTING_cmd_sleep ("wait (5s)", 5),
@ -271,7 +275,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-5-early",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-5-early"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-5-early"),
TALER_TESTING_cmd_sleep ("wait (5s)", 5),
@ -295,7 +300,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6a-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-6a-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-6a-tiny"),
TALER_TESTING_cmd_insert_deposit ("do-deposit-6b",
&dbc,
"bob",
@ -314,7 +320,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6c-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-6c-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-6c-tiny"),
TALER_TESTING_cmd_insert_deposit ("do-deposit-6d",
&dbc,
@ -326,7 +333,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-6d-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-6d-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-6d-tiny"),
TALER_TESTING_cmd_insert_deposit ("do-deposit-6e",
&dbc,
@ -359,7 +367,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-7a-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-7a-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-7a-tiny"),
TALER_TESTING_cmd_insert_deposit ("do-deposit-7b",
&dbc,
@ -414,7 +423,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-8a-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-8a-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-8a-tiny"),
TALER_TESTING_cmd_insert_deposit ("do-deposit-8b",
&dbc,
@ -431,7 +441,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-8b-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-8b-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-8b-tiny"),
// now trigger aggregate with large transaction and short deadline
@ -471,7 +482,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-9a-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-9a-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-9a-tiny"),
TALER_TESTING_cmd_insert_deposit ("do-deposit-9b",
&dbc,
@ -488,9 +500,8 @@ run (void *cls,
TALER_TESTING_cmd_exec_aggregator ("run-aggregator-deposit-9b-tiny",
config_filename),
TALER_TESTING_cmd_check_bank_empty ("expect-empty-transactions-after-9b-tiny"),
TALER_TESTING_cmd_check_bank_empty (
"expect-empty-transactions-after-9b-tiny"),
// now trigger aggregate with large transaction and short deadline
@ -521,6 +532,7 @@ run (void *cls,
bc.bank_url);
}
int
main (int argc,
char *const argv[])

View File

@ -98,8 +98,6 @@ fake_issue (struct TALER_EXCHANGEDB_DenominationKeyInformationP *issue)
}
/**
* Run the command.
*
@ -283,7 +281,8 @@ insert_deposit_traits (void *cls,
*/
struct TALER_TESTING_Command
TALER_TESTING_cmd_insert_deposit (const char *label,
const struct TALER_TESTING_DatabaseConnection *dbc,
const struct
TALER_TESTING_DatabaseConnection *dbc,
const char *merchant_name,
const char *merchant_account,
struct GNUNET_TIME_Relative wire_deadline,