mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-22 17:33:23 +01:00
Fix tests
This commit is contained in:
parent
383f8ea7dc
commit
0deed17752
@ -35,7 +35,7 @@ module.exports = class KeyringController extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
createNewVault(password, entropy, cb) {
|
createNewVault(password, entropy, cb) {
|
||||||
const salt = generateNewSalt()
|
const salt = generateSalt()
|
||||||
this.configManager.setSalt(salt)
|
this.configManager.setSalt(salt)
|
||||||
this.loadKey(password)
|
this.loadKey(password)
|
||||||
.then((key) => {
|
.then((key) => {
|
||||||
|
@ -42,8 +42,9 @@ function encryptWithKey (key, dataObj) {
|
|||||||
iv: vector,
|
iv: vector,
|
||||||
}, key, dataBuffer).then(function(buf){
|
}, key, dataBuffer).then(function(buf){
|
||||||
var buffer = new Uint8Array(buf)
|
var buffer = new Uint8Array(buf)
|
||||||
var vectorStr = serializeBufferForStorage(vector)
|
var vectorStr = encodeBufferToBase64(vector)
|
||||||
return serializeBufferForStorage(buffer) + vectorStr
|
var vaultStr = encodeBufferToBase64(buffer)
|
||||||
|
return `${vaultStr}\\${vectorStr}`
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,9 +57,9 @@ function decrypt (password, text) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function decryptWithKey (key, text) {
|
function decryptWithKey (key, text) {
|
||||||
const parts = text.split('0x')
|
const parts = text.split('\\')
|
||||||
const encryptedData = serializeBufferFromStorage(parts[1])
|
const encryptedData = decodeBase64ToBuffer(parts[0])
|
||||||
const vector = serializeBufferFromStorage(parts[2])
|
const vector = decodeBase64ToBuffer(parts[1])
|
||||||
return crypto.subtle.decrypt({name: 'AES-GCM', iv: vector}, key, encryptedData)
|
return crypto.subtle.decrypt({name: 'AES-GCM', iv: vector}, key, encryptedData)
|
||||||
.then(function(result){
|
.then(function(result){
|
||||||
const decryptedData = new Uint8Array(result)
|
const decryptedData = new Uint8Array(result)
|
||||||
@ -128,8 +129,9 @@ function encodeBufferToBase64 (buf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function decodeBase64ToBuffer (base64) {
|
function decodeBase64ToBuffer (base64) {
|
||||||
var u8_2 = new Uint8Array(atob(b64encoded).split("")
|
var buf = new Uint8Array(atob(base64).split('')
|
||||||
.map(function(c) {
|
.map(function(c) {
|
||||||
return c.charCodeAt(0)
|
return c.charCodeAt(0)
|
||||||
}))
|
}))
|
||||||
|
return buf
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,7 @@ QUnit.test('encryptor:encrypt & decrypt', function(assert) {
|
|||||||
})
|
})
|
||||||
.catch(function(reason) {
|
.catch(function(reason) {
|
||||||
assert.ifError(reason, 'threw an error')
|
assert.ifError(reason, 'threw an error')
|
||||||
|
done(reason)
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
var jsdom = require('mocha-jsdom')
|
|
||||||
var assert = require('assert')
|
|
||||||
var freeze = require('deep-freeze-strict')
|
|
||||||
var path = require('path')
|
|
||||||
var sinon = require('sinon')
|
|
||||||
|
|
||||||
var actions = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'actions.js'))
|
|
||||||
var reducers = require(path.join(__dirname, '..', '..', '..', 'ui', 'app', 'reducers.js'))
|
|
||||||
|
|
||||||
describe('#recoverFromSeed(password, seed)', function() {
|
|
||||||
|
|
||||||
beforeEach(function() {
|
|
||||||
// sinon allows stubbing methods that are easily verified
|
|
||||||
this.sinon = sinon.sandbox.create()
|
|
||||||
})
|
|
||||||
|
|
||||||
afterEach(function() {
|
|
||||||
// sinon requires cleanup otherwise it will overwrite context
|
|
||||||
this.sinon.restore()
|
|
||||||
})
|
|
||||||
|
|
||||||
// stub out account manager
|
|
||||||
actions._setKeyringController({
|
|
||||||
recoverFromSeed(pw, seed, cb) {
|
|
||||||
cb(null, {
|
|
||||||
identities: {
|
|
||||||
foo: 'bar'
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
it('sets metamask.isUnlocked to true', function() {
|
|
||||||
var initialState = {
|
|
||||||
metamask: {
|
|
||||||
isUnlocked: false,
|
|
||||||
isInitialized: false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
freeze(initialState)
|
|
||||||
|
|
||||||
const restorePhrase = 'invite heavy among daring outdoor dice jelly coil stable note seat vicious'
|
|
||||||
const password = 'foo'
|
|
||||||
const dispatchFunc = actions.recoverFromSeed(password, restorePhrase)
|
|
||||||
|
|
||||||
var dispatchStub = this.sinon.stub()
|
|
||||||
dispatchStub.withArgs({ TYPE: actions.unlockMetamask() }).onCall(0)
|
|
||||||
dispatchStub.withArgs({ TYPE: actions.showAccountsPage() }).onCall(1)
|
|
||||||
|
|
||||||
var action
|
|
||||||
var resultingState = initialState
|
|
||||||
dispatchFunc((newAction) => {
|
|
||||||
action = newAction
|
|
||||||
resultingState = reducers(resultingState, action)
|
|
||||||
})
|
|
||||||
|
|
||||||
assert.equal(resultingState.metamask.isUnlocked, true, 'was unlocked')
|
|
||||||
assert.equal(resultingState.metamask.isInitialized, true, 'was initialized')
|
|
||||||
});
|
|
||||||
});
|
|
@ -46,7 +46,7 @@ describe('tx confirmation screen', function() {
|
|||||||
describe('cancelTx', function() {
|
describe('cancelTx', function() {
|
||||||
|
|
||||||
before(function(done) {
|
before(function(done) {
|
||||||
actions._setKeyringController({
|
actions._setBackgroundConnection({
|
||||||
approveTransaction(txId, cb) { cb('An error!') },
|
approveTransaction(txId, cb) { cb('An error!') },
|
||||||
cancelTransaction(txId) { /* noop */ },
|
cancelTransaction(txId) { /* noop */ },
|
||||||
clearSeedWordCache(cb) { cb() },
|
clearSeedWordCache(cb) { cb() },
|
||||||
@ -75,7 +75,7 @@ describe('tx confirmation screen', function() {
|
|||||||
before(function(done) {
|
before(function(done) {
|
||||||
alert = () => {/* noop */}
|
alert = () => {/* noop */}
|
||||||
|
|
||||||
actions._setKeyringController({
|
actions._setBackgroundConnection({
|
||||||
approveTransaction(txId, cb) { cb({message: 'An error!'}) },
|
approveTransaction(txId, cb) { cb({message: 'An error!'}) },
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ describe('tx confirmation screen', function() {
|
|||||||
|
|
||||||
describe('when there is success', function() {
|
describe('when there is success', function() {
|
||||||
it('should complete tx and go home', function() {
|
it('should complete tx and go home', function() {
|
||||||
actions._setKeyringController({
|
actions._setBackgroundConnection({
|
||||||
approveTransaction(txId, cb) { cb() },
|
approveTransaction(txId, cb) { cb() },
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ describe('tx confirmation screen', function() {
|
|||||||
}
|
}
|
||||||
freeze(initialState)
|
freeze(initialState)
|
||||||
|
|
||||||
actions._setKeyringController({
|
actions._setBackgroundConnection({
|
||||||
approveTransaction(txId, cb) { cb() },
|
approveTransaction(txId, cb) { cb() },
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -31,111 +31,5 @@ describe('KeyringController', function() {
|
|||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('#recoverFromSeed', function() {
|
|
||||||
let newAccounts = []
|
|
||||||
|
|
||||||
before(function() {
|
|
||||||
window.localStorage = {} // Hacking localStorage support into JSDom
|
|
||||||
|
|
||||||
keyringController = new KeyringController({
|
|
||||||
configManager: configManagerGen(),
|
|
||||||
ethStore: {
|
|
||||||
addAccount(acct) { newAccounts.push(ethUtil.addHexPrefix(acct)) },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should return the expected keystore', function (done) {
|
|
||||||
|
|
||||||
keyringController.recoverFromSeed(password, seedWords, (err) => {
|
|
||||||
assert.ifError(err)
|
|
||||||
|
|
||||||
let newKeystore = keyringController._idmgmt.keyStore
|
|
||||||
assert.equal(newAccounts[0], accounts[0])
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('#recoverFromSeed BIP44 compliance', function() {
|
|
||||||
const salt = 'lightwalletSalt'
|
|
||||||
|
|
||||||
let password = 'secret!'
|
|
||||||
let accounts = {}
|
|
||||||
let keyringController
|
|
||||||
|
|
||||||
var assertions = [
|
|
||||||
{
|
|
||||||
seed: 'picnic injury awful upper eagle junk alert toss flower renew silly vague',
|
|
||||||
account: '0x5d8de92c205279c10e5669f797b853ccef4f739a',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
seed: 'radar blur cabbage chef fix engine embark joy scheme fiction master release',
|
|
||||||
account: '0xe15d894becb0354c501ae69429b05143679f39e0',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
seed: 'phone coyote caught pattern found table wedding list tumble broccoli chief swing',
|
|
||||||
account: '0xb0e868f24bc7fec2bce2efc2b1c344d7569cd9d2',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
seed: 'recycle tag bird palace blue village anxiety census cook soldier example music',
|
|
||||||
account: '0xab34a45920afe4af212b96ec51232aaa6a33f663',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
seed: 'half glimpse tape cute harvest sweet bike voyage actual floor poet lazy',
|
|
||||||
account: '0x28e9044597b625ac4beda7250011670223de43b2',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
seed: 'flavor tiger carpet motor angry hungry document inquiry large critic usage liar',
|
|
||||||
account: '0xb571be96558940c4e9292e1999461aa7499fb6cd',
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
before(function() {
|
|
||||||
window.localStorage = {} // Hacking localStorage support into JSDom
|
|
||||||
|
|
||||||
keyringController = new KeyringController({
|
|
||||||
configManager: configManagerGen(),
|
|
||||||
ethStore: {
|
|
||||||
addAccount(acct) { accounts[acct] = acct},
|
|
||||||
del(acct) { delete accounts[acct] },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('should enforce seed compliance with TestRPC', function (done) {
|
|
||||||
this.timeout(10000)
|
|
||||||
const tests = assertions.map((assertion) => {
|
|
||||||
return function (cb) {
|
|
||||||
|
|
||||||
keyringController.recoverFromSeed(password, assertion.seed, (err) => {
|
|
||||||
assert.ifError(err)
|
|
||||||
|
|
||||||
var expected = assertion.account.toLowerCase()
|
|
||||||
var received = accounts[expected].toLowerCase()
|
|
||||||
assert.equal(received, expected)
|
|
||||||
|
|
||||||
keyringController.tryPassword(password, function (err) {
|
|
||||||
|
|
||||||
assert.ok(keyringController._isUnlocked(), 'should unlock the id store')
|
|
||||||
|
|
||||||
keyringController.submitPassword(password, function(err, account) {
|
|
||||||
assert.ifError(err)
|
|
||||||
assert.equal(account, expected)
|
|
||||||
assert.equal(Object.keys(keyringController._getAddresses()).length, 1, 'only one account on restore')
|
|
||||||
cb()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
async.series(tests, function(err, results) {
|
|
||||||
assert.ifError(err)
|
|
||||||
done()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
var actions = {
|
var actions = {
|
||||||
|
_setBackgroundConnection: _setBackgroundConnection,
|
||||||
|
|
||||||
GO_HOME: 'GO_HOME',
|
GO_HOME: 'GO_HOME',
|
||||||
goHome: goHome,
|
goHome: goHome,
|
||||||
// menu state
|
// menu state
|
||||||
@ -94,8 +96,6 @@ var actions = {
|
|||||||
showConfigPage: showConfigPage,
|
showConfigPage: showConfigPage,
|
||||||
setRpcTarget: setRpcTarget,
|
setRpcTarget: setRpcTarget,
|
||||||
setProviderType: setProviderType,
|
setProviderType: setProviderType,
|
||||||
// hacky - need a way to get a reference to account manager
|
|
||||||
_setBackgroundConnection: _setBackgroundConnection,
|
|
||||||
// loading overlay
|
// loading overlay
|
||||||
SHOW_LOADING: 'SHOW_LOADING_INDICATION',
|
SHOW_LOADING: 'SHOW_LOADING_INDICATION',
|
||||||
HIDE_LOADING: 'HIDE_LOADING_INDICATION',
|
HIDE_LOADING: 'HIDE_LOADING_INDICATION',
|
||||||
|
Loading…
Reference in New Issue
Block a user