From: Chris Duncan Date: Mon, 18 Aug 2025 16:56:12 +0000 (-0700) Subject: Migrate wallet lock method to separate module and call it synchronously. X-Git-Tag: v0.10.5~41^2~66 X-Git-Url: https://git.codecow.com/?a=commitdiff_plain;h=2f53ec043d30e9669485c1f87f70979715723dbc;p=libnemo.git Migrate wallet lock method to separate module and call it synchronously. --- diff --git a/src/lib/vault/vault.ts b/src/lib/vault/vault.ts index 5d299ff..73248c8 100644 --- a/src/lib/vault/vault.ts +++ b/src/lib/vault/vault.ts @@ -56,7 +56,7 @@ export class Vault { break } case 'lock': { - result = await this.lock() + result = this.lock() break } case 'sign': { diff --git a/src/lib/wallet/index.ts b/src/lib/wallet/index.ts index 1f9873a..f139056 100644 --- a/src/lib/wallet/index.ts +++ b/src/lib/wallet/index.ts @@ -11,6 +11,7 @@ import { _create } from './create' import { Database } from '../database' import { _get } from './get' import { _load } from './load' +import { _lock } from './lock' import { _restore } from './restore' import { Rpc } from '../rpc' import { _sign } from './sign' @@ -272,24 +273,11 @@ export class Wallet { } /** - * Locks the wallet and all currently derived accounts with a password that - * will be needed to unlock it later. - * - * @returns True if successfully locked + * Clears the seed and mnemonic from the vault. */ - async lock (): Promise { - try { - const { isLocked } = await this.#vault.request({ - action: 'lock' - }) - if (!isLocked) { - throw new Error('Lock request to Vault failed') - } - clearTimeout(this.#lockTimer) - return isLocked - } catch (err) { - throw new Error('Failed to lock wallet', { cause: err }) - } + lock (): void { + _lock(this.#vault) + clearTimeout(this.#lockTimer) } /** @@ -337,7 +325,6 @@ export class Wallet { * Unlocks the wallet using the same password as used prior to lock it. * * @param {string} password Used previously to lock the wallet - * @returns True if successfully unlocked */ async unlock (password: string): Promise { await _unlock(this, this.#vault, password) diff --git a/src/lib/wallet/ledger.ts b/src/lib/wallet/ledger.ts index bcc5683..54767e9 100644 --- a/src/lib/wallet/ledger.ts +++ b/src/lib/wallet/ledger.ts @@ -226,9 +226,7 @@ export class Ledger extends Wallet { */ async destroy (): Promise { await super.destroy() - if (!(await this.lock())) { - throw new Error('Failed to lock Ledger wallet') - } + this.lock() } /** @@ -240,22 +238,16 @@ export class Ledger extends Wallet { * * Overrides the default wallet `lock()` method since as a hardware wallet it * does not need to be encrypted by software. - * - * @returns True if successfully locked */ - async lock (): Promise { - try { + lock (): void { + setTimeout(async () => { const devices = await globalThis.navigator.usb.getDevices() for (const device of devices) { if (device.vendorId === ledgerUSBVendorId) { - await device.forget() + device.forget() } } - return new Promise(r => setTimeout(r, 0, true)) - } catch (err) { - console.log(err) - return new Promise(r => setTimeout(r, 0, false)) - } + }) } /** diff --git a/src/lib/wallet/lock.ts b/src/lib/wallet/lock.ts new file mode 100644 index 0000000..ed58d86 --- /dev/null +++ b/src/lib/wallet/lock.ts @@ -0,0 +1,18 @@ +//! SPDX-FileCopyrightText: 2025 Chris Duncan +//! SPDX-License-Identifier: GPL-3.0-or-later + +import { WorkerQueue } from '../vault/worker-queue' + +export async function _lock (vault: WorkerQueue): Promise +export async function _lock (vault: WorkerQueue): Promise { + try { + const { isLocked } = await vault.request({ + action: 'lock' + }) + if (!isLocked) { + throw new Error('Lock request to Vault failed') + } + } catch (err) { + throw new Error('Failed to lock wallet', { cause: err }) + } +} diff --git a/test/test.lock-unlock.mjs b/test/test.lock-unlock.mjs index 58a7bc2..f806ea6 100644 --- a/test/test.lock-unlock.mjs +++ b/test/test.lock-unlock.mjs @@ -42,10 +42,16 @@ await Promise.all([ await test('fail to unlock a Bip44Wallet with different passwords', async () => { const wallet = await Wallet.load('BIP-44', NANO_TEST_VECTORS.PASSWORD, NANO_TEST_VECTORS.MNEMONIC, NANO_TEST_VECTORS.PASSWORD) await wallet.unlock(NANO_TEST_VECTORS.PASSWORD) - const lockResult = await wallet.lock() + wallet.lock() + + await assert.rejects(wallet.verify(NANO_TEST_VECTORS.MNEMONIC)) + await assert.rejects(wallet.verify(NANO_TEST_VECTORS.BIP39_SEED)) + assert.ok('mnemonic' in wallet) + assert.ok('seed' in wallet) + assert.ok(wallet.mnemonic === undefined) + assert.ok(wallet.seed === undefined) await assert.rejects(wallet.unlock(TREZOR_TEST_VECTORS.PASSWORD), { message: 'Failed to unlock wallet' }) - assert.equal(lockResult, true) assert.ok('mnemonic' in wallet) assert.ok('seed' in wallet) assert.ok(wallet.mnemonic === undefined)