[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [taler-merchant] branch master updated: fix #5262
From: |
gnunet |
Subject: |
[GNUnet-SVN] [taler-merchant] branch master updated: fix #5262 |
Date: |
Mon, 22 Jan 2018 21:59:52 +0100 |
This is an automated email from the git hooks/post-receive script.
grothoff pushed a commit to branch master
in repository merchant.
The following commit(s) were added to refs/heads/master by this push:
new 0a0fe09 fix #5262
0a0fe09 is described below
commit 0a0fe09e9b144e96d4c6b7f1dab937f49de58f08
Author: Christian Grothoff <address@hidden>
AuthorDate: Mon Jan 22 21:59:27 2018 +0100
fix #5262
---
ChangeLog | 15 ++++++++
src/backend/taler-merchant-httpd_pay.c | 38 +++++++++++++++++--
src/backenddb/plugin_merchantdb_postgres.c | 59 ++++++++++++++++++++++++++----
src/backenddb/test_merchantdb.c | 10 +++++
src/include/taler_merchantdb_plugin.h | 16 +++++++-
src/lib/test_merchant_api.c | 10 +++++
6 files changed, 137 insertions(+), 11 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 5b0dfa3..b3c2c46 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+Mon Jan 22 21:54:42 CET 2018
+ Address #5262. -CG
+
+Tue Jan 2 00:27:29 2018
+ Implement #5158 (proper handling of aborted payments). -CG
+
+Wed Dec 27 11:21:43 2017
+ Complete logic to allow /pay to span coins from multiple exchanges. -CG
+
+Wed Dec 13 21:50:59 2017
+ Use new wire transfer logic in payments generator. -CG
+
+Thu Dec 7 07:42:40 2017
+ Implemented new tipping feature (now with private keys in files). -CG
+
Wed Oct 18 15:33:23 CEST 2017
Releasing taler-merchant 0.4.0. -CG
diff --git a/src/backend/taler-merchant-httpd_pay.c
b/src/backend/taler-merchant-httpd_pay.c
index a6c5755..7f9a234 100644
--- a/src/backend/taler-merchant-httpd_pay.c
+++ b/src/backend/taler-merchant-httpd_pay.c
@@ -681,8 +681,6 @@ check_payment_sufficient (struct PayContext *pc)
}
}
-
-
/* Now compare exchange wire fee compared to what we are willing to
pay */
if (GNUNET_YES !=
@@ -1033,7 +1031,6 @@ process_pay_with_exchange (void *cls,
return;
}
-
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Found transaction data for proposal `%s' of merchant `%s',
initiating deposits\n",
GNUNET_h2s (&pc->h_contract_terms),
@@ -1715,8 +1712,43 @@ begin_transaction (struct PayContext *pc)
if (PC_MODE_ABORT_REFUND == pc->mode)
{
+ json_t *terms;
+
/* The wallet is going for a refund,
(on aborted operation)! */
+ /* check payment was indeed incomplete */
+ qs = db->find_paid_contract_terms_from_hash (db->cls,
+ &terms,
+ &pc->h_contract_terms,
+ &pc->mi->pubkey);
+ if (0 > qs)
+ {
+ db->rollback (db->cls);
+ if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+ {
+ begin_transaction (pc);
+ return;
+ }
+ /* Always report on hard error as well to enable diagnostics */
+ GNUNET_break (GNUNET_DB_STATUS_HARD_ERROR == qs);
+ resume_pay_with_error (pc,
+ MHD_HTTP_INTERNAL_SERVER_ERROR,
+ TALER_EC_PAY_DB_STORE_PAY_ERROR,
+ "Merchant database error");
+ return;
+ }
+ if (0 < qs)
+ {
+ /* Payment had been complete! */
+ json_decref (terms);
+ db->rollback (db->cls);
+ resume_pay_with_error (pc,
+ MHD_HTTP_FORBIDDEN,
+ TALER_EC_PAY_ABORT_REFUND_REFUSED_PAYMENT_COMPLETE,
+ "Payment complete, refusing to abort");
+ return;
+ }
+
/* Store refund in DB */
qs = db->increase_refund_for_contract (db->cls,
&pc->h_contract_terms,
diff --git a/src/backenddb/plugin_merchantdb_postgres.c
b/src/backenddb/plugin_merchantdb_postgres.c
index 1a97670..0a3ce5f 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -378,6 +378,14 @@ postgres_initialize (void *cls)
" WHERE h_contract_terms=$1"
" AND merchant_pub=$2",
2),
+ GNUNET_PQ_make_prepare ("find_paid_contract_terms_from_hash",
+ "SELECT"
+ " contract_terms"
+ " FROM merchant_contract_terms"
+ " WHERE h_contract_terms=$1"
+ " AND merchant_pub=$2"
+ " AND paid=TRUE",
+ 2),
GNUNET_PQ_make_prepare ("end_transaction",
"COMMIT",
0),
@@ -796,9 +804,9 @@ postgres_commit (void *cls)
*/
static enum GNUNET_DB_QueryStatus
postgres_find_contract_terms_from_hash (void *cls,
- json_t **contract_terms,
- const struct GNUNET_HashCode
*h_contract_terms,
- const struct TALER_MerchantPublicKeyP
*merchant_pub)
+ json_t **contract_terms,
+ const struct GNUNET_HashCode
*h_contract_terms,
+ const struct TALER_MerchantPublicKeyP
*merchant_pub)
{
struct PostgresClosure *pg = cls;
struct GNUNET_PQ_QueryParam params[] = {
@@ -821,6 +829,41 @@ postgres_find_contract_terms_from_hash (void *cls,
/**
+ * Retrieve proposal data given its proposal data's hashcode
+ *
+ * @param cls closure
+ * @param contract_terms where to store the retrieved proposal data
+ * @param h_contract_terms proposal data's hashcode that will be used to
+ * perform the lookup
+ * @return transaction status
+ */
+static enum GNUNET_DB_QueryStatus
+postgres_find_paid_contract_terms_from_hash (void *cls,
+ json_t **contract_terms,
+ const struct GNUNET_HashCode
*h_contract_terms,
+ const struct
TALER_MerchantPublicKeyP *merchant_pub)
+{
+ struct PostgresClosure *pg = cls;
+ struct GNUNET_PQ_QueryParam params[] = {
+ GNUNET_PQ_query_param_auto_from_type (h_contract_terms),
+ GNUNET_PQ_query_param_auto_from_type (merchant_pub),
+ GNUNET_PQ_query_param_end
+ };
+ struct GNUNET_PQ_ResultSpec rs[] = {
+ TALER_PQ_result_spec_json ("contract_terms",
+ contract_terms),
+ GNUNET_PQ_result_spec_end
+ };
+
+ check_connection (pg);
+ return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
+
"find_paid_contract_terms_from_hash",
+ params,
+ rs);
+}
+
+
+/**
* Retrieve proposal data given its order id. Ignores if the
* proposal has been paid or not.
*
@@ -1232,10 +1275,11 @@ postgres_find_contract_terms_history (void *cls,
rs);
if (qs <= 0)
return qs;
- cb (cb_cls,
- order_id,
- 0,
- contract_terms);
+ if (NULL != cb)
+ cb (cb_cls,
+ order_id,
+ 0,
+ contract_terms);
GNUNET_PQ_cleanup_result (rs);
return qs;
}
@@ -3363,6 +3407,7 @@ libtaler_plugin_merchantdb_postgres_init (void *cls)
plugin->find_contract_terms_by_date = &postgres_find_contract_terms_by_date;
plugin->find_contract_terms_by_date_and_range =
&postgres_find_contract_terms_by_date_and_range;
plugin->find_contract_terms_from_hash =
&postgres_find_contract_terms_from_hash;
+ plugin->find_paid_contract_terms_from_hash =
&postgres_find_paid_contract_terms_from_hash;
plugin->get_refunds_from_contract_terms_hash =
&postgres_get_refunds_from_contract_terms_hash;
plugin->lookup_wire_fee = &postgres_lookup_wire_fee;
plugin->increase_refund_for_contract =
&postgres_increase_refund_for_contract;
diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c
index d912838..cbf51b3 100644
--- a/src/backenddb/test_merchantdb.c
+++ b/src/backenddb/test_merchantdb.c
@@ -838,6 +838,11 @@ run (void *cls)
timestamp,
contract_terms));
+ FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
+ plugin->find_paid_contract_terms_from_hash (plugin->cls,
+ &out,
+ &h_contract_terms,
+ &merchant_pub));
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->mark_proposal_paid (plugin->cls,
&h_contract_terms,
@@ -858,6 +863,11 @@ run (void *cls)
NULL));
FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
+ plugin->find_paid_contract_terms_from_hash (plugin->cls,
+ &out,
+ &h_contract_terms,
+ &merchant_pub));
+ FAILIF (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT !=
plugin->find_contract_terms_from_hash (plugin->cls,
&out,
&h_contract_terms,
diff --git a/src/include/taler_merchantdb_plugin.h
b/src/include/taler_merchantdb_plugin.h
index ef613c1..0bb1e33 100644
--- a/src/include/taler_merchantdb_plugin.h
+++ b/src/include/taler_merchantdb_plugin.h
@@ -271,7 +271,6 @@ struct TALER_MERCHANTDB_Plugin
const struct TALER_MerchantPublicKeyP *merchant_pub);
-
/**
* Retrieve proposal data given its hashcode
*
@@ -288,6 +287,21 @@ struct TALER_MERCHANTDB_Plugin
const struct TALER_MerchantPublicKeyP
*merchant_pub);
+ /**
+ * Retrieve paid contract terms data given its hashcode.
+ *
+ * @param cls closure
+ * @param[out] contract_terms where to store the result
+ * @param h_contract_terms hashcode used to lookup.
+ * @param merchant_pub instance's public key.
+ * @return transaction status
+ */
+ enum GNUNET_DB_QueryStatus
+ (*find_paid_contract_terms_from_hash) (void *cls,
+ json_t **contract_terms,
+ const struct GNUNET_HashCode
*h_contract_terms,
+ const struct TALER_MerchantPublicKeyP
*merchant_pub);
+
/**
* Return proposals whose timestamp are older than `date`.
diff --git a/src/lib/test_merchant_api.c b/src/lib/test_merchant_api.c
index 9e0dc15..40b1f60 100644
--- a/src/lib/test_merchant_api.c
+++ b/src/lib/test_merchant_api.c
@@ -2863,6 +2863,9 @@ pay_refund_cb (void *cls,
if ( (MHD_HTTP_OK == http_status) &&
(TALER_EC_NONE == ec) )
{
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+ "Received %u refunds\n",
+ num_refunds);
cmd->details.pay_abort.num_refunds = num_refunds;
cmd->details.pay_abort.res
= GNUNET_new_array (num_refunds,
@@ -4153,6 +4156,13 @@ run (void *cls)
.details.check_payment.contract_ref = "create-proposal-1",
.details.check_payment.expect_paid = GNUNET_YES },
+ /* Test for #5262: abort after full payment */
+ { .oc = OC_PAY_ABORT,
+ .label = "pay-abort-2",
+ .expected_response_code = MHD_HTTP_FORBIDDEN,
+ .details.pay_abort.pay_ref = "deposit-simple",
+ },
+
/* Try to replay payment reusing coin */
{ .oc = OC_PAY,
.label = "replay-simple",
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [taler-merchant] branch master updated: fix #5262,
gnunet <=