taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

commit 22fba35a812d0685adf57f5e15be67f8d99954ae
parent 530c74ab22121d25f9db7c6ddf15649b4bad0bcc
Author: Florian Dold <florian@dold.me>
Date:   Wed, 24 Jun 2026 15:58:12 +0200

be more lenient with validating object keys of contract terms

The merchant allows dashes in token family names. These are used as keys
in the contract terms JSON object.  So far, the wallet only allowed
alphanumeric ASCII characters and underscore.

Diffstat:
Mpackages/taler-util/src/contract-terms.ts | 4++--
Mpackages/taler-wallet-core/src/pay-merchant.ts | 6+++---
2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/packages/taler-util/src/contract-terms.ts b/packages/taler-util/src/contract-terms.ts @@ -126,7 +126,7 @@ export namespace ContractTermsUtil { return dup; } - const nameRegex = /^[0-9A-Za-z_]+$/; + const nameRegex = /^[-0-9A-Za-z_]+$/; /** * Check that the given JSON object is well-formed with regards @@ -237,7 +237,7 @@ export namespace ContractTermsUtil { const regex = new RegExp("^(\\*\\.)?([\\w\\d]+\\.)+[\\w\\d]+$"); for (const slug in contractTerms.token_families) { const family = contractTerms.token_families[slug]; - var domains: string[] = []; + const domains: string[] = []; switch (family.details.class) { case MerchantContractTokenKind.Subscription: domains.push(...family.details.trusted_domains); diff --git a/packages/taler-wallet-core/src/pay-merchant.ts b/packages/taler-wallet-core/src/pay-merchant.ts @@ -965,7 +965,7 @@ async function processDownloadProposal( `orders/${proposal.orderId}/claim`, proposal.merchantBaseUrl, ); - logger.trace("downloading contract from '" + orderClaimUrl + "'"); + logger.trace(`downloading contract from ${orderClaimUrl.href}`); const requestBody: { nonce: string; @@ -1034,7 +1034,7 @@ async function processDownloadProposal( if (!isWellFormed) { logger.trace( - `malformed contract terms: ${j2s(proposalResp.contract_terms)}`, + `malformed contract terms (validateForgettable): ${j2s(proposalResp.contract_terms)}`, ); const err = makeErrorDetail( TalerErrorCode.WALLET_CONTRACT_TERMS_MALFORMED, @@ -1082,7 +1082,7 @@ async function processDownloadProposal( const err = makeErrorDetail( TalerErrorCode.WALLET_CONTRACT_TERMS_MALFORMED, {}, - "validation for well-formedness failed", + "validation for well-formedness failed (validateParsed)", ); await failProposalClaimPermanently(wex, proposalId, err); throw makePendingOperationFailedError(