mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge pull request #4506 from MetaMask/diagnostics-multivault
diagnostics - add multiple vault detection to diagnostics reporting
This commit is contained in:
commit
5b3af34139
@ -1,9 +1,7 @@
|
|||||||
const ObservableStore = require('obs-store')
|
const ObservableStore = require('obs-store')
|
||||||
const normalizeAddress = require('eth-sig-util').normalize
|
const normalizeAddress = require('eth-sig-util').normalize
|
||||||
const extend = require('xtend')
|
const extend = require('xtend')
|
||||||
const notifier = require('../lib/bug-notifier')
|
|
||||||
const log = require('loglevel')
|
|
||||||
const { version } = require('../../manifest.json')
|
|
||||||
|
|
||||||
class PreferencesController {
|
class PreferencesController {
|
||||||
|
|
||||||
@ -34,8 +32,7 @@ class PreferencesController {
|
|||||||
lostIdentities: {},
|
lostIdentities: {},
|
||||||
}, opts.initState)
|
}, opts.initState)
|
||||||
|
|
||||||
this.getFirstTimeInfo = opts.getFirstTimeInfo || null
|
this.diagnostics = opts.diagnostics
|
||||||
this.notifier = opts.notifier || notifier
|
|
||||||
|
|
||||||
this.store = new ObservableStore(initState)
|
this.store = new ObservableStore(initState)
|
||||||
}
|
}
|
||||||
@ -128,17 +125,9 @@ class PreferencesController {
|
|||||||
if (Object.keys(newlyLost).length > 0) {
|
if (Object.keys(newlyLost).length > 0) {
|
||||||
|
|
||||||
// Notify our servers:
|
// Notify our servers:
|
||||||
const uri = 'https://diagnostics.metamask.io/v1/orphanedAccounts'
|
if (this.diagnostics) this.diagnostics.reportOrphans(newlyLost)
|
||||||
const firstTimeInfo = this.getFirstTimeInfo ? this.getFirstTimeInfo() : {}
|
|
||||||
this.notifier.notify(uri, {
|
|
||||||
accounts: Object.keys(newlyLost),
|
|
||||||
metadata: {
|
|
||||||
version,
|
|
||||||
firstTimeInfo,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.catch(log.error)
|
|
||||||
|
|
||||||
|
// store lost accounts
|
||||||
for (let key in newlyLost) {
|
for (let key in newlyLost) {
|
||||||
lostIdentities[key] = newlyLost[key]
|
lostIdentities[key] = newlyLost[key]
|
||||||
}
|
}
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
class BugNotifier {
|
|
||||||
notify (uri, message) {
|
|
||||||
return postData(uri, message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function postData(uri, data) {
|
|
||||||
return fetch(uri, {
|
|
||||||
body: JSON.stringify(data), // must match 'Content-Type' header
|
|
||||||
credentials: 'same-origin', // include, same-origin, *omit
|
|
||||||
headers: {
|
|
||||||
'content-type': 'application/json',
|
|
||||||
},
|
|
||||||
method: 'POST', // *GET, POST, PUT, DELETE, etc.
|
|
||||||
mode: 'cors', // no-cors, cors, *same-origin
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const notifier = new BugNotifier()
|
|
||||||
|
|
||||||
module.exports = notifier
|
|
||||||
|
|
71
app/scripts/lib/diagnostics-reporter.js
Normal file
71
app/scripts/lib/diagnostics-reporter.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
class DiagnosticsReporter {
|
||||||
|
|
||||||
|
constructor ({ firstTimeInfo, version }) {
|
||||||
|
this.firstTimeInfo = firstTimeInfo
|
||||||
|
this.version = version
|
||||||
|
}
|
||||||
|
|
||||||
|
async reportOrphans(orphans) {
|
||||||
|
try {
|
||||||
|
return await this.submit({
|
||||||
|
accounts: Object.keys(orphans),
|
||||||
|
metadata: {
|
||||||
|
type: 'orphans',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
console.error('DiagnosticsReporter - "reportOrphans" encountered an error:')
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async reportMultipleKeyrings(rawKeyrings) {
|
||||||
|
try {
|
||||||
|
const keyrings = await Promise.all(rawKeyrings.map(async (keyring, index) => {
|
||||||
|
return {
|
||||||
|
index,
|
||||||
|
type: keyring.type,
|
||||||
|
accounts: await keyring.getAccounts(),
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
return await this.submit({
|
||||||
|
accounts: [],
|
||||||
|
metadata: {
|
||||||
|
type: 'keyrings',
|
||||||
|
keyrings,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
console.error('DiagnosticsReporter - "reportMultipleKeyrings" encountered an error:')
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async submit (message) {
|
||||||
|
try {
|
||||||
|
// add metadata
|
||||||
|
message.metadata.version = this.version
|
||||||
|
message.metadata.firstTimeInfo = this.firstTimeInfo
|
||||||
|
return await postData(message)
|
||||||
|
} catch (err) {
|
||||||
|
console.error('DiagnosticsReporter - "submit" encountered an error:')
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function postData(data) {
|
||||||
|
const uri = 'https://diagnostics.metamask.io/v1/orphanedAccounts'
|
||||||
|
return fetch(uri, {
|
||||||
|
body: JSON.stringify(data), // must match 'Content-Type' header
|
||||||
|
credentials: 'same-origin', // include, same-origin, *omit
|
||||||
|
headers: {
|
||||||
|
'content-type': 'application/json',
|
||||||
|
},
|
||||||
|
method: 'POST', // *GET, POST, PUT, DELETE, etc.
|
||||||
|
mode: 'cors', // no-cors, cors, *same-origin
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = DiagnosticsReporter
|
@ -46,6 +46,7 @@ const GWEI_BN = new BN('1000000000')
|
|||||||
const percentile = require('percentile')
|
const percentile = require('percentile')
|
||||||
const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
|
const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
|
||||||
const cleanErrorStack = require('./lib/cleanErrorStack')
|
const cleanErrorStack = require('./lib/cleanErrorStack')
|
||||||
|
const DiagnosticsReporter = require('./lib/diagnostics-reporter')
|
||||||
const log = require('loglevel')
|
const log = require('loglevel')
|
||||||
|
|
||||||
module.exports = class MetamaskController extends EventEmitter {
|
module.exports = class MetamaskController extends EventEmitter {
|
||||||
@ -64,6 +65,12 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
const initState = opts.initState || {}
|
const initState = opts.initState || {}
|
||||||
this.recordFirstTimeInfo(initState)
|
this.recordFirstTimeInfo(initState)
|
||||||
|
|
||||||
|
// metamask diagnostics reporter
|
||||||
|
this.diagnostics = opts.diagnostics || new DiagnosticsReporter({
|
||||||
|
firstTimeInfo: initState.firstTimeInfo,
|
||||||
|
version,
|
||||||
|
})
|
||||||
|
|
||||||
// platform-specific api
|
// platform-specific api
|
||||||
this.platform = opts.platform
|
this.platform = opts.platform
|
||||||
|
|
||||||
@ -85,7 +92,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
this.preferencesController = new PreferencesController({
|
this.preferencesController = new PreferencesController({
|
||||||
initState: initState.PreferencesController,
|
initState: initState.PreferencesController,
|
||||||
initLangCode: opts.initLangCode,
|
initLangCode: opts.initLangCode,
|
||||||
getFirstTimeInfo: () => initState.firstTimeInfo,
|
diagnostics: this.diagnostics,
|
||||||
})
|
})
|
||||||
|
|
||||||
// currency controller
|
// currency controller
|
||||||
@ -487,6 +494,12 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
await this.keyringController.submitPassword(password)
|
await this.keyringController.submitPassword(password)
|
||||||
const accounts = await this.keyringController.getAccounts()
|
const accounts = await this.keyringController.getAccounts()
|
||||||
|
|
||||||
|
// verify keyrings
|
||||||
|
const nonSimpleKeyrings = this.keyringController.keyrings.filter(keyring => keyring.type !== 'Simple Key Pair')
|
||||||
|
if (nonSimpleKeyrings.length > 1 && this.diagnostics) {
|
||||||
|
await this.diagnostics.reportMultipleKeyrings(nonSimpleKeyrings)
|
||||||
|
}
|
||||||
|
|
||||||
await this.preferencesController.syncAddresses(accounts)
|
await this.preferencesController.syncAddresses(accounts)
|
||||||
return this.keyringController.fullUpdate()
|
return this.keyringController.fullUpdate()
|
||||||
}
|
}
|
||||||
|
@ -72,11 +72,6 @@ describe('MetaMaskController', function () {
|
|||||||
it('removes any identities that do not correspond to known accounts.', async function () {
|
it('removes any identities that do not correspond to known accounts.', async function () {
|
||||||
const fakeAddress = '0xbad0'
|
const fakeAddress = '0xbad0'
|
||||||
metamaskController.preferencesController.addAddresses([fakeAddress])
|
metamaskController.preferencesController.addAddresses([fakeAddress])
|
||||||
metamaskController.preferencesController.notifier = {
|
|
||||||
notify: async () => {
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
}
|
|
||||||
await metamaskController.submitPassword(password)
|
await metamaskController.submitPassword(password)
|
||||||
|
|
||||||
const identities = Object.keys(metamaskController.preferencesController.store.getState().identities)
|
const identities = Object.keys(metamaskController.preferencesController.store.getState().identities)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user