From 5d8a3dd99b0cebad48e2fdcc4c407d7d89d4717c Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 18 Jan 2017 16:45:39 -0800 Subject: [PATCH] Add ability to import v3 JSON wallets There is now a menu item labeled "JSON File" for importing, and it can digest either: - v1 MyEtherWallet JSON files - v3 Account files (used by Geth, Mist, and MyEtherWallet). Fixes #715 --- app/scripts/account-import-strategies/index.js | 18 +++++++++++++----- ui/app/actions.js | 5 +++-- ui/app/app.js | 5 +++-- ui/app/components/loading.js | 8 +++++++- ui/app/reducers/app.js | 1 + 5 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/scripts/account-import-strategies/index.js b/app/scripts/account-import-strategies/index.js index 8f4456cdf..d5124eb7f 100644 --- a/app/scripts/account-import-strategies/index.js +++ b/app/scripts/account-import-strategies/index.js @@ -7,8 +7,7 @@ const accountImporter = { importAccount(strategy, args) { try { const importer = this.strategies[strategy] - const wallet = importer.apply(null, args) - const privateKeyHex = walletToPrivateKey(wallet) + const privateKeyHex = importer.apply(null, args) return Promise.resolve(privateKeyHex) } catch (e) { return Promise.reject(e) @@ -18,11 +17,20 @@ const accountImporter = { strategies: { 'Private Key': (privateKey) => { const stripped = ethUtil.stripHexPrefix(privateKey) - const buffer = new Buffer(stripped, 'hex') - return Wallet.fromPrivateKey(buffer) + return stripped }, 'JSON File': (input, password) => { - const wallet = importers.fromEtherWallet(input, password) + let wallet + try { + wallet = importers.fromEtherWallet(input, password) + } catch (e) { + console.log('Attempt to import as EtherWallet format failed, trying V3...') + } + + if (!wallet) { + wallet = Wallet.fromV3(input, password, true) + } + return walletToPrivateKey(wallet) }, }, diff --git a/ui/app/actions.js b/ui/app/actions.js index 36efa4bc6..bf3617310 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -267,7 +267,7 @@ function addNewKeyring (type, opts) { function importNewAccount (strategy, args) { return (dispatch) => { - dispatch(actions.showLoadingIndication()) + dispatch(actions.showLoadingIndication('This may take a while, be patient.')) background.importAccountWithStrategy(strategy, args, (err, newState) => { dispatch(actions.hideLoadingIndication()) if (err) return dispatch(actions.displayWarning(err.message)) @@ -630,9 +630,10 @@ function useEtherscanProvider () { } } -function showLoadingIndication () { +function showLoadingIndication (message) { return { type: actions.SHOW_LOADING, + value: message, } } diff --git a/ui/app/app.js b/ui/app/app.js index 0e04c334c..d8dedd397 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -43,6 +43,7 @@ function mapStateToProps (state) { return { // state from plugin isLoading: state.appState.isLoading, + loadingMessage: state.appState.loadingMessage, isDisclaimerConfirmed: state.metamask.isDisclaimerConfirmed, noActiveNotices: state.metamask.noActiveNotices, isInitialized: state.metamask.isInitialized, @@ -64,7 +65,7 @@ function mapStateToProps (state) { App.prototype.render = function () { var props = this.props - const { isLoading, transForward } = props + const { isLoading, loadingMessage, transForward } = props return ( @@ -76,7 +77,7 @@ App.prototype.render = function () { }, }, [ - h(LoadingIndicator, { isLoading }), + h(LoadingIndicator, { isLoading, loadingMessage }), // app bar this.renderAppBar(), diff --git a/ui/app/components/loading.js b/ui/app/components/loading.js index ae735894f..88dc535df 100644 --- a/ui/app/components/loading.js +++ b/ui/app/components/loading.js @@ -12,7 +12,7 @@ function LoadingIndicator () { } LoadingIndicator.prototype.render = function () { - var isLoading = this.props.isLoading + const { isLoading, loadingMessage } = this.props return ( h(ReactCSSTransitionGroup, { @@ -37,8 +37,14 @@ LoadingIndicator.prototype.render = function () { h('img', { src: 'images/loading.svg', }), + + showMessageIfAny(loadingMessage), ]) : null, ]) ) } +function showMessageIfAny (loadingMessage) { + if (!loadingMessage) return null + return h('span', loadingMessage) +} diff --git a/ui/app/reducers/app.js b/ui/app/reducers/app.js index ae91272cc..6a2c93f78 100644 --- a/ui/app/reducers/app.js +++ b/ui/app/reducers/app.js @@ -386,6 +386,7 @@ function reduceApp (state, action) { case actions.SHOW_LOADING: return extend(appState, { isLoading: true, + loadingMessage: action.value, }) case actions.HIDE_LOADING: