From ca8da4ed380b308abdc894145c7e1a102bfd6cf0 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Thu, 13 Oct 2022 15:24:47 +0200 Subject: wallet-core: only allow enabling dev mode via separate request --- packages/taler-util/src/walletTypes.ts | 9 ++++++ packages/taler-wallet-cli/src/index.ts | 24 ++++++++++++++++ packages/taler-wallet-core/src/dev-experiments.ts | 33 ++++++++++++---------- packages/taler-wallet-core/src/wallet-api-types.ts | 9 ++++++ packages/taler-wallet-core/src/wallet.ts | 8 +++++- 5 files changed, 67 insertions(+), 16 deletions(-) (limited to 'packages') diff --git a/packages/taler-util/src/walletTypes.ts b/packages/taler-util/src/walletTypes.ts index a1fa9b439..d0765ae31 100644 --- a/packages/taler-util/src/walletTypes.ts +++ b/packages/taler-util/src/walletTypes.ts @@ -1684,6 +1684,15 @@ export interface AcceptPeerPullPaymentRequest { peerPullPaymentIncomingId: string; } +export interface SetDevModeRequest { + devModeEnabled: boolean; +} + +export const codecForSetDevModeRequest = (): Codec => + buildCodecForObject() + .property("devModeEnabled", codecForBoolean()) + .build("SetDevModeRequest"); + export interface ApplyDevExperimentRequest { devExperimentUri: string; } diff --git a/packages/taler-wallet-cli/src/index.ts b/packages/taler-wallet-cli/src/index.ts index 6ae78bd47..941a2f28f 100644 --- a/packages/taler-wallet-cli/src/index.ts +++ b/packages/taler-wallet-cli/src/index.ts @@ -1018,6 +1018,30 @@ advancedCli }); }); +advancedCli + .subcommand("enableDevMode", "enable-dev-mode", { + help: "Enable developer mode (dangerous!)", + }) + .action(async (args) => { + await withWallet(args, async (wallet) => { + await wallet.client.call(WalletApiOperation.SetDevMode, { + devModeEnabled: true, + }); + }); + }); + +advancedCli + .subcommand("disableDevMode", "disable-dev-mode", { + help: "Disable developer mode", + }) + .action(async (args) => { + await withWallet(args, async (wallet) => { + await wallet.client.call(WalletApiOperation.SetDevMode, { + devModeEnabled: false, + }); + }); + }); + const coinPubListCodec = codecForList(codecForString()); advancedCli diff --git a/packages/taler-wallet-core/src/dev-experiments.ts b/packages/taler-wallet-core/src/dev-experiments.ts index c3167b3e4..6516db929 100644 --- a/packages/taler-wallet-core/src/dev-experiments.ts +++ b/packages/taler-wallet-core/src/dev-experiments.ts @@ -36,20 +36,11 @@ import { const logger = new Logger("dev-experiments.ts"); -/** - * Apply a dev experiment to the wallet database / state. - */ -export async function applyDevExperiment( +export async function setDevMode( ws: InternalWalletState, - uri: string, + enabled: boolean, ): Promise { - logger.info(`applying dev experiment ${uri}`); - const parsedUri = parseDevExperimentUri(uri); - if (!parsedUri) { - logger.info("unable to parse dev experiment URI"); - return; - } - if (parsedUri.devExperimentId == "enable-devmode") { + if (enabled) { logger.info("enabling devmode"); await ws.db .mktx((x) => [x.config]) @@ -60,9 +51,7 @@ export async function applyDevExperiment( }); }); await maybeInitDevMode(ws); - return; - } - if (parsedUri.devExperimentId === "disable-devmode") { + } else { logger.info("disabling devmode"); await ws.db .mktx((x) => [x.config]) @@ -73,6 +62,20 @@ export async function applyDevExperiment( }); }); await leaveDevMode(ws); + } +} + +/** + * Apply a dev experiment to the wallet database / state. + */ +export async function applyDevExperiment( + ws: InternalWalletState, + uri: string, +): Promise { + logger.info(`applying dev experiment ${uri}`); + const parsedUri = parseDevExperimentUri(uri); + if (!parsedUri) { + logger.info("unable to parse dev experiment URI"); return; } if (!ws.devModeActive) { diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index cecdd1281..63d960f81 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -67,6 +67,7 @@ import { RecoveryLoadRequest, RetryTransactionRequest, SetCoinSuspendedRequest, + SetDevModeRequest, SetWalletDeviceIdRequest, TestPayArgs, TestPayResult, @@ -140,6 +141,7 @@ export enum WalletApiOperation { AcceptPeerPullPayment = "acceptPeerPullPayment", ClearDb = "clearDb", Recycle = "recycle", + SetDevMode = "setDevMode", ApplyDevExperiment = "applyDevExperiment", } @@ -529,6 +531,12 @@ export type ApplyDevExperimentOp = { response: {}; }; +export type SetDevModeOp = { + op: WalletApiOperation.SetDevMode; + request: SetDevModeRequest; + response: {}; +}; + /** * Run a simple integration test on a test deployment * of the exchange and merchant. @@ -676,6 +684,7 @@ export type WalletOperations = { [WalletApiOperation.ClearDb]: ClearDbOp; [WalletApiOperation.Recycle]: RecycleOp; [WalletApiOperation.ApplyDevExperiment]: ApplyDevExperimentOp; + [WalletApiOperation.SetDevMode]: SetDevModeOp; }; export type RequestType< diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index 48d379931..254648064 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -94,6 +94,7 @@ import { URL, WalletCoreVersion, WalletNotification, + codecForSetDevModeRequest, } from "@gnu-taler/taler-util"; import { TalerCryptoInterface } from "./crypto/cryptoImplementation.js"; import { @@ -111,7 +112,7 @@ import { importDb, WalletStoresV1, } from "./db.js"; -import { applyDevExperiment, maybeInitDevMode } from "./dev-experiments.js"; +import { applyDevExperiment, maybeInitDevMode, setDevMode } from "./dev-experiments.js"; import { getErrorDetailFromException, TalerError } from "./errors.js"; import { ActiveLongpollInfo, @@ -1334,6 +1335,11 @@ async function dispatchRequestInternal( await applyDevExperiment(ws, req.devExperimentUri); return {}; } + case "setDevMode": { + const req = codecForSetDevModeRequest().decode(payload); + await setDevMode(ws, req.devModeEnabled); + return {}; + } case "getVersion": { const version: WalletCoreVersion = { hash: GIT_HASH, -- cgit v1.2.3