extend auditordb API with function to store deposit confirmations

This commit is contained in:
Christian Grothoff 2018-10-20 19:40:09 +02:00
parent 9d18caa006
commit 4f37950a40
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
2 changed files with 162 additions and 1 deletions

View File

@ -1,6 +1,6 @@
/* /*
This file is part of TALER This file is part of TALER
Copyright (C) 2014-2017 GNUnet e.V. Copyright (C) 2014-2018 GNUnet e.V.
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
@ -361,6 +361,24 @@ postgres_create_tables (void *cls)
")"), ")"),
GNUNET_PQ_make_try_execute ("CREATE INDEX auditor_historic_reserve_summary_by_master_pub_start_date " GNUNET_PQ_make_try_execute ("CREATE INDEX auditor_historic_reserve_summary_by_master_pub_start_date "
"ON auditor_historic_reserve_summary(master_pub,start_date)"), "ON auditor_historic_reserve_summary(master_pub,start_date)"),
/* Table with deposit confirmation sent to us by merchants;
we must check that the exchange reported these properly. */
GNUNET_PQ_make_execute ("CREATE TABLE IF NOT EXISTS deposit_confirmations "
"(master_pub BYTEA NOT NULL CHECK (LENGTH(master_pub)=32)"
",h_contract_terms BYTEA PRIMARY KEY CHECK (LENGTH(h_contract_terms_hash)=64)"
",h_wire BYTEA PRIMARY KEY CHECK (LENGTH(h_wire)=64)"
",timestamp INT8 NOT NULL"
",refund_deadline INT8 NOT NULL"
",amount_with_fee_val INT8 NOT NULL"
",amount_with_fee_frac INT4 NOT NULL"
",amount_with_fee_curr VARCHAR("TALER_CURRENCY_LEN_STR") NOT NULL"
",coin_pub BYTEA PRIMARY KEY CHECK (LENGTH(coin_pub)=32)"
",merchant BYTEA PRIMARY KEY CHECK (LENGTH(coin_pub)=32)"
",exchange_sig BYTEA PRIMARY KEY CHECK (LENGTH(coin_pub)=32)"
",exchange_pub BYTEA PRIMARY KEY CHECK (LENGTH(coin_pub)=32)"
",master_sig BYTEA PRIMARY KEY CHECK (LENGTH(coin_pub)=32)"
")"),
/* Table with historic business ledger; basically, when the exchange /* Table with historic business ledger; basically, when the exchange
operator decides to use operating costs for anything but wire operator decides to use operating costs for anything but wire
transfers to merchants, it goes in here. This happens when the transfers to merchants, it goes in here. This happens when the
@ -475,6 +493,22 @@ postgres_prepare (PGconn *db_conn)
" WHERE master_pub=$1;", " WHERE master_pub=$1;",
1), 1),
/* Used in #postgres_insert_auditor_progress() */ /* Used in #postgres_insert_auditor_progress() */
GNUNET_PQ_make_prepare ("auditor_deposit_confirmation_insert",
"INSERT INTO deposit_confirmations "
"(master_pub"
",h_contract_terms"
",h_wire"
",timestamp"
",refund_deadline"
",amount_without_fee"
",coin_pub"
",merchant"
",exchange_sig"
",exchange_pub"
",master_sig" /* master_sig could be normalized... */
") VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11);",
11),
/* Used in #postgres_insert_auditor_progress() */
GNUNET_PQ_make_prepare ("auditor_progress_insert", GNUNET_PQ_make_prepare ("auditor_progress_insert",
"INSERT INTO auditor_progress " "INSERT INTO auditor_progress "
"(master_pub" "(master_pub"
@ -1047,6 +1081,42 @@ postgres_gc (void *cls)
} }
/**
* Insert information about a deposit confirmation into the database.
*
* @param cls the @e cls of this struct with the plugin-specific state
* @param session connection to the database
* @param dc deposit confirmation information to store
* @return query result status
*/
static enum GNUNET_DB_QueryStatus
postgres_insert_deposit_confirmation (void *cls,
struct TALER_AUDITORDB_Session *session,
const struct TALER_AUDITORDB_DepositConfirmation *dc)
{
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_auto_from_type (&dc->master_public_key),
GNUNET_PQ_query_param_auto_from_type (&dc->h_contract_terms),
GNUNET_PQ_query_param_auto_from_type (&dc->h_wire),
TALER_PQ_query_param_absolute_time (&dc->timestamp),
TALER_PQ_query_param_absolute_time (&dc->refund_deadline),
TALER_PQ_query_param_amount (&dc->amount_without_fee),
GNUNET_PQ_query_param_auto_from_type (&dc->coin_pub),
GNUNET_PQ_query_param_auto_from_type (&dc->merchant),
GNUNET_PQ_query_param_auto_from_type (&dc->exchange_sig),
GNUNET_PQ_query_param_auto_from_type (&dc->exchange_pub),
GNUNET_PQ_query_param_auto_from_type (&dc->master_sig),
GNUNET_PQ_query_param_end
};
return GNUNET_PQ_eval_prepared_non_select (session->conn,
"auditor_deposit_confirmation_insert",
params);
}
/** /**
* Insert information about a denomination key and in particular * Insert information about a denomination key and in particular
* the properties (value, fees, expiration times) the coins signed * the properties (value, fees, expiration times) the coins signed
@ -2625,6 +2695,8 @@ libtaler_plugin_auditordb_postgres_init (void *cls)
plugin->rollback = &postgres_rollback; plugin->rollback = &postgres_rollback;
plugin->gc = &postgres_gc; plugin->gc = &postgres_gc;
plugin->insert_deposit_confirmation = &postgres_insert_deposit_confirmation;
plugin->select_denomination_info = &postgres_select_denomination_info; plugin->select_denomination_info = &postgres_select_denomination_info;
plugin->insert_denomination_info = &postgres_insert_denomination_info; plugin->insert_denomination_info = &postgres_insert_denomination_info;

View File

@ -186,6 +186,81 @@ struct TALER_AUDITORDB_ProgressPoint
}; };
/**
* Information about a deposit confirmation we received from
* a merchant.
*/
struct TALER_AUDITORDB_DepositConfirmation
{
/**
* Hash over the contract for which this deposit is made.
*/
struct GNUNET_HashCode h_contract_terms;
/**
* Hash over the wiring information of the merchant.
*/
struct GNUNET_HashCode h_wire;
/**
* Time when this confirmation was generated.
*/
struct GNUNET_TIME_Absolute timestamp;
/**
* How much time does the @e merchant have to issue a refund
* request? Zero if refunds are not allowed. After this time, the
* coin cannot be refunded. Note that the wire transfer will not be
* performed by the exchange until the refund deadline. This value
* is taken from the original deposit request.
*/
struct GNUNET_TIME_Absolute refund_deadline;
/**
* Amount to be deposited, excluding fee. Calculated from the
* amount with fee and the fee from the deposit request.
*/
struct TALER_Amount amount_without_fee;
/**
* The coin's public key. This is the value that must have been
* signed (blindly) by the Exchange. The deposit request is to be
* signed by the corresponding private key (using EdDSA).
*/
struct TALER_CoinSpendPublicKeyP coin_pub;
/**
* The Merchant's public key. Allows the merchant to later refund
* the transaction or to inquire about the wire transfer identifier.
*/
struct TALER_MerchantPublicKeyP merchant;
/**
* Signature from the exchange of type
* #TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT.
*/
struct TALER_ExchangeSignatureP exchange_sig;
/**
* Public signing key from the exchange matching @e exchange_sig.
*/
struct TALER_ExchangeSignatureP exchange_pub;
/**
* Exchange master signature over @e exchange_sig.
*/
struct TALER_MasterSignatureP master_sig;
/**
* Master public key of the exchange corresponding to @e master_sig.
* Identifies the exchange this is about.
*/
struct TALER_MasterPublicKeyP master_public_key;
};
/** /**
* Handle for one session with the database. * Handle for one session with the database.
*/ */
@ -291,6 +366,20 @@ struct TALER_AUDITORDB_Plugin
(*gc) (void *cls); (*gc) (void *cls);
/**
* Insert information about a deposit confirmation into the database.
*
* @param cls the @e cls of this struct with the plugin-specific state
* @param session connection to the database
* @param dc deposit confirmation information to store
* @return query result status
*/
enum GNUNET_DB_QueryStatus
(*insert_deposit_confirmation) (void *cls,
struct TALER_AUDITORDB_Session *session,
const struct TALER_AUDITORDB_DepositConfirmation *dc);
/** /**
* Insert information about a denomination key and in particular * Insert information about a denomination key and in particular
* the properties (value, fees, expiration times) the coins signed * the properties (value, fees, expiration times) the coins signed