Merge pull request #937 from MetaMask/i900-forgot-password-flow

I900 forgot password flow
feature/default_network_editable
Dan Finlay 8 years ago committed by GitHub
commit ead8329877
  1. 1
      CHANGELOG.md
  2. 3
      app/scripts/keyring-controller.js
  3. 4
      app/scripts/lib/idStore.js
  4. 12
      ui/app/actions.js
  5. 16
      ui/app/first-time/init-menu.js
  6. 8
      ui/app/keychains/hd/restore-vault.js
  7. 12
      ui/app/reducers/app.js
  8. 2
      ui/app/unlock.js

@ -14,6 +14,7 @@
## 2.13.11 2016-11-23 ## 2.13.11 2016-11-23
- Add support for synchronous RPC method "eth_uninstallFilter". - Add support for synchronous RPC method "eth_uninstallFilter".
- Forgotten password prompts now send users directly to seed word restoration.
## 2.13.10 2016-11-22 ## 2.13.10 2016-11-22

@ -73,7 +73,7 @@ module.exports = class KeyringController extends EventEmitter {
// or accept a state-resolving promise to consume their results. // or accept a state-resolving promise to consume their results.
// //
// Not all methods end with this, that might be a nice refactor. // Not all methods end with this, that might be a nice refactor.
fullUpdate() { fullUpdate () {
this.emit('update') this.emit('update')
return Promise.resolve(this.getState()) return Promise.resolve(this.getState())
} }
@ -586,7 +586,6 @@ module.exports = class KeyringController extends EventEmitter {
// Attempts to sign the provided @object msgParams. // Attempts to sign the provided @object msgParams.
signMessage (msgParams, cb) { signMessage (msgParams, cb) {
try { try {
const msgId = msgParams.metamaskId const msgId = msgParams.metamaskId
delete msgParams.metamaskId delete msgParams.metamaskId
const approvalCb = this._unconfMsgCbs[msgId] || noop const approvalCb = this._unconfMsgCbs[msgId] || noop

@ -258,7 +258,7 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone
function estimateGas (cb) { function estimateGas (cb) {
var estimationParams = extend(txParams) var estimationParams = extend(txParams)
query.getBlockByNumber('latest', true, function(err, block){ query.getBlockByNumber('latest', true, function (err, block) {
if (err) return cb(err) if (err) return cb(err)
// check if gasLimit is already specified // check if gasLimit is already specified
const gasLimitSpecified = Boolean(txParams.gas) const gasLimitSpecified = Boolean(txParams.gas)
@ -267,7 +267,7 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone
estimationParams.gas = block.gasLimit estimationParams.gas = block.gasLimit
} }
// run tx, see if it will OOG // run tx, see if it will OOG
query.estimateGas(estimationParams, function(err, estimatedGasHex){ query.estimateGas(estimationParams, function (err, estimatedGasHex) {
if (err) return cb(err.message || err) if (err) return cb(err.message || err)
// all gas used - must be an error // all gas used - must be an error
if (estimatedGasHex === estimationParams.gas) { if (estimatedGasHex === estimationParams.gas) {

@ -26,6 +26,8 @@ var actions = {
CREATE_NEW_VAULT_IN_PROGRESS: 'CREATE_NEW_VAULT_IN_PROGRESS', CREATE_NEW_VAULT_IN_PROGRESS: 'CREATE_NEW_VAULT_IN_PROGRESS',
SHOW_CREATE_VAULT: 'SHOW_CREATE_VAULT', SHOW_CREATE_VAULT: 'SHOW_CREATE_VAULT',
SHOW_RESTORE_VAULT: 'SHOW_RESTORE_VAULT', SHOW_RESTORE_VAULT: 'SHOW_RESTORE_VAULT',
FORGOT_PASSWORD: 'FORGOT_PASSWORD',
forgotPassword: forgotPassword,
SHOW_INIT_MENU: 'SHOW_INIT_MENU', SHOW_INIT_MENU: 'SHOW_INIT_MENU',
SHOW_NEW_VAULT_SEED: 'SHOW_NEW_VAULT_SEED', SHOW_NEW_VAULT_SEED: 'SHOW_NEW_VAULT_SEED',
SHOW_INFO_PAGE: 'SHOW_INFO_PAGE', SHOW_INFO_PAGE: 'SHOW_INFO_PAGE',
@ -184,13 +186,13 @@ function tryUnlockMetamask (password) {
} }
} }
function transitionForward() { function transitionForward () {
return { return {
type: this.TRANSITION_FORWARD, type: this.TRANSITION_FORWARD,
} }
} }
function transitionBackward() { function transitionBackward () {
return { return {
type: this.TRANSITION_BACKWARD, type: this.TRANSITION_BACKWARD,
} }
@ -387,6 +389,12 @@ function showRestoreVault () {
} }
} }
function forgotPassword () {
return {
type: actions.FORGOT_PASSWORD,
}
}
function showInitializeMenu () { function showInitializeMenu () {
return { return {
type: actions.SHOW_INIT_MENU, type: actions.SHOW_INIT_MENU,

@ -21,7 +21,6 @@ function mapStateToProps (state) {
// state from plugin // state from plugin
currentView: state.appState.currentView, currentView: state.appState.currentView,
warning: state.appState.warning, warning: state.appState.warning,
forgottenPassword: state.metamask.isInitialized,
} }
} }
@ -118,17 +117,6 @@ InitializeMenuScreen.prototype.renderMenu = function (state) {
}, },
}, 'Create'), }, 'Create'),
state.forgottenPassword ? h('.flex-row.flex-center.flex-grow', [
h('p.pointer', {
onClick: this.backToUnlockView.bind(this),
style: {
fontSize: '0.8em',
color: 'rgb(247, 134, 28)',
textDecoration: 'underline',
},
}, 'Return to Login'),
]) : null,
h('.flex-row.flex-center.flex-grow', [ h('.flex-row.flex-center.flex-grow', [
h('p.pointer', { h('p.pointer', {
onClick: this.showRestoreVault.bind(this), onClick: this.showRestoreVault.bind(this),
@ -159,10 +147,6 @@ InitializeMenuScreen.prototype.showRestoreVault = function () {
this.props.dispatch(actions.showRestoreVault()) this.props.dispatch(actions.showRestoreVault())
} }
InitializeMenuScreen.prototype.backToUnlockView = function () {
this.props.dispatch(actions.backToUnlockView())
}
InitializeMenuScreen.prototype.createNewVaultAndKeychain = function () { InitializeMenuScreen.prototype.createNewVaultAndKeychain = function () {
var passwordBox = document.getElementById('password-box') var passwordBox = document.getElementById('password-box')
var password = passwordBox.value var password = passwordBox.value

@ -14,6 +14,7 @@ function RestoreVaultScreen () {
function mapStateToProps (state) { function mapStateToProps (state) {
return { return {
warning: state.appState.warning, warning: state.appState.warning,
forgottenPassword: state.appState.forgottenPassword,
} }
} }
@ -100,14 +101,17 @@ RestoreVaultScreen.prototype.render = function () {
}, 'OK'), }, 'OK'),
]), ]),
]) ])
) )
} }
RestoreVaultScreen.prototype.showInitializeMenu = function () { RestoreVaultScreen.prototype.showInitializeMenu = function () {
this.props.dispatch(actions.showInitializeMenu()) if (this.props.forgottenPassword) {
this.props.dispatch(actions.backToUnlockView())
} else {
this.props.dispatch(actions.showInitializeMenu())
}
} }
RestoreVaultScreen.prototype.createOnEnter = function (event) { RestoreVaultScreen.prototype.createOnEnter = function (event) {

@ -72,6 +72,16 @@ function reduceApp (state, action) {
name: 'restoreVault', name: 'restoreVault',
}, },
transForward: true, transForward: true,
forgottenPassword: true,
})
case actions.FORGOT_PASSWORD:
return extend(appState, {
currentView: {
name: 'restoreVault',
},
transForward: false,
forgottenPassword: true,
}) })
case actions.SHOW_INIT_MENU: case actions.SHOW_INIT_MENU:
@ -169,7 +179,7 @@ function reduceApp (state, action) {
return extend(appState, { return extend(appState, {
warning: null, warning: null,
transForward: true, transForward: true,
forgottenPassword: !appState.forgottenPassword, forgottenPassword: false,
currentView: { currentView: {
name: 'UnlockScreen', name: 'UnlockScreen',
}, },

@ -70,7 +70,7 @@ UnlockScreen.prototype.render = function () {
h('.flex-row.flex-center.flex-grow', [ h('.flex-row.flex-center.flex-grow', [
h('p.pointer', { h('p.pointer', {
onClick: () => this.props.dispatch(actions.goBackToInitView()), onClick: () => this.props.dispatch(actions.forgotPassword()),
style: { style: {
fontSize: '0.8em', fontSize: '0.8em',
color: 'rgb(247, 134, 28)', color: 'rgb(247, 134, 28)',

Loading…
Cancel
Save