From 727b7b04f3ae23fd49da7479fe4b4258513aef83 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 5 May 2020 22:17:16 +0200 Subject: return fee as well --- src/include/taler_error_codes.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/include/taler_error_codes.h') diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index f75464c3..74660303 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -2198,6 +2198,25 @@ enum TALER_ErrorCode */ TALER_EC_TIP_PICKUP_UNBLIND_FAILURE = 2812, + /** + * We failed to fetch contract terms from our merchant database. The + * response is provided with HTTP status code + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_GET_ORDERS_DB_LOOKUP_ERROR = 2900, + + /** + * We failed to find the contract terms from our merchant database. + * The response is provided with HTTP status code #MHD_HTTP_NOT_FOUND. + */ + TALER_EC_GET_ORDERS_ID_UNKNOWN = 2901, + + /** + * The contract hash provided by the wallet does not match the order. + * The response is provided with HTTP status code #MHD_HTTP_FORBIDDEN. + */ + TALER_EC_GET_ORDERS_WRONG_CONTRACT = 2902, + /** * We failed to contract terms from our merchant database. The * response is provided with HTTP status code -- cgit v1.2.3 From 4f82885560d5d468ef5230f7ec383c612cc9625c Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Thu, 7 May 2020 20:22:02 +0200 Subject: towards changing timestamp in deposit confirmation (tests failing) --- .../taler-auditor-httpd_deposit-confirmation.c | 5 +- src/auditor/taler-helper-auditor-coins.c | 8 +- src/auditor/taler-helper-auditor-deposits.c | 9 +- src/auditordb/auditor-0001.sql | 2 +- src/auditordb/plugin_auditordb_postgres.c | 10 +- src/exchange/taler-exchange-aggregator.c | 12 ++ src/exchange/taler-exchange-httpd_deposit.c | 173 +++++++++++---------- src/exchange/taler-exchange-httpd_responses.c | 2 +- src/exchangedb/exchange-0001.sql | 3 +- src/exchangedb/plugin_exchangedb_postgres.c | 62 ++++++-- src/exchangedb/test_exchangedb.c | 71 ++++++--- src/include/taler_auditordb_plugin.h | 4 +- src/include/taler_error_codes.h | 45 ++++-- src/include/taler_exchange_service.h | 2 + src/include/taler_exchangedb_plugin.h | 18 ++- src/include/taler_signatures.h | 7 +- src/include/taler_testing_lib.h | 18 ++- src/lib/auditor_api_deposit_confirmation.c | 17 +- src/lib/exchange_api_common.c | 2 +- src/lib/exchange_api_deposit.c | 9 +- src/lib/exchange_api_refund.c | 7 +- src/testing/test_taler_exchange_aggregator.c | 24 +++ .../testing_api_cmd_auditor_deposit_confirmation.c | 8 +- src/testing/testing_api_cmd_deposit.c | 35 +++-- src/testing/testing_api_cmd_insert_deposit.c | 26 +++- 25 files changed, 390 insertions(+), 189 deletions(-) (limited to 'src/include/taler_error_codes.h') diff --git a/src/auditor/taler-auditor-httpd_deposit-confirmation.c b/src/auditor/taler-auditor-httpd_deposit-confirmation.c index 5f84a725..1039164c 100644 --- a/src/auditor/taler-auditor-httpd_deposit-confirmation.c +++ b/src/auditor/taler-auditor-httpd_deposit-confirmation.c @@ -155,7 +155,7 @@ verify_and_execute_deposit_confirmation ( .purpose.size = htonl (sizeof (struct TALER_DepositConfirmationPS)), .h_contract_terms = dc->h_contract_terms, .h_wire = dc->h_wire, - .timestamp = GNUNET_TIME_absolute_hton (dc->timestamp), + .exchange_timestamp = GNUNET_TIME_absolute_hton (dc->exchange_timestamp), .refund_deadline = GNUNET_TIME_absolute_hton (dc->refund_deadline), .coin_pub = dc->coin_pub, .merchant = dc->merchant @@ -224,7 +224,8 @@ TAH_DEPOSIT_CONFIRMATION_handler (struct TAH_RequestHandler *rh, struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed_auto ("h_contract_terms", &dc.h_contract_terms), GNUNET_JSON_spec_fixed_auto ("h_wire", &dc.h_wire), - GNUNET_JSON_spec_absolute_time ("timestamp", &dc.timestamp), + GNUNET_JSON_spec_absolute_time ("exchange_timestamp", + &dc.exchange_timestamp), GNUNET_JSON_spec_absolute_time ("refund_deadline", &dc.refund_deadline), TALER_JSON_spec_amount ("amount_without_fee", &dc.amount_without_fee), GNUNET_JSON_spec_fixed_auto ("coin_pub", &dc.coin_pub), diff --git a/src/auditor/taler-helper-auditor-coins.c b/src/auditor/taler-helper-auditor-coins.c index 2e32c569..158baa8b 100644 --- a/src/auditor/taler-helper-auditor-coins.c +++ b/src/auditor/taler-helper-auditor-coins.c @@ -1535,7 +1535,8 @@ refresh_session_cb (void *cls, * * @param cls closure * @param rowid unique serial ID for the deposit in our DB - * @param timestamp when did the deposit happen + * @param exchange_timestamp when did the exchange get the deposit + * @param wallet_timestamp when did the contract signing happen * @param merchant_pub public key of the merchant * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin @@ -1553,7 +1554,8 @@ refresh_session_cb (void *cls, static int deposit_cb (void *cls, uint64_t rowid, - struct GNUNET_TIME_Absolute timestamp, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, @@ -1611,7 +1613,7 @@ deposit_cb (void *cls, .purpose.purpose = htonl (TALER_SIGNATURE_WALLET_COIN_DEPOSIT), .purpose.size = htonl (sizeof (dr)), .h_contract_terms = *h_contract_terms, - .timestamp = GNUNET_TIME_absolute_hton (timestamp), + .wallet_timestamp = GNUNET_TIME_absolute_hton (wallet_timestamp), .refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline), .deposit_fee = issue->fee_deposit, .merchant = *merchant_pub, diff --git a/src/auditor/taler-helper-auditor-deposits.c b/src/auditor/taler-helper-auditor-deposits.c index 29155859..ed23c6a5 100644 --- a/src/auditor/taler-helper-auditor-deposits.c +++ b/src/auditor/taler-helper-auditor-deposits.c @@ -114,11 +114,15 @@ test_dc (void *cls, .h_wire = dc->h_wire, .refund_deadline = dc->refund_deadline }; + struct GNUNET_TIME_Absolute exchange_timestamp; + struct TALER_Amount deposit_fee; qs = TALER_ARL_edb->have_deposit (TALER_ARL_edb->cls, TALER_ARL_esession, &dep, - GNUNET_NO /* do not check refund deadline */); + GNUNET_NO /* do not check refund deadline */, + &deposit_fee, + &exchange_timestamp); if (qs > 0) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, @@ -137,7 +141,8 @@ test_dc (void *cls, TALER_ARL_report (report_deposit_confirmation_inconsistencies, json_pack ("{s:o, s:o, s:I, s:o}", "timestamp", - TALER_ARL_json_from_time_abs (dc->timestamp), + TALER_ARL_json_from_time_abs ( + dc->exchange_timestamp), "amount", TALER_JSON_from_amount (&dc->amount_without_fee), "rowid", diff --git a/src/auditordb/auditor-0001.sql b/src/auditordb/auditor-0001.sql index ff8867be..b511a4d5 100644 --- a/src/auditordb/auditor-0001.sql +++ b/src/auditordb/auditor-0001.sql @@ -251,7 +251,7 @@ CREATE TABLE IF NOT EXISTS deposit_confirmations ,serial_id BIGSERIAL UNIQUE ,h_contract_terms BYTEA CHECK (LENGTH(h_contract_terms)=64) ,h_wire BYTEA CHECK (LENGTH(h_wire)=64) - ,timestamp INT8 NOT NULL + ,exchange_timestamp INT8 NOT NULL ,refund_deadline INT8 NOT NULL ,amount_without_fee_val INT8 NOT NULL ,amount_without_fee_frac INT4 NOT NULL diff --git a/src/auditordb/plugin_auditordb_postgres.c b/src/auditordb/plugin_auditordb_postgres.c index 467c4c6d..4f9101fd 100644 --- a/src/auditordb/plugin_auditordb_postgres.c +++ b/src/auditordb/plugin_auditordb_postgres.c @@ -269,7 +269,7 @@ postgres_get_session (void *cls) "(master_pub" ",h_contract_terms" ",h_wire" - ",timestamp" + ",exchange_timestamp" ",refund_deadline" ",amount_without_fee_val" ",amount_without_fee_frac" @@ -286,7 +286,7 @@ postgres_get_session (void *cls) " serial_id" ",h_contract_terms" ",h_wire" - ",timestamp" + ",exchange_timestamp" ",refund_deadline" ",amount_without_fee_val" ",amount_without_fee_frac" @@ -1126,7 +1126,7 @@ postgres_insert_deposit_confirmation ( 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->exchange_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), @@ -1207,8 +1207,8 @@ deposit_confirmation_cb (void *cls, &dc.h_contract_terms), GNUNET_PQ_result_spec_auto_from_type ("h_wire", &dc.h_wire), - GNUNET_PQ_result_spec_absolute_time ("timestamp", - &dc.timestamp), + GNUNET_PQ_result_spec_absolute_time ("exchange_timestamp", + &dc.exchange_timestamp), GNUNET_PQ_result_spec_absolute_time ("refund_deadline", &dc.refund_deadline), TALER_PQ_RESULT_SPEC_AMOUNT ("amount_without_fee", diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index 21a29e50..69c73746 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -330,6 +330,8 @@ refund_by_coin_cb (void *cls, * * @param cls a `struct AggregationUnit` * @param row_id identifies database entry + * @param exchange_timestamp when did the deposit happen + * @param wallet_timestamp when did the contract happen * @param merchant_pub public key of the merchant * @param coin_pub public key of the coin * @param amount_with_fee amount that was deposited including fee @@ -343,6 +345,8 @@ refund_by_coin_cb (void *cls, static enum GNUNET_DB_QueryStatus deposit_cb (void *cls, uint64_t row_id, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_Amount *amount_with_fee, @@ -358,6 +362,8 @@ deposit_cb (void *cls, /* NOTE: potential optimization: use custom SQL API to not fetch this one: */ (void) wire_deadline; /* already checked by SQL query */ + (void) exchange_timestamp; + (void) wallet_timestamp; au->merchant_pub = *merchant_pub; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Aggregator processing payment %s with amount %s\n", @@ -501,6 +507,8 @@ deposit_cb (void *cls, * * @param cls a `struct AggregationUnit` * @param row_id identifies database entry + * @param exchange_timestamp when did the exchange receive the deposit + * @param wallet_timestamp when did the wallet sign the contract * @param merchant_pub public key of the merchant * @param coin_pub public key of the coin * @param amount_with_fee amount that was deposited including fee @@ -514,6 +522,8 @@ deposit_cb (void *cls, static enum GNUNET_DB_QueryStatus aggregate_cb (void *cls, uint64_t row_id, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_Amount *amount_with_fee, @@ -529,6 +539,8 @@ aggregate_cb (void *cls, /* NOTE: potential optimization: use custom SQL API to not fetch these: */ (void) wire_deadline; /* checked by SQL */ + (void) exchange_timestamp; + (void) wallet_timestamp; (void) wire; /* must match */ GNUNET_break (0 == GNUNET_memcmp (&au->merchant_pub, merchant_pub)); diff --git a/src/exchange/taler-exchange-httpd_deposit.c b/src/exchange/taler-exchange-httpd_deposit.c index 65251863..fe8fdf06 100644 --- a/src/exchange/taler-exchange-httpd_deposit.c +++ b/src/exchange/taler-exchange-httpd_deposit.c @@ -47,7 +47,7 @@ * @param coin_pub public key of the coin * @param h_wire hash of wire details * @param h_contract_terms hash of contract details - * @param timestamp client's timestamp + * @param exchange_timestamp exchange's timestamp * @param refund_deadline until when this deposit be refunded * @param merchant merchant public key * @param amount_without_fee fraction of coin value to deposit, without the fee @@ -58,7 +58,7 @@ reply_deposit_success (struct MHD_Connection *connection, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_contract_terms, - struct GNUNET_TIME_Absolute timestamp, + struct GNUNET_TIME_Absolute exchange_timestamp, struct GNUNET_TIME_Absolute refund_deadline, const struct TALER_MerchantPublicKeyP *merchant, const struct TALER_Amount *amount_without_fee) @@ -70,7 +70,7 @@ reply_deposit_success (struct MHD_Connection *connection, .purpose.size = htonl (sizeof (dc)), .h_contract_terms = *h_contract_terms, .h_wire = *h_wire, - .timestamp = GNUNET_TIME_absolute_hton (timestamp), + .exchange_timestamp = GNUNET_TIME_absolute_hton (exchange_timestamp), .refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline), .coin_pub = *coin_pub, .merchant = *merchant @@ -88,13 +88,16 @@ reply_deposit_success (struct MHD_Connection *connection, TALER_EC_EXCHANGE_BAD_CONFIGURATION, "no keys"); } - return TALER_MHD_reply_json_pack (connection, - MHD_HTTP_OK, - "{s:o, s:o}", - "exchange_sig", - GNUNET_JSON_from_data_auto (&sig), - "exchange_pub", - GNUNET_JSON_from_data_auto (&pub)); + return TALER_MHD_reply_json_pack ( + connection, + MHD_HTTP_OK, + "{s:o, s:o, s:o}", + "exchange_timestamp", + GNUNET_JSON_from_time_abs (exchange_timestamp), + "exchange_sig", + GNUNET_JSON_from_data_auto (&sig), + "exchange_pub", + GNUNET_JSON_from_data_auto (&pub)); } @@ -108,6 +111,11 @@ struct DepositContext */ const struct TALER_EXCHANGEDB_Deposit *deposit; + /** + * Our timestamp (when we received the request). + */ + struct GNUNET_TIME_Absolute exchange_timestamp; + /** * Value of the coin. */ @@ -117,12 +125,11 @@ struct DepositContext /** - * Execute database transaction for /deposit. Runs the transaction - * logic; IF it returns a non-error code, the transaction logic MUST - * NOT queue a MHD response. IF it returns an hard error, the - * transaction logic MUST queue a MHD response and set @a mhd_ret. IF - * it returns the soft error code, the function MAY be called again to - * retry and MUST not queue a MHD response. + * Check if /deposit is already in the database. IF it returns a non-error + * code, the transaction logic MUST NOT queue a MHD response. IF it returns + * an hard error, the transaction logic MUST queue a MHD response and set @a + * mhd_ret. We do return a "hard" error also if we found the deposit in the + * database and generated a regular response. * * @param cls a `struct DepositContext` * @param connection MHD request context @@ -131,20 +138,22 @@ struct DepositContext * @return transaction status */ static enum GNUNET_DB_QueryStatus -deposit_transaction (void *cls, - struct MHD_Connection *connection, - struct TALER_EXCHANGEDB_Session *session, - MHD_RESULT *mhd_ret) +deposit_precheck (void *cls, + struct MHD_Connection *connection, + struct TALER_EXCHANGEDB_Session *session, + MHD_RESULT *mhd_ret) { struct DepositContext *dc = cls; const struct TALER_EXCHANGEDB_Deposit *deposit = dc->deposit; - struct TALER_Amount spent; + struct TALER_Amount deposit_fee; enum GNUNET_DB_QueryStatus qs; qs = TEH_plugin->have_deposit (TEH_plugin->cls, session, deposit, - GNUNET_YES /* check refund deadline */); + GNUNET_YES /* check refund deadline */, + &deposit_fee, + &dc->exchange_timestamp); if (qs < 0) { if (GNUNET_DB_STATUS_HARD_ERROR == qs) @@ -166,12 +175,12 @@ deposit_transaction (void *cls, GNUNET_assert (0 <= TALER_amount_subtract (&amount_without_fee, &deposit->amount_with_fee, - &deposit->deposit_fee)); + &deposit_fee)); *mhd_ret = reply_deposit_success (connection, &deposit->coin.coin_pub, &deposit->h_wire, &deposit->h_contract_terms, - deposit->timestamp, + dc->exchange_timestamp, deposit->refund_deadline, &deposit->merchant_pub, &amount_without_fee); @@ -179,6 +188,44 @@ deposit_transaction (void *cls, never try again. */ return GNUNET_DB_STATUS_HARD_ERROR; } + return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS; +} + + +/** + * Execute database transaction for /deposit. Runs the transaction + * logic; IF it returns a non-error code, the transaction logic MUST + * NOT queue a MHD response. IF it returns an hard error, the + * transaction logic MUST queue a MHD response and set @a mhd_ret. IF + * it returns the soft error code, the function MAY be called again to + * retry and MUST not queue a MHD response. + * + * @param cls a `struct DepositContext` + * @param connection MHD request context + * @param session database session and transaction to use + * @param[out] mhd_ret set to MHD status on error + * @return transaction status + */ +static enum GNUNET_DB_QueryStatus +deposit_transaction (void *cls, + struct MHD_Connection *connection, + struct TALER_EXCHANGEDB_Session *session, + MHD_RESULT *mhd_ret) +{ + struct DepositContext *dc = cls; + const struct TALER_EXCHANGEDB_Deposit *deposit = dc->deposit; + struct TALER_Amount spent; + enum GNUNET_DB_QueryStatus qs; + + /* Theoretically, someone other threat may have received + and committed the deposit in the meantime. Check now + that we are in the transaction scope. */ + qs = deposit_precheck (cls, + connection, + session, + mhd_ret); + if (qs < 0) + return qs; /* Start with fee for THIS transaction */ spent = deposit->amount_with_fee; @@ -238,6 +285,7 @@ deposit_transaction (void *cls, } qs = TEH_plugin->insert_deposit (TEH_plugin->cls, session, + dc->exchange_timestamp, deposit); if (GNUNET_DB_STATUS_HARD_ERROR == qs) { @@ -251,45 +299,6 @@ deposit_transaction (void *cls, } -/** - * Check that @a ts is reasonably close to our own RTC. - * - * @param ts timestamp to check - * @return #GNUNET_OK if @a ts is reasonable - */ -static int -check_timestamp_current (struct GNUNET_TIME_Absolute ts) -{ - struct GNUNET_TIME_Relative r; - struct GNUNET_TIME_Relative tolerance; - - /* Let's be VERY generous (after all, this is basically about - which year the deposit counts for in terms of tax purposes) */ - tolerance = GNUNET_TIME_UNIT_MONTHS; - r = GNUNET_TIME_absolute_get_duration (ts); - if (r.rel_value_us > tolerance.rel_value_us) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Deposit timestamp too old: %llu vs %llu > %llu\n", - (unsigned long long) ts.abs_value_us, - (unsigned long long) GNUNET_TIME_absolute_get ().abs_value_us, - (unsigned long long) tolerance.rel_value_us); - return GNUNET_SYSERR; - } - r = GNUNET_TIME_absolute_get_remaining (ts); - if (r.rel_value_us > tolerance.rel_value_us) - { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Deposit timestamp too new: %llu vs %llu < - %llu\n", - (unsigned long long) ts.abs_value_us, - (unsigned long long) GNUNET_TIME_absolute_get ().abs_value_us, - (unsigned long long) tolerance.rel_value_us); - return GNUNET_SYSERR; - } - return GNUNET_OK; -} - - /** * Handle a "/coins/$COIN_PUB/deposit" request. Parses the JSON, and, if * successful, passes the JSON data to #deposit_transaction() to @@ -367,17 +376,6 @@ TEH_handler_deposit (struct MHD_Connection *connection, TALER_EC_DEPOSIT_REFUND_DEADLINE_AFTER_WIRE_DEADLINE, "refund_deadline"); } - - if (GNUNET_OK != - check_timestamp_current (deposit.timestamp)) - { - GNUNET_break_op (0); - GNUNET_JSON_parse_free (spec); - return TALER_MHD_reply_with_error (connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_DEPOSIT_INVALID_TIMESTAMP, - "timestamp"); - } if (GNUNET_OK != TALER_JSON_merchant_wire_signature_hash (wire, &my_h_wire)) @@ -401,6 +399,26 @@ TEH_handler_deposit (struct MHD_Connection *connection, "h_wire"); } + /* Check for idempotency: did we get this request before? */ + dc.deposit = &deposit; + { + MHD_RESULT mhd_ret; + + if (GNUNET_OK != + TEH_DB_run_transaction (connection, + "precheck deposit", + &mhd_ret, + &deposit_precheck, + &dc)) + { + GNUNET_JSON_parse_free (spec); + return mhd_ret; + } + } + + /* new deposit */ + dc.exchange_timestamp = GNUNET_TIME_absolute_get (); + (void) GNUNET_TIME_round_abs (&dc.exchange_timestamp); /* check denomination exists and is valid */ { struct TEH_KS_StateHandle *key_state; @@ -408,7 +426,7 @@ TEH_handler_deposit (struct MHD_Connection *connection, enum TALER_ErrorCode ec; unsigned int hc; - key_state = TEH_KS_acquire (GNUNET_TIME_absolute_get ()); + key_state = TEH_KS_acquire (dc.exchange_timestamp); if (NULL == key_state) { TALER_LOG_ERROR ("Lacking keys to operate\n"); @@ -502,7 +520,7 @@ TEH_handler_deposit (struct MHD_Connection *connection, .purpose.size = htonl (sizeof (dr)), .h_contract_terms = deposit.h_contract_terms, .h_wire = deposit.h_wire, - .timestamp = GNUNET_TIME_absolute_hton (deposit.timestamp), + .wallet_timestamp = GNUNET_TIME_absolute_hton (deposit.timestamp), .refund_deadline = GNUNET_TIME_absolute_hton (deposit.refund_deadline), .merchant = deposit.merchant_pub, .coin_pub = deposit.coin.coin_pub @@ -528,7 +546,6 @@ TEH_handler_deposit (struct MHD_Connection *connection, } /* execute transaction */ - dc.deposit = &deposit; { MHD_RESULT mhd_ret; @@ -557,7 +574,7 @@ TEH_handler_deposit (struct MHD_Connection *connection, &deposit.coin.coin_pub, &deposit.h_wire, &deposit.h_contract_terms, - deposit.timestamp, + dc.exchange_timestamp, deposit.refund_deadline, &deposit.merchant_pub, &amount_without_fee); diff --git a/src/exchange/taler-exchange-httpd_responses.c b/src/exchange/taler-exchange-httpd_responses.c index 7924ad54..f6595161 100644 --- a/src/exchange/taler-exchange-httpd_responses.c +++ b/src/exchange/taler-exchange-httpd_responses.c @@ -66,7 +66,7 @@ TEH_RESPONSE_compile_transaction_history ( .purpose.size = htonl (sizeof (dr)), .h_contract_terms = deposit->h_contract_terms, .h_wire = deposit->h_wire, - .timestamp = GNUNET_TIME_absolute_hton (deposit->timestamp), + .wallet_timestamp = GNUNET_TIME_absolute_hton (deposit->timestamp), .refund_deadline = GNUNET_TIME_absolute_hton ( deposit->refund_deadline), .merchant = deposit->merchant_pub, diff --git a/src/exchangedb/exchange-0001.sql b/src/exchangedb/exchange-0001.sql index bec9af5b..ad05e779 100644 --- a/src/exchangedb/exchange-0001.sql +++ b/src/exchangedb/exchange-0001.sql @@ -254,7 +254,8 @@ CREATE TABLE IF NOT EXISTS deposits ,coin_pub BYTEA NOT NULL REFERENCES known_coins (coin_pub) ON DELETE CASCADE ,amount_with_fee_val INT8 NOT NULL ,amount_with_fee_frac INT4 NOT NULL - ,timestamp INT8 NOT NULL + ,wallet_timestamp INT8 NOT NULL + ,exchange_timestamp INT8 NOT NULL ,refund_deadline INT8 NOT NULL ,wire_deadline INT8 NOT NULL ,merchant_pub BYTEA NOT NULL CHECK (LENGTH(merchant_pub)=32) diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index 5bd674b2..93577feb 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -796,7 +796,7 @@ postgres_get_session (void *cls) "(coin_pub" ",amount_with_fee_val" ",amount_with_fee_frac" - ",timestamp" + ",wallet_timestamp" ",refund_deadline" ",wire_deadline" ",merchant_pub" @@ -804,22 +804,28 @@ postgres_get_session (void *cls) ",h_wire" ",coin_sig" ",wire" + ",exchange_timestamp" ") VALUES " "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10," - " $11);", - 11), + " $11, $12);", + 12), /* Fetch an existing deposit request, used to ensure idempotency during /deposit processing. Used in #postgres_have_deposit(). */ GNUNET_PQ_make_prepare ("get_deposit", "SELECT" " amount_with_fee_val" ",amount_with_fee_frac" - ",timestamp" + ",denominations.fee_deposit_val" + ",denominations.fee_deposit_frac" + ",wallet_timestamp" + ",exchange_timestamp" ",refund_deadline" ",wire_deadline" ",h_contract_terms" ",h_wire" " FROM deposits" + " JOIN known_coins USING (coin_pub)" + " JOIN denominations USING (denom_pub_hash)" " WHERE ((coin_pub=$1)" " AND (merchant_pub=$3)" " AND (h_contract_terms=$2))" @@ -830,7 +836,8 @@ postgres_get_session (void *cls) "SELECT" " amount_with_fee_val" ",amount_with_fee_frac" - ",timestamp" + ",wallet_timestamp" + ",exchange_timestamp" ",merchant_pub" ",denom.denom_pub" ",coin_pub" @@ -881,6 +888,8 @@ postgres_get_session (void *cls) ",wire" ",merchant_pub" ",coin_pub" + ",exchange_timestamp" + ",wallet_timestamp" " FROM deposits" " JOIN known_coins USING (coin_pub)" " JOIN denominations denom USING (denom_pub_hash)" @@ -900,6 +909,8 @@ postgres_get_session (void *cls) ",denom.fee_deposit_val" ",denom.fee_deposit_frac" ",wire_deadline" + ",exchange_timestamp" + ",wallet_timestamp" ",h_contract_terms" ",coin_pub" " FROM deposits" @@ -945,7 +956,7 @@ postgres_get_session (void *cls) ",amount_with_fee_frac" ",denom.fee_deposit_val" ",denom.fee_deposit_frac" - ",timestamp" + ",wallet_timestamp" ",refund_deadline" ",wire_deadline" ",merchant_pub" @@ -2571,6 +2582,8 @@ postgres_get_reserve_history (void *cls, * @param session database connection * @param deposit deposit to search for * @param check_extras whether to check extra fields match or not + * @param[out] deposit_fee set to the deposit fee the exchange charged + * @param[out] exchange_timestamp set to the time when the exchange received the deposit * @return 1 if we know this operation, * 0 if this exact deposit is unknown to us, * otherwise transaction error status @@ -2579,7 +2592,9 @@ static enum GNUNET_DB_QueryStatus postgres_have_deposit (void *cls, struct TALER_EXCHANGEDB_Session *session, const struct TALER_EXCHANGEDB_Deposit *deposit, - int check_extras) + int check_extras, + struct TALER_Amount *deposit_fee, + struct GNUNET_TIME_Absolute *exchange_timestamp) { struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam params[] = { @@ -2592,12 +2607,16 @@ postgres_have_deposit (void *cls, struct GNUNET_PQ_ResultSpec rs[] = { TALER_PQ_RESULT_SPEC_AMOUNT ("amount_with_fee", &deposit2.amount_with_fee), - TALER_PQ_result_spec_absolute_time ("timestamp", + TALER_PQ_result_spec_absolute_time ("wallet_timestamp", &deposit2.timestamp), + TALER_PQ_result_spec_absolute_time ("exchange_timestamp", + exchange_timestamp), TALER_PQ_result_spec_absolute_time ("refund_deadline", &deposit2.refund_deadline), TALER_PQ_result_spec_absolute_time ("wire_deadline", &deposit2.wire_deadline), + TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit", + deposit_fee), GNUNET_PQ_result_spec_auto_from_type ("h_wire", &deposit2.h_wire), GNUNET_PQ_result_spec_end @@ -2776,6 +2795,8 @@ postgres_get_ready_deposit (void *cls, struct TALER_Amount amount_with_fee; struct TALER_Amount deposit_fee; struct GNUNET_TIME_Absolute wire_deadline; + struct GNUNET_TIME_Absolute wallet_timestamp; + struct GNUNET_TIME_Absolute exchange_timestamp; struct GNUNET_HashCode h_contract_terms; struct TALER_MerchantPublicKeyP merchant_pub; struct TALER_CoinSpendPublicKeyP coin_pub; @@ -2788,6 +2809,10 @@ postgres_get_ready_deposit (void *cls, &amount_with_fee), TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit", &deposit_fee), + TALER_PQ_result_spec_absolute_time ("exchange_timestamp", + &exchange_timestamp), + TALER_PQ_result_spec_absolute_time ("wallet_timestamp", + &wallet_timestamp), TALER_PQ_result_spec_absolute_time ("wire_deadline", &wire_deadline), GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", @@ -2817,6 +2842,8 @@ postgres_get_ready_deposit (void *cls, qs = deposit_cb (deposit_cb_cls, serial_id, + exchange_timestamp, + wallet_timestamp, &merchant_pub, &coin_pub, &amount_with_fee, @@ -2898,6 +2925,8 @@ match_deposit_cb (void *cls, { struct TALER_Amount amount_with_fee; struct TALER_Amount deposit_fee; + struct GNUNET_TIME_Absolute exchange_timestamp; + struct GNUNET_TIME_Absolute wallet_timestamp; struct GNUNET_TIME_Absolute wire_deadline; struct GNUNET_HashCode h_contract_terms; struct TALER_CoinSpendPublicKeyP coin_pub; @@ -2912,6 +2941,10 @@ match_deposit_cb (void *cls, &deposit_fee), TALER_PQ_result_spec_absolute_time ("wire_deadline", &wire_deadline), + TALER_PQ_result_spec_absolute_time ("exchange_timestamp", + &exchange_timestamp), + TALER_PQ_result_spec_absolute_time ("wallet_timestamp", + &wallet_timestamp), GNUNET_PQ_result_spec_auto_from_type ("h_contract_terms", &h_contract_terms), GNUNET_PQ_result_spec_auto_from_type ("coin_pub", @@ -2930,6 +2963,8 @@ match_deposit_cb (void *cls, } qs = mdc->deposit_cb (mdc->deposit_cb_cls, serial_id, + exchange_timestamp, + wallet_timestamp, mdc->merchant_pub, &coin_pub, &amount_with_fee, @@ -3210,12 +3245,14 @@ postgres_ensure_coin_known (void *cls, * * @param cls the `struct PostgresClosure` with the plugin-specific state * @param session connection to the database + * @param exchange_timestamp time the exchange received the deposit request * @param deposit deposit information to store * @return query result status */ static enum GNUNET_DB_QueryStatus postgres_insert_deposit (void *cls, struct TALER_EXCHANGEDB_Session *session, + struct GNUNET_TIME_Absolute exchange_timestamp, const struct TALER_EXCHANGEDB_Deposit *deposit) { struct GNUNET_PQ_QueryParam params[] = { @@ -3229,6 +3266,7 @@ postgres_insert_deposit (void *cls, GNUNET_PQ_query_param_auto_from_type (&deposit->h_wire), GNUNET_PQ_query_param_auto_from_type (&deposit->csig), TALER_PQ_query_param_json (deposit->receiver_wire_account), + TALER_PQ_query_param_absolute_time (&exchange_timestamp), GNUNET_PQ_query_param_end }; @@ -4042,7 +4080,7 @@ add_coin_deposit (void *cls, &deposit->amount_with_fee), TALER_PQ_RESULT_SPEC_AMOUNT ("fee_deposit", &deposit->deposit_fee), - TALER_PQ_result_spec_absolute_time ("timestamp", + TALER_PQ_result_spec_absolute_time ("wallet_timestamp", &deposit->timestamp), TALER_PQ_result_spec_absolute_time ("refund_deadline", &deposit->refund_deadline), @@ -5462,14 +5500,17 @@ deposit_serial_helper_cb (void *cls, for (unsigned int i = 0; icb (dsc->cb_cls, rowid, + exchange_timestamp, deposit.timestamp, &deposit.merchant_pub, &denom_pub, diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index eea484e9..fe3ed785 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -833,6 +833,8 @@ static uint64_t deposit_rowid; * @param cls closure a `struct TALER_EXCHANGEDB_Deposit *` * @param rowid unique ID for the deposit in our DB, used for marking * it as 'tiny' or 'done' + * @param exchange_timestamp when did the deposit happen + * @param wallet_timestamp when did the wallet sign the contract * @param merchant_pub public key of the merchant * @param coin_pub public key of the coin * @param amount_with_fee amount that was deposited including fee @@ -846,6 +848,8 @@ static uint64_t deposit_rowid; static enum GNUNET_DB_QueryStatus deposit_cb (void *cls, uint64_t rowid, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_Amount *amount_with_fee, @@ -890,7 +894,8 @@ deposit_cb (void *cls, * * @param cls closure * @param rowid unique serial ID for the deposit in our DB - * @param timestamp when did the deposit happen + * @param exchange_timestamp when did the deposit happen + * @param wallet_timestamp when did the wallet sign the contract * @param merchant_pub public key of the merchant * @param denom_pub denomination of the @a coin_pub * @param coin_pub public key of the coin @@ -908,7 +913,8 @@ deposit_cb (void *cls, static int audit_deposit_cb (void *cls, uint64_t rowid, - struct GNUNET_TIME_Absolute timestamp, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, @@ -1878,15 +1884,27 @@ run (void *cls) plugin->ensure_coin_known (plugin->cls, session, &deposit.coin)); - FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != - plugin->insert_deposit (plugin->cls, + { + struct GNUNET_TIME_Absolute now; + struct GNUNET_TIME_Absolute r; + struct TALER_Amount deposit_fee; + + now = GNUNET_TIME_absolute_get (); + GNUNET_TIME_round_abs (&now); + FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != + plugin->insert_deposit (plugin->cls, + session, + now, + &deposit)); + FAILIF (1 != + plugin->have_deposit (plugin->cls, session, - &deposit)); - FAILIF (1 != - plugin->have_deposit (plugin->cls, - session, - &deposit, - GNUNET_YES)); + &deposit, + GNUNET_YES, + &deposit_fee, + &r)); + FAILIF (now.abs_value_us != r.abs_value_us); + } { struct GNUNET_TIME_Absolute start_range; struct GNUNET_TIME_Absolute end_range; @@ -1983,18 +2001,27 @@ run (void *cls) session, "test-2")); RND_BLK (&deposit2.merchant_pub); /* should fail if merchant is different */ - FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != - plugin->have_deposit (plugin->cls, - session, - &deposit2, - GNUNET_YES)); - deposit2.merchant_pub = deposit.merchant_pub; - RND_BLK (&deposit2.coin.coin_pub); /* should fail if coin is different */ - FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != - plugin->have_deposit (plugin->cls, - session, - &deposit2, - GNUNET_YES)); + { + struct GNUNET_TIME_Absolute r; + struct TALER_Amount deposit_fee; + + FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != + plugin->have_deposit (plugin->cls, + session, + &deposit2, + GNUNET_YES, + &deposit_fee, + &r)); + deposit2.merchant_pub = deposit.merchant_pub; + RND_BLK (&deposit2.coin.coin_pub); /* should fail if coin is different */ + FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != + plugin->have_deposit (plugin->cls, + session, + &deposit2, + GNUNET_YES, + &deposit_fee, + &r)); + } FAILIF (GNUNET_OK != test_melting (session)); FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != diff --git a/src/include/taler_auditordb_plugin.h b/src/include/taler_auditordb_plugin.h index 9a7f6ed7..7c58e654 100644 --- a/src/include/taler_auditordb_plugin.h +++ b/src/include/taler_auditordb_plugin.h @@ -300,9 +300,9 @@ struct TALER_AUDITORDB_DepositConfirmation struct GNUNET_HashCode h_wire; /** - * Time when this confirmation was generated. + * Time when this deposit confirmation was generated by the exchange. */ - struct GNUNET_TIME_Absolute timestamp; + struct GNUNET_TIME_Absolute exchange_timestamp; /** * How much time does the @e merchant have to issue a refund diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index 74660303..eded2333 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -1542,73 +1542,92 @@ enum TALER_ErrorCode * This response is provided with HTTP status code * #MHD_HTTP_SERVICE_UNAVAILABLE. */ - TALER_EC_TRACK_TRANSFER_EXCHANGE_TIMEOUT = 2400, + TALER_EC_POST_TRANSFERS_EXCHANGE_TIMEOUT = 2400, /** * We failed to obtain an acceptable /keys response from the exchange * for the /track/transfer request. This response is provided with * HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. */ - TALER_EC_TRACK_TRANSFER_EXCHANGE_KEYS_FAILURE = 2401, + TALER_EC_POST_TRANSFERS_EXCHANGE_KEYS_FAILURE = 2401, /** * We failed to persist coin wire transfer information in our merchant * database. The response is provided with HTTP status code * #MHD_HTTP_INTERNAL_SERVER_ERROR. */ - TALER_EC_TRACK_TRANSFER_DB_STORE_COIN_ERROR = 2402, + TALER_EC_POST_TRANSFERS_DB_STORE_COIN_ERROR = 2402, /** * We internally failed to execute the /track/transfer request. The * response is provided with HTTP status code * #MHD_HTTP_INTERNAL_SERVER_ERROR. */ - TALER_EC_TRACK_TRANSFER_REQUEST_ERROR = 2403, + TALER_EC_POST_TRANSFERS_REQUEST_ERROR = 2403, /** * We failed to persist wire transfer information in our merchant * database. The response is provided with HTTP status code * #MHD_HTTP_INTERNAL_SERVER_ERROR. */ - TALER_EC_TRACK_TRANSFER_DB_STORE_TRANSFER_ERROR = 2404, + TALER_EC_POST_TRANSFERS_DB_STORE_TRANSFER_ERROR = 2404, /** * The exchange returned an error from /track/transfer. The response * is provided with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. */ - TALER_EC_TRACK_TRANSFER_EXCHANGE_ERROR = 2405, + TALER_EC_POST_TRANSFERS_EXCHANGE_ERROR = 2405, /** * We failed to fetch deposit information from our merchant database. * The response is provided with HTTP status code * #MHD_HTTP_INTERNAL_SERVER_ERROR. */ - TALER_EC_TRACK_TRANSFER_DB_FETCH_DEPOSIT_ERROR = 2406, + TALER_EC_POST_TRANSFERS_DB_FETCH_DEPOSIT_ERROR = 2406, /** * We encountered an internal logic error. The response is provided * with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. */ - TALER_EC_TRACK_TRANSFER_DB_INTERNAL_LOGIC_ERROR = 2407, + TALER_EC_POST_TRANSFERS_DB_INTERNAL_LOGIC_ERROR = 2407, /** * The exchange gave conflicting information about a coin which has * been wire transferred. The response is provided with HTTP status * code #MHD_HTTP_FAILED_DEPENDENCY. */ - TALER_EC_TRACK_TRANSFER_CONFLICTING_REPORTS = 2408, + TALER_EC_POST_TRANSFERS_CONFLICTING_REPORTS = 2408, /** * The merchant backend had problems in creating the JSON response. */ - TALER_EC_TRACK_TRANSFER_JSON_RESPONSE_ERROR = 2409, + TALER_EC_POST_TRANSFERS_JSON_RESPONSE_ERROR = 2409, /** * The exchange charged a different wire fee than what it originally - * advertised, and it is higher. The response is provied with an HTTP - * status of #MHD_HTTP_FAILED_DEPENDENCY. + * advertised, and it is higher. The response is provided with an + * HTTP status of #MHD_HTTP_FAILED_DEPENDENCY. */ - TALER_EC_TRACK_TRANSFER_JSON_BAD_WIRE_FEE = 2410, + TALER_EC_POST_TRANSFERS_JSON_BAD_WIRE_FEE = 2410, + + /** + * We did not find the account that the transfer was made to. The + * response is provided with an HTTP status of #MHD_HTTP_NOT_FOUND. + */ + TALER_EC_POST_TRANSFERS_ACCOUNT_NOT_FOUND = 2411, + + /** + * We did failed to store information in our database. The response is + * provided with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_POST_TRANSFERS_DB_STORE_ERROR = 2412, + + /** + * We did failed to retrieve information from our database. The + * response is provided with an HTTP status of + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_POST_TRANSFERS_DB_LOOKUP_ERROR = 2413, /** * The merchant backend cannot create an instance under the given diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index 82b9b83d..38928dc1 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -756,6 +756,7 @@ struct TALER_EXCHANGE_DepositHandle; * * @param cls closure * @param hr HTTP response data + * @param deposit_timestamp time when the exchange generated the deposit confirmation * @param exchange_sig signature provided by the exchange * @param exchange_pub exchange key used to sign @a obj, or NULL */ @@ -763,6 +764,7 @@ typedef void (*TALER_EXCHANGE_DepositResultCallback) ( void *cls, const struct TALER_EXCHANGE_HttpResponse *hr, + struct GNUNET_TIME_Absolute deposit_timestamp, const struct TALER_ExchangeSignatureP *exchange_sig, const struct TALER_ExchangePublicKeyP *exchange_pub); diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 4fd58072..9fb93236 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -975,6 +975,8 @@ struct TALER_EXCHANGEDB_Session; * @param cls closure * @param rowid unique ID for the deposit in our DB, used for marking * it as 'tiny' or 'done' + * @param exchange_timestamp when did the exchange receive the deposit + * @param wallet_timestamp when did the wallet sign the contract * @param merchant_pub public key of the merchant * @param coin_pub public key of the coin * @param amount_with_fee amount that was deposited including fee @@ -990,6 +992,8 @@ typedef enum GNUNET_DB_QueryStatus (*TALER_EXCHANGEDB_DepositIterator)( void *cls, uint64_t rowid, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, const struct TALER_Amount *amount_with_fee, @@ -1022,7 +1026,8 @@ typedef void * * @param cls closure * @param rowid unique serial ID for the deposit in our DB - * @param timestamp when did the deposit happen + * @param exchange_timestamp when did the deposit happen + * @param wallet_timestamp when did the contract happen * @param merchant_pub public key of the merchant * @param denom_pub denomination public key of @a coin_pub * @param coin_pub public key of the coin @@ -1042,7 +1047,8 @@ typedef int (*TALER_EXCHANGEDB_DepositCallback)( void *cls, uint64_t rowid, - struct GNUNET_TIME_Absolute timestamp, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Absolute wallet_timestamp, const struct TALER_MerchantPublicKeyP *merchant_pub, const struct TALER_DenominationPublicKey *denom_pub, const struct TALER_CoinSpendPublicKeyP *coin_pub, @@ -1841,6 +1847,8 @@ struct TALER_EXCHANGEDB_Plugin * @param session database connection * @param deposit deposit to search for * @param check_extras whether to check extra fields or not + * @param[out] deposit_fee set to the deposit fee the exchange charged + * @param[out] exchange_timestamp set to the time when the exchange received the deposit * @return 1 if we know this operation, * 0 if this exact deposit is unknown to us, * otherwise transaction error status @@ -1849,7 +1857,9 @@ struct TALER_EXCHANGEDB_Plugin (*have_deposit)(void *cls, struct TALER_EXCHANGEDB_Session *session, const struct TALER_EXCHANGEDB_Deposit *deposit, - int check_extras); + int check_extras, + struct TALER_Amount *deposit_fee, + struct GNUNET_TIME_Absolute *exchange_timestamp); /** @@ -1857,12 +1867,14 @@ struct TALER_EXCHANGEDB_Plugin * * @param cls the @e cls of this struct with the plugin-specific state * @param session connection to the database + * @param exchange_timestamp time the exchange received the deposit request * @param deposit deposit information to store * @return query result status */ enum GNUNET_DB_QueryStatus (*insert_deposit)(void *cls, struct TALER_EXCHANGEDB_Session *session, + struct GNUNET_TIME_Absolute exchange_timestamp, const struct TALER_EXCHANGEDB_Deposit *deposit); diff --git a/src/include/taler_signatures.h b/src/include/taler_signatures.h index c346a6ce..38b895d7 100644 --- a/src/include/taler_signatures.h +++ b/src/include/taler_signatures.h @@ -363,7 +363,7 @@ struct TALER_DepositRequestPS * deposit request in a timely fashion (so back-dating is not * prevented). */ - struct GNUNET_TIME_AbsoluteNBO timestamp; + struct GNUNET_TIME_AbsoluteNBO wallet_timestamp; /** * How much time does the merchant have to issue a refund request? @@ -429,9 +429,10 @@ struct TALER_DepositConfirmationPS struct GNUNET_HashCode h_wire GNUNET_PACKED; /** - * Time when this confirmation was generated. + * Time when this confirmation was generated / when the exchange received + * the deposit request. */ - struct GNUNET_TIME_AbsoluteNBO timestamp; + struct GNUNET_TIME_AbsoluteNBO exchange_timestamp; /** * How much time does the @e merchant have to issue a refund diff --git a/src/include/taler_testing_lib.h b/src/include/taler_testing_lib.h index 9abb0cca..53a004c8 100644 --- a/src/include/taler_testing_lib.h +++ b/src/include/taler_testing_lib.h @@ -1917,6 +1917,7 @@ TALER_TESTING_cmd_connect_with_state (const char *label, * @param dbc collects plugin and session handles * @param merchant_name Human-readable name of the merchant. * @param merchant_account merchant's account name (NOT a payto:// URI) + * @param exchange_timestamp when did the exchange receive the deposit * @param wire_deadline point in time where the aggregator should have * wired money to the merchant. * @param amount_with_fee amount to deposit (inclusive of deposit fee) @@ -1924,14 +1925,15 @@ TALER_TESTING_cmd_connect_with_state (const char *label, * @return the command. */ struct TALER_TESTING_Command -TALER_TESTING_cmd_insert_deposit (const char *label, - const struct - TALER_TESTING_DatabaseConnection *dbc, - const char *merchant_name, - const char *merchant_account, - struct GNUNET_TIME_Relative wire_deadline, - const char *amount_with_fee, - const char *deposit_fee); +TALER_TESTING_cmd_insert_deposit ( + const char *label, + const struct TALER_TESTING_DatabaseConnection *dbc, + const char *merchant_name, + const char *merchant_account, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Relative wire_deadline, + const char *amount_with_fee, + const char *deposit_fee); /** diff --git a/src/lib/auditor_api_deposit_confirmation.c b/src/lib/auditor_api_deposit_confirmation.c index cddfe8b1..1856a89f 100644 --- a/src/lib/auditor_api_deposit_confirmation.c +++ b/src/lib/auditor_api_deposit_confirmation.c @@ -148,7 +148,7 @@ handle_deposit_confirmation_finished (void *cls, * * @param h_wire hash of merchant wire details * @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor) - * @param timestamp timestamp when the contract was finalized, must not be too far in the future + * @param exchange_timestamp timestamp when the deposit was received by the wallet * @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline * @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant * @param coin_pub coin’s public key @@ -165,7 +165,7 @@ handle_deposit_confirmation_finished (void *cls, static int verify_signatures (const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_contract_terms, - struct GNUNET_TIME_Absolute timestamp, + struct GNUNET_TIME_Absolute exchange_timestamp, struct GNUNET_TIME_Absolute refund_deadline, const struct TALER_Amount *amount_without_fee, const struct TALER_CoinSpendPublicKeyP *coin_pub, @@ -184,7 +184,7 @@ verify_signatures (const struct GNUNET_HashCode *h_wire, .purpose.size = htonl (sizeof (dc)), .h_contract_terms = *h_contract_terms, .h_wire = *h_wire, - .timestamp = GNUNET_TIME_absolute_hton (timestamp), + .exchange_timestamp = GNUNET_TIME_absolute_hton (exchange_timestamp), .refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline), .coin_pub = *coin_pub, .merchant = *merchant_pub @@ -256,7 +256,7 @@ verify_signatures (const struct GNUNET_HashCode *h_wire, * @param auditor the auditor handle; the auditor must be ready to operate * @param h_wire hash of merchant wire details * @param h_contract_terms hash of the contact of the merchant with the customer (further details are never disclosed to the auditor) - * @param timestamp timestamp when the contract was finalized, must not be too far in the future + * @param exchange_timestamp timestamp when deposit was received by the exchange * @param refund_deadline date until which the merchant can issue a refund to the customer via the auditor (can be zero if refunds are not allowed); must not be after the @a wire_deadline * @param amount_without_fee the amount confirmed to be wired by the exchange to the merchant * @param coin_pub coin’s public key @@ -278,7 +278,7 @@ TALER_AUDITOR_deposit_confirmation ( struct TALER_AUDITOR_Handle *auditor, const struct GNUNET_HashCode *h_wire, const struct GNUNET_HashCode *h_contract_terms, - struct GNUNET_TIME_Absolute timestamp, + struct GNUNET_TIME_Absolute exchange_timestamp, struct GNUNET_TIME_Absolute refund_deadline, const struct TALER_Amount *amount_without_fee, const struct TALER_CoinSpendPublicKeyP *coin_pub, @@ -298,7 +298,7 @@ TALER_AUDITOR_deposit_confirmation ( json_t *deposit_confirmation_obj; CURL *eh; - (void) GNUNET_TIME_round_abs (×tamp); + (void) GNUNET_TIME_round_abs (&exchange_timestamp); (void) GNUNET_TIME_round_abs (&refund_deadline); (void) GNUNET_TIME_round_abs (&ep_start); (void) GNUNET_TIME_round_abs (&ep_expire); @@ -308,7 +308,7 @@ TALER_AUDITOR_deposit_confirmation ( if (GNUNET_OK != verify_signatures (h_wire, h_contract_terms, - timestamp, + exchange_timestamp, refund_deadline, amount_without_fee, coin_pub, @@ -336,7 +336,8 @@ TALER_AUDITOR_deposit_confirmation ( "h_wire", GNUNET_JSON_from_data_auto (h_wire), "h_contract_terms", GNUNET_JSON_from_data_auto ( h_contract_terms), - "timestamp", GNUNET_JSON_from_time_abs (timestamp), + "exchange_timestamp", GNUNET_JSON_from_time_abs ( + exchange_timestamp), "refund_deadline", GNUNET_JSON_from_time_abs (refund_deadline), "amount_without_fee", TALER_JSON_from_amount ( amount_without_fee), diff --git a/src/lib/exchange_api_common.c b/src/lib/exchange_api_common.c index dc44291d..bf8eb537 100644 --- a/src/lib/exchange_api_common.c +++ b/src/lib/exchange_api_common.c @@ -524,7 +524,7 @@ TALER_EXCHANGE_verify_coin_history ( GNUNET_JSON_spec_fixed_auto ("h_wire", &dr.h_wire), GNUNET_JSON_spec_absolute_time_nbo ("timestamp", - &dr.timestamp), + &dr.wallet_timestamp), GNUNET_JSON_spec_absolute_time_nbo ("refund_deadline", &dr.refund_deadline), TALER_JSON_spec_amount_nbo ("deposit_fee", diff --git a/src/lib/exchange_api_deposit.c b/src/lib/exchange_api_deposit.c index a5cf6c36..27605365 100644 --- a/src/lib/exchange_api_deposit.c +++ b/src/lib/exchange_api_deposit.c @@ -160,7 +160,7 @@ auditor_cb (void *cls, ah, &dh->depconf.h_wire, &dh->depconf.h_contract_terms, - GNUNET_TIME_absolute_ntoh (dh->depconf.timestamp), + GNUNET_TIME_absolute_ntoh (dh->depconf.exchange_timestamp), GNUNET_TIME_absolute_ntoh (dh->depconf.refund_deadline), &amount_without_fee, &dh->depconf.coin_pub, @@ -198,6 +198,8 @@ verify_deposit_signature_ok (struct TALER_EXCHANGE_DepositHandle *dh, struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_fixed_auto ("exchange_sig", exchange_sig), GNUNET_JSON_spec_fixed_auto ("exchange_pub", exchange_pub), + GNUNET_JSON_spec_absolute_time_nbo ("exchange_timestamp", + &dh->depconf.exchange_timestamp), GNUNET_JSON_spec_end () }; @@ -386,6 +388,7 @@ handle_deposit_finished (void *cls, } dh->cb (dh->cb_cls, &hr, + GNUNET_TIME_absolute_ntoh (dh->depconf.exchange_timestamp), es, ep); TALER_EXCHANGE_deposit_cancel (dh); @@ -429,7 +432,7 @@ verify_signatures (const struct TALER_EXCHANGE_DenomPublicKey *dki, .purpose.size = htonl (sizeof (dr)), .h_contract_terms = *h_contract_terms, .h_wire = *h_wire, - .timestamp = GNUNET_TIME_absolute_hton (timestamp), + .wallet_timestamp = GNUNET_TIME_absolute_hton (timestamp), .refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline), .merchant = *merchant_pub, .coin_pub = *coin_pub @@ -658,7 +661,7 @@ TALER_EXCHANGE_deposit (struct TALER_EXCHANGE_Handle *exchange, TALER_SIGNATURE_EXCHANGE_CONFIRM_DEPOSIT); dh->depconf.h_contract_terms = *h_contract_terms; dh->depconf.h_wire = h_wire; - dh->depconf.timestamp = GNUNET_TIME_absolute_hton (timestamp); + /* dh->depconf.exchange_timestamp; -- initialized later from exchange reply! */ dh->depconf.refund_deadline = GNUNET_TIME_absolute_hton (refund_deadline); TALER_amount_hton (&dh->depconf.amount_without_fee, &amount_without_fee); diff --git a/src/lib/exchange_api_refund.c b/src/lib/exchange_api_refund.c index b1ea176b..6f91389f 100644 --- a/src/lib/exchange_api_refund.c +++ b/src/lib/exchange_api_refund.c @@ -148,7 +148,8 @@ handle_refund_finished (void *cls, struct TALER_ExchangeSignatureP exchange_sig; struct TALER_ExchangePublicKeyP *ep = NULL; struct TALER_ExchangeSignatureP *es = NULL; - struct TALER_Amount *rf = NULL; + struct TALER_Amount ra; + const struct TALER_Amount *rf = NULL; const json_t *j = response; struct TALER_EXCHANGE_HttpResponse hr = { .reply = j, @@ -176,7 +177,9 @@ handle_refund_finished (void *cls, { ep = &exchange_pub; es = &exchange_sig; - rf = &rh->depconf.refund_fee; + TALER_amount_ntoh (&ra, + &rh->depconf.refund_fee); + rf = &ra; } break; case MHD_HTTP_BAD_REQUEST: diff --git a/src/testing/test_taler_exchange_aggregator.c b/src/testing/test_taler_exchange_aggregator.c index eaa621cf..d5c392d3 100644 --- a/src/testing/test_taler_exchange_aggregator.c +++ b/src/testing/test_taler_exchange_aggregator.c @@ -108,6 +108,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:1", "EUR:0.1"), @@ -126,6 +127,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:1", "EUR:0.1"), @@ -134,6 +136,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:1", "EUR:0.1"), @@ -153,6 +156,7 @@ run (void *cls, &dbc, "bob", "4", + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:1", "EUR:0.1"), @@ -160,6 +164,7 @@ run (void *cls, &dbc, "bob", "5", + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:1", "EUR:0.1"), @@ -167,6 +172,7 @@ run (void *cls, &dbc, "alice", "4", + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:1", "EUR:0.1"), @@ -195,6 +201,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -204,6 +211,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -229,6 +237,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10), @@ -239,6 +248,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -263,6 +273,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.102", "EUR:0.1"), @@ -274,6 +285,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.102", "EUR:0.1"), @@ -281,6 +293,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.102", "EUR:0.1"), @@ -292,6 +305,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.102", "EUR:0.1"), @@ -303,6 +317,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.112", "EUR:0.1"), @@ -319,6 +334,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.109", "EUR:0.1"), @@ -330,6 +346,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.119", "EUR:0.1"), @@ -346,6 +363,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.122", "EUR:0.1"), @@ -362,6 +380,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -375,6 +394,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -390,6 +410,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.122", "EUR:0.1"), @@ -406,6 +427,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -419,6 +441,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5), @@ -434,6 +457,7 @@ run (void *cls, &dbc, "bob", USER42_ACCOUNT, + GNUNET_TIME_absolute_get (), GNUNET_TIME_UNIT_ZERO, "EUR:0.112", "EUR:0.1"), diff --git a/src/testing/testing_api_cmd_auditor_deposit_confirmation.c b/src/testing/testing_api_cmd_auditor_deposit_confirmation.c index 247399a9..1442380b 100644 --- a/src/testing/testing_api_cmd_auditor_deposit_confirmation.c +++ b/src/testing/testing_api_cmd_auditor_deposit_confirmation.c @@ -203,6 +203,7 @@ deposit_confirmation_run (void *cls, const struct TALER_TESTING_Command *deposit_cmd; struct GNUNET_HashCode h_wire; struct GNUNET_HashCode h_contract_terms; + const struct GNUNET_TIME_Absolute *exchange_timestamp = NULL; struct GNUNET_TIME_Absolute timestamp; struct GNUNET_TIME_Absolute refund_deadline; struct TALER_Amount amount_without_fee; @@ -238,6 +239,11 @@ deposit_confirmation_run (void *cls, TALER_TESTING_get_trait_exchange_sig (deposit_cmd, dcs->coin_index, &exchange_sig)); + GNUNET_assert (GNUNET_OK == + TALER_TESTING_get_trait_absolute_time (deposit_cmd, + dcs->coin_index, + &exchange_timestamp)); + GNUNET_assert (NULL != exchange_timestamp); keys = TALER_EXCHANGE_get_keys (dcs->is->exchange); GNUNET_assert (NULL != keys); spk = TALER_EXCHANGE_get_signing_key_info (keys, @@ -309,7 +315,7 @@ deposit_confirmation_run (void *cls, dcs->dc = TALER_AUDITOR_deposit_confirmation (dcs->auditor, &h_wire, &h_contract_terms, - timestamp, + *exchange_timestamp, refund_deadline, &amount_without_fee, &coin_pub, diff --git a/src/testing/testing_api_cmd_deposit.c b/src/testing/testing_api_cmd_deposit.c index 9468e7ac..049f36f2 100644 --- a/src/testing/testing_api_cmd_deposit.c +++ b/src/testing/testing_api_cmd_deposit.c @@ -91,9 +91,9 @@ struct DepositState struct TALER_EXCHANGE_DepositHandle *dh; /** - * Timestamp of the /deposit operation. + * Timestamp of the /deposit operation in the wallet (contract signing time). */ - struct GNUNET_TIME_Absolute timestamp; + struct GNUNET_TIME_Absolute wallet_timestamp; /** * Interpreter state. @@ -126,6 +126,11 @@ struct DepositState */ int deposit_succeeded; + /** + * When did the exchange receive the deposit? + */ + struct GNUNET_TIME_Absolute exchange_timestamp; + /** * Signing key used by the exchange to sign the * deposit confirmation. @@ -198,6 +203,7 @@ do_retry (void *cls) * * @param cls closure. * @param hr HTTP response details + * @param exchange_timestamp when did the exchange receive the deposit permission * @param exchange_sig signature provided by the exchange * (NULL on errors) * @param exchange_pub public key of the exchange, @@ -206,6 +212,7 @@ do_retry (void *cls) static void deposit_cb (void *cls, const struct TALER_EXCHANGE_HttpResponse *hr, + const struct GNUNET_TIME_Absolute exchange_timestamp, const struct TALER_ExchangeSignatureP *exchange_sig, const struct TALER_ExchangePublicKeyP *exchange_pub) { @@ -254,6 +261,7 @@ deposit_cb (void *cls, if (MHD_HTTP_OK == hr->http_status) { ds->deposit_succeeded = GNUNET_YES; + ds->exchange_timestamp = exchange_timestamp; ds->exchange_pub = *exchange_pub; ds->exchange_sig = *exchange_sig; } @@ -305,7 +313,7 @@ deposit_run (void *cls, ds->coin_index = ods->coin_index; ds->wire_details = json_incref (ods->wire_details); ds->contract_terms = json_incref (ods->contract_terms); - ds->timestamp = ods->timestamp; + ds->wallet_timestamp = ods->wallet_timestamp; ds->refund_deadline = ods->refund_deadline; ds->amount = ods->amount; ds->merchant_priv = ods->merchant_priv; @@ -379,7 +387,7 @@ deposit_run (void *cls, } else { - ds->refund_deadline = ds->timestamp; + ds->refund_deadline = ds->wallet_timestamp; wire_deadline = GNUNET_TIME_relative_to_absolute (GNUNET_TIME_UNIT_ZERO); } @@ -388,6 +396,7 @@ deposit_run (void *cls, (void) GNUNET_TIME_round_abs (&wire_deadline); + // FIXME: This should be part of TALER_EXCHANGE_deposit()! { struct TALER_DepositRequestPS dr; @@ -400,7 +409,7 @@ deposit_run (void *cls, GNUNET_assert (GNUNET_OK == TALER_JSON_merchant_wire_signature_hash (ds->wire_details, &dr.h_wire)); - dr.timestamp = GNUNET_TIME_absolute_hton (ds->timestamp); + dr.wallet_timestamp = GNUNET_TIME_absolute_hton (ds->wallet_timestamp); dr.refund_deadline = GNUNET_TIME_absolute_hton (ds->refund_deadline); TALER_amount_hton (&dr.amount_with_fee, @@ -421,7 +430,7 @@ deposit_run (void *cls, &coin_pub, denom_pub_sig, &denom_pub->key, - ds->timestamp, + ds->wallet_timestamp, &merchant_pub, ds->refund_deadline, &coin_sig, @@ -534,6 +543,8 @@ deposit_traits (void *cls, &ds->merchant_priv), TALER_TESTING_make_trait_amount_obj (0, &ds->amount), + TALER_TESTING_make_trait_absolute_time (0, + &ds->exchange_timestamp), TALER_TESTING_trait_end () }; @@ -599,12 +610,12 @@ TALER_TESTING_cmd_deposit (const char *label, label); GNUNET_assert (0); } - ds->timestamp = GNUNET_TIME_absolute_get (); - (void) GNUNET_TIME_round_abs (&ds->timestamp); + ds->wallet_timestamp = GNUNET_TIME_absolute_get (); + (void) GNUNET_TIME_round_abs (&ds->wallet_timestamp); json_object_set_new (ds->contract_terms, "timestamp", - GNUNET_JSON_from_time_abs (ds->timestamp)); + GNUNET_JSON_from_time_abs (ds->wallet_timestamp)); if (0 != refund_deadline.rel_value_us) { ds->refund_deadline = GNUNET_TIME_relative_to_absolute (refund_deadline); @@ -687,12 +698,12 @@ TALER_TESTING_cmd_deposit_with_ref (const char *label, label); GNUNET_assert (0); } - ds->timestamp = GNUNET_TIME_absolute_get (); - (void) GNUNET_TIME_round_abs (&ds->timestamp); + ds->wallet_timestamp = GNUNET_TIME_absolute_get (); + (void) GNUNET_TIME_round_abs (&ds->wallet_timestamp); json_object_set_new (ds->contract_terms, "timestamp", - GNUNET_JSON_from_time_abs (ds->timestamp)); + GNUNET_JSON_from_time_abs (ds->wallet_timestamp)); if (0 != refund_deadline.rel_value_us) { ds->refund_deadline = GNUNET_TIME_relative_to_absolute (refund_deadline); diff --git a/src/testing/testing_api_cmd_insert_deposit.c b/src/testing/testing_api_cmd_insert_deposit.c index 35652800..cff2884a 100644 --- a/src/testing/testing_api_cmd_insert_deposit.c +++ b/src/testing/testing_api_cmd_insert_deposit.c @@ -57,6 +57,11 @@ struct InsertDepositState */ struct GNUNET_TIME_Relative wire_deadline; + /** + * When did the exchange receive the deposit? + */ + struct GNUNET_TIME_Absolute exchange_timestamp; + /** * Amount to deposit, inclusive of deposit fee. */ @@ -210,6 +215,7 @@ insert_deposit_run (void *cls, (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT != ids->dbc->plugin->insert_deposit (ids->dbc->plugin->cls, ids->dbc->session, + ids->exchange_timestamp, &deposit)) || (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS != ids->dbc->plugin->commit (ids->dbc->plugin->cls, @@ -275,6 +281,7 @@ insert_deposit_traits (void *cls, * @param dbc collects database plugin and session handles. * @param merchant_name Human-readable name of the merchant. * @param merchant_account merchant's account name (NOT a payto:// URI) + * @param exchange_timestamp when did the exchange receive the deposit * @param wire_deadline point in time where the aggregator should have * wired money to the merchant. * @param amount_with_fee amount to deposit (inclusive of deposit fee) @@ -282,21 +289,24 @@ insert_deposit_traits (void *cls, * @return the command. */ struct TALER_TESTING_Command -TALER_TESTING_cmd_insert_deposit (const char *label, - const struct - TALER_TESTING_DatabaseConnection *dbc, - const char *merchant_name, - const char *merchant_account, - struct GNUNET_TIME_Relative wire_deadline, - const char *amount_with_fee, - const char *deposit_fee) +TALER_TESTING_cmd_insert_deposit ( + const char *label, + const struct TALER_TESTING_DatabaseConnection *dbc, + const char *merchant_name, + const char *merchant_account, + struct GNUNET_TIME_Absolute exchange_timestamp, + struct GNUNET_TIME_Relative wire_deadline, + const char *amount_with_fee, + const char *deposit_fee) { struct InsertDepositState *ids; + GNUNET_TIME_round_abs (&exchange_timestamp); ids = GNUNET_new (struct InsertDepositState); ids->dbc = dbc; ids->merchant_name = merchant_name; ids->merchant_account = merchant_account; + ids->exchange_timestamp = exchange_timestamp; ids->wire_deadline = wire_deadline; ids->amount_with_fee = amount_with_fee; ids->deposit_fee = deposit_fee; -- cgit v1.2.3 From 4119dbd1aab1ad6f63cc48d4a7e396834e60d62b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 11 May 2020 10:01:37 +0200 Subject: update --- src/include/taler_error_codes.h | 7 +++++++ src/include/taler_exchange_service.h | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'src/include/taler_error_codes.h') diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index eded2333..cafdf1f6 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -1537,6 +1537,13 @@ enum TALER_ErrorCode */ TALER_EC_TRACK_TRANSACTION_CONFLICTING_REPORTS = 2308, + /** + * We did failed to retrieve information from our database. The + * response is provided with an HTTP status of + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_GET_TRANSFERS_DB_FETCH_ERROR = 2350, + /** * We failed to contact the exchange for the /track/transfer request. * This response is provided with HTTP status code diff --git a/src/include/taler_exchange_service.h b/src/include/taler_exchange_service.h index ea185f09..1fe7d2f8 100644 --- a/src/include/taler_exchange_service.h +++ b/src/include/taler_exchange_service.h @@ -1611,7 +1611,7 @@ struct TALER_EXCHANGE_TransferData struct GNUNET_TIME_Absolute execution_time; /** - * amount of the wire transfer + * amount of the wire transfer; FIXME: total wired (without fee), or including @a wire_fee? */ struct TALER_Amount total_amount; -- cgit v1.2.3 From baab185d87fc507ea47a509d602c4fd899c6ffcb Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 18 May 2020 19:10:47 +0200 Subject: more ecs --- src/include/taler_error_codes.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src/include/taler_error_codes.h') diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index cafdf1f6..255fdc2f 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -1997,6 +1997,18 @@ enum TALER_ErrorCode */ TALER_EC_REFUND_LOOKUP_NO_REFUND = 2607, + /** + * The requested wire method is not supported by the exchange. + * Returned with an HTTP status of #MHD_HTTP_CONFLICT. + */ + TALER_EC_RESERVES_POST_UNSUPPORTED_WIRE_METHOD = 2650, + + /** + * The backend failed to commit the result to the database. Returned + * with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_RESERVES_POST_DB_COMMIT_HARD_ERROR = 2651, + /** * The backend knows the instance that was supposed to support the * tip, but it was not configured for tipping (i.e. has no exchange -- cgit v1.2.3 From 03615083589230803dd2a9d1fbfa5912f9472b70 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 22 May 2020 11:19:24 +0200 Subject: ecs --- src/include/taler_error_codes.h | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/include/taler_error_codes.h') diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index 255fdc2f..901a89b7 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -2009,6 +2009,13 @@ enum TALER_ErrorCode */ TALER_EC_RESERVES_POST_DB_COMMIT_HARD_ERROR = 2651, + /** + * The backend failed to fetch the requested information from the + * database. Returned with an HTTP status of + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_GET_RESERVES_DB_LOOKUP_ERROR = 2652, + /** * The backend knows the instance that was supposed to support the * tip, but it was not configured for tipping (i.e. has no exchange @@ -2019,7 +2026,7 @@ enum TALER_ErrorCode /** * The reserve that was used to fund the tips has expired. Returned - * with an HTTP status code of #MHD_HTTP_NOT_FOUND. + * with an HTTP status code of #MHD_HTTP_GONE. */ TALER_EC_TIP_AUTHORIZE_RESERVE_EXPIRED = 2702, @@ -2146,6 +2153,18 @@ enum TALER_ErrorCode */ TALER_EC_TIP_QUERY_TIP_ID_UNKNOWN = 2720, + /** + * The reserve could not be deleted due to a database failure. + * Returned with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_RESERVES_DELETE_DB_HARD_FAILURE = 2721, + + /** + * The reserve could not be deleted because it is unknown. Returned + * with HTTP status code #MHD_HTTP_NOT_FOUND. + */ + TALER_EC_RESERVES_DELETE_NO_SUCH_RESERVE = 2722, + /** * The backend had trouble accessing the database to persist * information about enabling tips. Returned with an HTTP status code @@ -2236,6 +2255,18 @@ enum TALER_ErrorCode */ TALER_EC_TIP_PICKUP_UNBLIND_FAILURE = 2812, + /** + * Merchant failed to access its database to lookup the tip. Returned + * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_GET_TIPS_DB_LOOKUP_ERROR = 2813, + + /** + * Merchant failed find the tip in its database. Returned with a + * response code of #MHD_HTTP_NOT_FOUND. + */ + TALER_EC_GET_TIPS_ID_UNKNOWN = 2814, + /** * We failed to fetch contract terms from our merchant database. The * response is provided with HTTP status code -- cgit v1.2.3 From 6eabe1ab4f6ac393155e04c3c3579dc97d7cb99b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 22 May 2020 13:01:19 +0200 Subject: more ECs --- src/include/taler_error_codes.h | 61 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) (limited to 'src/include/taler_error_codes.h') diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index 901a89b7..1e031f4b 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -2267,6 +2267,67 @@ enum TALER_ErrorCode */ TALER_EC_GET_TIPS_ID_UNKNOWN = 2814, + /** + * The merchant failed to contact the exchange. Returned with a + * response code of #MHD_HTTP_FAILED_DEPENDENCY. + */ + TALER_EC_TIP_PICKUP_CONTACT_EXCHANGE_ERROR = 2815, + + /** + * The merchant failed to obtain keys from the exchange. Returned with + * a response code of #MHD_HTTP_FAILED_DEPENDENCY. + */ + TALER_EC_TIP_PICKUP_EXCHANGE_KEYS_ERROR = 2816, + + /** + * The merchant failed to store data in its own database. Returned + * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_PICKUP_DB_STORE_HARD_ERROR = 2817, + + /** + * The merchant failed to get a timely response from the exchange. + * Returned with a response code of #MHD_HTTP_REQUEST_TIMEOUT. + */ + TALER_EC_TIP_PICKUP_EXCHANGE_TIMEOUT = 2818, + + /** + * The exchange returned a failure code for the withdraw operation. + * Returned with a response code of #MHD_HTTP_FAILED_DEPENDENCY. + */ + TALER_EC_TIP_PICKUP_EXCHANGE_ERROR = 2819, + + /** + * The merchant failed to add up the amounts to compute the pick up + * value. Returned with a response code of + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_PICKUP_SUMMATION_FAILED = 2820, + + /** + * The tip expired. Returned with a response code of #MHD_HTTP_GONE. + */ + TALER_EC_TIP_PICKUP_HAS_EXPIRED = 2821, + + /** + * The requested withdraw amount exceeds the amount remaining to be + * picked up. Returned with a response code of #MHD_HTTP_BAD_REQUEST. + */ + TALER_EC_TIP_PICKUP_AMOUNT_EXCEEDS_TIP_REMAINING = 2822, + + /** + * The merchant failed to store data in its own database. Returned + * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_PICKUP_DB_STORE_SOFT_ERROR = 2823, + + /** + * The merchant did not find the specified denomination key in the + * exchange's key set. Returned with a response code of + * #MHD_HTTP_CONFLICT. + */ + TALER_EC_TIP_PICKUP_DENOMINATION_UNKNOWN = 2824, + /** * We failed to fetch contract terms from our merchant database. The * response is provided with HTTP status code -- cgit v1.2.3 From 44c70269e25b86d3ab995b9fbd3366020b6a3c1c Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 31 May 2020 17:39:26 +0200 Subject: update ECs --- src/include/taler_error_codes.h | 55 +++++++++++++++++++++++++++++++++++++++++ src/lib/exchange_api_melt.c | 10 ++++---- 2 files changed, 60 insertions(+), 5 deletions(-) (limited to 'src/include/taler_error_codes.h') diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h index 1e031f4b..87feea2d 100644 --- a/src/include/taler_error_codes.h +++ b/src/include/taler_error_codes.h @@ -2165,6 +2165,61 @@ enum TALER_ErrorCode */ TALER_EC_RESERVES_DELETE_NO_SUCH_RESERVE = 2722, + /** + * The backend got an unexpected error trying to lookup reserve + * details from the backend. This response is provided with HTTP + * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_LOOKUP_RESERVE_DB_FAILURE = 2723, + + /** + * The backend repeatedly failed to serialize the transaction to + * authorize the tip. This response is provided with HTTP status code + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_AUTHORIZE_DB_SERIALIZATION_FAILURE = 2724, + + /** + * The backend failed to start the transaction to authorize the tip. + * This response is provided with HTTP status code + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_AUTHORIZE_DB_START_FAILURE = 2725, + + /** + * The backend failed looking up the reserve needed to authorize the + * tip. This response is provided with HTTP status code + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_AUTHORIZE_DB_LOOKUP_RESERVE_FAILURE = 2726, + + /** + * The backend failed to find a reserve needed to authorize the tip. + * This response is provided with HTTP status code + * #MHD_HTTP_SERVICE_UNAVAILABLE. + */ + TALER_EC_TIP_AUTHORIZE_DB_RESERVE_NOT_FOUND = 2727, + + /** + * The backend encountered an internal invariant violation. This + * response is provided with HTTP status code + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_AUTHORIZE_DB_RESERVE_INVARIANT_FAILURE = 2728, + + /** + * The selected exchange expired. This response is provided with HTTP + * status code #MHD_HTTP_GONE. + */ + TALER_EC_TIP_AUTHORIZE_DB_RESERVE_EXPIRED = 2729, + + /** + * The backend failed updating the reserve needed to authorize the + * tip. This response is provided with HTTP status code + * #MHD_HTTP_INTERNAL_SERVER_ERROR. + */ + TALER_EC_TIP_AUTHORIZE_DB_UPDATE_RESERVE_FAILURE = 2730, + /** * The backend had trouble accessing the database to persist * information about enabling tips. Returned with an HTTP status code diff --git a/src/lib/exchange_api_melt.c b/src/lib/exchange_api_melt.c index f89036e4..0695f997 100644 --- a/src/lib/exchange_api_melt.c +++ b/src/lib/exchange_api_melt.c @@ -445,11 +445,11 @@ TALER_EXCHANGE_melt (struct TALER_EXCHANGE_Handle *exchange, char pub_str[sizeof (struct TALER_CoinSpendPublicKeyP) * 2]; char *end; - end = GNUNET_STRINGS_data_to_string (&melt.coin_pub, - sizeof (struct - TALER_CoinSpendPublicKeyP), - pub_str, - sizeof (pub_str)); + end = GNUNET_STRINGS_data_to_string ( + &melt.coin_pub, + sizeof (struct TALER_CoinSpendPublicKeyP), + pub_str, + sizeof (pub_str)); *end = '\0'; GNUNET_snprintf (arg_str, sizeof (arg_str), -- cgit v1.2.3 From acd8d318c024cc31381361f3593b7b1510795627 Mon Sep 17 00:00:00 2001 From: Jonathan Buchanan Date: Mon, 8 Jun 2020 14:55:50 -0400 Subject: taler_error_codes.h auto generated from gnunet/gana.git as a submodule --- .gitignore | 1 + .gitmodules | 3 + bootstrap | 9 +- contrib/gana | 1 + src/include/taler_error_codes.h | 2754 --------------------------------------- 5 files changed, 13 insertions(+), 2755 deletions(-) create mode 160000 contrib/gana delete mode 100644 src/include/taler_error_codes.h (limited to 'src/include/taler_error_codes.h') diff --git a/.gitignore b/.gitignore index 9ed74175..4b3e5a35 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ GPATH GRTAGS GTAGS *.swp +src/include/taler_error_codes.h src/lib/test_exchange_api doc/doxygen/doxygen_sqlite3.db src/auditor/taler-auditor-dbinit diff --git a/.gitmodules b/.gitmodules index de5e3305..af62a847 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,6 @@ path = doc/prebuilt url = https://git.taler.net/docs.git branch = prebuilt +[submodule "contrib/gana"] + path = contrib/gana + url = https://gnunet.org/git/gana.git diff --git a/bootstrap b/bootstrap index 44f929c6..a25549b7 100755 --- a/bootstrap +++ b/bootstrap @@ -5,7 +5,14 @@ if ! git --version >/dev/null; then exit 1 fi -git submodule update --init +#git submodule update --init + +# Generate taler-error-codes.h in gana and copy it to +# src/include/taler_error_codes.h +cd contrib/gana/gnu-taler-error-codes +make +cd ../../.. +cp contrib/gana/gnu-taler-error-codes/taler-error-codes.h src/include/taler_error_codes.h # This is more portable than `which' but comes with # the caveat of not(?) properly working on busybox's ash: diff --git a/contrib/gana b/contrib/gana new file mode 160000 index 00000000..30d83deb --- /dev/null +++ b/contrib/gana @@ -0,0 +1 @@ +Subproject commit 30d83deb42b0ad54154214ecd916a167c324c9d6 diff --git a/src/include/taler_error_codes.h b/src/include/taler_error_codes.h deleted file mode 100644 index 87feea2d..00000000 --- a/src/include/taler_error_codes.h +++ /dev/null @@ -1,2754 +0,0 @@ -/* - This file is part of TALER - Copyright (C) 2016, 2017, 2019 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 -*/ - -/** - * @file taler_error_codes.h - * @brief error codes returned by GNU Taler - * - * This file defines constants for error codes returned - * in Taler APIs. We use codes above 1000 to avoid any - * confusing with HTTP status codes. All constants have the - * shared prefix "TALER_EC_" to indicate that they are error - * codes. - * - * THIS FILE IS AUTO-GENERATED, DO NOT MODIFY! - * If you want to add an error code, please add it in the - * taler-util.git repository. Instructions - * for this are in the README in taler-util.git. - */ -#ifndef TALER_ERROR_CODES_H -#define TALER_ERROR_CODES_H - -/** - * Enumeration with all possible Taler error codes. - */ -enum TALER_ErrorCode -{ - - /** - * Special code to indicate no error (or no "code" present). - */ - TALER_EC_NONE = 0, - - /** - * Special code to indicate that a non-integer error code was returned - * in the JSON response. - */ - TALER_EC_INVALID = 1, - - /** - * The response we got from the server was not even in JSON format. - */ - TALER_EC_INVALID_RESPONSE = 2, - - /** - * Generic implementation error: this function was not yet - * implemented. - */ - TALER_EC_NOT_IMPLEMENTED = 3, - - /** - * Exchange is badly configured and thus cannot operate. - */ - TALER_EC_EXCHANGE_BAD_CONFIGURATION = 4, - - /** - * Internal assertion error. - */ - TALER_EC_INTERNAL_INVARIANT_FAILURE = 5, - - /** - * Operation timed out. - */ - TALER_EC_TIMEOUT = 6, - - /** - * Exchange failed to allocate memory for building JSON reply. - */ - TALER_EC_JSON_ALLOCATION_FAILURE = 7, - - /** - * HTTP method invalid for this URL. - */ - TALER_EC_METHOD_INVALID = 8, - - /** - * Operation specified invalid for this URL (resulting in a "NOT - * FOUND" for the overall response). - */ - TALER_EC_OPERATION_INVALID = 9, - - /** - * There is no endpoint defined for the URL provided by the client - * (returned together with a #MHD_HTTP_NOT_FOUND status code). - */ - TALER_EC_ENDPOINT_UNKNOWN = 10, - - /** - * The URI is longer than the longest URI the HTTP server is willing - * to parse. Returned together with an HTTP status code of - * #MHD_HTTP_URI_TOO_LONG. - */ - TALER_EC_URI_TOO_LONG = 11, - - /** - * The number of segments included in the URI does not match the - * number of segments expected by the endpoint. (returned together - * with a #MHD_HTTP_NOT_FOUND status code). - */ - TALER_EC_WRONG_NUMBER_OF_SEGMENTS = 12, - - /** - * The start and end-times in the wire fee structure leave a hole. - * This is not allowed. Generated as an error on the client-side. - */ - TALER_EC_HOLE_IN_WIRE_FEE_STRUCTURE = 13, - - /** - * The version string given does not follow the expected - * CURRENT:REVISION:AGE Format. Generated as an error on the client - * side. - */ - TALER_EC_VERSION_MALFORMED = 14, - - /** - * The client-side experienced an internal failure. Generated as an - * error on the client side. - */ - TALER_EC_CLIENT_INTERNAL_FAILURE = 15, - - /** - * The exchange failed to even just initialize its connection to the - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DB_SETUP_FAILED = 1001, - - /** - * The exchange encountered an error event to just start the database - * transaction. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DB_START_FAILED = 1002, - - /** - * The exchange encountered an error event to commit the database - * transaction (hard, unrecoverable error). This response is provided - * with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DB_COMMIT_FAILED_HARD = 1003, - - /** - * The exchange encountered an error event to commit the database - * transaction, even after repeatedly retrying it there was always a - * conflicting transaction. (This indicates a repeated serialization - * error; should only happen if some client maliciously tries to - * create conflicting concurrent transactions.) This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DB_COMMIT_FAILED_ON_RETRY = 1004, - - /** - * The exchange had insufficient memory to parse the request. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PARSER_OUT_OF_MEMORY = 1005, - - /** - * The JSON in the client's request to the exchange was malformed. - * (Generic parse error). This response is provided with HTTP status - * code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_JSON_INVALID = 1006, - - /** - * The JSON in the client's request to the exchange was malformed. - * Details about the location of the parse error are provided. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_JSON_INVALID_WITH_DETAILS = 1007, - - /** - * A required parameter in the request to the exchange was missing. - * This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PARAMETER_MISSING = 1008, - - /** - * A parameter in the request to the exchange was malformed. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PARAMETER_MALFORMED = 1009, - - /** - * The exchange failed to obtain the transaction history of the given - * coin from the database while generating an insufficient funds - * errors. This can happen during /deposit or /recoup requests. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_COIN_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS = 1010, - - /** - * Internal logic error. Some server-side function failed that really - * should not. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_INTERNAL_LOGIC_ERROR = 1011, - - /** - * The method specified in a payto:// URI is not one we expected. - */ - TALER_EC_PAYTO_WRONG_METHOD = 1012, - - /** - * The payto:// URI is malformed. - */ - TALER_EC_PAYTO_MALFORMED = 1013, - - /** - * We failed to update the database of known coins. - */ - TALER_EC_DB_COIN_HISTORY_STORE_ERROR = 1014, - - /** - * The public key of given to a /coins/ handler was malformed. - */ - TALER_EC_COINS_INVALID_COIN_PUB = 1050, - - /** - * The reserve key of given to a /reserves/ handler was malformed. - */ - TALER_EC_RESERVES_INVALID_RESERVE_PUB = 1051, - - /** - * The public key of given to a /transfers/ handler was malformed. - */ - TALER_EC_TRANSFERS_INVALID_WTID = 1052, - - /** - * The wire hash of given to a /deposits/ handler was malformed. - */ - TALER_EC_DEPOSITS_INVALID_H_WIRE = 1053, - - /** - * The merchant key of given to a /deposits/ handler was malformed. - */ - TALER_EC_DEPOSITS_INVALID_MERCHANT_PUB = 1054, - - /** - * The hash of the contract terms given to a /deposits/ handler was - * malformed. - */ - TALER_EC_DEPOSITS_INVALID_H_CONTRACT_TERMS = 1055, - - /** - * The coin public key of given to a /deposits/ handler was malformed. - */ - TALER_EC_DEPOSITS_INVALID_COIN_PUB = 1056, - - /** - * The body returned by the exchange for a /deposits/ request was - * malformed. Error created client-side. - */ - TALER_EC_DEPOSITS_INVALID_BODY_BY_EXCHANGE = 1057, - - /** - * The signature returned by the exchange in a /deposits/ request was - * malformed. Error created client-side. - */ - TALER_EC_DEPOSITS_INVALID_SIGNATURE_BY_EXCHANGE = 1058, - - /** - * The given reserve does not have sufficient funds to admit the - * requested withdraw operation at this time. The response includes - * the current "balance" of the reserve as well as the transaction - * "history" that lead to this balance. This response is provided - * with HTTP status code #MHD_HTTP_CONFLICT. - */ - TALER_EC_WITHDRAW_INSUFFICIENT_FUNDS = 1100, - - /** - * The exchange has no information about the "reserve_pub" that was - * given. This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_WITHDRAW_RESERVE_UNKNOWN = 1101, - - /** - * The amount to withdraw together with the fee exceeds the numeric - * range for Taler amounts. This is not a client failure, as the coin - * value and fees come from the exchange's configuration. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_AMOUNT_FEE_OVERFLOW = 1102, - - /** - * All of the deposited amounts into this reserve total up to a value - * that is too big for the numeric range for Taler amounts. This is - * not a client failure, as the transaction history comes from the - * exchange's configuration. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_AMOUNT_DEPOSITS_OVERFLOW = 1103, - - /** - * For one of the historic withdrawals from this reserve, the exchange - * could not find the denomination key. This is not a client failure, - * as the transaction history comes from the exchange's configuration. - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_HISTORIC_DENOMINATION_KEY_NOT_FOUND = 1104, - - /** - * All of the withdrawals from reserve total up to a value that is too - * big for the numeric range for Taler amounts. This is not a client - * failure, as the transaction history comes from the exchange's - * configuration. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_AMOUNT_WITHDRAWALS_OVERFLOW = 1105, - - /** - * The exchange somehow knows about this reserve, but there seem to - * have been no wire transfers made. This is not a client failure, as - * this is a database consistency issue of the exchange. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_RESERVE_WITHOUT_WIRE_TRANSFER = 1106, - - /** - * The exchange failed to create the signature using the denomination - * key. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_SIGNATURE_FAILED = 1107, - - /** - * The exchange failed to store the withdraw operation in its - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_DB_STORE_ERROR = 1108, - - /** - * The exchange failed to check against historic withdraw data from - * database (as part of ensuring the idempotency of the operation). - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_DB_FETCH_ERROR = 1109, - - /** - * The exchange is not aware of the denomination key the wallet - * requested for the withdrawal. This response is provided with HTTP - * status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_WITHDRAW_DENOMINATION_KEY_NOT_FOUND = 1110, - - /** - * The signature of the reserve is not valid. This response is - * provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_WITHDRAW_RESERVE_SIGNATURE_INVALID = 1111, - - /** - * When computing the reserve history, we ended up with a negative - * overall balance, which should be impossible. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS = 1112, - - /** - * When computing the reserve history, we ended up with a negative - * overall balance, which should be impossible. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_RESERVE_HISTORY_IMPOSSIBLE = 1113, - - /** - * Validity period of the coin to be withdrawn is in the future. - * Returned with an HTTP status of #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_WITHDRAW_VALIDITY_IN_FUTURE = 1114, - - /** - * Withdraw period of the coin to be withdrawn is in the past. - * Returned with an HTTP status of #MHD_HTTP_GONE. - */ - TALER_EC_WITHDRAW_VALIDITY_IN_PAST = 1115, - - /** - * Withdraw period of the coin to be withdrawn is in the past. - * Returned with an HTTP status of #MHD_HTTP_GONE. - */ - TALER_EC_DENOMINATION_KEY_LOST = 1116, - - /** - * The exchange's database entry with the reserve balance summary is - * inconsistent with its own history of the reserve. Returned with an - * HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_WITHDRAW_RESERVE_BALANCE_CORRUPT = 1117, - - /** - * The exchange responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_WITHDRAW_REPLY_MALFORMED = 1118, - - /** - * The client failed to unblind the blind signature. This error is not - * used in the protocol but created client-side. - */ - TALER_EC_WITHDRAW_UNBLIND_FAILURE = 1119, - - /** - * The exchange failed to obtain the transaction history of the given - * reserve from the database. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RESERVE_STATUS_DB_ERROR = 1150, - - /** - * The reserve status was requested using a unknown key, to be - * returned with 404 Not Found. - */ - TALER_EC_RESERVE_STATUS_UNKNOWN = 1151, - - /** - * The exchange responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_RESERVE_STATUS_REPLY_MALFORMED = 1152, - - /** - * The respective coin did not have sufficient residual value for the - * /deposit operation (i.e. due to double spending). The "history" in - * the respose provides the transaction history of the coin proving - * this fact. This response is provided with HTTP status code - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_DEPOSIT_INSUFFICIENT_FUNDS = 1200, - - /** - * The exchange failed to obtain the transaction history of the given - * coin from the database (this does not happen merely because the - * coin is seen by the exchange for the first time). This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSIT_HISTORY_DB_ERROR = 1201, - - /** - * The exchange failed to store the /depost information in the - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSIT_STORE_DB_ERROR = 1202, - - /** - * The exchange database is unaware of the denomination key that - * signed the coin (however, the exchange process is; this is not - * supposed to happen; it can happen if someone decides to purge the - * DB behind the back of the exchange process). Hence the deposit is - * being refused. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSIT_DB_DENOMINATION_KEY_UNKNOWN = 1203, - - /** - * The exchange was trying to lookup the denomination key for the - * purpose of a DEPOSIT operation. However, the denomination key is - * unavailable for that purpose. This can be because it is entirely - * unknown to the exchange or not in the validity period for the - * deposit operation. Hence the deposit is being refused. This - * response is provided with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_DEPOSIT_DENOMINATION_KEY_UNKNOWN = 1204, - - /** - * The signature made by the coin over the deposit permission is not - * valid. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_COIN_SIGNATURE_INVALID = 1205, - - /** - * The signature of the denomination key over the coin is not valid. - * This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_DENOMINATION_SIGNATURE_INVALID = 1206, - - /** - * The stated value of the coin after the deposit fee is subtracted - * would be negative. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_NEGATIVE_VALUE_AFTER_FEE = 1207, - - /** - * The stated refund deadline is after the wire deadline. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_REFUND_DEADLINE_AFTER_WIRE_DEADLINE = 1208, - - /** - * The exchange does not recognize the validity of or support the - * given wire format type. This response is provided with HTTP status - * code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_TYPE = 1209, - - /** - * The exchange failed to canonicalize and hash the given wire format. - * For example, the merchant failed to provide the "salt" or a valid - * payto:// URI in the wire details. Note that while the exchange - * will do some basic sanity checking on the wire details, it cannot - * warrant that the banking system will ultimately be able to route to - * the specified address, even if this check passed. This response is - * provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_JSON = 1210, - - /** - * The hash of the given wire address does not match the hash - * specified in the proposal data. This response is provided with - * HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_CONTRACT_HASH_CONFLICT = 1211, - - /** - * The exchange detected that the given account number is invalid for - * the selected wire format type. This response is provided with HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSIT_INVALID_WIRE_FORMAT_ACCOUNT_NUMBER = 1213, - - /** - * Timestamp included in deposit permission is intolerably far off - * with respect to the clock of the exchange. - */ - TALER_EC_DEPOSIT_INVALID_TIMESTAMP = 1218, - - /** - * Validity period of the denomination key is in the future. Returned - * with an HTTP status of #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_DEPOSIT_DENOMINATION_VALIDITY_IN_FUTURE = 1219, - - /** - * Denomination key of the coin is past the deposit deadline. - * Returned with an HTTP status of #MHD_HTTP_GONE. - */ - TALER_EC_DEPOSIT_DENOMINATION_EXPIRED = 1220, - - /** - * The signature provided by the exchange is not valid. Error created - * client-side. - */ - TALER_EC_DEPOSIT_INVALID_SIGNATURE_BY_EXCHANGE = 1221, - - /** - * The currency specified for the deposit is different from the - * currency of the coin. This response is provided with HTTP status - * code #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_DEPOSIT_CURRENCY_MISMATCH = 1222, - - /** - * The respective coin did not have sufficient residual value for the - * /refresh/melt operation. The "history" in this response provdes - * the "residual_value" of the coin, which may be less than its - * "original_value". This response is provided with HTTP status code - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_MELT_INSUFFICIENT_FUNDS = 1300, - - /** - * The respective coin did not have sufficient residual value for the - * /refresh/melt operation. The "history" in this response provdes - * the "residual_value" of the coin, which may be less than its - * "original_value". This response is provided with HTTP status code - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_MELT_DENOMINATION_KEY_NOT_FOUND = 1301, - - /** - * The exchange had an internal error reconstructing the transaction - * history of the coin that was being melted. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_MELT_COIN_HISTORY_COMPUTATION_FAILED = 1302, - - /** - * The exchange failed to check against historic melt data from - * database (as part of ensuring the idempotency of the operation). - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_MELT_DB_FETCH_ERROR = 1303, - - /** - * The exchange failed to store session data in the database. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_MELT_DB_STORE_SESSION_ERROR = 1304, - - /** - * The exchange encountered melt fees exceeding the melted coin's - * contribution. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_MELT_FEES_EXCEED_CONTRIBUTION = 1305, - - /** - * The denomination key signature on the melted coin is invalid. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_MELT_DENOMINATION_SIGNATURE_INVALID = 1306, - - /** - * The signature made with the coin to be melted is invalid. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_MELT_COIN_SIGNATURE_INVALID = 1307, - - /** - * The exchange failed to obtain the transaction history of the given - * coin from the database while generating an insufficient funds - * errors. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_MELT_HISTORY_DB_ERROR_INSUFFICIENT_FUNDS = 1308, - - /** - * The denomination of the given coin has past its expiration date and - * it is also not a valid zombie (that is, was not refreshed with the - * fresh coin being subjected to recoup). - */ - TALER_EC_MELT_COIN_EXPIRED_NO_ZOMBIE = 1309, - - /** - * The signature returned by the exchange in a melt request was - * malformed. Error created client-side. - */ - TALER_EC_MELT_INVALID_SIGNATURE_BY_EXCHANGE = 1310, - - /** - * The currency specified for the melt amount is different from the - * currency of the coin. This response is provided with HTTP status - * code #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_MELT_CURRENCY_MISMATCH = 1311, - - /** - * The exchange is unaware of the denomination key that was used to - * sign the melted zombie coin. This response is provided with HTTP - * status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_REFRESH_RECOUP_DENOMINATION_KEY_NOT_FOUND = 1351, - - /** - * Validity period of the denomination key is in the future. Returned - * with an HTTP status of #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_REFRESH_RECOUP_DENOMINATION_VALIDITY_IN_FUTURE = 1352, - - /** - * Denomination key of the coin is past the deposit deadline. - * Returned with an HTTP status of #MHD_HTTP_GONE. - */ - TALER_EC_REFRESH_RECOUP_DENOMINATION_EXPIRED = 1353, - - /** - * Denomination key of the coin is past the deposit deadline. - * Returned with an HTTP status of #MHD_HTTP_GONE. - */ - TALER_EC_REFRESH_ZOMBIE_DENOMINATION_EXPIRED = 1354, - - /** - * The provided transfer keys do not match up with the original - * commitment. Information about the original commitment is included - * in the response. This response is provided with HTTP status code - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_REVEAL_COMMITMENT_VIOLATION = 1370, - - /** - * Failed to produce the blinded signatures over the coins to be - * returned. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REVEAL_SIGNING_ERROR = 1371, - - /** - * The exchange is unaware of the refresh session specified in the - * request. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_SESSION_UNKNOWN = 1372, - - /** - * The exchange failed to retrieve valid session data from the - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REVEAL_DB_FETCH_SESSION_ERROR = 1373, - - /** - * The exchange failed to retrieve previously revealed data from the - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REVEAL_DB_FETCH_REVEAL_ERROR = 1374, - - /** - * The exchange failed to retrieve commitment data from the database. - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REVEAL_DB_COMMIT_ERROR = 1375, - - /** - * The size of the cut-and-choose dimension of the private transfer - * keys request does not match #TALER_CNC_KAPPA - 1. This response is - * provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_CNC_TRANSFER_ARRAY_SIZE_INVALID = 1376, - - /** - * The number of coins to be created in refresh exceeds the limits of - * the exchange. private transfer keys request does not match - * #TALER_CNC_KAPPA - 1. This response is provided with HTTP status - * code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_NEW_DENOMS_ARRAY_SIZE_EXCESSIVE = 1377, - - /** - * The number of envelopes given does not match the number of - * denomination keys given. This response is provided with HTTP status - * code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_NEW_DENOMS_ARRAY_SIZE_MISMATCH = 1378, - - /** - * The exchange encountered a numeric overflow totaling up the cost - * for the refresh operation. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REVEAL_COST_CALCULATION_OVERFLOW = 1379, - - /** - * The exchange's cost calculation shows that the melt amount is below - * the costs of the transaction. This response is provided with HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_AMOUNT_INSUFFICIENT = 1380, - - /** - * The exchange is unaware of the denomination key that was requested - * for one of the fresh coins. This response is provided with HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_FRESH_DENOMINATION_KEY_NOT_FOUND = 1381, - - /** - * The signature made with the coin over the link data is invalid. - * This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REVEAL_LINK_SIGNATURE_INVALID = 1382, - - /** - * The exchange failed to generate the signature as it could not find - * the signing key for the denomination. This response is provided - * with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REVEAL_KEYS_MISSING = 1383, - - /** - * The refresh session hash given to a /refreshes/ handler was - * malformed. - */ - TALER_EC_REVEAL_INVALID_RCH = 1384, - - /** - * The exchange responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_REVEAL_REPLY_MALFORMED = 1385, - - /** - * The coin specified in the link request is unknown to the exchange. - * This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_LINK_COIN_UNKNOWN = 1400, - - /** - * The exchange responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_LINK_REPLY_MALFORMED = 1401, - - /** - * The exchange knows literally nothing about the coin we were asked - * to refund. But without a transaction history, we cannot issue a - * refund. This is kind-of OK, the owner should just refresh it - * directly without executing the refund. This response is provided - * with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_REFUND_COIN_NOT_FOUND = 1500, - - /** - * We could not process the refund request as the coin's transaction - * history does not permit the requested refund at this time. The - * "history" in the response proves this. This response is provided - * with HTTP status code #MHD_HTTP_CONFLICT. - */ - TALER_EC_REFUND_CONFLICT = 1501, - - /** - * The exchange knows about the coin we were asked to refund, but not - * about the specific /deposit operation. Hence, we cannot issue a - * refund (as we do not know if this merchant public key is authorized - * to do a refund). This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_REFUND_DEPOSIT_NOT_FOUND = 1503, - - /** - * The currency specified for the refund is different from the - * currency of the coin. This response is provided with HTTP status - * code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REFUND_CURRENCY_MISMATCH = 1504, - - /** - * When we tried to check if we already paid out the coin, the - * exchange's database suddenly disagreed with data it previously - * provided (internal inconsistency). This response is provided with - * HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REFUND_DB_INCONSISTENT = 1505, - - /** - * The exchange can no longer refund the customer/coin as the money - * was already transferred (paid out) to the merchant. (It should be - * past the refund deadline.) This response is provided with HTTP - * status code #MHD_HTTP_GONE. - */ - TALER_EC_REFUND_MERCHANT_ALREADY_PAID = 1506, - - /** - * The amount the exchange was asked to refund exceeds (with fees) the - * total amount of the deposit (including fees). This response is - * provided with HTTP status code #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_REFUND_INSUFFICIENT_FUNDS = 1507, - - /** - * The exchange failed to recover information about the denomination - * key of the refunded coin (even though it recognizes the key). - * Hence it could not check the fee strucutre. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REFUND_DENOMINATION_KEY_NOT_FOUND = 1508, - - /** - * The refund fee specified for the request is lower than the refund - * fee charged by the exchange for the given denomination key of the - * refunded coin. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REFUND_FEE_TOO_LOW = 1509, - - /** - * The exchange failed to store the refund information to its - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REFUND_STORE_DB_ERROR = 1510, - - /** - * The refund fee is specified in a different currency than the refund - * amount. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REFUND_FEE_CURRENCY_MISMATCH = 1511, - - /** - * The refunded amount is smaller than the refund fee, which would - * result in a negative refund. This response is provided with HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REFUND_FEE_ABOVE_AMOUNT = 1512, - - /** - * The signature of the merchant is invalid. This response is provided - * with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_REFUND_MERCHANT_SIGNATURE_INVALID = 1513, - - /** - * Merchant backend failed to create the refund confirmation - * signature. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_REFUND_MERCHANT_SIGNING_FAILED = 1514, - - /** - * The signature returned by the exchange in a refund request was - * malformed. Error created client-side. - */ - TALER_EC_REFUND_INVALID_SIGNATURE_BY_EXCHANGE = 1515, - - /** - * The wire format specified in the "sender_account_details" is not - * understood or not supported by this exchange. Returned with an HTTP - * status code of #MHD_HTTP_NOT_FOUND. (As we did not find an - * interpretation of the wire format.) - */ - TALER_EC_ADMIN_ADD_INCOMING_WIREFORMAT_UNSUPPORTED = 1600, - - /** - * The currency specified in the "amount" parameter is not supported - * by this exhange. Returned with an HTTP status code of - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_ADMIN_ADD_INCOMING_CURRENCY_UNSUPPORTED = 1601, - - /** - * The exchange failed to store information about the incoming - * transfer in its database. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ADMIN_ADD_INCOMING_DB_STORE = 1602, - - /** - * The exchange encountered an error (that is not about not finding - * the wire transfer) trying to lookup a wire transfer identifier in - * the database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TRANSFERS_GET_DB_FETCH_FAILED = 1700, - - /** - * The exchange found internally inconsistent data when resolving a - * wire transfer identifier in the database. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TRANSFERS_GET_DB_INCONSISTENT = 1701, - - /** - * The exchange did not find information about the specified wire - * transfer identifier in the database. This response is provided - * with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_TRANSFERS_GET_WTID_NOT_FOUND = 1702, - - /** - * The exchange did not find information about the wire transfer fees - * it charged. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TRANSFERS_GET_WIRE_FEE_NOT_FOUND = 1703, - - /** - * The exchange found a wire fee that was above the total transfer - * value (and thus could not have been charged). This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TRANSFERS_GET_WIRE_FEE_INCONSISTENT = 1704, - - /** - * The exchange responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_TRANSFERS_GET_REPLY_MALFORMED = 1705, - - /** - * The exchange found internally inconsistent fee data when resolving - * a transaction in the database. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSITS_GET_DB_FEE_INCONSISTENT = 1800, - - /** - * The exchange encountered an error (that is not about not finding - * the transaction) trying to lookup a transaction in the database. - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSITS_GET_DB_FETCH_FAILED = 1801, - - /** - * The exchange did not find information about the specified - * transaction in the database. This response is provided with HTTP - * status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_DEPOSITS_GET_NOT_FOUND = 1802, - - /** - * The exchange failed to identify the wire transfer of the - * transaction (or information about the plan that it was supposed to - * still happen in the future). This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSITS_GET_WTID_RESOLUTION_ERROR = 1803, - - /** - * The signature of the merchant is invalid. This response is provided - * with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_DEPOSITS_GET_MERCHANT_SIGNATURE_INVALID = 1804, - - /** - * The given denomination key is not in the "recoup" set of the - * exchange right now. This response is provided with an HTTP status - * code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_RECOUP_DENOMINATION_KEY_UNKNOWN = 1850, - - /** - * The given coin signature is invalid for the request. This response - * is provided with an HTTP status code of #MHD_HTTP_FORBIDDEN. - */ - TALER_EC_RECOUP_SIGNATURE_INVALID = 1851, - - /** - * The signature of the denomination key over the coin is not valid. - * This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_RECOUP_DENOMINATION_SIGNATURE_INVALID = 1852, - - /** - * The exchange failed to access its own database about reserves. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RECOUP_DB_FETCH_FAILED = 1853, - - /** - * The exchange could not find the corresponding withdraw operation. - * The request is denied. This response is provided with an HTTP - * status code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_RECOUP_WITHDRAW_NOT_FOUND = 1854, - - /** - * The exchange obtained an internally inconsistent transaction - * history for the given coin. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RECOUP_HISTORY_DB_ERROR = 1855, - - /** - * The exchange failed to store information about the recoup to be - * performed in the database. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RECOUP_DB_PUT_FAILED = 1856, - - /** - * The coin's remaining balance is zero. The request is denied. This - * response is provided with an HTTP status code of - * #MHD_HTTP_FORBIDDEN. - */ - TALER_EC_RECOUP_COIN_BALANCE_ZERO = 1857, - - /** - * The exchange failed to reproduce the coin's blinding. This response - * is provided with an HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RECOUP_BLINDING_FAILED = 1858, - - /** - * The coin's remaining balance is zero. The request is denied. This - * response is provided with an HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR - */ - TALER_EC_RECOUP_COIN_BALANCE_NEGATIVE = 1859, - - /** - * Validity period of the denomination key is in the future. Returned - * with an HTTP status of #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_RECOUP_DENOMINATION_VALIDITY_IN_FUTURE = 1860, - - /** - * The exchange responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_RECOUP_REPLY_MALFORMED = 1861, - - /** - * The "have" parameter was not a natural number. This response is - * provied with an HTTP status code of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_KEYS_HAVE_NOT_NUMERIC = 1900, - - /** - * We currently cannot find any keys. This response is provied with an - * HTTP status code of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_KEYS_MISSING = 1901, - - /** - * This exchange does not allow clients to request /keys for times - * other than the current (exchange) time. This response is provied - * with an HTTP status code of #MHD_HTTP_FORBIDDEN. - */ - TALER_EC_KEYS_TIMETRAVEL_FORBIDDEN = 1902, - - /** - * The keys response was malformed. This error is generated client- - * side. - */ - TALER_EC_KEYS_INVALID = 1903, - - /** - * The backend could not find the merchant instance specified in the - * request. This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_INSTANCE_UNKNOWN = 2000, - - /** - * The backend lacks a wire transfer method configuration option for - * the given instance. - */ - TALER_EC_PROPOSAL_INSTANCE_CONFIGURATION_LACKS_WIRE = 2002, - - /** - * The merchant failed to provide a meaningful response to a /pay - * request. This error is created client-side. - */ - TALER_EC_PAY_MERCHANT_INVALID_RESPONSE = 2100, - - /** - * The exchange failed to provide a meaningful response to a /deposit - * request. This response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENCY, or #MHD_HTTP_CONFLICT in case the - * exchange reports #TALER_EC_DEPOSIT_INSUFFICIENT_FUNDS (aka double - * spending). - */ - TALER_EC_PAY_EXCHANGE_FAILED = 2101, - - /** - * The merchant failed to commit the exchanges' response to a /deposit - * request to its database. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_DB_STORE_PAY_ERROR = 2102, - - /** - * The specified exchange is not supported/trusted by this merchant. - * This response is provided with HTTP status code - * #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_PAY_EXCHANGE_REJECTED = 2103, - - /** - * The denomination key used for payment is not listed among the - * denomination keys of the exchange. This response is provided with - * HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PAY_DENOMINATION_KEY_NOT_FOUND = 2104, - - /** - * The denomination key used for payment is not audited by an auditor - * approved by the merchant. This response is provided with HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PAY_DENOMINATION_KEY_AUDITOR_FAILURE = 2105, - - /** - * There was an integer overflow totaling up the amounts or deposit - * fees in the payment. This response is provided with HTTP status - * code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_AMOUNT_OVERFLOW = 2106, - - /** - * The deposit fees exceed the total value of the payment. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PAY_FEES_EXCEED_PAYMENT = 2107, - - /** - * After considering deposit and wire fees, the payment is - * insufficient to satisfy the required amount for the contract. The - * client should revisit the logic used to calculate fees it must - * cover. This response is provided with HTTP status code - * #MHD_HTTP_ACCEPTED. - */ - TALER_EC_PAY_PAYMENT_INSUFFICIENT_DUE_TO_FEES = 2108, - - /** - * Even if we do not consider deposit and wire fees, the payment is - * insufficient to satisfy the required amount for the contract. This - * response is provided with HTTP status code #MHD_HTTP_ACCEPTED. - */ - TALER_EC_PAY_PAYMENT_INSUFFICIENT = 2109, - - /** - * The signature over the contract of one of the coins was invalid. - * This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PAY_COIN_SIGNATURE_INVALID = 2110, - - /** - * We failed to contact the exchange for the /pay request. This - * response is provided with HTTP status code - * #MHD_HTTP_REQUEST_TIMEOUT. - */ - TALER_EC_PAY_EXCHANGE_TIMEOUT = 2111, - - /** - * When we tried to find information about the exchange to issue the - * deposit, we failed. This usually only happens if the merchant - * backend is somehow unable to get its own HTTP client logic to work. - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_EXCHANGE_LOOKUP_FAILED = 2112, - - /** - * The refund deadline in the contract is after the transfer deadline. - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR as this should have been caught - * when the offer was first setup. - */ - TALER_EC_PAY_REFUND_DEADLINE_PAST_WIRE_TRANSFER_DEADLINE = 2114, - - /** - * The request fails to provide coins for the payment. This response - * is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PAY_COINS_ARRAY_EMPTY = 2115, - - /** - * The merchant failed to fetch the contract terms from the merchant's - * database. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_DB_FETCH_PAY_ERROR = 2116, - - /** - * The merchant failed to fetch the merchant's previous state with - * respect to transactions from its database. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_DB_FETCH_TRANSACTION_ERROR = 2117, - - /** - * The merchant failed to store the merchant's state with respect to - * the transaction in its database. This response is provided with - * HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_DB_STORE_TRANSACTION_ERROR = 2119, - - /** - * The exchange failed to provide a valid response to the merchant's - * /keys request. This response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENDCY. - */ - TALER_EC_PAY_EXCHANGE_KEYS_FAILURE = 2120, - - /** - * The payment is too late, the offer has expired. This response is - * provided with HTTP status code #MHD_HTTP_GONE. - */ - TALER_EC_PAY_OFFER_EXPIRED = 2121, - - /** - * The "merchant" field is missing in the proposal data. This response - * is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PAY_MERCHANT_FIELD_MISSING = 2122, - - /** - * Failed computing a hash code (likely server out-of-memory). This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_FAILED_COMPUTE_PROPOSAL_HASH = 2123, - - /** - * Failed to locate merchant's account information matching the wire - * hash given in the proposal. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_WIRE_HASH_UNKNOWN = 2124, - - /** - * We got different currencies for the wire fee and the maximum wire - * fee. This response is provided with HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_WIRE_FEE_CURRENCY_MISMATCH = 2125, - - /** - * A unknown merchant public key was included in the payment. That - * happens typically when the wallet sends the payment to the wrong - * merchant instance. This response is provided with an HTTP status - * code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_PAY_WRONG_INSTANCE = 2127, - - /** - * The exchange failed to give us a response when we asked for /keys. - * This response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_PAY_EXCHANGE_HAS_NO_KEYS = 2128, - - /** - * The deposit time for the denomination has expired. This response is - * provided with HTTP status code #MHD_HTTP_GONE. - */ - TALER_EC_PAY_DENOMINATION_DEPOSIT_EXPIRED = 2129, - - /** - * The proposal is not known to the backend. This response is provided - * with an HTTP status code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_PAY_PROPOSAL_NOT_FOUND = 2130, - - /** - * The exchange of the deposited coin charges a wire fee that could - * not be added to the total (total amount too high). This response - * is provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_EXCHANGE_WIRE_FEE_ADDITION_FAILED = 2131, - - /** - * The contract was not fully paid because of refunds. Note that - * clients MAY treat this as paid if, for example, contracts must be - * executed despite of refunds. This response is provided with HTTP - * status code #MHD_HTTP_PAYMENT_REQUIRED. - */ - TALER_EC_PAY_REFUNDED = 2132, - - /** - * According to our database, we have refunded more than we were paid - * (which should not be possible). This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PAY_REFUNDS_EXCEED_PAYMENTS = 2133, - - /** - * Legacy stuff. Remove me with protocol v1. This response is provided - * with HTTP status code #MHD_HTTP_PREREQUISTE. - */ - TALER_EC_PAY_ABORT_REFUND_REFUSED_PAYMENT_COMPLETE = 2134, - - /** - * The merchant failed to contact the exchange. This response is - * provided with HTTP status code of #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_ABORT_EXCHANGE_KEYS_FAILURE = 2150, - - /** - * The merchant failed to send the exchange the refund request. This - * response is provided with HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ABORT_EXCHANGE_REFUND_FAILED = 2151, - - /** - * The merchant failed to find the exchange to process the lookup. - * This response is provided with HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ABORT_EXCHANGE_LOOKUP_FAILED = 2152, - - /** - * The merchant failed to store the abort request in its database. - * This response is provided with HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ABORT_DB_STORE_ABORT_ERROR = 2153, - - /** - * The merchant failed to repeatedly serialize the transaction. This - * response is provided with HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ABORT_DB_STORE_TRANSACTION_ERROR = 2154, - - /** - * The merchant failed in the lookup part of the transaction. This - * response is provided with HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ABORT_DB_FETCH_TRANSACTION_ERROR = 2155, - - /** - * The merchant could not find the contract. This response is provided - * with HTTP status code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_ABORT_CONTRACT_NOT_FOUND = 2156, - - /** - * The payment was already completed and thus cannot be aborted - * anymore. This response is provided with HTTP status code of - * #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_ABORT_REFUND_REFUSED_PAYMENT_COMPLETE = 2157, - - /** - * The hash provided by the wallet does not match the order. This - * response is provided with HTTP status code of #MHD_HTTP_FORBIDDEN. - */ - TALER_EC_ABORT_CONTRACT_HASH_MISSMATCH = 2158, - - /** - * The array of coins cannot be empty. This response is provided with - * HTTP status code of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_ABORT_COINS_ARRAY_EMPTY = 2159, - - /** - * The merchant experienced a timeout processing the request. This - * response is provided with HTTP status code of - * #MHD_HTTP_REQUEST_TIMEOUT. - */ - TALER_EC_ABORT_EXCHANGE_TIMEOUT = 2160, - - /** - * Integer overflow with specified timestamp argument detected. This - * response is provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_HISTORY_TIMESTAMP_OVERFLOW = 2200, - - /** - * Failed to retrieve history from merchant database. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_HISTORY_DB_FETCH_ERROR = 2201, - - /** - * The backend could not find the contract specified in the request. - * This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_POLL_PAYMENT_CONTRACT_NOT_FOUND = 2250, - - /** - * The response provided by the merchant backend was malformed. This - * error is created client-side. - */ - TALER_EC_POLL_PAYMENT_REPLY_MALFORMED = 2251, - - /** - * We failed to contact the exchange for the /track/transaction - * request. This response is provided with HTTP status code - * #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_TRACK_TRANSACTION_EXCHANGE_TIMEOUT = 2300, - - /** - * We failed to get a valid /keys response from the exchange for the - * /track/transaction request. This response is provided with HTTP - * status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TRACK_TRANSACTION_EXCHANGE_KEYS_FAILURE = 2301, - - /** - * The backend could not find the transaction specified in the - * request. This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_TRACK_TRANSACTION_TRANSACTION_UNKNOWN = 2302, - - /** - * The backend had a database access error trying to retrieve - * transaction data from its database. The response is provided with - * HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TRACK_TRANSACTION_DB_FETCH_TRANSACTION_ERROR = 2303, - - /** - * The backend had a database access error trying to retrieve payment - * data from its database. The response is provided with HTTP status - * code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TRACK_TRANSACTION_DB_FETCH_PAYMENT_ERROR = 2304, - - /** - * The backend found no applicable deposits in the database. This is - * odd, as we know about the transaction, but not about deposits we - * made for the transaction. The response is provided with HTTP - * status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_TRACK_TRANSACTION_DB_NO_DEPOSITS_ERROR = 2305, - - /** - * We failed to obtain a wire transfer identifier for one of the coins - * in the transaction. The response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENCY if the exchange had a hard error, or - * #MHD_HTTP_ACCEPTED if the exchange signaled that the transfer was - * in progress. - */ - TALER_EC_TRACK_TRANSACTION_COIN_TRACE_ERROR = 2306, - - /** - * We failed to obtain the full wire transfer identifier for the - * transfer one of the coins was aggregated into. The response is - * provided with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TRACK_TRANSACTION_WIRE_TRANSFER_TRACE_ERROR = 2307, - - /** - * We got conflicting reports from the exhange with respect to which - * transfers are included in which aggregate. The response is provided - * with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TRACK_TRANSACTION_CONFLICTING_REPORTS = 2308, - - /** - * We did failed to retrieve information from our database. The - * response is provided with an HTTP status of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_GET_TRANSFERS_DB_FETCH_ERROR = 2350, - - /** - * We failed to contact the exchange for the /track/transfer request. - * This response is provided with HTTP status code - * #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_POST_TRANSFERS_EXCHANGE_TIMEOUT = 2400, - - /** - * We failed to obtain an acceptable /keys response from the exchange - * for the /track/transfer request. This response is provided with - * HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_POST_TRANSFERS_EXCHANGE_KEYS_FAILURE = 2401, - - /** - * We failed to persist coin wire transfer information in our merchant - * database. The response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_DB_STORE_COIN_ERROR = 2402, - - /** - * We internally failed to execute the /track/transfer request. The - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_REQUEST_ERROR = 2403, - - /** - * We failed to persist wire transfer information in our merchant - * database. The response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_DB_STORE_TRANSFER_ERROR = 2404, - - /** - * The exchange returned an error from /track/transfer. The response - * is provided with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_POST_TRANSFERS_EXCHANGE_ERROR = 2405, - - /** - * We failed to fetch deposit information from our merchant database. - * The response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_DB_FETCH_DEPOSIT_ERROR = 2406, - - /** - * We encountered an internal logic error. The response is provided - * with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_DB_INTERNAL_LOGIC_ERROR = 2407, - - /** - * The exchange gave conflicting information about a coin which has - * been wire transferred. The response is provided with HTTP status - * code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_POST_TRANSFERS_CONFLICTING_REPORTS = 2408, - - /** - * The merchant backend had problems in creating the JSON response. - */ - TALER_EC_POST_TRANSFERS_JSON_RESPONSE_ERROR = 2409, - - /** - * The exchange charged a different wire fee than what it originally - * advertised, and it is higher. The response is provided with an - * HTTP status of #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_POST_TRANSFERS_JSON_BAD_WIRE_FEE = 2410, - - /** - * We did not find the account that the transfer was made to. The - * response is provided with an HTTP status of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_POST_TRANSFERS_ACCOUNT_NOT_FOUND = 2411, - - /** - * We did failed to store information in our database. The response is - * provided with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_DB_STORE_ERROR = 2412, - - /** - * We did failed to retrieve information from our database. The - * response is provided with an HTTP status of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_TRANSFERS_DB_LOOKUP_ERROR = 2413, - - /** - * The merchant backend cannot create an instance under the given - * identifier as one already exists. Use PATCH to modify the existing - * entry. The response is provied with an HTTP status of - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_POST_INSTANCES_ALREADY_EXISTS = 2450, - - /** - * The merchant backend cannot create an instance because the - * specified bank accounts are somehow invalid. The response is - * provied with an HTTP status of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_POST_INSTANCES_BAD_PAYTO_URIS = 2451, - - /** - * The merchant backend cannot create an instance because it failed to - * start the database transaction. The response is provied with an - * HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_INSTANCES_DB_START_ERROR = 2452, - - /** - * The merchant backend cannot create an instance because it failed to - * commit the database transaction. The response is provied with an - * HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_POST_INSTANCES_DB_COMMIT_ERROR = 2453, - - /** - * The merchant backend cannot delete an instance because it failed to - * commit the database transaction. The response is provied with an - * HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DELETE_INSTANCES_ID_DB_HARD_FAILURE = 2454, - - /** - * The merchant backend cannot delete the data because it already does - * not exist. The response is provied with an HTTP status of - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_DELETE_INSTANCES_ID_NO_SUCH_INSTANCE = 2455, - - /** - * The merchant backend cannot update an instance because the - * specified bank accounts are somehow invalid. The response is - * provied with an HTTP status of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PATCH_INSTANCES_BAD_PAYTO_URIS = 2456, - - /** - * The merchant backend cannot patch an instance because it failed to - * start the database transaction. The response is provied with an - * HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PATCH_INSTANCES_DB_START_ERROR = 2457, - - /** - * The merchant backend cannot patch an instance because it failed to - * commit the database transaction. The response is provied with an - * HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PATCH_INSTANCES_DB_COMMIT_ERROR = 2458, - - /** - * The hash provided in the request of /map/in does not match the - * contract sent alongside in the same request. - */ - TALER_EC_MAP_IN_UNMATCHED_HASH = 2500, - - /** - * The backend encountered an error while trying to store the - * h_contract_terms into the database. The response is provided with - * HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PROPOSAL_STORE_DB_ERROR = 2501, - - /** - * The backend encountered an error while trying to retrieve the - * proposal data from database. Likely to be an internal error. The - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PROPOSAL_LOOKUP_DB_ERROR = 2502, - - /** - * The proposal being looked up is not found on this merchant. - * Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND - */ - TALER_EC_PROPOSAL_LOOKUP_NOT_FOUND = 2503, - - /** - * The proposal had no timestamp and the backend failed to obtain the - * local time. Likely to be an internal error. The response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PROPOSAL_NO_LOCALTIME = 2504, - - /** - * The order provided to the backend could not be parsed, some - * required fields were missing or ill-formed. Returned with an HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PROPOSAL_ORDER_PARSE_ERROR = 2505, - - /** - * The backend encountered an error while trying to find the existing - * proposal in the database. The response is provided with HTTP status - * code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PROPOSAL_STORE_DB_ERROR_HARD = 2506, - - /** - * The backend encountered an error while trying to find the existing - * proposal in the database. The response is provided with HTTP status - * code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PROPOSAL_STORE_DB_ERROR_SOFT = 2507, - - /** - * The backend encountered an error: the proposal already exists. The - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PROPOSAL_STORE_DB_ERROR_ALREADY_EXISTS = 2508, - - /** - * The order provided to the backend uses an amount in a currency that - * does not match the backend's configuration. Returned with HTTP - * status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_PROPOSAL_ORDER_BAD_CURRENCY = 2509, - - /** - * The response provided by the merchant backend was malformed. This - * error is created client-side. - */ - TALER_EC_PROPOSAL_REPLY_MALFORMED = 2510, - - /** - * The order provided to the backend could not be deleted, it is not - * known. Returned with an HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_ORDERS_DELETE_NO_SUCH_ORDER = 2511, - - /** - * The order provided to the backend could not be deleted, our offer - * is still valid and awaiting payment. Returned with an HTTP status - * code #MHD_HTTP_CONFLICT. - */ - TALER_EC_ORDERS_DELETE_AWAITING_PAYMENT = 2512, - - /** - * The order provided to the backend could not be deleted, due to a - * database error. Returned with an HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ORDERS_DELETE_DB_HARD_FAILURE = 2513, - - /** - * The order provided to the backend could not be completed, due to a - * database error trying to fetch product inventory data. Returned - * with an HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ORDERS_LOOKUP_PRODUCT_DB_HARD_FAILURE = 2514, - - /** - * The order provided to the backend could not be completed, due to a - * database serialization error (which should be impossible) trying to - * fetch product inventory data. Returned with an HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ORDERS_LOOKUP_PRODUCT_DB_SOFT_FAILURE = 2515, - - /** - * The order provided to the backend could not be completed, because a - * product to be completed via inventory data is not actually in our - * inventory. Returned with an HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_ORDERS_LOOKUP_PRODUCT_NOT_FOUND = 2516, - - /** - * We could not obtain a list of all orders because of a database - * failure. Returned with an HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ORDERS_GET_DB_LOOKUP_ERROR = 2517, - - /** - * We could not claim the order because of a database failure. - * Returned with an HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ORDERS_CLAIM_HARD_DB_ERROR = 2518, - - /** - * We could not claim the order because of a database serialization - * failure. Returned with an HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_ORDERS_CLAIM_SOFT_DB_ERROR = 2519, - - /** - * We could not claim the order because the backend is unaware of it. - * Returned with an HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_ORDERS_CLAIM_NOT_FOUND = 2520, - - /** - * We could not claim the order because someone else claimed it first. - * Returned with an HTTP status code #MHD_HTTP_CONFLICT. - */ - TALER_EC_ORDERS_ALREADY_CLAIMED = 2521, - - /** - * The merchant backend failed to lookup the products. The response is - * provied with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_GET_PRODUCTS_DB_LOOKUP_ERROR = 2550, - - /** - * The merchant backend failed to start the transaction. The response - * is provied with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PRODUCTS_POST_DB_START_ERROR = 2551, - - /** - * The product ID exists. The response is provied with an HTTP status - * of #MHD_HTTP_CONFLICT. - */ - TALER_EC_PRODUCTS_POST_CONFLICT_PRODUCT_EXISTS = 2552, - - /** - * The merchant backend failed to serialize the transaction. The - * response is provied with an HTTP status of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PRODUCTS_POST_DB_COMMIT_SOFT_ERROR = 2553, - - /** - * The merchant backend failed to commit the transaction. The response - * is provied with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PRODUCTS_POST_DB_COMMIT_HARD_ERROR = 2554, - - /** - * The merchant backend failed to commit the transaction. The response - * is provied with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PRODUCTS_PATCH_DB_COMMIT_HARD_ERROR = 2555, - - /** - * The merchant backend did not find the product to be updated. The - * response is provied with an HTTP status of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_PRODUCTS_PATCH_UNKNOWN_PRODUCT = 2556, - - /** - * The update would have reduced the total amount of product lost, - * which is not allowed. The response is provied with an HTTP status - * of #MHD_HTTP_CONFLICT. - */ - TALER_EC_PRODUCTS_PATCH_TOTAL_LOST_REDUCED = 2557, - - /** - * The update would have mean that more stocks were lost than what - * remains from total inventory after sales, which is not allowed. The - * response is provied with an HTTP status of #MHD_HTTP_CONFLICT. - */ - TALER_EC_PRODUCTS_PATCH_TOTAL_LOST_EXCEEDS_STOCKS = 2558, - - /** - * The update would have reduced the total amount of product in stock, - * which is not allowed. The response is provied with an HTTP status - * of #MHD_HTTP_CONFLICT. - */ - TALER_EC_PRODUCTS_PATCH_TOTAL_STOCKED_REDUCED = 2559, - - /** - * The lock request is for more products than we have left (unlocked) - * in stock. The response is provied with an HTTP status of - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_PRODUCTS_LOCK_INSUFFICIENT_STOCKS = 2560, - - /** - * The lock request is for an unknown product. The response is provied - * with an HTTP status of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_PRODUCTS_LOCK_UNKNOWN_PRODUCT = 2561, - - /** - * The deletion request resulted in a hard database error. The - * response is provied with an HTTP status of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_PRODUCTS_DELETE_DB_HARD_FAILURE = 2562, - - /** - * The deletion request was for a product unknown to the backend. The - * response is provied with an HTTP status of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_PRODUCTS_DELETE_NO_SUCH_PRODUCT = 2563, - - /** - * The deletion request is for a product that is locked. The response - * is provied with an HTTP status of #MHD_HTTP_CONFLICT. - */ - TALER_EC_PRODUCTS_DELETE_CONFLICTING_LOCK = 2564, - - /** - * The merchant returned a malformed response. Error created client- - * side. - */ - TALER_EC_REFUND_LOOKUP_INVALID_RESPONSE = 2600, - - /** - * The frontend gave an unknown order id to issue the refund to. - */ - TALER_EC_REFUND_ORDER_ID_UNKNOWN = 2601, - - /** - * The amount to be refunded is inconsistent: either is lower than the - * previous amount being awarded, or it is too big to be paid back. In - * this second case, the fault stays on the business dept. side. - * Returned with an HTTP status of #MHD_HTTP_CONFLICT. - */ - TALER_EC_REFUND_INCONSISTENT_AMOUNT = 2602, - - /** - * The backend encountered an error while trying to retrieve the - * payment data from database. Likely to be an internal error. - */ - TALER_EC_REFUND_LOOKUP_DB_ERROR = 2603, - - /** - * The backend encountered an error while trying to retrieve the - * payment data from database. Likely to be an internal error. - */ - TALER_EC_REFUND_MERCHANT_DB_COMMIT_ERROR = 2604, - - /** - * Payments are stored in a single db transaction; this error - * indicates that one db operation within that transaction failed. - * This might involve storing of coins or other related db operations, - * like starting/committing the db transaction or marking a contract - * as paid. - */ - TALER_EC_PAY_DB_STORE_PAYMENTS_ERROR = 2605, - - /** - * The backend failed to sign the refund request. - */ - TALER_EC_PAY_REFUND_SIGNATURE_FAILED = 2606, - - /** - * The merchant backend is not available of any applicable refund(s) - * for this order. Returned with an HTTP status of - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_REFUND_LOOKUP_NO_REFUND = 2607, - - /** - * The requested wire method is not supported by the exchange. - * Returned with an HTTP status of #MHD_HTTP_CONFLICT. - */ - TALER_EC_RESERVES_POST_UNSUPPORTED_WIRE_METHOD = 2650, - - /** - * The backend failed to commit the result to the database. Returned - * with an HTTP status of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RESERVES_POST_DB_COMMIT_HARD_ERROR = 2651, - - /** - * The backend failed to fetch the requested information from the - * database. Returned with an HTTP status of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_GET_RESERVES_DB_LOOKUP_ERROR = 2652, - - /** - * The backend knows the instance that was supposed to support the - * tip, but it was not configured for tipping (i.e. has no exchange - * associated with it). Likely to be a configuration error. Returned - * with an HTTP status code of #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_TIP_AUTHORIZE_INSTANCE_DOES_NOT_TIP = 2701, - - /** - * The reserve that was used to fund the tips has expired. Returned - * with an HTTP status code of #MHD_HTTP_GONE. - */ - TALER_EC_TIP_AUTHORIZE_RESERVE_EXPIRED = 2702, - - /** - * The reserve that was used to fund the tips was not found in the DB. - * Returned with an HTTP status code of #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_TIP_AUTHORIZE_RESERVE_UNKNOWN = 2703, - - /** - * The backend knows the instance that was supposed to support the - * tip, and it was configured for tipping. However, the funds - * remaining are insufficient to cover the tip, and the merchant - * should top up the reserve. Returned with an HTTP status code of - * #MHD_HTTP_PRECONDITION FAILED. - */ - TALER_EC_TIP_AUTHORIZE_INSUFFICIENT_FUNDS = 2704, - - /** - * The backend had trouble accessing the database to persist - * information about the tip authorization. Returned with an HTTP - * status code of internal error. - */ - TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR = 2705, - - /** - * The backend had trouble accessing the database to persist - * information about the tip authorization. The problem might be - * fixable by repeating the transaction. - */ - TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR = 2706, - - /** - * The backend failed to obtain a reserve status from the exchange. - * This response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_STATUS_FAILED_EXCHANGE_DOWN = 2707, - - /** - * The backend got an empty (!) reserve history from the exchange. - * This response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_FAILED_EMPTY = 2708, - - /** - * The backend got an invalid reserve history (fails to start with a - * deposit) from the exchange. This response is provided with HTTP - * status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_INVALID_NO_DEPOSIT = 2709, - - /** - * The backend got an 404 response from the exchange when it inquired - * about the reserve history. The response is provided with HTTP - * status code #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_TIP_QUERY_RESERVE_UNKNOWN_TO_EXCHANGE = 2710, - - /** - * The backend got a reserve with a currency that does not match the - * backend's currency. The response is provided with HTTP status code - * #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_TIP_QUERY_RESERVE_CURRENCY_MISMATCH = 2711, - - /** - * The backend got a reserve history with amounts it cannot process - * (addition failure in deposits). The response is provided with HTTP - * status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_ARITHMETIC_ISSUE_DEPOSIT = 2712, - - /** - * The backend got a reserve history with amounts it cannot process - * (addition failure in withdraw amounts). The response is provided - * with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_ARITHMETIC_ISSUE_WITHDRAW = 2713, - - /** - * The backend got a reserve history with amounts it cannot process - * (addition failure in closing amounts). The response is provided - * with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_ARITHMETIC_ISSUE_CLOSED = 2714, - - /** - * The backend got a reserve history with inconsistent amounts. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_ARITHMETIC_ISSUE_INCONSISTENT = 2715, - - /** - * The backend encountered a database error querying tipping reserves. - */ - TALER_EC_TIP_QUERY_DB_ERROR = 2716, - - /** - * The backend got an unexpected resever history reply from the - * exchange. This response is provided with HTTP status code - * #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_FAILED = 2717, - - /** - * The backend got a reserve history with amounts it cannot process - * (addition failure in withdraw amounts). The response is provided - * with HTTP status code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_QUERY_RESERVE_HISTORY_ARITHMETIC_ISSUE_RECOUP = 2718, - - /** - * The backend knows the instance that was supposed to support the - * tip, but it was not configured for tipping (i.e. has no exchange - * associated with it). Likely to be a configuration error. Returned - * with an HTTP status code of #MHD_HTTP_PRECONDITION_FAILED. - */ - TALER_EC_TIP_QUERY_INSTANCE_DOES_NOT_TIP = 2719, - - /** - * The tip id is unknown. This could happen if the tip id is wrong or - * the tip authorization expired. - */ - TALER_EC_TIP_QUERY_TIP_ID_UNKNOWN = 2720, - - /** - * The reserve could not be deleted due to a database failure. - * Returned with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_RESERVES_DELETE_DB_HARD_FAILURE = 2721, - - /** - * The reserve could not be deleted because it is unknown. Returned - * with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_RESERVES_DELETE_NO_SUCH_RESERVE = 2722, - - /** - * The backend got an unexpected error trying to lookup reserve - * details from the backend. This response is provided with HTTP - * status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_LOOKUP_RESERVE_DB_FAILURE = 2723, - - /** - * The backend repeatedly failed to serialize the transaction to - * authorize the tip. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_AUTHORIZE_DB_SERIALIZATION_FAILURE = 2724, - - /** - * The backend failed to start the transaction to authorize the tip. - * This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_AUTHORIZE_DB_START_FAILURE = 2725, - - /** - * The backend failed looking up the reserve needed to authorize the - * tip. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_AUTHORIZE_DB_LOOKUP_RESERVE_FAILURE = 2726, - - /** - * The backend failed to find a reserve needed to authorize the tip. - * This response is provided with HTTP status code - * #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_TIP_AUTHORIZE_DB_RESERVE_NOT_FOUND = 2727, - - /** - * The backend encountered an internal invariant violation. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_AUTHORIZE_DB_RESERVE_INVARIANT_FAILURE = 2728, - - /** - * The selected exchange expired. This response is provided with HTTP - * status code #MHD_HTTP_GONE. - */ - TALER_EC_TIP_AUTHORIZE_DB_RESERVE_EXPIRED = 2729, - - /** - * The backend failed updating the reserve needed to authorize the - * tip. This response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_AUTHORIZE_DB_UPDATE_RESERVE_FAILURE = 2730, - - /** - * The backend had trouble accessing the database to persist - * information about enabling tips. Returned with an HTTP status code - * of internal error. - */ - TALER_EC_TIP_ENABLE_DB_TRANSACTION_ERROR = 2750, - - /** - * The tip ID is unknown. This could happen if the tip has expired. - * Returned with an HTTP status code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_TIP_PICKUP_TIP_ID_UNKNOWN = 2800, - - /** - * The amount requested exceeds the remaining tipping balance for this - * tip ID. Returned with an HTTP status code of "Conflict" (as it - * conflicts with a previous pickup operation). - */ - TALER_EC_TIP_PICKUP_NO_FUNDS = 2801, - - /** - * We encountered a DB error, repeating the request may work. - */ - TALER_EC_TIP_PICKUP_DB_ERROR_SOFT = 2802, - - /** - * We encountered a DB error, repeating the request will not help. - * This is an internal server error. - */ - TALER_EC_TIP_PICKUP_DB_ERROR_HARD = 2803, - - /** - * The same pickup ID was already used for picking up a different - * amount. This points to a very strange internal error as the pickup - * ID is derived from the denomination key which is tied to a - * particular amount. Hence this should also be an internal server - * error. - */ - TALER_EC_TIP_PICKUP_AMOUNT_CHANGED = 2804, - - /** - * We failed to contact the exchange to obtain the denomination keys. - * Returned with a response code #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_DOWN = 2805, - - /** - * We contacted the exchange to obtain any denomination keys, but got - * no valid keys. Returned with a response code - * #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_LACKED_KEYS = 2806, - - /** - * We contacted the exchange to obtain at least one of the - * denomination keys specified in the request. Returned with a - * response code "not found" (404). - */ - TALER_EC_TIP_PICKUP_EXCHANGE_LACKED_KEY = 2807, - - /** - * We encountered an arithmetic issue totaling up the amount to - * withdraw. Returned with a response code of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_AMOUNT_OVERFLOW = 2808, - - /** - * The number of planchets specified exceeded the limit. Returned with - * a response code of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_TOO_MANY_PLANCHETS = 2809, - - /** - * The merchant failed to initialize the withdraw operaiton. Returned - * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_PICKUP_WITHDRAW_FAILED = 2810, - - /** - * The merchant failed to initialize the withdraw operaiton. Returned - * with a response code of #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_PICKUP_WITHDRAW_FAILED_AT_EXCHANGE = 2811, - - /** - * The client failed to unblind the signature returned by the - * merchant. Generated client-side. - */ - TALER_EC_TIP_PICKUP_UNBLIND_FAILURE = 2812, - - /** - * Merchant failed to access its database to lookup the tip. Returned - * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_GET_TIPS_DB_LOOKUP_ERROR = 2813, - - /** - * Merchant failed find the tip in its database. Returned with a - * response code of #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_GET_TIPS_ID_UNKNOWN = 2814, - - /** - * The merchant failed to contact the exchange. Returned with a - * response code of #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_PICKUP_CONTACT_EXCHANGE_ERROR = 2815, - - /** - * The merchant failed to obtain keys from the exchange. Returned with - * a response code of #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_KEYS_ERROR = 2816, - - /** - * The merchant failed to store data in its own database. Returned - * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_PICKUP_DB_STORE_HARD_ERROR = 2817, - - /** - * The merchant failed to get a timely response from the exchange. - * Returned with a response code of #MHD_HTTP_REQUEST_TIMEOUT. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_TIMEOUT = 2818, - - /** - * The exchange returned a failure code for the withdraw operation. - * Returned with a response code of #MHD_HTTP_FAILED_DEPENDENCY. - */ - TALER_EC_TIP_PICKUP_EXCHANGE_ERROR = 2819, - - /** - * The merchant failed to add up the amounts to compute the pick up - * value. Returned with a response code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_PICKUP_SUMMATION_FAILED = 2820, - - /** - * The tip expired. Returned with a response code of #MHD_HTTP_GONE. - */ - TALER_EC_TIP_PICKUP_HAS_EXPIRED = 2821, - - /** - * The requested withdraw amount exceeds the amount remaining to be - * picked up. Returned with a response code of #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_TIP_PICKUP_AMOUNT_EXCEEDS_TIP_REMAINING = 2822, - - /** - * The merchant failed to store data in its own database. Returned - * with a response code of #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TIP_PICKUP_DB_STORE_SOFT_ERROR = 2823, - - /** - * The merchant did not find the specified denomination key in the - * exchange's key set. Returned with a response code of - * #MHD_HTTP_CONFLICT. - */ - TALER_EC_TIP_PICKUP_DENOMINATION_UNKNOWN = 2824, - - /** - * We failed to fetch contract terms from our merchant database. The - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_GET_ORDERS_DB_LOOKUP_ERROR = 2900, - - /** - * We failed to find the contract terms from our merchant database. - * The response is provided with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_GET_ORDERS_ID_UNKNOWN = 2901, - - /** - * The contract hash provided by the wallet does not match the order. - * The response is provided with HTTP status code #MHD_HTTP_FORBIDDEN. - */ - TALER_EC_GET_ORDERS_WRONG_CONTRACT = 2902, - - /** - * We failed to contract terms from our merchant database. The - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_CHECK_PAYMENT_DB_FETCH_CONTRACT_TERMS_ERROR = 2911, - - /** - * We failed to contract terms from our merchant database. The - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_CHECK_PAYMENT_DB_FETCH_ORDER_ERROR = 2912, - - /** - * The order id we're checking is unknown, likely the frontend did not - * create the order first. - */ - TALER_EC_CHECK_PAYMENT_ORDER_ID_UNKNOWN = 2913, - - /** - * Failed computing a hash code (likely server out-of-memory). This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_CHECK_PAYMENT_FAILED_COMPUTE_PROPOSAL_HASH = 2914, - - /** - * Signature "session_sig" failed to verify. This response is provided - * with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_CHECK_PAYMENT_SESSION_SIGNATURE_INVALID = 2915, - - /** - * The response we received from the merchant is malformed. This error - * is generated client-side. - */ - TALER_EC_CHECK_PAYMENT_RESPONSE_MALFORMED = 2916, - - /** - * The signature from the exchange on the deposit confirmation is - * invalid. Returned with a "400 Bad Request" status code. - */ - TALER_EC_DEPOSIT_CONFIRMATION_SIGNATURE_INVALID = 3000, - - /** - * The auditor had trouble storing the deposit confirmation in its - * database. Returned with an HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_DEPOSIT_CONFIRMATION_STORE_DB_ERROR = 3001, - - /** - * The auditor had trouble retrieving the exchange list from its - * database. Returned with an HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_LIST_EXCHANGES_DB_ERROR = 3002, - - /** - * The auditor had trouble storing an exchange in its database. - * Returned with an HTTP status code of - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_AUDITOR_EXCHANGE_STORE_DB_ERROR = 3003, - - /** - * The auditor (!) responded with a reply that did not satsify the - * protocol. This error is not used in the protocol but created - * client-side. - */ - TALER_EC_AUDITOR_EXCHANGES_REPLY_MALFORMED = 3004, - - /** - * The exchange failed to compute ECDH. This response is provided - * with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TEST_ECDH_ERROR = 4000, - - /** - * The EdDSA test signature is invalid. This response is provided - * with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_TEST_EDDSA_INVALID = 4001, - - /** - * The exchange failed to compute the EdDSA test signature. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TEST_EDDSA_ERROR = 4002, - - /** - * The exchange failed to generate an RSA key. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TEST_RSA_GEN_ERROR = 4003, - - /** - * The exchange failed to compute the public RSA key. This response - * is provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TEST_RSA_PUB_ERROR = 4004, - - /** - * The exchange failed to compute the RSA signature. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_TEST_RSA_SIGN_ERROR = 4005, - - /** - * The JSON in the server's response was malformed. This response is - * provided with HTTP status code of 0. - */ - TALER_EC_SERVER_JSON_INVALID = 5000, - - /** - * A signature in the server's response was malformed. This response - * is provided with HTTP status code of 0. - */ - TALER_EC_SERVER_SIGNATURE_INVALID = 5001, - - /** - * Wire transfer attempted with credit and debit party being the same - * bank account. - */ - TALER_EC_BANK_SAME_ACCOUNT = 5102, - - /** - * Wire transfer impossible, due to financial limitation of the party - * that attempted the payment. - */ - TALER_EC_BANK_UNALLOWED_DEBIT = 5103, - - /** - * Arithmetic operation between two amounts of different currency was - * attempted. - */ - TALER_EC_BANK_CURRENCY_MISMATCH = 5104, - - /** - * At least one GET parameter was either missing or invalid for the - * requested operation. - */ - TALER_EC_BANK_PARAMETER_MISSING_OR_INVALID = 5105, - - /** - * JSON body sent was invalid for the requested operation. - */ - TALER_EC_BANK_JSON_INVALID = 5106, - - /** - * Negative number was used (as value and/or fraction) to initiate a - * Amount object. - */ - TALER_EC_BANK_NEGATIVE_NUMBER_AMOUNT = 5107, - - /** - * A number too big was used (as value and/or fraction) to initiate a - * amount object. - */ - TALER_EC_BANK_NUMBER_TOO_BIG = 5108, - - /** - * Could not login for the requested operation. - */ - TALER_EC_BANK_LOGIN_FAILED = 5109, - - /** - * The bank account referenced in the requested operation was not - * found. Returned along "400 Not found". - */ - TALER_EC_BANK_UNKNOWN_ACCOUNT = 5110, - - /** - * The transaction referenced in the requested operation (typically a - * reject operation), was not found. - */ - TALER_EC_BANK_TRANSACTION_NOT_FOUND = 5111, - - /** - * Bank received a malformed amount string. - */ - TALER_EC_BANK_BAD_FORMAT_AMOUNT = 5112, - - /** - * The client does not own the account credited by the transaction - * which is to be rejected, so it has no rights do reject it. To be - * returned along HTTP 403 Forbidden. - */ - TALER_EC_BANK_REJECT_NO_RIGHTS = 5200, - - /** - * This error code is returned when no known exception types captured - * the exception, and comes along with a 500 Internal Server Error. - */ - TALER_EC_BANK_UNMANAGED_EXCEPTION = 5300, - - /** - * This error code is used for all those exceptions that do not really - * need a specific error code to return to the client, but need to - * signal the middleware that the bank is not responding with 500 - * Internal Server Error. Used for example when a client is trying to - * register with a unavailable username. - */ - TALER_EC_BANK_SOFT_EXCEPTION = 5400, - - /** - * The request UID for a request to transfer funds has already been - * used, but with different details for the transfer. - */ - TALER_EC_BANK_TRANSFER_REQUEST_UID_REUSED = 5500, - - /** - * The sync service failed to access its database. This response is - * provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_SYNC_DB_FETCH_ERROR = 6000, - - /** - * The sync service failed find the record in its database. This - * response is provided with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_SYNC_BACKUP_UNKNOWN = 6001, - - /** - * The sync service failed find the account in its database. This - * response is provided with HTTP status code #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_SYNC_ACCOUNT_UNKNOWN = 6002, - - /** - * The SHA-512 hash provided in the If-None-Match header is malformed. - * This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_SYNC_BAD_IF_NONE_MATCH = 6003, - - /** - * The SHA-512 hash provided in the If-Match header is malformed or - * missing. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_SYNC_BAD_IF_MATCH = 6004, - - /** - * The signature provided in the "Sync-Signature" header is malformed - * or missing. This response is provided with HTTP status code - * #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_SYNC_BAD_SYNC_SIGNATURE = 6005, - - /** - * The signature provided in the "Sync-Signature" header does not - * match the account, old or new Etags. This response is provided with - * HTTP status code #MHD_HTTP_FORBIDDEN. - */ - TALER_EC_SYNC_INVALID_SIGNATURE = 6007, - - /** - * The "Content-length" field for the upload is either not a number, - * or too big, or missing. This response is provided with HTTP status - * code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_SYNC_BAD_CONTENT_LENGTH = 6008, - - /** - * The "Content-length" field for the upload is too big based on the - * server's terms of service. This response is provided with HTTP - * status code #MHD_HTTP_PAYLOAD_TOO_LARGE. - */ - TALER_EC_SYNC_EXCESSIVE_CONTENT_LENGTH = 6009, - - /** - * The server is out of memory to handle the upload. Trying again - * later may succeed. This response is provided with HTTP status code - * #MHD_HTTP_PAYLOAD_TOO_LARGE. - */ - TALER_EC_SYNC_OUT_OF_MEMORY_ON_CONTENT_LENGTH = 6010, - - /** - * The uploaded data does not match the Etag. This response is - * provided with HTTP status code #MHD_HTTP_BAD_REQUEST. - */ - TALER_EC_SYNC_INVALID_UPLOAD = 6011, - - /** - * We failed to check for existing upload data in the database. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_SYNC_DATABASE_FETCH_ERROR = 6012, - - /** - * HTTP server was being shutdown while this operation was pending. - * This response is provided with HTTP status code - * #MHD_HTTP_SERVICE_UNAVAILABLE. - */ - TALER_EC_SYNC_SHUTDOWN = 6013, - - /** - * HTTP server experienced a timeout while awaiting promised payment. - * This response is provided with HTTP status code - * #MHD_HTTP_REQUEST_TIMEOUT. - */ - TALER_EC_SYNC_PAYMENT_TIMEOUT = 6014, - - /** - * Sync could not store order data in its own database. This response - * is provided with HTTP status code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_SYNC_PAYMENT_CREATE_DB_ERROR = 6015, - - /** - * Sync could not store payment confirmation in its own database. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_SYNC_PAYMENT_CONFIRM_DB_ERROR = 6016, - - /** - * Sync could not fetch information about possible existing orders - * from its own database. This response is provided with HTTP status - * code #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_SYNC_PAYMENT_CHECK_ORDER_DB_ERROR = 6017, - - /** - * Sync could not setup the payment request with its own backend. This - * response is provided with HTTP status code - * #MHD_HTTP_INTERNAL_SERVER_ERROR. - */ - TALER_EC_SYNC_PAYMENT_CREATE_BACKEND_ERROR = 6018, - - /** - * The sync service failed find the backup to be updated in its - * database. This response is provided with HTTP status code - * #MHD_HTTP_NOT_FOUND. - */ - TALER_EC_SYNC_PREVIOUS_BACKUP_UNKNOWN = 6019, - - /** - * End of error code range. - */ - TALER_EC_END = 9999, - -}; - - -#endif -- cgit v1.2.3