taler-typescript-core

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

commit 9fba8c16c1d94287f36909ec974f555f27e14493
parent 4ed9bd5d575c00585986977b7966840eaa0ef210
Author: Florian Dold <florian@dold.me>
Date:   Wed, 22 Jul 2026 01:42:47 +0200

harness: fix secmod purging logic

Exchange treats config headings case-sensitively, even though they're
not. The coin_ prefix of private key files can thus have any casing, and
we must consider that when purging them.

Diffstat:
Mpackages/taler-harness/src/harness/harness.ts | 21+++++++++++++++++----
1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts @@ -43,6 +43,7 @@ import { MerchantAccountKycRedirectsResponse, MerchantAuthMethod, PaytoString, + Paytos, Result, TalerCoreBankHttpClient, TalerCorebankApiClient, @@ -67,7 +68,6 @@ import { hash, j2s, openPromise, - Paytos, stringToBytes, succeedOrThrow, } from "@gnu-taler/taler-util"; @@ -2008,6 +2008,17 @@ export class ExchangeService implements ExchangeServiceInterface { ); } + private async purgeCoinDirs(dir: string): Promise<void> { + const files = await fs.promises.readdir(dir); + const filesToDelete = files.filter((file) => + file.toLowerCase().startsWith("coin_"), + ); + for (const f of filesToDelete) { + logger.info(`deleting ${dir}/${f}`); + await fs.promises.rm(`${dir}/${f}`, { recursive: true }); + } + } + /** * Purge all secmod keys, including message and coin signing keys. */ @@ -2022,8 +2033,10 @@ export class ExchangeService implements ExchangeServiceInterface { const eddsaKeydir = cfg .getPath("taler-exchange-secmod-eddsa", "KEY_DIR") .required(); + logger.info(`purging rsa coins at: ${rsaKeydir}`); + logger.info(`purging eddsa keys at: ${eddsaKeydir}`); + await this.purgeCoinDirs(rsaKeydir); // Be *VERY* careful when changing this, or you will accidentally delete user data. - await sh(this.globalState, "rm-secmod-keys", `rm -rf ${rsaKeydir}/COIN_*`); await sh(this.globalState, "rm-secmod-keys", `rm ${eddsaKeydir}/*`); } @@ -2039,8 +2052,8 @@ export class ExchangeService implements ExchangeServiceInterface { const rsaKeydir = cfg .getPath("taler-exchange-secmod-rsa", "KEY_DIR") .required(); - // Be *VERY* careful when changing this, or you will accidentally delete user data. - await sh(this.globalState, "rm-secmod-keys", `rm -rf ${rsaKeydir}/COIN_*`); + logger.info(`purging rsa coins at: ${rsaKeydir}`); + await this.purgeCoinDirs(rsaKeydir); } /**