summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/auditor/taler-helper-auditor-purses.c8
-rw-r--r--src/exchange/taler-exchange-httpd_purses_deposit.c6
-rw-r--r--src/exchange/taler-exchange-httpd_purses_get.c10
-rw-r--r--src/exchangedb/pg_select_purse.c10
-rw-r--r--src/exchangedb/pg_select_purse.h5
-rw-r--r--src/exchangedb/pg_select_purse_merge.c23
-rw-r--r--src/include/taler_exchangedb_plugin.h4
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);
/**