summaryrefslogtreecommitdiff
path: root/src/backenddb
diff options
context:
space:
mode:
Diffstat (limited to 'src/backenddb')
-rw-r--r--src/backenddb/merchant-0002.sql24
-rw-r--r--src/backenddb/plugin_merchantdb_postgres.c29
-rw-r--r--src/backenddb/test_merchantdb.c6
3 files changed, 49 insertions, 10 deletions
diff --git a/src/backenddb/merchant-0002.sql b/src/backenddb/merchant-0002.sql
index 46428dd9..2656fedb 100644
--- a/src/backenddb/merchant-0002.sql
+++ b/src/backenddb/merchant-0002.sql
@@ -14,6 +14,10 @@
-- TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
--
+-- This file includes migrations up to 0.8.2.
+-- All migrations after that release should
+-- to into a different file.
+
-- Everything in one big transaction
BEGIN;
@@ -59,6 +63,26 @@ ALTER TABLE merchant_transfer_signatures
ALTER COLUMN credit_amount_val SET NOT NULL,
ALTER COLUMN credit_amount_frac SET NOT NULL;
+-- contract terms now also need to check the claim_token,
+-- as we consider the fulfillment_url private
+ALTER TABLE merchant_contract_terms
+ ADD COLUMN claim_token BYTEA;
+UPDATE merchant_contract_terms mct
+ SET claim_token=ord.claim_token
+ FROM merchant_orders ord
+ WHERE mct.order_serial=ord.order_serial;
+-- If the merchant_orders row already has been GCed,
+-- we can't migrate to the correct claim_token anymore.
+-- Instead of setting it to all zeroes (no auth),
+-- we set it to a prefix of the h_contract_terms.
+UPDATE merchant_contract_terms
+ SET claim_token = substring(h_contract_terms for 16)
+ WHERE claim_token IS NULL;
+ALTER TABLE merchant_contract_terms
+ ALTER COLUMN claim_token SET NOT NULL,
+ ADD CHECK (LENGTH(claim_token)=16);
+COMMENT ON COLUMN merchant_contract_terms.claim_token
+ IS 'Token optionally used to access the status of the order. All zeros (not NULL) if not used';
-- Complete transaction
COMMIT;
diff --git a/src/backenddb/plugin_merchantdb_postgres.c b/src/backenddb/plugin_merchantdb_postgres.c
index 0001a8e6..780becfb 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -1755,6 +1755,7 @@ postgres_insert_order_lock (void *cls,
* @param order_id order_id used to lookup.
* @param[out] contract_terms where to store the result, NULL to only check for existence
* @param[out] order_serial set to the order's serial number
+ * @param[out] claim_token set to the claim token, NULL to only check for existence
* @return transaction status
*/
static enum GNUNET_DB_QueryStatus
@@ -1762,23 +1763,32 @@ postgres_lookup_contract_terms (void *cls,
const char *instance_id,
const char *order_id,
json_t **contract_terms,
- uint64_t *order_serial)
+ uint64_t *order_serial,
+ struct TALER_ClaimTokenP *claim_token)
{
struct PostgresClosure *pg = cls;
+ struct TALER_ClaimTokenP ct;
struct GNUNET_PQ_QueryParam params[] = {
GNUNET_PQ_query_param_string (instance_id),
GNUNET_PQ_query_param_string (order_id),
GNUNET_PQ_query_param_end
};
- struct GNUNET_PQ_ResultSpec rs[] = {
+ struct GNUNET_PQ_ResultSpec rs[4] = {
/* contract_terms must be first! */
TALER_PQ_result_spec_json ("contract_terms",
contract_terms),
GNUNET_PQ_result_spec_uint64 ("order_serial",
order_serial),
+ GNUNET_PQ_result_spec_auto_from_type ("claim_token",
+ &ct),
GNUNET_PQ_result_spec_end
};
+ if (NULL != claim_token)
+ {
+ *claim_token = ct;
+ }
+
check_connection (pg);
return GNUNET_PQ_eval_prepared_singleton_select (pg->conn,
"lookup_contract_terms",
@@ -7648,6 +7658,7 @@ postgres_connect (void *cls)
"SELECT"
" contract_terms"
",order_serial"
+ ",claim_token"
" FROM merchant_contract_terms"
" WHERE order_id=$2"
" AND merchant_serial="
@@ -7666,18 +7677,20 @@ postgres_connect (void *cls)
",creation_time"
",pay_deadline"
",refund_deadline"
- ",fulfillment_url)"
+ ",fulfillment_url"
+ ",claim_token)"
"SELECT"
- " order_serial"
- ",merchant_serial"
- ",order_id"
+ " mo.order_serial"
+ ",mo.merchant_serial"
+ ",mo.order_id"
",$3" /* contract_terms */
",$4" /* h_contract_terms */
- ",creation_time"
+ ",mo.creation_time"
",$5" /* pay_deadline */
",$6" /* refund_deadline */
",$7" /* fulfillment_url */
- "FROM merchant_orders"
+ ",mo.claim_token "
+ "FROM merchant_orders mo"
" WHERE order_id=$2"
" AND merchant_serial="
" (SELECT merchant_serial"
diff --git a/src/backenddb/test_merchantdb.c b/src/backenddb/test_merchantdb.c
index 1e68bcae..818172d9 100644
--- a/src/backenddb/test_merchantdb.c
+++ b/src/backenddb/test_merchantdb.c
@@ -1685,7 +1685,8 @@ test_lookup_contract_terms (const struct InstanceData *instance,
instance->instance.id,
order->id,
&contract,
- &order_serial))
+ &order_serial,
+ NULL))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup contract terms failed\n");
@@ -2065,7 +2066,8 @@ run_test_orders (struct TestOrders_Closure *cls)
cls->instance.instance.id,
cls->orders[1].id,
&lookup_contract,
- &lookup_order_serial))
+ &lookup_order_serial,
+ NULL))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Lookup contract terms failed\n");