From 235ba079a189c43cd8021523d9998f86793e8efe Mon Sep 17 00:00:00 2001 From: Umair Sarfraz Date: Thu, 11 Mar 2021 17:05:05 +0100 Subject: [PATCH 1/2] feat: verify, store mnemonic in wallet.rs explicitly on text import --- .../backend/bindings/node/native/Cargo.lock | 20 +++++- packages/shared/lib/router.ts | 2 +- packages/shared/lib/walletApi.ts | 4 +- .../shared/routes/setup/backup/Backup.svelte | 2 + .../shared/routes/setup/import/Import.svelte | 2 + .../routes/setup/protect/Protect.svelte | 68 +++++++++++++++++-- .../routes/setup/protect/views/Pin.svelte | 4 +- 7 files changed, 91 insertions(+), 11 deletions(-) diff --git a/packages/backend/bindings/node/native/Cargo.lock b/packages/backend/bindings/node/native/Cargo.lock index cce6c700b7c..d3e8dc98ea3 100644 --- a/packages/backend/bindings/node/native/Cargo.lock +++ b/packages/backend/bindings/node/native/Cargo.lock @@ -1800,7 +1800,7 @@ dependencies = [ [[package]] name = "iota-client" version = "0.5.0-alpha.3" -source = "git+https://github.com/iotaledger/iota.rs?branch=dev#aa4bea2f7220cf34efbc2eb933a8584104277664" +source = "git+https://github.com/iotaledger/iota.rs?branch=dev#2422c5c5be81dfda72709dcd7a536f27f0348bfc" dependencies = [ "async-trait", "bee-common 0.3.1-alpha (git+https://github.com/iotaledger/bee.git?branch=dev)", @@ -1810,7 +1810,7 @@ dependencies = [ "bee-rest-api", "chrono", "hex", - "iota-crypto 0.2.0 (git+https://github.com/iotaledger/crypto.rs.git?rev=527392202e78fa35620a9b30061d5e231a046ea2)", + "iota-crypto 0.3.0 (git+https://github.com/iotaledger/crypto.rs.git?rev=61924d5c237254f5a6da0e9ac61cd7e7bb310058)", "num_cpus", "reqwest", "serde 1.0.124", @@ -1834,7 +1834,7 @@ dependencies = [ [[package]] name = "iota-core" version = "0.2.0-alpha.3" -source = "git+https://github.com/iotaledger/iota.rs?branch=dev#aa4bea2f7220cf34efbc2eb933a8584104277664" +source = "git+https://github.com/iotaledger/iota.rs?branch=dev#2422c5c5be81dfda72709dcd7a536f27f0348bfc" dependencies = [ "bee-common 0.3.1-alpha (git+https://github.com/iotaledger/bee.git?rev=c42171ff33c80cc2efb183e244dc79b7f58d9ac4)", "bee-message", @@ -1872,6 +1872,20 @@ dependencies = [ "sha2 0.9.3", ] +[[package]] +name = "iota-crypto" +version = "0.3.0" +source = "git+https://github.com/iotaledger/crypto.rs.git?rev=61924d5c237254f5a6da0e9ac61cd7e7bb310058#61924d5c237254f5a6da0e9ac61cd7e7bb310058" +dependencies = [ + "blake2", + "digest 0.9.0", + "ed25519-zebra", + "getrandom 0.2.2", + "hmac 0.10.1", + "serde 1.0.124", + "sha2 0.9.3", +] + [[package]] name = "iota-crypto" version = "0.3.0" diff --git a/packages/shared/lib/router.ts b/packages/shared/lib/router.ts index 424054fa191..4c96eaf5003 100644 --- a/packages/shared/lib/router.ts +++ b/packages/shared/lib/router.ts @@ -37,7 +37,7 @@ export const path = readable(null, (set) => { /** * Onboarding/setup type */ -let walletSetupType = writable(null) +export const walletSetupType = writable(null) /* * Current view diff --git a/packages/shared/lib/walletApi.ts b/packages/shared/lib/walletApi.ts index d1538fb53a8..ee53f4f6732 100644 --- a/packages/shared/lib/walletApi.ts +++ b/packages/shared/lib/walletApi.ts @@ -116,9 +116,9 @@ const eventsApiResponseTypes = Object.values(eventsApiToResponseTypeMap) * Response subscriber. * Receives messages from wallet.rs. */ -Wallet.onMessage((message: MessageResponse) => { +Wallet.onMessage((message: MessageResponse) => { const _deleteCallbackId = (_id: string) => { - // Do not delete callback ids for events api methods + // Do not delete callback ids for events api methods if (!eventsApiResponseTypes.includes(message.type)) { delete callbacksStore[_id] } diff --git a/packages/shared/routes/setup/backup/Backup.svelte b/packages/shared/routes/setup/backup/Backup.svelte index ae24a34c2b7..49c650366f8 100644 --- a/packages/shared/routes/setup/backup/Backup.svelte +++ b/packages/shared/routes/setup/backup/Backup.svelte @@ -101,6 +101,8 @@ }, { onSuccess() { + // Clear mnemonic + mnemonic.set(null); dispatch('next') }, onError(err) { diff --git a/packages/shared/routes/setup/import/Import.svelte b/packages/shared/routes/setup/import/Import.svelte index 5cea1cd2c9f..45fe4267b9f 100644 --- a/packages/shared/routes/setup/import/Import.svelte +++ b/packages/shared/routes/setup/import/Import.svelte @@ -3,6 +3,7 @@ import { Transition } from 'shared/components' import { Import, TextImport, FileImport, BackupPassword, Success } from './views/' import { api } from 'shared/lib/wallet' + import { mnemonic } from 'shared/lib/app' export let locale export let mobile @@ -46,6 +47,7 @@ dispatch('next', { importType }) } else { importType = 'mnemonic' + mnemonic.set(input.split(' ')) nextState = ImportState.Success } break diff --git a/packages/shared/routes/setup/protect/Protect.svelte b/packages/shared/routes/setup/protect/Protect.svelte index abba90702de..f99a109c190 100644 --- a/packages/shared/routes/setup/protect/Protect.svelte +++ b/packages/shared/routes/setup/protect/Protect.svelte @@ -8,10 +8,16 @@ import { get } from 'svelte/store' import { Pin, Protect } from './views/' import { showAppNotification } from 'shared/lib/notifications' + import { walletSetupType } from 'shared/lib/router' + import { mnemonic } from 'shared/lib/app' + import { DEFAULT_NODE, DEFAULT_NODES, network } from 'shared/lib/network' + import { SetupType } from 'shared/lib/typings/routes' export let locale export let mobile + let isVerifyingPin = false + enum ProtectState { Init = 'init', Biometric = 'biometric', @@ -34,6 +40,47 @@ break } + // Initialises wallet from imported mnemonic + // Verifies mnemonic syntactically + // Stores mnemonic + // Creates first account + function initialiseWallet(input: string): Promise { + return new Promise((resolve, reject) => { + api.verifyMnemonic(input, { + onSuccess() { + api.storeMnemonic(input, { + onSuccess() { + api.createAccount( + { + signerType: { type: 'Stronghold' }, + clientOptions: { + node: DEFAULT_NODE, + nodes: DEFAULT_NODES, + network: $network, + }, + }, + { + onSuccess() { + resolve() + }, + onError(error) { + reject(error) + }, + } + ) + }, + onError(error) { + reject(error) + }, + }) + }, + onError(error) { + reject(error) + }, + }) + }) + } + const _next = async (event) => { let nextState let params = event.detail || {} @@ -53,6 +100,8 @@ break case ProtectState.Confirm: try { + isVerifyingPin = true + if (!validatePinFormat(pin)) { throw new Error('Invalid pin code!') } @@ -60,10 +109,21 @@ await Electron.PincodeManager.set(get(activeProfile).id, pin) api.setStoragePassword(pin, { - onSuccess() { - dispatch('next', { pin }) + async onSuccess() { + if ($walletSetupType === SetupType.Mnemonic) { + await initialiseWallet(get(mnemonic).join(' ')) + + // Clear mnemonic + mnemonic.set(null) + dispatch('next', { pin }) + } else { + dispatch('next', { pin }) + } + + isVerifyingPin = false }, onError(err) { + isVerifyingPin = false showAppNotification({ type: 'error', message: locale(err.error), @@ -72,6 +132,7 @@ }) break } catch (error) { + isVerifyingPin = false console.error(error) } } @@ -92,7 +153,6 @@ } -