add missing file

This commit is contained in:
Christian Grothoff 2021-11-07 11:41:53 +01:00
parent fadfc735fa
commit cd8d4bede1
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
7 changed files with 105 additions and 10 deletions

View File

@ -149,6 +149,13 @@ static struct TALER_Amount currency_round_unit;
*/ */
static char *exchange_base_url; static char *exchange_base_url;
/**
* Set to #GNUNET_YES if this exchange does not support KYC checks
* and thus deposits are to be aggregated regardless of the
* KYC status of the target account.
*/
static int kyc_off;
/** /**
* The exchange's configuration. * The exchange's configuration.
*/ */
@ -706,6 +713,7 @@ run_aggregation (void *cls)
db_plugin->cls, db_plugin->cls,
s->shard_start, s->shard_start,
s->shard_end, s->shard_end,
kyc_off ? true : false,
&deposit_cb, &deposit_cb,
&au_active); &au_active);
switch (qs) switch (qs)
@ -1106,6 +1114,10 @@ main (int argc,
"test", "test",
"run in test mode and exit when idle", "run in test mode and exit when idle",
&test_mode), &test_mode),
GNUNET_GETOPT_option_flag ('y',
"kyc-off",
"perform wire transfers without KYC checks",
&kyc_off),
GNUNET_GETOPT_OPTION_END GNUNET_GETOPT_OPTION_END
}; };
enum GNUNET_GenericReturnValue ret; enum GNUNET_GenericReturnValue ret;

View File

@ -70,7 +70,7 @@ CREATE TABLE IF NOT EXISTS wire_targets
(wire_target_serial_id BIGSERIAL UNIQUE (wire_target_serial_id BIGSERIAL UNIQUE
,h_payto BYTEA NOT NULL CHECK (LENGTH(h_payto)=64) ,h_payto BYTEA NOT NULL CHECK (LENGTH(h_payto)=64)
,payto_uri VARCHAR NOT NULL ,payto_uri VARCHAR NOT NULL
,kyc_ok BOOLEAN NOT NULL DEFAULT (false) ,kyc_ok BOOLEAN NOT NULL DEFAULT (FALSE)
,oauth_username VARCHAR ,oauth_username VARCHAR
,PRIMARY KEY (h_payto) ,PRIMARY KEY (h_payto)
); );

View File

@ -1045,7 +1045,7 @@ prepare_statements (struct PostgresClosure *pg)
/* Fetch an existing deposit request. /* Fetch an existing deposit request.
Used in #postgres_lookup_transfer_by_deposit(). */ Used in #postgres_lookup_transfer_by_deposit(). */
GNUNET_PQ_make_prepare ( GNUNET_PQ_make_prepare (
"get_deposit_for_wtid", "get_deposit_without_wtid",
"SELECT" "SELECT"
" kyc_ok" " kyc_ok"
",wire_target_serial_id AS payment_target_uuid" ",wire_target_serial_id AS payment_target_uuid"
@ -1091,13 +1091,14 @@ prepare_statements (struct PostgresClosure *pg)
" AND shard <= $3" " AND shard <= $3"
" AND tiny=FALSE" " AND tiny=FALSE"
" AND done=FALSE" " AND done=FALSE"
" AND (kyc_ok OR $4)"
" AND wire_deadline<=$1" " AND wire_deadline<=$1"
" AND refund_deadline<$1" " AND refund_deadline<$1"
" ORDER BY " " ORDER BY "
" shard ASC" " shard ASC"
" ,wire_deadline ASC" " ,wire_deadline ASC"
" LIMIT 1;", " LIMIT 1;",
3), 4),
/* Used in #postgres_iterate_matching_deposits() */ /* Used in #postgres_iterate_matching_deposits() */
GNUNET_PQ_make_prepare ( GNUNET_PQ_make_prepare (
"deposits_iterate_matching", "deposits_iterate_matching",
@ -5257,13 +5258,15 @@ postgres_mark_deposit_done (void *cls,
/** /**
* Obtain information about deposits that are ready to be executed. * Obtain information about deposits that are ready to be executed. Such
* Such deposits must not be marked as "tiny" or "done", and the * deposits must not be marked as "tiny" or "done", the execution time must be
* execution time must be in the past. * in the past, and the KYC status must be 'ok'.
* *
* @param cls the @e cls of this struct with the plugin-specific state * @param cls the @e cls of this struct with the plugin-specific state
* @param start_shard_row minimum shard row to select * @param start_shard_row minimum shard row to select
* @param end_shard_row maximum shard row to select (inclusive) * @param end_shard_row maximum shard row to select (inclusive)
* @param kyc_off true if we should not check the KYC status because
* this exchange does not need/support KYC checks.
* @param deposit_cb function to call for ONE such deposit * @param deposit_cb function to call for ONE such deposit
* @param deposit_cb_cls closure for @a deposit_cb * @param deposit_cb_cls closure for @a deposit_cb
* @return transaction status code * @return transaction status code
@ -5272,15 +5275,18 @@ static enum GNUNET_DB_QueryStatus
postgres_get_ready_deposit (void *cls, postgres_get_ready_deposit (void *cls,
uint64_t start_shard_row, uint64_t start_shard_row,
uint64_t end_shard_row, uint64_t end_shard_row,
bool kyc_off,
TALER_EXCHANGEDB_DepositIterator deposit_cb, TALER_EXCHANGEDB_DepositIterator deposit_cb,
void *deposit_cb_cls) void *deposit_cb_cls)
{ {
struct PostgresClosure *pg = cls; struct PostgresClosure *pg = cls;
uint8_t kyc_override = (kyc_off) ? 1 : 0;
struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get (); struct GNUNET_TIME_Absolute now = GNUNET_TIME_absolute_get ();
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
TALER_PQ_query_param_absolute_time (&now), TALER_PQ_query_param_absolute_time (&now),
GNUNET_PQ_query_param_uint64 (&start_shard_row), GNUNET_PQ_query_param_uint64 (&start_shard_row),
GNUNET_PQ_query_param_uint64 (&end_shard_row), GNUNET_PQ_query_param_uint64 (&end_shard_row),
GNUNET_PQ_query_param_auto_from_type (&kyc_override),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
struct TALER_Amount amount_with_fee; struct TALER_Amount amount_with_fee;
@ -7298,8 +7304,8 @@ postgres_lookup_transfer_by_deposit (
"lookup_deposit_wtid returned 0 matching rows\n"); "lookup_deposit_wtid returned 0 matching rows\n");
{ {
/* Check if transaction exists in deposits, so that we just /* Check if transaction exists in deposits, so that we just
do not have a WTID yet, if so, do call the CB with a NULL wtid do not have a WTID yet. In that case, return without wtid
and return #GNUNET_YES! */ (by setting 'pending' true). */
uint8_t ok8 = 0; uint8_t ok8 = 0;
struct GNUNET_PQ_ResultSpec rs2[] = { struct GNUNET_PQ_ResultSpec rs2[] = {
GNUNET_PQ_result_spec_auto_from_type ("wire_salt", GNUNET_PQ_result_spec_auto_from_type ("wire_salt",
@ -7320,7 +7326,7 @@ postgres_lookup_transfer_by_deposit (
}; };
qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn, qs = GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"get_deposit_for_wtid", "get_deposit_without_wtid",
params, params,
rs2); rs2);
if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)

View File

@ -1907,6 +1907,7 @@ run (void *cls)
plugin->get_ready_deposit (plugin->cls, plugin->get_ready_deposit (plugin->cls,
0, 0,
INT32_MAX, INT32_MAX,
true,
&deposit_cb, &deposit_cb,
&deposit)); &deposit));
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
@ -1928,6 +1929,7 @@ run (void *cls)
plugin->get_ready_deposit (plugin->cls, plugin->get_ready_deposit (plugin->cls,
0, 0,
INT32_MAX, INT32_MAX,
true,
&deposit_cb, &deposit_cb,
&deposit)); &deposit));
plugin->rollback (plugin->cls); plugin->rollback (plugin->cls);
@ -1935,6 +1937,7 @@ run (void *cls)
plugin->get_ready_deposit (plugin->cls, plugin->get_ready_deposit (plugin->cls,
0, 0,
INT32_MAX, INT32_MAX,
true,
&deposit_cb, &deposit_cb,
&deposit)); &deposit));
FAILIF (GNUNET_OK != FAILIF (GNUNET_OK !=

View File

@ -2731,11 +2731,14 @@ struct TALER_EXCHANGEDB_Plugin
/** /**
* Obtain information about deposits that are ready to be executed. * Obtain information about deposits that are ready to be executed.
* Such deposits must not be marked as "tiny" or "done", and the * Such deposits must not be marked as "tiny" or "done", and the
* execution time and refund deadlines must both be in the past. * execution time, the refund deadlines must both be in the past and
* the KYC status must be 'ok'.
* *
* @param cls the @e cls of this struct with the plugin-specific state * @param cls the @e cls of this struct with the plugin-specific state
* @param start_shard_row minimum shard row to select * @param start_shard_row minimum shard row to select
* @param end_shard_row maximum shard row to select (inclusive) * @param end_shard_row maximum shard row to select (inclusive)
* @param kyc_off true if we should not check the KYC status because
* this exchange does not need/support KYC checks.
* @param deposit_cb function to call for ONE such deposit * @param deposit_cb function to call for ONE such deposit
* @param deposit_cb_cls closure for @a deposit_cb * @param deposit_cb_cls closure for @a deposit_cb
* @return transaction status code * @return transaction status code
@ -2744,6 +2747,7 @@ struct TALER_EXCHANGEDB_Plugin
(*get_ready_deposit)(void *cls, (*get_ready_deposit)(void *cls,
uint64_t start_shard_row, uint64_t start_shard_row,
uint64_t end_shard_row, uint64_t end_shard_row,
bool kyc_off,
TALER_EXCHANGEDB_DepositIterator deposit_cb, TALER_EXCHANGEDB_DepositIterator deposit_cb,
void *deposit_cb_cls); void *deposit_cb_cls);

View File

@ -68,6 +68,7 @@ aggregator_run (void *cls,
"taler-exchange-aggregator", "taler-exchange-aggregator",
"-c", as->config_filename, "-c", as->config_filename,
"-t", /* exit when done */ "-t", /* exit when done */
"-y", /* skip KYC */
NULL); NULL);
if (NULL == as->aggregator_proc) if (NULL == as->aggregator_proc)
{ {

View File

@ -0,0 +1,69 @@
/*
This file is part of TALER
Copyright (C) 2021 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 exchange_signatures.c
* @brief Utility functions for Taler security module signatures
* @author Christian Grothoff
*/
#include "platform.h"
#include "taler_util.h"
#include "taler_signatures.h"
enum GNUNET_GenericReturnValue
TALER_exchange_deposit_confirm_verify (
const struct TALER_PrivateContractHash *h_contract_terms,
const struct TALER_MerchantWireHash *h_wire,
const struct TALER_ExtensionContractHash *h_extensions,
struct GNUNET_TIME_Absolute exchange_timestamp,
struct GNUNET_TIME_Absolute wire_deadline,
struct GNUNET_TIME_Absolute refund_deadline,
const struct TALER_Amount *amount_without_fee,
const struct TALER_CoinSpendPublicKeyP *coin_pub,
const struct TALER_MerchantPublicKeyP *merchant_pub,
const struct TALER_ExchangePublicKeyP *exchange_pub,
const struct TALER_ExchangeSignatureP *exchange_sig)
{
struct TALER_DepositConfirmationPS dcs = {
.purpose.purpose = htonl (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT),
.purpose.size = htonl (sizeof (struct TALER_DepositConfirmationPS)),
.h_contract_terms = *h_contract_terms,
.h_wire = *h_wire,
.exchange_timestamp = GNUNET_TIME_absolute_hton (exchange_timestamp),
.wire_deadline = GNUNET_TIME_absolute_hton (wire_deadline),
.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline),
.coin_pub = *coin_pub,
.merchant_pub = *merchant_pub
};
if (NULL != h_extensions)
dcs.h_extensions = *h_extensions;
TALER_amount_hton (&dcs.amount_without_fee,
amount_without_fee);
if (GNUNET_OK !=
GNUNET_CRYPTO_eddsa_verify (TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT,
&dcs,
&exchange_sig->eddsa_signature,
&exchange_pub->eddsa_pub))
{
GNUNET_break_op (0);
return GNUNET_SYSERR;
}
return GNUNET_OK;
}
/* end of exchange_signatures.c */