@ -27,19 +27,19 @@ class ProviderApprovalController {
} )
if ( platform && platform . addMessageListener ) {
platform . addMessageListener ( ( { action = '' , force , origin , siteTitle , siteImage } ) => {
platform . addMessageListener ( ( { action = '' , force , origin , siteTitle , siteImage } , { tab } ) => {
switch ( action ) {
case 'init-provider-request' :
this . _handleProviderRequest ( origin , siteTitle , siteImage , force )
this . _handleProviderRequest ( origin , siteTitle , siteImage , force , tab . id )
break
case 'init-is-approved' :
this . _handleIsApproved ( origin )
this . _handleIsApproved ( origin , tab . id )
break
case 'init-is-unlocked' :
this . _handleIsUnlocked ( )
this . _handleIsUnlocked ( tab . id )
break
case 'init-privacy-request' :
this . _handlePrivacyRequest ( )
this . _handlePrivacyRequest ( tab . id )
break
}
} )
@ -53,11 +53,11 @@ class ProviderApprovalController {
* @ param { string } siteTitle - The title of the document requesting full provider access
* @ param { string } siteImage - The icon of the window requesting full provider access
* /
_handleProviderRequest ( origin , siteTitle , siteImage , force ) {
this . store . updateState ( { providerRequests : [ { origin , siteTitle , siteImage } ] } )
_handleProviderRequest ( origin , siteTitle , siteImage , force , tabID ) {
this . store . updateState ( { providerRequests : [ { origin , siteTitle , siteImage , tabID } ] } )
const isUnlocked = this . keyringController . memStore . getState ( ) . isUnlocked
if ( ! force && this . approvedOrigins [ origin ] && this . caching && isUnlocked ) {
this . approveProviderRequest ( origin )
this . approveProviderRequest ( tabID )
return
}
this . openPopup && this . openPopup ( )
@ -68,32 +68,32 @@ class ProviderApprovalController {
*
* @ param { string } origin - Origin of the window
* /
_handleIsApproved ( origin ) {
_handleIsApproved ( origin , tabID ) {
this . platform && this . platform . sendMessage ( {
action : 'answer-is-approved' ,
isApproved : this . approvedOrigins [ origin ] && this . caching ,
caching : this . caching ,
} , { active : true } )
} , { id : tabID } )
}
/ * *
* Called by a tab to determine if MetaMask is currently locked or unlocked
* /
_handleIsUnlocked ( ) {
_handleIsUnlocked ( tabID ) {
const isUnlocked = this . keyringController . memStore . getState ( ) . isUnlocked
this . platform && this . platform . sendMessage ( { action : 'answer-is-unlocked' , isUnlocked } , { active : true } )
this . platform && this . platform . sendMessage ( { action : 'answer-is-unlocked' , isUnlocked } , { id : tabID } )
}
/ * *
* Called to check privacy mode ; if privacy mode is off , this will automatically enable the provider ( legacy behavior )
* /
_handlePrivacyRequest ( ) {
_handlePrivacyRequest ( tabID ) {
const privacyMode = this . preferencesController . getFeatureFlags ( ) . privacyMode
if ( ! privacyMode ) {
this . platform && this . platform . sendMessage ( {
action : 'approve-legacy-provider-request' ,
selectedAddress : this . publicConfigStore . getState ( ) . selectedAddress ,
} , { active : true } )
} , { id : tabID } )
this . publicConfigStore . emit ( 'update' , this . publicConfigStore . getState ( ) )
}
}
@ -101,17 +101,18 @@ class ProviderApprovalController {
/ * *
* Called when a user approves access to a full Ethereum provider API
*
* @ param { string } origin - Origin of the target window to approve provider access
* @ param { string } tabID - ID of the target window that approved provider access
* /
approveProviderRequest ( origin ) {
approveProviderRequest ( tabID ) {
this . closePopup && this . closePopup ( )
const requests = this . store . getState ( ) . providerRequests
const origin = requests . find ( request => request . tabID === tabID ) . origin
this . platform && this . platform . sendMessage ( {
action : 'approve-provider-request' ,
selectedAddress : this . publicConfigStore . getState ( ) . selectedAddress ,
} , { active : true } )
} , { id : tabID } )
this . publicConfigStore . emit ( 'update' , this . publicConfigStore . getState ( ) )
const providerRequests = requests . filter ( request => request . origin !== origin )
const providerRequests = requests . filter ( request => request . tabID !== tabID )
this . store . updateState ( { providerRequests } )
this . approvedOrigins [ origin ] = true
}
@ -119,13 +120,14 @@ class ProviderApprovalController {
/ * *
* Called when a tab rejects access to a full Ethereum provider API
*
* @ param { string } origin - Origin of the target window to reject provider access
* @ param { string } tabID - ID of the target window that rejected provider access
* /
rejectProviderRequest ( origin ) {
rejectProviderRequest ( tabID ) {
this . closePopup && this . closePopup ( )
const requests = this . store . getState ( ) . providerRequests
this . platform && this . platform . sendMessage ( { action : 'reject-provider-request' } , { active : true } )
const providerRequests = requests . filter ( request => request . origin !== origin )
const origin = requests . find ( request => request . tabID === tabID ) . origin
this . platform && this . platform . sendMessage ( { action : 'reject-provider-request' } , { id : tabID } )
const providerRequests = requests . filter ( request => request . tabID !== tabID )
this . store . updateState ( { providerRequests } )
delete this . approvedOrigins [ origin ]
}