From d60d537dfc506590a1fc8c2872fe5a66097718c4 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 13 Feb 2017 00:21:52 +0100 Subject: fix #4893 --- src/backend/taler-merchant-httpd_pay.c | 51 +++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 19 deletions(-) (limited to 'src/backend/taler-merchant-httpd_pay.c') diff --git a/src/backend/taler-merchant-httpd_pay.c b/src/backend/taler-merchant-httpd_pay.c index dc7766a1..f3be11ad 100644 --- a/src/backend/taler-merchant-httpd_pay.c +++ b/src/backend/taler-merchant-httpd_pay.c @@ -327,6 +327,36 @@ abort_deposit (struct PayContext *pc) } +/** + * Generate a response that indicates payment success. + * + * @param pc payment context + * @return the mhd response + */ +struct MHD_Response * +sign_success_response (struct PayContext *pc) +{ + struct GNUNET_CRYPTO_EddsaSignature sig; + struct PaymentResponsePS mr; + + mr.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_PAYMENT_OK); + mr.purpose.size = htonl (sizeof (mr)); + mr.h_proposal_data = pc->h_proposal_data; + + GNUNET_CRYPTO_eddsa_sign (&pc->mi->privkey.eddsa_priv, + &mr.purpose, + &sig); + + return TMH_RESPONSE_make_json_pack ("{s:O, s:s, s:o}", + "proposal_data", pc->proposal_data, + "sig", + json_string_value (GNUNET_JSON_from_data_auto (&sig)), + "h_proposal_data", + GNUNET_JSON_from_data (&pc->h_proposal_data, + sizeof (struct GNUNET_HashCode))); +} + + /** * Callback to handle a deposit permission's response. * @@ -353,8 +383,6 @@ deposit_cb (void *cls, { struct DepositConfirmation *dc = cls; struct PayContext *pc = dc->pc; - struct GNUNET_CRYPTO_EddsaSignature sig; - struct PaymentResponsePS mr; dc->dh = NULL; pc->pending--; @@ -425,22 +453,7 @@ deposit_cb (void *cls, return; /* still more to do */ - mr.purpose.purpose = htonl (TALER_SIGNATURE_MERCHANT_PAYMENT_OK); - mr.purpose.size = htonl (sizeof (mr)); - mr.h_proposal_data = pc->h_proposal_data; - - GNUNET_CRYPTO_eddsa_sign (&pc->mi->privkey.eddsa_priv, - &mr.purpose, - &sig); - resume_pay_with_response (pc, - MHD_HTTP_OK, - TMH_RESPONSE_make_json_pack ("{s:O, s:s, s:o}", - "proposal_data", pc->proposal_data, - "sig", - json_string_value (GNUNET_JSON_from_data_auto (&sig)), - "h_proposal_data", - GNUNET_JSON_from_data (&pc->h_proposal_data, - sizeof (struct GNUNET_HashCode)))); + resume_pay_with_response (pc, MHD_HTTP_OK, sign_success_response (pc)); } @@ -1151,7 +1164,7 @@ handler_pay_json (struct MHD_Connection *connection, MHD_RESPMEM_PERSISTENT); ret = MHD_queue_response (connection, MHD_HTTP_OK, - resp); + sign_success_response (pc)); MHD_destroy_response (resp); return ret; } -- cgit v1.2.3