mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge pull request #2605 from MetaMask/i2577-SeedPhraseBug
Fix a possible seed phrase bug
This commit is contained in:
commit
e71115735c
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
## Current Master
|
## Current Master
|
||||||
|
|
||||||
|
- Fix bug where a user could be shown two different seed phrases.
|
||||||
- Detect when multiple web3 extensions are active, and provide useful error.
|
- Detect when multiple web3 extensions are active, and provide useful error.
|
||||||
|
|
||||||
## 3.12.0 2017-10-25
|
## 3.12.0 2017-10-25
|
||||||
|
@ -31,6 +31,7 @@ const ConfigManager = require('./lib/config-manager')
|
|||||||
const nodeify = require('./lib/nodeify')
|
const nodeify = require('./lib/nodeify')
|
||||||
const accountImporter = require('./account-import-strategies')
|
const accountImporter = require('./account-import-strategies')
|
||||||
const getBuyEthUrl = require('./lib/buy-eth-url')
|
const getBuyEthUrl = require('./lib/buy-eth-url')
|
||||||
|
const Mutex = require('await-semaphore').Mutex
|
||||||
const version = require('../manifest.json').version
|
const version = require('../manifest.json').version
|
||||||
|
|
||||||
module.exports = class MetamaskController extends EventEmitter {
|
module.exports = class MetamaskController extends EventEmitter {
|
||||||
@ -38,6 +39,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
constructor (opts) {
|
constructor (opts) {
|
||||||
super()
|
super()
|
||||||
|
|
||||||
|
|
||||||
this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200)
|
this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200)
|
||||||
|
|
||||||
this.opts = opts
|
this.opts = opts
|
||||||
@ -49,6 +51,9 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// observable state store
|
// observable state store
|
||||||
this.store = new ObservableStore(initState)
|
this.store = new ObservableStore(initState)
|
||||||
|
|
||||||
|
// lock to ensure only one vault created at once
|
||||||
|
this.createVaultMutex = new Mutex()
|
||||||
|
|
||||||
// network store
|
// network store
|
||||||
this.networkController = new NetworkController(initState.NetworkController)
|
this.networkController = new NetworkController(initState.NetworkController)
|
||||||
|
|
||||||
@ -467,15 +472,34 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
// Vault Management
|
// Vault Management
|
||||||
//
|
//
|
||||||
|
|
||||||
async createNewVaultAndKeychain (password, cb) {
|
async createNewVaultAndKeychain (password) {
|
||||||
const vault = await this.keyringController.createNewVaultAndKeychain(password)
|
const release = await this.createVaultMutex.acquire()
|
||||||
this.selectFirstIdentity(vault)
|
let vault
|
||||||
|
|
||||||
|
try {
|
||||||
|
const accounts = await this.keyringController.getAccounts()
|
||||||
|
|
||||||
|
if (accounts.length > 0) {
|
||||||
|
vault = await this.keyringController.fullUpdate()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
let vault = await this.keyringController.createNewVaultAndKeychain(password)
|
||||||
|
this.selectFirstIdentity(vault)
|
||||||
|
}
|
||||||
|
release()
|
||||||
|
} catch (err) {
|
||||||
|
release()
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
|
||||||
return vault
|
return vault
|
||||||
}
|
}
|
||||||
|
|
||||||
async createNewVaultAndRestore (password, seed, cb) {
|
async createNewVaultAndRestore (password, seed) {
|
||||||
|
const release = await this.createVaultMutex.acquire()
|
||||||
const vault = await this.keyringController.createNewVaultAndRestore(password, seed)
|
const vault = await this.keyringController.createNewVaultAndRestore(password, seed)
|
||||||
this.selectFirstIdentity(vault)
|
this.selectFirstIdentity(vault)
|
||||||
|
release()
|
||||||
return vault
|
return vault
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,6 +11,15 @@ describe('MetaMaskController', function () {
|
|||||||
unlockAccountMessage: noop,
|
unlockAccountMessage: noop,
|
||||||
showUnapprovedTx: noop,
|
showUnapprovedTx: noop,
|
||||||
platform: {},
|
platform: {},
|
||||||
|
encryptor: {
|
||||||
|
encrypt: function(password, object) {
|
||||||
|
this.object = object
|
||||||
|
return Promise.resolve()
|
||||||
|
},
|
||||||
|
decrypt: function () {
|
||||||
|
return Promise.resolve(this.object)
|
||||||
|
}
|
||||||
|
},
|
||||||
// initial state
|
// initial state
|
||||||
initState: clone(firstTimeState),
|
initState: clone(firstTimeState),
|
||||||
})
|
})
|
||||||
@ -27,6 +36,30 @@ describe('MetaMaskController', function () {
|
|||||||
|
|
||||||
describe('Metamask Controller', function () {
|
describe('Metamask Controller', function () {
|
||||||
assert(metamaskController)
|
assert(metamaskController)
|
||||||
|
|
||||||
|
beforeEach(function () {
|
||||||
|
sinon.spy(metamaskController.keyringController, 'createNewVaultAndKeychain')
|
||||||
|
})
|
||||||
|
|
||||||
|
afterEach(function () {
|
||||||
|
metamaskController.keyringController.createNewVaultAndKeychain.restore()
|
||||||
|
})
|
||||||
|
|
||||||
|
describe('#createNewVaultAndKeychain', function () {
|
||||||
|
it('can only create new vault on keyringController once', async function () {
|
||||||
|
|
||||||
|
const selectStub = sinon.stub(metamaskController, 'selectFirstIdentity')
|
||||||
|
|
||||||
|
const password = 'a-fake-password'
|
||||||
|
|
||||||
|
const first = await metamaskController.createNewVaultAndKeychain(password)
|
||||||
|
const second = await metamaskController.createNewVaultAndKeychain(password)
|
||||||
|
|
||||||
|
assert(metamaskController.keyringController.createNewVaultAndKeychain.calledOnce)
|
||||||
|
|
||||||
|
selectStub.reset()
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@ const actions = require('../actions')
|
|||||||
const Tooltip = require('../components/tooltip')
|
const Tooltip = require('../components/tooltip')
|
||||||
const getCaretCoordinates = require('textarea-caret')
|
const getCaretCoordinates = require('textarea-caret')
|
||||||
|
|
||||||
|
let isSubmitting = false
|
||||||
|
|
||||||
module.exports = connect(mapStateToProps)(InitializeMenuScreen)
|
module.exports = connect(mapStateToProps)(InitializeMenuScreen)
|
||||||
|
|
||||||
inherits(InitializeMenuScreen, Component)
|
inherits(InitializeMenuScreen, Component)
|
||||||
@ -164,7 +166,10 @@ InitializeMenuScreen.prototype.createNewVaultAndKeychain = function () {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.dispatch(actions.createNewVaultAndKeychain(password))
|
if (!isSubmitting) {
|
||||||
|
isSubmitting = true
|
||||||
|
this.props.dispatch(actions.createNewVaultAndKeychain(password))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InitializeMenuScreen.prototype.inputChanged = function (event) {
|
InitializeMenuScreen.prototype.inputChanged = function (event) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user