1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Handle logout gracefully

This commit is contained in:
bitpshr 2018-10-29 21:55:13 +01:00 committed by Dan Finlay
parent f02e18dd80
commit ba40fcbcb4
4 changed files with 42 additions and 25 deletions

View File

@ -129,21 +129,21 @@ function listenForProviderRequest () {
origin: source.location.hostname, origin: source.location.hostname,
}) })
break break
case 'ETHEREUM_QUERY_STATUS': case 'ETHEREUM_IS_APPROVED':
extension.runtime.sendMessage({ extension.runtime.sendMessage({
action: 'init-status-request', action: 'init-is-approved',
origin: source.location.hostname, origin: source.location.hostname,
}) })
break break
case 'METAMASK_UNLOCK_STATUS': case 'METAMASK_IS_UNLOCKED':
extension.runtime.sendMessage({ extension.runtime.sendMessage({
action: 'init-unlock-request', action: 'init-is-unlocked',
}) })
break break
} }
}) })
extension.runtime.onMessage.addListener(({ action, isEnabled, isUnlocked }) => { extension.runtime.onMessage.addListener(({ action, isEnabled, isApproved, isUnlocked }) => {
if (!action) { return } if (!action) { return }
switch (action) { switch (action) {
case 'approve-provider-request': case 'approve-provider-request':
@ -153,11 +153,14 @@ function listenForProviderRequest () {
case 'reject-provider-request': case 'reject-provider-request':
injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`) injectScript(`window.dispatchEvent(new CustomEvent('ethereumprovider', { detail: { error: 'User rejected provider access' }}))`)
break break
case 'answer-status-request': case 'answer-is-approved':
injectScript(`window.dispatchEvent(new CustomEvent('ethereumproviderstatus', { detail: { isEnabled: ${isEnabled}}}))`) injectScript(`window.dispatchEvent(new CustomEvent('ethereumisapproved', { detail: { isApproved: ${isApproved}}}))`)
break break
case 'answer-unlock-request': case 'answer-is-unlocked':
injectScript(`window.dispatchEvent(new CustomEvent('metamaskunlockstatus', { detail: { isUnlocked: ${isUnlocked}}}))`) injectScript(`window.dispatchEvent(new CustomEvent('metamaskisunlocked', { detail: { isUnlocked: ${isUnlocked}}}))`)
break
case 'metamask-set-locked':
injectScript(`window.dispatchEvent(new CustomEvent('metamasksetlocked', { detail: {}}))`)
break break
} }
}) })

View File

@ -24,11 +24,11 @@ class ProviderApprovalController {
case 'init-provider-request': case 'init-provider-request':
this.handleProviderRequest(origin) this.handleProviderRequest(origin)
break break
case 'init-status-request': case 'init-is-approved':
this.handleProviderStatusRequest(origin) this.handleIsApproved(origin)
break break
case 'init-unlock-request': case 'init-is-unlocked':
this.handleUnlockRequest() this.handleIsUnlocked()
break break
case 'init-privacy-request': case 'init-privacy-request':
this.handlePrivacyStatusRequest() this.handlePrivacyStatusRequest()
@ -44,7 +44,8 @@ class ProviderApprovalController {
*/ */
handleProviderRequest (origin) { handleProviderRequest (origin) {
this.store.updateState({ providerRequests: [{ origin }] }) this.store.updateState({ providerRequests: [{ origin }] })
if (this.isApproved(origin)) { const isUnlocked = this.keyringController.memStore.getState().isUnlocked
if (isUnlocked && this.isApproved(origin)) {
this.approveProviderRequest(origin) this.approveProviderRequest(origin)
return return
} }
@ -56,14 +57,14 @@ class ProviderApprovalController {
* *
* @param {string} origin - Origin of the window requesting provider status * @param {string} origin - Origin of the window requesting provider status
*/ */
async handleProviderStatusRequest (origin) { async handleIsApproved (origin) {
const isEnabled = this.isApproved(origin) const isApproved = this.isApproved(origin)
this.platform && this.platform.sendMessage({ action: 'answer-status-request', isEnabled }, { active: true }) this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved }, { active: true })
} }
handleUnlockRequest () { handleIsUnlocked () {
const isUnlocked = this.keyringController.memStore.getState().isUnlocked const isUnlocked = this.keyringController.memStore.getState().isUnlocked
this.platform && this.platform.sendMessage({ action: 'answer-unlock-request', isUnlocked }, { active: true }) this.platform && this.platform.sendMessage({ action: 'answer-is-unlocked', isUnlocked }, { active: true })
} }
handlePrivacyStatusRequest () { handlePrivacyStatusRequest () {
@ -119,6 +120,10 @@ class ProviderApprovalController {
const privacyMode = this.preferencesController.getFeatureFlags().privacyMode const privacyMode = this.preferencesController.getFeatureFlags().privacyMode
return !privacyMode || this.approvedOrigins[origin] return !privacyMode || this.approvedOrigins[origin]
} }
setLocked () {
this.platform.sendMessage({ action: 'metamask-set-locked' })
}
} }
module.exports = ProviderApprovalController module.exports = ProviderApprovalController

View File

@ -33,6 +33,10 @@ inpageProvider.setMaxListeners(100)
var isEnabled = false var isEnabled = false
var warned = false var warned = false
window.addEventListener('metamasksetlocked', () => {
isEnabled = false
})
// augment the provider with its enable method // augment the provider with its enable method
inpageProvider.enable = function () { inpageProvider.enable = function () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -91,14 +95,14 @@ inpageProvider._metamask = new Proxy({
*/ */
isApproved: function() { isApproved: function() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
window.addEventListener('ethereumproviderstatus', ({ detail }) => { window.addEventListener('ethereumisapproved', ({ detail }) => {
if (typeof detail.error !== 'undefined') { if (typeof detail.error !== 'undefined') {
reject(detail.error) reject(detail.error)
} else { } else {
resolve(!!detail.isEnabled) resolve(!!detail.isApproved)
} }
}) })
window.postMessage({ type: 'ETHEREUM_QUERY_STATUS' }, '*') window.postMessage({ type: 'ETHEREUM_IS_APPROVED' }, '*')
}) })
}, },
@ -109,14 +113,14 @@ inpageProvider._metamask = new Proxy({
*/ */
isUnlocked: function () { isUnlocked: function () {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
window.addEventListener('metamaskunlockstatus', ({ detail }) => { window.addEventListener('metamaskisunlocked', ({ detail }) => {
if (typeof detail.error !== 'undefined') { if (typeof detail.error !== 'undefined') {
reject(detail.error) reject(detail.error)
} else { } else {
resolve(!!detail.isUnlocked) resolve(!!detail.isUnlocked)
} }
}) })
window.postMessage({ type: 'METAMASK_UNLOCK_STATUS' }, '*') window.postMessage({ type: 'METAMASK_IS_UNLOCKED' }, '*')
}) })
}, },
}, { }, {

View File

@ -422,7 +422,7 @@ module.exports = class MetamaskController extends EventEmitter {
setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController), setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController),
// KeyringController // KeyringController
setLocked: nodeify(keyringController.setLocked, keyringController), setLocked: nodeify(this.setLocked, this),
createNewVaultAndKeychain: nodeify(this.createNewVaultAndKeychain, this), createNewVaultAndKeychain: nodeify(this.createNewVaultAndKeychain, this),
createNewVaultAndRestore: nodeify(this.createNewVaultAndRestore, this), createNewVaultAndRestore: nodeify(this.createNewVaultAndRestore, this),
addNewKeyring: nodeify(keyringController.addNewKeyring, keyringController), addNewKeyring: nodeify(keyringController.addNewKeyring, keyringController),
@ -1576,4 +1576,9 @@ module.exports = class MetamaskController extends EventEmitter {
whitelistPhishingDomain (hostname) { whitelistPhishingDomain (hostname) {
return this.blacklistController.whitelistDomain(hostname) return this.blacklistController.whitelistDomain(hostname)
} }
setLocked() {
this.providerApprovalController.setLocked()
return this.keyringController.setLocked()
}
} }