taler-typescript-core

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

commit bf34cedb5cdb3a9033a3b2b93103544418133773
parent 2566fb8008d1bac70d210187ba61f2081f8c93a0
Author: Florian Dold <florian@dold.me>
Date:   Tue,  3 Jun 2025 16:21:02 +0200

wallet-core: handle kyc-auth response in initial kyc-check response

Diffstat:
Mpackages/taler-wallet-core/src/deposits.ts | 106+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
1 file changed, 60 insertions(+), 46 deletions(-)

diff --git a/packages/taler-wallet-core/src/deposits.ts b/packages/taler-wallet-core/src/deposits.ts @@ -1273,7 +1273,8 @@ async function transitionToKycRequired( }); const url = new URL(`kyc-check/${kycPaytoHash}`, exchangeUrl); - logger.info(`kyc url ${url.href}`); + logger.info(`kyc-check url ${url.href}`); + logger.info(`account owner pub: ${depositGroup.merchantPub}`); const kycStatusResp = await cancelableFetch(wex, url, { headers: { ["Account-Owner-Signature"]: sigResp.sig, @@ -1281,51 +1282,64 @@ async function transitionToKycRequired( }, }); logger.trace(`response status of initial kyc-check: ${kycStatusResp.status}`); - if (kycStatusResp.status === HttpStatusCode.Ok) { - logger.warn("kyc requested, but already fulfilled"); - return TaskRunResult.backoff(); - } else if (kycStatusResp.status === HttpStatusCode.Accepted) { - const statusResp = await readResponseJsonOrThrow( - kycStatusResp, - codecForAccountKycStatus(), - ); - const transitionInfo = await wex.db.runReadWriteTx( - { storeNames: ["depositGroups", "transactionsMeta"] }, - async (tx) => { - const dg = await tx.depositGroups.get(depositGroupId); - if (!dg) { - return undefined; - } - const oldTxState = computeDepositTransactionStatus(dg); - switch (dg.operationStatus) { - case DepositOperationStatus.LegacyPendingTrack: - case DepositOperationStatus.FinalizingTrack: - dg.operationStatus = DepositOperationStatus.PendingAggregateKyc; - break; - case DepositOperationStatus.PendingDeposit: - dg.operationStatus = DepositOperationStatus.PendingDepositKyc; - break; - default: - return; - } - dg.kycInfo = { - exchangeBaseUrl: exchangeUrl, - paytoHash: kycPaytoHash, - accessToken: statusResp.access_token, - }; - await tx.depositGroups.put(dg); - await ctx.updateTransactionMeta(tx); - const newTxState = computeDepositTransactionStatus(dg); - return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any }; - }, - ); - notifyTransition(wex, ctx.transactionId, transitionInfo); - return TaskRunResult.progress(); - } else { - throwUnexpectedRequestError( - kycStatusResp, - await readTalerErrorResponse(kycStatusResp), - ); + + switch (kycStatusResp.status) { + case HttpStatusCode.Ok: { + logger.warn("kyc requested, but already fulfilled"); + return TaskRunResult.backoff(); + } + case HttpStatusCode.Conflict: { + return await transitionToKycAuthRequired( + wex, + depositGroup, + kycPaytoHash, + exchangeUrl, + ); + } + case HttpStatusCode.Accepted: { + const statusResp = await readResponseJsonOrThrow( + kycStatusResp, + codecForAccountKycStatus(), + ); + const transitionInfo = await wex.db.runReadWriteTx( + { storeNames: ["depositGroups", "transactionsMeta"] }, + async (tx) => { + const dg = await tx.depositGroups.get(depositGroupId); + if (!dg) { + return undefined; + } + const oldTxState = computeDepositTransactionStatus(dg); + switch (dg.operationStatus) { + case DepositOperationStatus.LegacyPendingTrack: + case DepositOperationStatus.FinalizingTrack: + dg.operationStatus = DepositOperationStatus.PendingAggregateKyc; + break; + case DepositOperationStatus.PendingDeposit: + dg.operationStatus = DepositOperationStatus.PendingDepositKyc; + break; + default: + return; + } + dg.kycInfo = { + exchangeBaseUrl: exchangeUrl, + paytoHash: kycPaytoHash, + accessToken: statusResp.access_token, + }; + await tx.depositGroups.put(dg); + await ctx.updateTransactionMeta(tx); + const newTxState = computeDepositTransactionStatus(dg); + return { oldTxState, newTxState, balanceEffect: BalanceEffect.Any }; + }, + ); + notifyTransition(wex, ctx.transactionId, transitionInfo); + return TaskRunResult.progress(); + } + default: { + throwUnexpectedRequestError( + kycStatusResp, + await readTalerErrorResponse(kycStatusResp), + ); + } } }