diff options
author | Christian Blättler <blatc2@bfh.ch> | 2024-06-13 17:56:22 +0200 |
---|---|---|
committer | Christian Blättler <blatc2@bfh.ch> | 2024-06-13 17:56:22 +0200 |
commit | e62fe71de43a1325822e5768cc040609030fccd6 (patch) | |
tree | 65afdbf1b6e89f83db94d78c74da0ce63b3a40b8 | |
parent | cf4679e7b21cafa878903cf679167a7e90c8ac61 (diff) |
move tokens_evs to wallet data and remove h_outputs
-rw-r--r-- | src/backend/taler-merchant-httpd_post-orders-ID-pay.c | 160 | ||||
-rw-r--r-- | src/lib/merchant_api_post_order_pay.c | 10 |
2 files changed, 74 insertions, 96 deletions
diff --git a/src/backend/taler-merchant-httpd_post-orders-ID-pay.c b/src/backend/taler-merchant-httpd_post-orders-ID-pay.c index 5af827e7..cbfd8fdd 100644 --- a/src/backend/taler-merchant-httpd_post-orders-ID-pay.c +++ b/src/backend/taler-merchant-httpd_post-orders-ID-pay.c @@ -3106,24 +3106,24 @@ phase_check_contract (struct PayContext *pc) static void phase_parse_wallet_data (struct PayContext *pc) { - struct GNUNET_HashCode h_outputs_req; pc->choice_index = -1; - // TODO: Ensure that wallet_data must be set for contracts with choices. if (NULL == pc->wallet_data) { pc->phase = PP_CHECK_CONTRACT; return; } + const json_t *tokens_evs; + struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_mark_optional( GNUNET_JSON_spec_int64 ("choice_index", &pc->choice_index), NULL), - GNUNET_JSON_spec_mark_optional( - GNUNET_JSON_spec_fixed_auto ("h_outputs", - &h_outputs_req), + GNUNET_JSON_spec_mark_optional ( + GNUNET_JSON_spec_array_const ("tokens_evs", + &tokens_evs), NULL), GNUNET_JSON_spec_end () }; @@ -3143,16 +3143,78 @@ phase_parse_wallet_data (struct PayContext *pc) return; } - if (0 != GNUNET_CRYPTO_hash_cmp(&h_outputs_req, &pc->h_outputs)) + pc->token_envelopes_cnt = json_array_size (tokens_evs); + if (pc->token_envelopes_cnt > MAX_TOKEN_ALLOWED_OUTPUTs) { GNUNET_break_op (0); pay_end (pc, - TALER_MHD_reply_with_error (pc->connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_PARAMETER_MALFORMED, - "'wallet_data.h_outputs' does not match hash of tokens_evs")); + TALER_MHD_reply_with_error ( + pc->connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_PARAMETER_MALFORMED, + "'tokens_evs' array too long")); return; } + if (0 < pc->token_envelopes_cnt) + { + /* Calculate output commitment to be verified later. */ + TALER_json_hash (tokens_evs, + &pc->h_outputs); + } + + pc->token_envelopes = GNUNET_new_array (pc->token_envelopes_cnt, + struct TokenEnvelope); + + { + unsigned int tokens_ev_index; + json_t *token_ev; + + json_array_foreach (tokens_evs, tokens_ev_index, token_ev) + { + if (json_is_null (token_ev)) + { + // Skip null envelopes + continue; + } + + struct TokenEnvelope *ev = &pc->token_envelopes[tokens_ev_index]; + struct GNUNET_JSON_Specification ispec[] = { + TALER_JSON_spec_token_envelope ("token_ev", + &ev->blinded_token), + GNUNET_JSON_spec_end () + }; + enum GNUNET_GenericReturnValue res; + + res = TALER_MHD_parse_json_data (pc->connection, + token_ev, + ispec); + if (GNUNET_YES != res) + { + GNUNET_break_op (0); + pay_end (pc, + (GNUNET_NO == res) + ? MHD_YES + : MHD_NO); + return; + } + + for (unsigned int j = 0; j<tokens_ev_index; j++) + { + if (0 == + GNUNET_memcmp (ev->blinded_token.blinded_pub, + pc->token_envelopes[j].blinded_token.blinded_pub)) + { + GNUNET_break_op (0); + pay_end (pc, + TALER_MHD_reply_with_error (pc->connection, + MHD_HTTP_BAD_REQUEST, + TALER_EC_GENERIC_PARAMETER_MALFORMED, + "duplicate token envelope in list")); + return; + } + } + } + } TALER_json_hash (pc->wallet_data, &pc->h_wallet_data); @@ -3173,7 +3235,6 @@ phase_parse_pay (struct PayContext *pc) const char *session_id = NULL; const json_t *coins; const json_t *tokens; - const json_t *tokens_evs; struct GNUNET_JSON_Specification spec[] = { GNUNET_JSON_spec_array_const ("coins", &coins), @@ -3189,10 +3250,6 @@ phase_parse_pay (struct PayContext *pc) GNUNET_JSON_spec_array_const ("tokens", &tokens), NULL), - GNUNET_JSON_spec_mark_optional ( - GNUNET_JSON_spec_array_const ("tokens_evs", - &tokens_evs), - NULL), GNUNET_JSON_spec_end () }; @@ -3422,79 +3479,6 @@ phase_parse_pay (struct PayContext *pc) } } - pc->token_envelopes_cnt = json_array_size (tokens_evs); - if (pc->token_envelopes_cnt > MAX_TOKEN_ALLOWED_OUTPUTs) - { - GNUNET_break_op (0); - pay_end (pc, - TALER_MHD_reply_with_error ( - pc->connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_PARAMETER_MALFORMED, - "'tokens_evs' array too long")); - return; - } - if (0 < pc->token_envelopes_cnt) - { - /* Calculate output commitment to be verified later. */ - TALER_json_hash (tokens_evs, - &pc->h_outputs); - - } - - pc->token_envelopes = GNUNET_new_array (pc->token_envelopes_cnt, - struct TokenEnvelope); - - { - unsigned int tokens_ev_index; - json_t *token_ev; - - json_array_foreach (tokens_evs, tokens_ev_index, token_ev) - { - if (json_is_null (token_ev)) - { - // Skip null envelopes - continue; - } - - struct TokenEnvelope *ev = &pc->token_envelopes[tokens_ev_index]; - struct GNUNET_JSON_Specification ispec[] = { - TALER_JSON_spec_token_envelope ("token_ev", - &ev->blinded_token), - GNUNET_JSON_spec_end () - }; - enum GNUNET_GenericReturnValue res; - - res = TALER_MHD_parse_json_data (pc->connection, - token_ev, - ispec); - if (GNUNET_YES != res) - { - GNUNET_break_op (0); - pay_end (pc, - (GNUNET_NO == res) - ? MHD_YES - : MHD_NO); - return; - } - - for (unsigned int j = 0; j<tokens_ev_index; j++) - { - if (0 == - GNUNET_memcmp (ev->blinded_token.blinded_pub, - pc->token_envelopes[j].blinded_token.blinded_pub)) - { - GNUNET_break_op (0); - pay_end (pc, - TALER_MHD_reply_with_error (pc->connection, - MHD_HTTP_BAD_REQUEST, - TALER_EC_GENERIC_PARAMETER_MALFORMED, - "duplicate token envelope in list")); - return; - } - } - } - } pc->phase = PP_PARSE_WALLET_DATA; } diff --git a/src/lib/merchant_api_post_order_pay.c b/src/lib/merchant_api_post_order_pay.c index b34240b6..cf06630a 100644 --- a/src/lib/merchant_api_post_order_pay.c +++ b/src/lib/merchant_api_post_order_pay.c @@ -497,9 +497,6 @@ TALER_MERCHANT_order_pay_frontend ( GNUNET_JSON_pack_array_steal ("tokens", j_tokens)), GNUNET_JSON_pack_allow_null ( - GNUNET_JSON_pack_array_incref ("tokens_evs", - j_output_tokens)), - GNUNET_JSON_pack_allow_null ( GNUNET_JSON_pack_object_incref ("wallet_data", (json_t *) wallet_data)), GNUNET_JSON_pack_allow_null ( @@ -590,7 +587,6 @@ TALER_MERCHANT_order_pay ( { json_t *j_output_tokens = NULL; const json_t *wallet_data = NULL; - struct GNUNET_HashCode h_outputs; struct GNUNET_HashCode wallet_data_hash; if (GNUNET_YES != @@ -630,8 +626,6 @@ TALER_MERCHANT_order_pay ( return NULL; } } - - TALER_json_hash (j_output_tokens, &h_outputs); } if (0 <= choice_index) { @@ -639,8 +633,8 @@ TALER_MERCHANT_order_pay ( GNUNET_JSON_pack_int64 ("choice_index", choice_index), GNUNET_JSON_pack_allow_null ( - GNUNET_JSON_pack_data_auto ("h_outputs", - &h_outputs))); + GNUNET_JSON_pack_array_incref ("tokens_evs", + j_output_tokens))); TALER_json_hash (wallet_data, &wallet_data_hash); } |