merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit f0ce8a0d390a7fde83775fbf449384d049198f74
parent 2dcbc692f955e9a5a40fd2570694ac0e2fae7222
Author: bohdan-potuzhnyi <bohdan.potuzhnyi@gmail.com>
Date:   Mon, 14 Jul 2025 21:15:13 +0200

pay test passing

Diffstat:
Msrc/backend/taler-merchant-httpd_post-orders-ID-pay.c | 24+++++++++++++++++++-----
Msrc/testing/testing_api_cmd_pay_order.c | 42+++++++++++++++++++++++++++---------------
2 files changed, 46 insertions(+), 20 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 @@ -1777,11 +1777,6 @@ phase_success_response (struct PayContext *pc) GNUNET_JSON_pack_allow_null ( GNUNET_JSON_pack_array_steal ("token_sigs", token_sigs)), - #ifdef HAVE_DONAU_DONAU_SERVICE_H - GNUNET_JSON_pack_allow_null ( - GNUNET_JSON_pack_array_steal ("donau_sigs", - pc->donau_receipt.donau_sigs_json)), - #endif GNUNET_JSON_pack_data_auto ("sig", &sig))); GNUNET_free (pos_confirmation); @@ -1931,6 +1926,25 @@ merchant_donau_issue_receipt_cb (void *cls, pc->donau_receipt.sigs = resp->details.ok.blinded_sigs; /* array of signatures */ + // TODO: For each output we have one signature(or rather for the selected donau_output_token), + // we need to put them into the output token. + // sigs.blinded_sig to the output_tokens[i].sig.signature + for (size_t i = 0; i<pc->validate_tokens.output_tokens_len; i++) + { + const struct TALER_MERCHANT_ContractChoice *choice = + &pc->check_contract.contract_terms->details.v1 + .choices[pc->parse_wallet_data.choice_index]; + + /* If the matching contract-output is a donation-receipt, we skip it. */ + if (i < choice->outputs_len && + TALER_MERCHANT_CONTRACT_OUTPUT_TYPE_DONATION_RECEIPT == + choice->outputs[i].type) + { + pc->validate_tokens.output_tokens[i].sig.signature = + pc->donau_receipt.sigs->blinded_sig; + } + } + pc->donau_receipt.donau_sigs_json = json_array (); if (NULL == pc->donau_receipt.donau_sigs_json) { diff --git a/src/testing/testing_api_cmd_pay_order.c b/src/testing/testing_api_cmd_pay_order.c @@ -145,7 +145,7 @@ struct MerchantDonauPayData json_t *budis_json; }; -// FIXME: One thing left is to receive the BUDIsKP + static enum GNUNET_GenericReturnValue prepare_donau_data (struct TALER_TESTING_Interpreter *is, struct MerchantDonauPayData *ss) @@ -155,25 +155,18 @@ prepare_donau_data (struct TALER_TESTING_Interpreter *is, { const struct TALER_TESTING_Command *charity_post_cmd; const unsigned long long *charity_id; - // const struct DONAU_CharityPrivateKeyP *charity_priv; charity_post_cmd = TALER_TESTING_interpreter_lookup_command (is, ss-> charity_reference); if (GNUNET_OK != - TALER_TESTING_get_trait_charity_id (charity_post_cmd, &charity_id) - // Well as the charity_priv, doesn't seem to be used anywhere, I think we can skip it... - // || - // GNUNET_OK != TALER_TESTING_get_trait_charity_priv (charity_post_cmd, - // &charity_priv) - ) + TALER_TESTING_get_trait_charity_id (charity_post_cmd, &charity_id)) { GNUNET_break (0); return GNUNET_SYSERR; } ss->charity_id = (uint64_t) *(charity_id); - // ss->charity_priv = *(charity_priv); } /* Get donau keys from trait */ @@ -254,8 +247,10 @@ prepare_donau_data (struct TALER_TESTING_Interpreter *is, ss->alg_values[cnt] = alg_values; break; case GNUNET_CRYPTO_BSA_CS: - GNUNET_assert (0); // FIXME: BUG-#### Cs support missing/broken for donau - // FUCK THIS CS CASE + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "CS donation-unit key not yet supported – skip"); + return GNUNET_NO; +// FIXME: BUG-#### Cs support missing/broken for donau // struct CSR_Data *csr_data = GNUNET_new (struct CSR_Data); // TALER_cs_withdraw_nonce_derive ( // FIXME: write new method // (struct TALER_PlanchetMasterSecretP *) &ps, @@ -390,6 +385,13 @@ struct PayState unsigned int num_issued_tokens; /** + * Number of donau_tokens in @e issued_tokens. + * + * For this moment, it can only be 0 or 1. + */ + unsigned int num_donau_tokens; + + /** * The session for which the payment is made. */ const char *session_id; @@ -741,7 +743,8 @@ pay_cb (void *cls, if (MHD_HTTP_OK == pr->hr.http_status) { ps->merchant_sig = pr->details.ok.merchant_sig; - if (ps->num_issued_tokens != pr->details.ok.num_tokens) + if (ps->num_issued_tokens + ps->num_donau_tokens != + pr->details.ok.num_tokens) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Unexpected number of tokens issued. " @@ -1104,11 +1107,18 @@ pay_run (void *cls, if (ps->donau_data.charity_reference != NULL) { - if (GNUNET_OK != prepare_donau_data (is, &ps->donau_data)) + switch (prepare_donau_data (is, &ps->donau_data)) { + case GNUNET_OK: + break; + case GNUNET_NO: + TALER_TESTING_interpreter_next (ps->is); + return; + case GNUNET_SYSERR: TALER_TESTING_FAIL (is); return; } + ps->num_donau_tokens++; } #else /* HAVE_DONAU_DONAU_SERVICE_H */ // Theoretically we have thought about paying without donau_url being selected, so could proceed... @@ -1152,12 +1162,14 @@ pay_run (void *cls, GNUNET_array_grow (ps->issued_tokens, ps->num_issued_tokens, - ps->num_issued_tokens + count); + ps->num_issued_tokens + count + + ps->num_donau_tokens); for (unsigned int k = 0; k < count; k++) { struct TALER_MERCHANT_PrivateTokenDetails *details = - &ps->issued_tokens[ps->num_issued_tokens - count + k]; + &ps->issued_tokens[ps->num_issued_tokens - count + k + + ps->num_donau_tokens]; if (GNUNET_OK != find_token_public_key (token_families,