add missing file
This commit is contained in:
parent
fadfc735fa
commit
cd8d4bede1
@ -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;
|
||||||
|
@ -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)
|
||||||
);
|
);
|
||||||
|
@ -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)
|
||||||
|
@ -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 !=
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
69
src/util/exchange_signatures.c
Normal file
69
src/util/exchange_signatures.c
Normal 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 */
|
Loading…
Reference in New Issue
Block a user