allow auditor to operate per-account

This commit is contained in:
Christian Grothoff 2018-04-02 21:12:18 +02:00
parent 2b0f98dd4b
commit aea82d3dcd
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
6 changed files with 218 additions and 28 deletions

View File

@ -861,11 +861,12 @@ check_exchange_wire_out ()
enum GNUNET_DB_QueryStatus qs; enum GNUNET_DB_QueryStatus qs;
struct GNUNET_TIME_Absolute next_timestamp; struct GNUNET_TIME_Absolute next_timestamp;
qs = edb->select_wire_out_above_serial_id (edb->cls, qs = edb->select_wire_out_above_serial_id_by_account (edb->cls,
esession, esession,
pp.last_wire_out_serial_id, wp_section_name,
&wire_out_cb, pp.last_wire_out_serial_id,
NULL); &wire_out_cb,
NULL);
if (0 > qs) if (0 > qs)
{ {
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
@ -1439,11 +1440,12 @@ process_next_account (void *cls)
in_map = GNUNET_CONTAINER_multihashmap_create (1024, in_map = GNUNET_CONTAINER_multihashmap_create (1024,
GNUNET_YES); GNUNET_YES);
qs = edb->select_reserves_in_above_serial_id (edb->cls, qs = edb->select_reserves_in_above_serial_id_by_account (edb->cls,
esession, esession,
pp.last_reserve_in_serial_id, wp_section_name,
&reserve_in_cb, pp.last_reserve_in_serial_id,
NULL); &reserve_in_cb,
NULL);
if (0 > qs) if (0 > qs)
{ {
GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs); GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);

View File

@ -723,7 +723,10 @@ deposit_cb (void *cls,
GNUNET_free (url); GNUNET_free (url);
} }
if (NULL == au->wa) if (NULL == au->wa)
{
GNUNET_break (0);
return GNUNET_DB_STATUS_HARD_ERROR; return GNUNET_DB_STATUS_HARD_ERROR;
}
/* make sure we have current fees */ /* make sure we have current fees */
au->execution_time = GNUNET_TIME_absolute_get (); au->execution_time = GNUNET_TIME_absolute_get ();
@ -1570,6 +1573,7 @@ prepare_cb (void *cls,
au->execution_time, au->execution_time,
&au->wtid, &au->wtid,
au->wire, au->wire,
au->wa->section_name,
&au->final_amount); &au->final_amount);
cleanup_au (); cleanup_au ();
if (GNUNET_DB_STATUS_SOFT_ERROR == qs) if (GNUNET_DB_STATUS_SOFT_ERROR == qs)

View File

@ -368,6 +368,7 @@ postgres_create_tables (void *cls)
",execution_date INT8 NOT NULL" ",execution_date INT8 NOT NULL"
",wtid_raw BYTEA UNIQUE NOT NULL CHECK (LENGTH(wtid_raw)=" TALER_WIRE_TRANSFER_IDENTIFIER_LEN_STR ")" ",wtid_raw BYTEA UNIQUE NOT NULL CHECK (LENGTH(wtid_raw)=" TALER_WIRE_TRANSFER_IDENTIFIER_LEN_STR ")"
",wire_target TEXT NOT NULL" ",wire_target TEXT NOT NULL"
",exchange_account_section TEXT NOT NULL"
",amount_val INT8 NOT NULL" ",amount_val INT8 NOT NULL"
",amount_frac INT4 NOT NULL" ",amount_frac INT4 NOT NULL"
",amount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL" ",amount_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
@ -621,6 +622,22 @@ postgres_prepare (PGconn *db_conn)
" WHERE reserve_in_serial_id>=$1" " WHERE reserve_in_serial_id>=$1"
" ORDER BY reserve_in_serial_id;", " ORDER BY reserve_in_serial_id;",
1), 1),
/* Used in postgres_select_reserves_in_above_serial_id() to obtain inbound
transactions for reserves with serial id '\geq' the given parameter */
GNUNET_PQ_make_prepare ("audit_reserves_in_get_transactions_incr_by_account",
"SELECT"
" reserve_pub"
",wire_reference"
",credit_val"
",credit_frac"
",credit_curr"
",execution_date"
",sender_account_details"
",reserve_in_serial_id"
" FROM reserves_in"
" WHERE reserve_in_serial_id>=$1 AND exchange_account_section=$2"
" ORDER BY reserve_in_serial_id;",
2),
/* Used in #postgres_get_reserve_history() to obtain inbound transactions /* Used in #postgres_get_reserve_history() to obtain inbound transactions
for a reserve */ for a reserve */
GNUNET_PQ_make_prepare ("reserves_in_get_transactions", GNUNET_PQ_make_prepare ("reserves_in_get_transactions",
@ -1215,12 +1232,13 @@ postgres_prepare (PGconn *db_conn)
"(execution_date" "(execution_date"
",wtid_raw" ",wtid_raw"
",wire_target" ",wire_target"
",exchange_account_section"
",amount_val" ",amount_val"
",amount_frac" ",amount_frac"
",amount_curr" ",amount_curr"
") VALUES " ") VALUES "
"($1, $2, $3, $4, $5, $6);", "($1, $2, $3, $4, $5, $6, $7);",
6), 7),
/* Used in #postgres_wire_prepare_data_insert() to store /* Used in #postgres_wire_prepare_data_insert() to store
wire transfer information before actually committing it with the bank */ wire transfer information before actually committing it with the bank */
GNUNET_PQ_make_prepare ("wire_prepare_data_insert", GNUNET_PQ_make_prepare ("wire_prepare_data_insert",
@ -1290,6 +1308,20 @@ postgres_prepare (PGconn *db_conn)
" WHERE wireout_uuid>=$1" " WHERE wireout_uuid>=$1"
" ORDER BY wireout_uuid ASC;", " ORDER BY wireout_uuid ASC;",
1), 1),
/* Used in #postgres_select_wire_out_above_serial_id_by_account() */
GNUNET_PQ_make_prepare ("audit_get_wire_incr_by_account",
"SELECT"
" wireout_uuid"
",execution_date"
",wtid_raw"
",wire_target"
",amount_val"
",amount_frac"
",amount_curr"
" FROM wire_out"
" WHERE wireout_uuid>=$1 AND exchange_account_section=$2"
" ORDER BY wireout_uuid ASC;",
2),
/* Used in #postgres_insert_payback_request() to store payback /* Used in #postgres_insert_payback_request() to store payback
information */ information */
GNUNET_PQ_make_prepare ("payback_insert", GNUNET_PQ_make_prepare ("payback_insert",
@ -4883,6 +4915,8 @@ postgres_start_deferred_wire_out (void *cls,
* @param date time of the wire transfer * @param date time of the wire transfer
* @param wtid subject of the wire transfer * @param wtid subject of the wire transfer
* @param wire_account details about the receiver account of the wire transfer * @param wire_account details about the receiver account of the wire transfer
* @param exchange_account_section configuration section of the exchange specifying the
* exchange's bank account being used
* @param amount amount that was transmitted * @param amount amount that was transmitted
* @return transaction status code * @return transaction status code
*/ */
@ -4892,12 +4926,14 @@ postgres_store_wire_transfer_out (void *cls,
struct GNUNET_TIME_Absolute date, struct GNUNET_TIME_Absolute date,
const struct TALER_WireTransferIdentifierRawP *wtid, const struct TALER_WireTransferIdentifierRawP *wtid,
const json_t *wire_account, const json_t *wire_account,
const char *exchange_account_section,
const struct TALER_Amount *amount) const struct TALER_Amount *amount)
{ {
struct GNUNET_PQ_QueryParam params[] = { struct GNUNET_PQ_QueryParam params[] = {
TALER_PQ_query_param_absolute_time (&date), TALER_PQ_query_param_absolute_time (&date),
GNUNET_PQ_query_param_auto_from_type (wtid), GNUNET_PQ_query_param_auto_from_type (wtid),
TALER_PQ_query_param_json (wire_account), TALER_PQ_query_param_json (wire_account),
GNUNET_PQ_query_param_string (exchange_account_section),
TALER_PQ_query_param_amount (amount), TALER_PQ_query_param_amount (amount),
GNUNET_PQ_query_param_end GNUNET_PQ_query_param_end
}; };
@ -5507,6 +5543,49 @@ postgres_select_reserves_in_above_serial_id (void *cls,
} }
/**
* Select inbound wire transfers into reserves_in above @a serial_id
* in monotonically increasing order by account.
*
* @param cls closure
* @param session database connection
* @param account_name name of the account to select by
* @param serial_id highest serial ID to exclude (select strictly larger)
* @param cb function to call on each result
* @param cb_cls closure for @a cb
* @return transaction status code
*/
static enum GNUNET_DB_QueryStatus
postgres_select_reserves_in_above_serial_id_by_account (void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *account_name,
uint64_t serial_id,
TALER_EXCHANGEDB_ReserveInCallback cb,
void *cb_cls)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&serial_id),
GNUNET_PQ_query_param_string (account_name),
GNUNET_PQ_query_param_end
};
struct ReservesInSerialContext risc = {
.cb = cb,
.cb_cls = cb_cls,
.status = GNUNET_OK
};
enum GNUNET_DB_QueryStatus qs;
qs = GNUNET_PQ_eval_prepared_multi_select (session->conn,
"audit_reserves_in_get_transactions_incr_by_account",
params,
&reserves_in_serial_helper_cb,
&risc);
if (GNUNET_OK != risc.status)
return GNUNET_DB_STATUS_HARD_ERROR;
return qs;
}
/** /**
* Closure for #reserves_out_serial_helper_cb(). * Closure for #reserves_out_serial_helper_cb().
*/ */
@ -5763,6 +5842,49 @@ postgres_select_wire_out_above_serial_id (void *cls,
} }
/**
* Function called to select all wire transfers the exchange
* executed by account.
*
* @param cls closure
* @param session database connection
* @param account_name account to select
* @param serial_id highest serial ID to exclude (select strictly larger)
* @param cb function to call for ONE unfinished item
* @param cb_cls closure for @a cb
* @return transaction status code
*/
static enum GNUNET_DB_QueryStatus
postgres_select_wire_out_above_serial_id_by_account (void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *account_name,
uint64_t serial_id,
TALER_EXCHANGEDB_WireTransferOutCallback cb,
void *cb_cls)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_uint64 (&serial_id),
GNUNET_PQ_query_param_string (account_name),
GNUNET_PQ_query_param_end
};
struct WireOutSerialContext wosc = {
.cb = cb,
.cb_cls = cb_cls,
.status = GNUNET_OK
};
enum GNUNET_DB_QueryStatus qs;
qs = GNUNET_PQ_eval_prepared_multi_select (session->conn,
"audit_get_wire_incr_by_account",
params,
&wire_out_serial_helper_cb,
&wosc);
if (GNUNET_OK != wosc.status)
return GNUNET_DB_STATUS_HARD_ERROR;
return qs;
}
/** /**
* Closure for #payback_serial_helper_cb(). * Closure for #payback_serial_helper_cb().
*/ */
@ -6448,19 +6570,36 @@ libtaler_plugin_exchangedb_postgres_init (void *cls)
plugin->start_deferred_wire_out = &postgres_start_deferred_wire_out; plugin->start_deferred_wire_out = &postgres_start_deferred_wire_out;
plugin->store_wire_transfer_out = &postgres_store_wire_transfer_out; plugin->store_wire_transfer_out = &postgres_store_wire_transfer_out;
plugin->gc = &postgres_gc; plugin->gc = &postgres_gc;
plugin->select_deposits_above_serial_id = &postgres_select_deposits_above_serial_id; plugin->select_deposits_above_serial_id
plugin->select_refreshs_above_serial_id = &postgres_select_refreshs_above_serial_id; = &postgres_select_deposits_above_serial_id;
plugin->select_refunds_above_serial_id = &postgres_select_refunds_above_serial_id; plugin->select_refreshs_above_serial_id
plugin->select_reserves_in_above_serial_id = &postgres_select_reserves_in_above_serial_id; = &postgres_select_refreshs_above_serial_id;
plugin->select_reserves_out_above_serial_id = &postgres_select_reserves_out_above_serial_id; plugin->select_refunds_above_serial_id
plugin->select_wire_out_above_serial_id = &postgres_select_wire_out_above_serial_id; = &postgres_select_refunds_above_serial_id;
plugin->select_payback_above_serial_id = &postgres_select_payback_above_serial_id; plugin->select_reserves_in_above_serial_id
plugin->select_reserve_closed_above_serial_id = &postgres_select_reserve_closed_above_serial_id; = &postgres_select_reserves_in_above_serial_id;
plugin->insert_payback_request = &postgres_insert_payback_request; plugin->select_reserves_in_above_serial_id_by_account
plugin->get_reserve_by_h_blind = &postgres_get_reserve_by_h_blind; = &postgres_select_reserves_in_above_serial_id_by_account;
plugin->insert_denomination_revocation = &postgres_insert_denomination_revocation; plugin->select_reserves_out_above_serial_id
plugin->get_denomination_revocation = &postgres_get_denomination_revocation; = &postgres_select_reserves_out_above_serial_id;
plugin->select_deposits_missing_wire = &postgres_select_deposits_missing_wire; plugin->select_wire_out_above_serial_id
= &postgres_select_wire_out_above_serial_id;
plugin->select_wire_out_above_serial_id_by_account
= &postgres_select_wire_out_above_serial_id_by_account;
plugin->select_payback_above_serial_id
= &postgres_select_payback_above_serial_id;
plugin->select_reserve_closed_above_serial_id
= &postgres_select_reserve_closed_above_serial_id;
plugin->insert_payback_request
= &postgres_insert_payback_request;
plugin->get_reserve_by_h_blind
= &postgres_get_reserve_by_h_blind;
plugin->insert_denomination_revocation
= &postgres_insert_denomination_revocation;
plugin->get_denomination_revocation
= &postgres_get_denomination_revocation;
plugin->select_deposits_missing_wire
= &postgres_select_deposits_missing_wire;
return plugin; return plugin;
} }

View File

@ -1273,6 +1273,7 @@ test_wire_out (struct TALER_EXCHANGEDB_Session *session,
wire_out_date, wire_out_date,
&wire_out_wtid, &wire_out_wtid,
wire_out_account, wire_out_account,
"my-config-section",
&wire_out_amount)) &wire_out_amount))
{ {
json_decref (wire_out_account); json_decref (wire_out_account);
@ -2187,7 +2188,8 @@ run (void *cls)
result = 0; result = 0;
drop: drop:
if (0 != result) if ( (0 != result) &&
(NULL != session) )
plugin->rollback (plugin->cls, plugin->rollback (plugin->cls,
session); session);
if (NULL != rh) if (NULL != rh)

View File

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

View File

@ -1878,6 +1878,8 @@ struct TALER_EXCHANGEDB_Plugin
* @param wire_account details about the receiver account of the wire transfer, * @param wire_account details about the receiver account of the wire transfer,
* including 'url' in payto://-format * including 'url' in payto://-format
* @param amount amount that was transmitted * @param amount amount that was transmitted
* @param exchange_account_section configuration section of the exchange specifying the
* exchange's bank account being used
* @return transaction status code * @return transaction status code
*/ */
enum GNUNET_DB_QueryStatus enum GNUNET_DB_QueryStatus
@ -1886,6 +1888,7 @@ struct TALER_EXCHANGEDB_Plugin
struct GNUNET_TIME_Absolute date, struct GNUNET_TIME_Absolute date,
const struct TALER_WireTransferIdentifierRawP *wtid, const struct TALER_WireTransferIdentifierRawP *wtid,
const json_t *wire_account, const json_t *wire_account,
const char *exchange_account_section,
const struct TALER_Amount *amount); const struct TALER_Amount *amount);
@ -1983,12 +1986,33 @@ struct TALER_EXCHANGEDB_Plugin
TALER_EXCHANGEDB_ReserveInCallback cb, TALER_EXCHANGEDB_ReserveInCallback cb,
void *cb_cls); void *cb_cls);
/**
* Select inbound wire transfers into reserves_in above @a serial_id
* in monotonically increasing order by @a account_name.
*
* @param cls closure
* @param session database connection
* @param account_name name of the account for which we do the selection
* @param serial_id highest serial ID to exclude (select strictly larger)
* @param cb function to call on each result
* @param cb_cls closure for @a cb
* @return transaction status code
*/
enum GNUNET_DB_QueryStatus
(*select_reserves_in_above_serial_id_by_account)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *account_name,
uint64_t serial_id,
TALER_EXCHANGEDB_ReserveInCallback cb,
void *cb_cls);
/** /**
* Select withdraw operations from reserves_out above @a serial_id * Select withdraw operations from reserves_out above @a serial_id
* in monotonically increasing order. * in monotonically increasing order.
* *
* @param cls closure * @param cls closure
* @param session database connection * @param session database connection
* @param account_name name of the account for which we do the selection
* @param serial_id highest serial ID to exclude (select strictly larger) * @param serial_id highest serial ID to exclude (select strictly larger)
* @param cb function to call on each result * @param cb function to call on each result
* @param cb_cls closure for @a cb * @param cb_cls closure for @a cb
@ -2001,7 +2025,6 @@ struct TALER_EXCHANGEDB_Plugin
TALER_EXCHANGEDB_WithdrawCallback cb, TALER_EXCHANGEDB_WithdrawCallback cb,
void *cb_cls); void *cb_cls);
/** /**
* Function called to select outgoing wire transfers the exchange * Function called to select outgoing wire transfers the exchange
* executed, ordered by serial ID (monotonically increasing). * executed, ordered by serial ID (monotonically increasing).
@ -2020,6 +2043,26 @@ struct TALER_EXCHANGEDB_Plugin
TALER_EXCHANGEDB_WireTransferOutCallback cb, TALER_EXCHANGEDB_WireTransferOutCallback cb,
void *cb_cls); void *cb_cls);
/**
* Function called to select outgoing wire transfers the exchange
* executed, ordered by serial ID (monotonically increasing).
*
* @param cls closure
* @param session database connection
* @param account_name name to select by
* @param serial_id lowest serial ID to include (select larger or equal)
* @param cb function to call for ONE unfinished item
* @param cb_cls closure for @a cb
* @return transaction status code
*/
enum GNUNET_DB_QueryStatus
(*select_wire_out_above_serial_id_by_account)(void *cls,
struct TALER_EXCHANGEDB_Session *session,
const char *account_name,
uint64_t serial_id,
TALER_EXCHANGEDB_WireTransferOutCallback cb,
void *cb_cls);
/** /**
* Function called to select payback requests the exchange * Function called to select payback requests the exchange