From ee42582de202ecc485cc0e153810f25ecb9055d8 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Mon, 20 May 2024 15:51:36 -0300 Subject: fix #8855 --- packages/taler-wallet-core/src/pay-merchant.ts | 64 +++++++++++++--------- packages/taler-wallet-core/src/wallet-api-types.ts | 3 +- 2 files changed, 41 insertions(+), 26 deletions(-) (limited to 'packages/taler-wallet-core') diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts index f08db3a6a..8b6cb5e8d 100644 --- a/packages/taler-wallet-core/src/pay-merchant.ts +++ b/packages/taler-wallet-core/src/pay-merchant.ts @@ -34,6 +34,8 @@ import { assertUnreachable, AsyncFlag, checkDbInvariant, + CheckPaymentResponse, + CheckPayTemplateReponse, CheckPayTemplateRequest, codecForAbortResponse, codecForMerchantContractTerms, @@ -79,6 +81,7 @@ import { TalerErrorCode, TalerErrorDetail, TalerMerchantApi, + TalerMerchantInstanceHttpClient, TalerPreciseTimestamp, TalerProtocolViolationError, TalerUriAction, @@ -627,8 +630,7 @@ async function processDownloadProposal( if (proposal.purchaseStatus != PurchaseStatus.PendingDownloadingProposal) { logger.error( - `unexpected state ${proposal.purchaseStatus}/${ - PurchaseStatus[proposal.purchaseStatus] + `unexpected state ${proposal.purchaseStatus}/${PurchaseStatus[proposal.purchaseStatus] } for ${ctx.transactionId} in processDownloadProposal`, ); return TaskRunResult.finished(); @@ -887,8 +889,7 @@ async function createOrReusePurchase( oldProposal.claimToken === claimToken ) { logger.info( - `Found old proposal (status=${ - PurchaseStatus[oldProposal.purchaseStatus] + `Found old proposal (status=${PurchaseStatus[oldProposal.purchaseStatus] }) for order ${orderId} at ${merchantBaseUrl}`, ); if (oldProposal.purchaseStatus === PurchaseStatus.DialogShared) { @@ -1601,16 +1602,31 @@ async function downloadTemplate( export async function checkPayForTemplate( wex: WalletExecutionContext, req: CheckPayTemplateRequest, -): Promise { +): Promise { const parsedUri = parsePayTemplateUri(req.talerPayTemplateUri); if (!parsedUri) { throw Error("invalid taler-template URI"); } - return await downloadTemplate( + const asd = await downloadTemplate( wex, parsedUri.merchantBaseUrl, parsedUri.templateId, ); + + const merchantApi = new TalerMerchantInstanceHttpClient( + parsedUri.merchantBaseUrl, + wex.http, + ); + + const cfg = await merchantApi.getConfig() + if (cfg.type === "fail") { + throw TalerError.fromUncheckedDetail(cfg.detail); + } + + return { + ...asd, + supportedCurrencies: Object.keys(cfg.body.currencies) + } } export async function preparePayForTemplate( @@ -1630,28 +1646,26 @@ export async function preparePayForTemplate( parsedUri.templateId, ); - const amountFromUri = templateInfo.editable_defaults?.amount; - if (amountFromUri != null) { - const templateParamsAmount = req.templateParams?.amount; - if (templateParamsAmount != null) { - templateDetails.amount = templateParamsAmount as AmountString; - } else { - if (Amounts.isCurrency(amountFromUri)) { - throw Error( - "Amount from template URI only has a currency without value. The value must be provided in the templateParams.", - ); - } else { - templateDetails.amount = amountFromUri as AmountString; - } + const templateParamsAmount = req.templateParams?.amount as AmountString | undefined; + if (templateParamsAmount === null) { + const amountFromUri = templateInfo.editable_defaults?.amount; + if (amountFromUri != null) { + templateDetails.amount = amountFromUri as AmountString; } + } else { + templateDetails.amount = templateParamsAmount } - if ( - templateInfo.editable_defaults?.summary !== undefined && - typeof templateInfo.editable_defaults?.summary === "string" - ) { - templateDetails.summary = - req.templateParams?.summary ?? templateInfo.editable_defaults?.summary; + + const templateParamsSummary = req.templateParams?.summary; + if (templateParamsSummary === null) { + const summaryFromUri = templateInfo.editable_defaults?.summary; + if (summaryFromUri != null) { + templateDetails.summary = summaryFromUri; + } + } else { + templateDetails.summary = templateParamsSummary } + const reqUrl = new URL( `templates/${parsedUri.templateId}`, parsedUri.merchantBaseUrl, diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index 2a1b7d170..1bcab801c 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -40,6 +40,7 @@ import { BalancesResponse, CanonicalizeBaseUrlRequest, CanonicalizeBaseUrlResponse, + CheckPayTemplateReponse, CheckPayTemplateRequest, CheckPeerPullCreditRequest, CheckPeerPullCreditResponse, @@ -553,7 +554,7 @@ export type SharePaymentOp = { export type CheckPayForTemplateOp = { op: WalletApiOperation.CheckPayForTemplate; request: CheckPayTemplateRequest; - response: TalerMerchantApi.WalletTemplateDetails; + response: CheckPayTemplateReponse; }; /** -- cgit v1.2.3