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:
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);
}
/**