aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------contrib/merchant-backoffice0
-rw-r--r--src/backend/taler-merchant-httpd_post-orders-ID-claim.c77
-rw-r--r--src/backenddb/plugin_merchantdb_postgres.c8
3 files changed, 53 insertions, 32 deletions
diff --git a/contrib/merchant-backoffice b/contrib/merchant-backoffice
-Subproject 1732185ac1d1dcc783b8f2489f2ce333b5254d9
+Subproject 4320467db1392e5f48a4acd079f7e2a253cf998
diff --git a/src/backend/taler-merchant-httpd_post-orders-ID-claim.c b/src/backend/taler-merchant-httpd_post-orders-ID-claim.c
index b764c7d7..1d201ce1 100644
--- a/src/backend/taler-merchant-httpd_post-orders-ID-claim.c
+++ b/src/backend/taler-merchant-httpd_post-orders-ID-claim.c
@@ -83,7 +83,46 @@ claim_order (const char *instance_id,
return qs;
}
- if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
+ if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
+ {
+ /* We already have claimed contract terms for this order_id */
+ const char *stored_nonce;
+ struct GNUNET_JSON_Specification spec[] = {
+ GNUNET_JSON_spec_string ("nonce",
+ &stored_nonce),
+ GNUNET_JSON_spec_end ()
+ };
+ enum GNUNET_GenericReturnValue res;
+
+ TMH_db->rollback (TMH_db->cls);
+ GNUNET_assert (NULL != *contract_terms);
+
+ if (GNUNET_OK !=
+ GNUNET_JSON_parse (*contract_terms,
+ spec,
+ NULL,
+ NULL))
+ {
+ /* this should not be possible: contract_terms should always
+ have a nonce! */
+ GNUNET_break (0);
+ return GNUNET_DB_STATUS_HARD_ERROR;
+ }
+
+ if (0 != strcmp (stored_nonce,
+ nonce))
+ {
+ GNUNET_JSON_parse_free (spec);
+ return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
+ }
+ GNUNET_JSON_parse_free (spec);
+ return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
+ }
+
+ GNUNET_assert (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs);
+
+ /* Now we need to claim the order. */
+
{
struct GNUNET_HashCode unused;
@@ -99,13 +138,13 @@ claim_order (const char *instance_id,
TMH_db->rollback (TMH_db->cls);
return qs;
}
- GNUNET_assert (NULL != contract_terms);
+ GNUNET_assert (NULL != *contract_terms);
GNUNET_assert (0 ==
json_object_set_new (*contract_terms,
"nonce",
json_string (nonce)));
- if (0 != GNUNET_memcmp (&order_ct,
- claim_token))
+ if (0 != GNUNET_memcmp_priv (&order_ct,
+ claim_token))
{
TMH_db->rollback (TMH_db->cls);
json_decref (*contract_terms);
@@ -128,29 +167,6 @@ claim_order (const char *instance_id,
return qs;
return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
}
- else
- {
- const char *stored_nonce;
-
- TMH_db->rollback (TMH_db->cls);
- GNUNET_assert (NULL != *contract_terms);
- stored_nonce
- = json_string_value (json_object_get (*contract_terms,
- "nonce"));
- if (NULL == stored_nonce)
- {
- /* this should not be possible: contract_terms should always
- have a nonce! */
- GNUNET_break (0);
- return GNUNET_DB_STATUS_HARD_ERROR;
- }
- if (0 != strcmp (stored_nonce,
- nonce))
- {
- return GNUNET_DB_STATUS_SUCCESS_NO_RESULTS;
- }
- return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
- }
}
@@ -225,13 +241,18 @@ TMH_post_orders_ID_claim (const struct TMH_RequestHandler *rh,
break; /* Good! return signature (below) */
}
- /* create proposal signature */
+ /* create contract signature */
{
struct GNUNET_CRYPTO_EddsaSignature merchant_sig;
struct TALER_ProposalDataPS pdps = {
.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_CONTRACT),
.purpose.size = htonl (sizeof (pdps))
};
+ /**
+ * Hash of the JSON contract in UTF-8 including 0-termination,
+ * using JSON_COMPACT | JSON_SORT_KEYS
+ */
+ struct GNUNET_HashCode hash;
if (GNUNET_OK !=
TALER_JSON_contract_hash (contract_terms,
diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c
index bc3af1bb..6970233c 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -1749,7 +1749,7 @@ postgres_update_contract_terms (void *cls,
struct PostgresClosure *pg = cls;
struct GNUNET_TIME_Absolute pay_deadline;
struct GNUNET_TIME_Absolute refund_deadline;
- const char *fulfillment_url;
+ const char *fulfillment_url = NULL;
struct GNUNET_HashCode h_contract_terms;
if (GNUNET_OK !=
@@ -1766,6 +1766,9 @@ postgres_update_contract_terms (void *cls,
&pay_deadline),
TALER_JSON_spec_absolute_time ("refund_deadline",
&refund_deadline),
+ GNUNET_JSON_spec_mark_optional (
+ GNUNET_JSON_spec_string ("fulfillment_url",
+ &fulfillment_url)),
GNUNET_JSON_spec_end ()
};
enum GNUNET_GenericReturnValue res;
@@ -1780,9 +1783,6 @@ postgres_update_contract_terms (void *cls,
}
}
- fulfillment_url =
- json_string_value (json_object_get (contract_terms,
- "fulfillment_url"));
check_connection (pg);
{
struct GNUNET_PQ_QueryParam params[] = {