From 8f3db0dbc0bafdc604bd7359bd41370f594c792c Mon Sep 17 00:00:00 2001 From: Kevin Serrano Date: Tue, 1 Nov 2016 22:19:04 -0700 Subject: [PATCH] Add reveal of seed words. --- app/scripts/keyring-controller.js | 10 ++++++++-- app/scripts/metamask-controller.js | 1 + ui/app/actions.js | 23 +++++++++++++++++++++++ ui/app/app.js | 4 ++++ ui/app/config.js | 16 ++++++++++++++++ 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/app/scripts/keyring-controller.js b/app/scripts/keyring-controller.js index b93d4a156..e6a7d95b2 100644 --- a/app/scripts/keyring-controller.js +++ b/app/scripts/keyring-controller.js @@ -132,8 +132,6 @@ module.exports = class KeyringController extends EventEmitter { .then((encryptedString) => { this.configManager.setVault(encryptedString) cb(null, serialized) - // NORMAL BEHAVIOR: - // return cb(null, this.getState()) }) .catch((err) => { cb(err) @@ -157,6 +155,14 @@ module.exports = class KeyringController extends EventEmitter { } } + placeSeedWords () { + const firstKeyring = this.keyrings[0] + const seedWords = firstKeyring.serialize().mnemonic + this.configManager.setSeedWords(seedWords) + } + + + submitPassword(password, cb) { this.loadKey(password) .then((key) => { diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 6dffefe98..a165a2e2a 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -59,6 +59,7 @@ module.exports = class MetamaskController { setGasMultiplier: this.setGasMultiplier.bind(this), // forward directly to keyringController + placeSeedWords: keyringController.placeSeedWords.bind(keyringController), createNewVaultAndKeychain: keyringController.createNewVaultAndKeychain.bind(keyringController), createNewVaultAndRestore: keyringController.createNewVaultAndRestore.bind(keyringController), clearSeedWordCache: keyringController.clearSeedWordCache.bind(keyringController), diff --git a/ui/app/actions.js b/ui/app/actions.js index 8218e05ef..070ba2da0 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -30,6 +30,10 @@ var actions = { addNewAccount, showNewVaultSeed: showNewVaultSeed, showInfoPage: showInfoPage, + // seed recovery actions + REVEAL_SEED_CONFIRMATION: 'REVEAL_SEED_CONFIRMATION', + revealSeedConfirmation: revealSeedConfirmation, + requestRevealSeed: requestRevealSeed, // unlock screen UNLOCK_IN_PROGRESS: 'UNLOCK_IN_PROGRESS', UNLOCK_FAILED: 'UNLOCK_FAILED', @@ -213,6 +217,25 @@ function createNewVaultAndKeychain (password, entropy) { } } +function revealSeedConfirmation () { + return { + type: this.REVEAL_SEED_CONFIRMATION, + } +} + +function requestRevealSeed (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + background.submitPassword(password, (err, newState) => { + dispatch(actions.hideLoadingIndication()) + if (err) return dispatch(actions.displayWarning(err.message)) + background.placeSeedWords() + dispatch(actions.showNewVaultSeed()) + }) + } +} + + function addNewKeyring (type, opts) { return (dispatch) => { dispatch(actions.showLoadingIndication()) diff --git a/ui/app/app.js b/ui/app/app.js index 4b1818b93..a2532c153 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -28,6 +28,7 @@ const BuyView = require('./components/buy-button-subview') const QrView = require('./components/qr-code') const HDCreateVaultComplete = require('./keychains/hd/create-vault-complete') const HDRestoreVaultScreen = require('./keychains/hd/restore-vault') +const RevealSeedConfirmation = require('./keychains/hd/recover-seed/confirmation') module.exports = connect(mapStateToProps)(App) @@ -411,6 +412,9 @@ App.prototype.renderPrimary = function () { case 'config': return h(ConfigScreen, {key: 'config'}) + case 'reveal-seed-conf': + return h(RevealSeedConfirmation, {key: 'reveal-seed-conf'}) + case 'info': return h(InfoScreen, {key: 'info'}) diff --git a/ui/app/config.js b/ui/app/config.js index d4730e558..e09a38cd8 100644 --- a/ui/app/config.js +++ b/ui/app/config.js @@ -77,6 +77,22 @@ ConfigScreen.prototype.render = function () { currentConversionInformation(metamaskState, state), h('hr.horizontal-line'), + h('div', { + style: { + marginTop: '20px', + }, + }, [ + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + event.preventDefault() + state.dispatch(actions.revealSeedConfirmation()) + }, + }, 'Reveal Seed Words'), + ]), + ]), ]), ])