From e8c88a55512a22b14fd453c72f744abd48977e64 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 25 May 2016 15:39:18 -0700 Subject: [PATCH 1/4] Fix persistent warning bug --- test/unit/reducers/unlock_vault_test.js | 51 +++++++++++++++++++++++++ ui/app/reducers/app.js | 1 + 2 files changed, 52 insertions(+) create mode 100644 test/unit/reducers/unlock_vault_test.js diff --git a/test/unit/reducers/unlock_vault_test.js b/test/unit/reducers/unlock_vault_test.js new file mode 100644 index 000000000..b7540af08 --- /dev/null +++ b/test/unit/reducers/unlock_vault_test.js @@ -0,0 +1,51 @@ +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('#unlockMetamask(selectedAccount)', 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() + }) + + describe('after an error', function() { + it('clears warning', function() { + const warning = 'this is the wrong warning' + const account = 'foo_account' + const initialState = { + appState: { + warning: warning, + } + } + + const resultState = reducers(initialState, actions.unlockMetamask(account)) + assert.equal(resultState.appState.warning, null, 'warning nullified') + }) + }) + + describe('going home after an error', function() { + it('clears warning', function() { + const warning = 'this is the wrong warning' + const account = 'foo_account' + const initialState = { + appState: { + warning: warning, + } + } + + const resultState = reducers(initialState, actions.goHome()) + assert.equal(resultState.appState.warning, null, 'warning nullified') + }) + }) +}) diff --git a/ui/app/reducers/app.js b/ui/app/reducers/app.js index a29a8f79c..493246a35 100644 --- a/ui/app/reducers/app.js +++ b/ui/app/reducers/app.js @@ -152,6 +152,7 @@ function reduceApp(state, action) { privateKey: '', }, transForward: false, + warning: null, }) case actions.SHOW_ACCOUNT_DETAIL: From 2683d1f43ee3425756a4d34c4e953990f5bff9e5 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Wed, 25 May 2016 15:51:37 -0700 Subject: [PATCH 2/4] Bump changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd7a0ecf6..2fc67168c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Current Master - Added copy address button to account list. +- Fixed bug where error warning was sometimes not cleared on view transition. ## 2.0.0 2016-05-23 From 821648fad7e863d3c76a861285525ea4ba764eb0 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 25 May 2016 17:27:49 -0700 Subject: [PATCH 3/4] background - append origin to rpc payload and sig request --- app/scripts/background.js | 48 +++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/app/scripts/background.js b/app/scripts/background.js index 313dbbc66..4f537b30a 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,10 +1,10 @@ +const urlUtil = require('url') const Dnode = require('dnode') const eos = require('end-of-stream') const combineStreams = require('pumpify') const extend = require('xtend') const EthStore = require('eth-store') const MetaMaskProvider = require('web3-provider-engine/zero.js') -const handleRequestsFromStream = require('web3-stream-provider/handler') const ObjectMultiplex = require('./lib/obj-multiplex') const PortStream = require('./lib/port-stream.js') const IdentityStore = require('./lib/idStore') @@ -27,27 +27,28 @@ function connectRemote(remotePort){ var portStream = new PortStream(remotePort) if (isMetaMaskInternalProcess) { // communication with popup - setupTrustedCommunication(portStream) + setupTrustedCommunication(portStream, 'MetaMask') } else { // communication with page - setupUntrustedCommunication(portStream) + var originDomain = urlUtil.parse(remotePort.sender.url).hostname + setupUntrustedCommunication(portStream, originDomain) } } -function setupUntrustedCommunication(connectionStream){ +function setupUntrustedCommunication(connectionStream, originDomain){ // setup multiplexing var mx = setupMultiplex(connectionStream) // connect features - setupProviderConnection(mx.createStream('provider')) + setupProviderConnection(mx.createStream('provider'), originDomain) setupPublicConfig(mx.createStream('publicConfig')) } -function setupTrustedCommunication(connectionStream){ +function setupTrustedCommunication(connectionStream, originDomain){ // setup multiplexing var mx = setupMultiplex(connectionStream) // connect features setupControllerConnection(mx.createStream('controller')) - setupProviderConnection(mx.createStream('provider')) + setupProviderConnection(mx.createStream('provider'), originDomain) } // @@ -66,10 +67,10 @@ var providerOpts = { cb(null, result) }, // tx signing - approveTransaction: approveTransaction, + approveTransaction: newUnsignedTransaction, signTransaction: idStore.signTransaction.bind(idStore), // msg signing - approveMessage: approveMessage, + approveMessage: newUnsignedMessage, signMessage: idStore.signMessage.bind(idStore), } var provider = MetaMaskProvider(providerOpts) @@ -143,13 +144,32 @@ function setupPublicConfig(stream){ stream.pipe(storeStream).pipe(stream) } -function setupProviderConnection(stream){ - handleRequestsFromStream(stream, provider, logger) +function setupProviderConnection(stream, originDomain){ + + stream.on('data', function onRpcRequest(payload){ + // Append origin to rpc payload + payload.origin = originDomain + // Append origin to signature request + if (payload.method === 'eth_sendTransaction') { + payload.params[0].origin = originDomain + } else if (payload.method === 'eth_sign') { + payload.params.push(originDomain) + } + // handle rpc request + provider.sendAsync(payload, function onPayloadHandled(err, response){ + logger(null, payload, response) + try { + stream.write(response) + } catch (err) { + logger(err) + } + }) + }) function logger(err, request, response){ if (err) return console.error(err.stack) if (!request.isMetamaskInternal) { - console.log('MetaMaskPlugin - RPC complete:', request, '->', response) + console.log(`RPC (${originDomain}):`, request, '->', response) if (response.error) console.error('Error in RPC response:\n'+response.error.message) } } @@ -218,7 +238,7 @@ function updateBadge(state){ // Add unconfirmed Tx + Msg // -function approveTransaction(txParams, cb){ +function newUnsignedTransaction(txParams, cb){ var state = idStore.getState() if (!state.isUnlocked) { createUnlockRequestNotification({ @@ -230,7 +250,7 @@ function approveTransaction(txParams, cb){ } } -function approveMessage(msgParams, cb){ +function newUnsignedMessage(msgParams, cb){ var state = idStore.getState() if (!state.isUnlocked) { createUnlockRequestNotification({ From 59e98751b2f80685f0f374211bf46bf9148724a5 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 25 May 2016 17:34:31 -0700 Subject: [PATCH 4/4] notifications - show tx origin --- app/scripts/lib/notifications.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/scripts/lib/notifications.js b/app/scripts/lib/notifications.js index 0b55417b2..4626afdd1 100644 --- a/app/scripts/lib/notifications.js +++ b/app/scripts/lib/notifications.js @@ -40,6 +40,7 @@ function createUnlockRequestNotification(opts){ function createTxNotification(opts){ var message = [ + 'Submitted by '+opts.txParams.origin, 'to: '+uiUtils.addressSummary(opts.txParams.to), 'from: '+uiUtils.addressSummary(opts.txParams.from), 'value: '+uiUtils.formatBalance(opts.txParams.value),