diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/auditor/taler-helper-auditor-purses.c | 8 | ||||
-rw-r--r-- | src/exchange/taler-exchange-httpd_purses_deposit.c | 6 | ||||
-rw-r--r-- | src/exchange/taler-exchange-httpd_purses_get.c | 10 | ||||
-rw-r--r-- | src/exchangedb/pg_select_purse.c | 10 | ||||
-rw-r--r-- | src/exchangedb/pg_select_purse.h | 5 | ||||
-rw-r--r-- | src/exchangedb/pg_select_purse_merge.c | 23 | ||||
-rw-r--r-- | src/include/taler_exchangedb_plugin.h | 4 |
7 files changed, 45 insertions, 21 deletions
diff --git a/src/auditor/taler-helper-auditor-purses.c b/src/auditor/taler-helper-auditor-purses.c index e728df0ee..81291f97d 100644 --- a/src/auditor/taler-helper-auditor-purses.c +++ b/src/auditor/taler-helper-auditor-purses.c @@ -316,6 +316,11 @@ struct PurseSummary */ bool purse_deleted; + /** + * Was the purse refunded? FIXME: Not yet handled (do we need to?) + */ + bool purse_refunded; + }; @@ -416,7 +421,8 @@ setup_purse (struct PurseContext *pc, &ps->exchange_balance, &ps->h_contract_terms, &ps->merge_timestamp, - &ps->purse_deleted); + &ps->purse_deleted, + &ps->purse_refunded); if (0 >= qs) { GNUNET_free (ps); diff --git a/src/exchange/taler-exchange-httpd_purses_deposit.c b/src/exchange/taler-exchange-httpd_purses_deposit.c index 973dfccf1..8e4d5e41a 100644 --- a/src/exchange/taler-exchange-httpd_purses_deposit.c +++ b/src/exchange/taler-exchange-httpd_purses_deposit.c @@ -374,6 +374,7 @@ TEH_handler_purses_deposit ( struct GNUNET_TIME_Timestamp create_timestamp; struct GNUNET_TIME_Timestamp merge_timestamp; bool was_deleted; + bool was_refunded; qs = TEH_plugin->select_purse ( TEH_plugin->cls, @@ -384,7 +385,8 @@ TEH_handler_purses_deposit ( &pcc.deposit_total, &pcc.h_contract_terms, &merge_timestamp, - &was_deleted); + &was_deleted, + &was_refunded); switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: @@ -407,7 +409,7 @@ TEH_handler_purses_deposit ( case GNUNET_DB_STATUS_SUCCESS_ONE_RESULT: break; /* handled below */ } - if (GNUNET_TIME_absolute_is_past (pcc.purse_expiration.abs_time) || + if (was_refunded || was_deleted) { return TALER_MHD_reply_with_error ( diff --git a/src/exchange/taler-exchange-httpd_purses_get.c b/src/exchange/taler-exchange-httpd_purses_get.c index 0701fc452..cb0c5ca77 100644 --- a/src/exchange/taler-exchange-httpd_purses_get.c +++ b/src/exchange/taler-exchange-httpd_purses_get.c @@ -208,6 +208,7 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc, { struct GetContext *gc = rc->rh_ctx; bool purse_deleted; + bool purse_refunded; MHD_RESULT res; if (NULL == gc) @@ -286,7 +287,8 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc, &gc->deposited, &gc->h_contract, &gc->merge_timestamp, - &purse_deleted); + &purse_deleted, + &purse_refunded); switch (qs) { case GNUNET_DB_STATUS_HARD_ERROR: @@ -341,9 +343,11 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc, gc->eh = eh2; } } - if (GNUNET_TIME_absolute_is_past (gc->purse_expiration.abs_time) || + if (purse_refunded || purse_deleted) { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Purse refunded or deleted\n"); return TALER_MHD_reply_with_error (rc->connection, MHD_HTTP_GONE, purse_deleted @@ -397,9 +401,11 @@ TEH_handler_purses_get (struct TEH_RequestContext *rc, &gc->deposited, &exchange_pub, &exchange_sig))) + { res = TALER_MHD_reply_with_ec (rc->connection, ec, NULL); + } else { /* Make sure merge_timestamp is omitted if not yet merged */ diff --git a/src/exchangedb/pg_select_purse.c b/src/exchangedb/pg_select_purse.c index 7c0a638ac..ffccb905c 100644 --- a/src/exchangedb/pg_select_purse.c +++ b/src/exchangedb/pg_select_purse.c @@ -36,7 +36,8 @@ TEH_PG_select_purse ( struct TALER_Amount *deposited, struct TALER_PrivateContractHashP *h_contract_terms, struct GNUNET_TIME_Timestamp *merge_timestamp, - bool *purse_deleted) + bool *purse_deleted, + bool *purse_refunded) { struct PostgresClosure *pg = cls; struct GNUNET_PQ_QueryParam params[] = { @@ -60,6 +61,10 @@ TEH_PG_select_purse ( NULL), GNUNET_PQ_result_spec_bool ("purse_deleted", purse_deleted), + GNUNET_PQ_result_spec_allow_null ( + GNUNET_PQ_result_spec_bool ("purse_refunded", + purse_refunded), + NULL), GNUNET_PQ_result_spec_end }; @@ -74,11 +79,14 @@ TEH_PG_select_purse ( ",pr.balance" ",pm.merge_timestamp" ",pd.purse_sig IS NOT NULL AS purse_deleted" + ",pc.refunded AS purse_refunded" " FROM purse_requests pr" " LEFT JOIN purse_merges pm ON (pm.purse_pub = pr.purse_pub)" + " LEFT JOIN purse_decision pc ON (pc.purse_pub = pr.purse_pub)" " LEFT JOIN purse_deletion pd ON (pd.purse_pub = pr.purse_pub)" " WHERE pr.purse_pub=$1;"); *merge_timestamp = GNUNET_TIME_UNIT_FOREVER_TS; + *purse_refunded = false; return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "select_purse", params, diff --git a/src/exchangedb/pg_select_purse.h b/src/exchangedb/pg_select_purse.h index db63f0c90..8f88c5cf7 100644 --- a/src/exchangedb/pg_select_purse.h +++ b/src/exchangedb/pg_select_purse.h @@ -38,6 +38,7 @@ * @param[out] h_contract_terms set to hash of the contract for the purse * @param[out] merge_timestamp set to time when the purse was merged, or NEVER if not * @param[out] purse_deleted set to true if purse was deleted + * @param[out] purse_refunded set to true if purse was refunded * @return transaction status code */ enum GNUNET_DB_QueryStatus @@ -50,7 +51,7 @@ TEH_PG_select_purse ( struct TALER_Amount *deposited, struct TALER_PrivateContractHashP *h_contract_terms, struct GNUNET_TIME_Timestamp *merge_timestamp, - bool *purse_deleted); - + bool *purse_deleted, + bool *purse_refunded); #endif diff --git a/src/exchangedb/pg_select_purse_merge.c b/src/exchangedb/pg_select_purse_merge.c index d58e8892f..ecc047cc5 100644 --- a/src/exchangedb/pg_select_purse_merge.c +++ b/src/exchangedb/pg_select_purse_merge.c @@ -41,7 +41,6 @@ TEH_PG_select_purse_merge ( GNUNET_PQ_query_param_auto_from_type (purse_pub), GNUNET_PQ_query_param_end }; - bool is_null; struct GNUNET_PQ_ResultSpec rs[] = { GNUNET_PQ_result_spec_auto_from_type ("merge_sig", merge_sig), @@ -52,7 +51,7 @@ TEH_PG_select_purse_merge ( GNUNET_PQ_result_spec_allow_null ( GNUNET_PQ_result_spec_string ("partner_base_url", partner_url), - &is_null), + NULL), GNUNET_PQ_result_spec_allow_null ( GNUNET_PQ_result_spec_bool ("refunded", refunded), @@ -61,19 +60,19 @@ TEH_PG_select_purse_merge ( }; *partner_url = NULL; - *refunded = true; + *refunded = false; PREPARE (pg, "select_purse_merge", "SELECT " - " reserve_pub" - ",merge_sig" - ",merge_timestamp" - ",partner_base_url" - ",refunded" - " FROM purse_merges" - " LEFT JOIN purse_decision USING (purse_pub)" - " LEFT JOIN partners USING (partner_serial_id)" - " WHERE purse_pub=$1;"); + " pm.reserve_pub" + ",pm.merge_sig" + ",pm.merge_timestamp" + ",pr.partner_base_url" + ",pd.refunded" + " FROM purse_merges pm" + " LEFT JOIN purse_decision pd USING (purse_pub)" + " LEFT JOIN partners pr USING (partner_serial_id)" + " WHERE pm.purse_pub=$1;"); return GNUNET_PQ_eval_prepared_singleton_select (pg->conn, "select_purse_merge", params, diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 3fe2efd1a..33546e008 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -6335,6 +6335,7 @@ struct TALER_EXCHANGEDB_Plugin * @param[out] h_contract_terms set to hash of the contract for the purse * @param[out] merge_timestamp set to time when the purse was merged, or NEVER if not * @param[out] purse_deleted set to true if purse was deleted + * @param[out] purse_refunded set to true if purse was refunded (after expiration) * @return transaction status code */ enum GNUNET_DB_QueryStatus @@ -6347,7 +6348,8 @@ struct TALER_EXCHANGEDB_Plugin struct TALER_Amount *deposited, struct TALER_PrivateContractHashP *h_contract_terms, struct GNUNET_TIME_Timestamp *merge_timestamp, - bool *purse_deleted); + bool *purse_deleted, + bool *purse_refunded); /** |