diff options
author | Christian Grothoff <christian@grothoff.org> | 2017-03-06 13:56:31 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2017-03-06 13:56:31 +0100 |
commit | d3e568e2d1c5dee55856d3ac44e77cb4af80b39f (patch) | |
tree | 62bdbf326da242988b6b48c39c0fb35b1bc1bf98 /src/backend | |
parent | 9a6e0aeb07f6d5d17201e8630d0958b4275a31eb (diff) | |
download | merchant-d3e568e2d1c5dee55856d3ac44e77cb4af80b39f.tar.gz merchant-d3e568e2d1c5dee55856d3ac44e77cb4af80b39f.tar.bz2 merchant-d3e568e2d1c5dee55856d3ac44e77cb4af80b39f.zip |
notes on #4939, verify that H_wire from contract matches instance's H_wire early on
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/taler-merchant-httpd.h | 9 | ||||
-rw-r--r-- | src/backend/taler-merchant-httpd_pay.c | 57 |
2 files changed, 36 insertions, 30 deletions
diff --git a/src/backend/taler-merchant-httpd.h b/src/backend/taler-merchant-httpd.h index f5adeac9..ee4a3b25 100644 --- a/src/backend/taler-merchant-httpd.h +++ b/src/backend/taler-merchant-httpd.h @@ -38,7 +38,8 @@ * Used by the iterator of the various merchant's instances given * in configuration */ -struct IterateInstancesCls { +struct IterateInstancesCls +{ /** * Handle for the configuration beig parsed @@ -75,7 +76,8 @@ struct IterateInstancesCls { * backend can account for several merchants, as used to do in donation * shops */ -struct MerchantInstance { +struct MerchantInstance +{ /** * Instance's mnemonic identifier. This value lives as long as @@ -89,6 +91,9 @@ struct MerchantInstance { */ char *keyfile; + /* NOTE: the *_wire-fields should eventually be moved into a DLL + once we implement #4939 */ + /** * Wire details for this instance */ diff --git a/src/backend/taler-merchant-httpd_pay.c b/src/backend/taler-merchant-httpd_pay.c index 36d08346..54d8efaf 100644 --- a/src/backend/taler-merchant-httpd_pay.c +++ b/src/backend/taler-merchant-httpd_pay.c @@ -199,12 +199,12 @@ struct PayContext struct TALER_Amount amount; /** - * Timestamp from @e root. + * Timestamp from @e proposal_data. */ struct GNUNET_TIME_Absolute timestamp; /** - * Refund deadline from @e root. + * Refund deadline from @e proposal_data. */ struct GNUNET_TIME_Absolute refund_deadline; @@ -214,11 +214,17 @@ struct PayContext struct GNUNET_TIME_Absolute pay_deadline; /** - * "H_contract" from @e root. + * "H_contract" from @e proposal_data. */ struct GNUNET_HashCode h_proposal_data; /** + * "H_wire" from @e proposal_data. Used to identify the instance's + * wire transfer method. + */ + struct GNUNET_HashCode h_wire; + + /** * Wire transfer deadline. How soon would the merchant like the * wire transfer to be executed? (Can be given by the frontend * or be determined by our configuration via #wire_transfer_delay.) @@ -789,24 +795,21 @@ process_pay_with_exchange (void *cls, /** * Handle a timeout for the processing of the pay request. * - * @param cls closure + * @param cls our `struct PayContext` */ static void handle_pay_timeout (void *cls) { struct PayContext *pc = cls; + pc->timeout_task = NULL; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Resuming /pay with error after timeout\n"); - - pc->timeout_task = NULL; - if (NULL != pc->fo) { TMH_EXCHANGES_find_exchange_cancel (pc->fo); pc->fo = NULL; } - resume_pay_with_response (pc, MHD_HTTP_SERVICE_UNAVAILABLE, TMH_RESPONSE_make_internal_error (TALER_EC_PAY_EXCHANGE_TIMEOUT, @@ -977,7 +980,7 @@ parse_pay (struct MHD_Connection *connection, if (MHD_YES != TMH_RESPONSE_reply_internal_error (connection, TALER_EC_PAY_FAILED_COMPUTE_PROPOSAL_HASH, - "Can not hash proposal")) + "Failed to hash proposal")) { GNUNET_break (0); return GNUNET_SYSERR; @@ -989,9 +992,9 @@ parse_pay (struct MHD_Connection *connection, "merchant"); if (NULL == merchant) { - GNUNET_JSON_parse_free (spec); /* invalid contract */ GNUNET_break (0); + GNUNET_JSON_parse_free (spec); if (MHD_YES != TMH_RESPONSE_reply_internal_error (connection, TALER_EC_PAY_MERCHANT_FIELD_MISSING, @@ -1003,11 +1006,10 @@ parse_pay (struct MHD_Connection *connection, return GNUNET_NO; } pc->mi = get_instance (merchant); - if (NULL == pc->mi) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Not able to find the specified instance\n"); + "Unable to find the specified instance\n"); GNUNET_JSON_parse_free (spec); if (MHD_NO == TMH_RESPONSE_reply_not_found (connection, TALER_EC_PAY_INSTANCE_UNKNOWN, @@ -1038,6 +1040,8 @@ parse_pay (struct MHD_Connection *connection, &pc->max_fee), TALER_JSON_spec_amount ("amount", &pc->amount), + GNUNET_JSON_spec_fixed_auto ("H_wire", + &pc->h_wire), GNUNET_JSON_spec_end() }; @@ -1065,6 +1069,19 @@ parse_pay (struct MHD_Connection *connection, } } + /* NOTE: In the future, iterate over all wire hashes + available to a given instance here! (#4939) */ + if (0 != memcmp (&pc->h_wire, + &mi->h_wire, + sizeof (struct GNUNET_HashCode))) + { + GNUNET_break (0); + GNUNET_JSON_parse_free (spec); + return TMH_RESPONSE_reply_internal_error (connection, + TALER_EC_PAY_WIRE_HASH_UNKNOWN, + "Did not find matching wire details"); + } + /* parse optional details */ if (NULL != json_object_get (pc->proposal_data, "max_wire_fee")) @@ -1143,23 +1160,9 @@ parse_pay (struct MHD_Connection *connection, return (GNUNET_NO == res) ? MHD_YES : MHD_NO; } - { - char *s; - - s = TALER_amount_to_string (&dc->amount_with_fee); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Coin #%i has f %s\n", - coins_index, - s); - GNUNET_free (s); - } - dc->index = coins_index; dc->pc = pc; } - - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "parsed coins\n"); pc->pending = pc->coins_cnt; GNUNET_JSON_parse_free (spec); return GNUNET_OK; @@ -1182,8 +1185,6 @@ handler_pay_json (struct MHD_Connection *connection, { int ret; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "about to parse '/pay' body\n"); ret = parse_pay (connection, root, pc); |