From c76c9ca2c86317f902f443db2c5704d4bf6311c0 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Thu, 27 Sep 2018 14:19:09 -0400 Subject: EIP-1102: updated implementation --- app/scripts/controllers/provider-approval.js | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 app/scripts/controllers/provider-approval.js (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js new file mode 100644 index 000000000..e9b1b8e16 --- /dev/null +++ b/app/scripts/controllers/provider-approval.js @@ -0,0 +1,84 @@ +const ObservableStore = require('obs-store') + +/** + * A controller that services user-approved requests for a full Ethereum provider API + */ +class ProviderApprovalController { + /** + * Creates a ProviderApprovalController + * + * @param {Object} [config] - Options to configure controller + */ + constructor ({ closePopup, openPopup, platform, publicConfigStore } = {}) { + this.store = new ObservableStore() + this.closePopup = closePopup + this.openPopup = openPopup + this.platform = platform + this.publicConfigStore = publicConfigStore + this.approvedOrigins = {} + platform && platform.addMessageListener && platform.addMessageListener(({ action, origin }) => { + action && action === 'init-provider-request' && this.handleProviderRequest(origin) + }) + } + + /** + * Called when a tab requests access to a full Ethereum provider API + * + * @param {string} origin - Origin of the window requesting full provider access + */ + handleProviderRequest (origin) { + this.store.updateState({ providerRequests: [{ origin }] }) + if (this.approvedOrigins[origin]) { + this.approveProviderRequest(origin) + return + } + this.openPopup && this.openPopup() + } + + /** + * Called when a user approves access to a full Ethereum provider API + * + * @param {string} origin - Origin of the target window to approve provider access + */ + approveProviderRequest (origin) { + this.closePopup && this.closePopup() + const requests = this.store.getState().providerRequests || [] + this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) + this.publicConfigStore.emit('update', this.publicConfigStore.getState()) + const providerRequests = requests.filter(request => request.origin !== origin) + this.store.updateState({ providerRequests }) + this.approvedOrigins[origin] = true + } + + /** + * Called when a tab rejects access to a full Ethereum provider API + * + * @param {string} origin - Origin of the target window to reject provider access + */ + rejectProviderRequest (origin) { + 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) + this.store.updateState({ providerRequests }) + } + + /** + * Clears any cached approvals for user-approved origins + */ + clearApprovedOrigins () { + this.approvedOrigins = {} + } + + /** + * Determines if a given origin has been approved + * + * @param {string} origin - Domain origin to check for approval status + * @returns {boolean} - True if the origin has been approved + */ + isApproved (origin) { + return this.approvedOrigins[origin] + } +} + +module.exports = ProviderApprovalController -- cgit v1.2.3 From 89b4aa5d62237f36fac9dcce9c546005ec18968b Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 1 Oct 2018 20:52:31 -0400 Subject: EIP-1102: Add option to force-enable provider --- app/scripts/controllers/provider-approval.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index e9b1b8e16..8c7520d59 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -1,4 +1,5 @@ const ObservableStore = require('obs-store') +const extension = require('extensionizer') /** * A controller that services user-approved requests for a full Ethereum provider API @@ -26,9 +27,9 @@ class ProviderApprovalController { * * @param {string} origin - Origin of the window requesting full provider access */ - handleProviderRequest (origin) { + async handleProviderRequest (origin) { this.store.updateState({ providerRequests: [{ origin }] }) - if (this.approvedOrigins[origin]) { + if (await this.isApproved(origin)) { this.approveProviderRequest(origin) return } @@ -68,6 +69,7 @@ class ProviderApprovalController { */ clearApprovedOrigins () { this.approvedOrigins = {} + extension.storage.local.set({ forcedOrigins: [] }) } /** @@ -77,7 +79,18 @@ class ProviderApprovalController { * @returns {boolean} - True if the origin has been approved */ isApproved (origin) { - return this.approvedOrigins[origin] + return new Promise(resolve => { + extension.storage.local.get(['forcedOrigins'], ({ forcedOrigins = [] }) => { + resolve(this.approvedOrigins[origin] || forcedOrigins.indexOf(origin) > -1) + }) + }) + } + + /** + * Called when a user forces the exposure of a full Ethereum provider API + */ + forceInjection () { + this.platform.sendMessage({ action: 'force-injection' }, { active: true }) } } -- cgit v1.2.3 From bfcb73ad533b7c2acea012a586c2a391811faf03 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Thu, 4 Oct 2018 11:05:32 -0400 Subject: EIP-1102: add isEnabled convenience method to provider --- app/scripts/controllers/provider-approval.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 8c7520d59..918fc8ad0 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -18,7 +18,15 @@ class ProviderApprovalController { this.publicConfigStore = publicConfigStore this.approvedOrigins = {} platform && platform.addMessageListener && platform.addMessageListener(({ action, origin }) => { - action && action === 'init-provider-request' && this.handleProviderRequest(origin) + if (!action) { return } + switch (action) { + case 'init-provider-request': + this.handleProviderRequest(origin) + break + case 'provider-status-request': + this.handleProviderStatusRequest(origin) + break + } }) } @@ -36,6 +44,16 @@ class ProviderApprovalController { this.openPopup && this.openPopup() } + /** + * Called by a tab to detemrine if a full Ethereum provider API is exposed + * + * @param {string} origin - Origin of the window requesting provider status + */ + async handleProviderStatusRequest (origin) { + const isEnabled = await this.isApproved(origin) + this.platform && this.platform.sendMessage({ action: 'provider-status', isEnabled }, { active: true }) + } + /** * Called when a user approves access to a full Ethereum provider API * -- cgit v1.2.3 From 226601a956594d00817cdb1fa5214242aae7936c Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 10 Oct 2018 14:52:26 -0400 Subject: EIP-1102: add user privacy option --- app/scripts/controllers/provider-approval.js | 41 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 918fc8ad0..a44d2b3ab 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -1,5 +1,4 @@ const ObservableStore = require('obs-store') -const extension = require('extensionizer') /** * A controller that services user-approved requests for a full Ethereum provider API @@ -10,22 +9,25 @@ class ProviderApprovalController { * * @param {Object} [config] - Options to configure controller */ - constructor ({ closePopup, openPopup, platform, publicConfigStore } = {}) { + constructor ({ closePopup, openPopup, platform, preferencesController, publicConfigStore } = {}) { this.store = new ObservableStore() this.closePopup = closePopup this.openPopup = openPopup this.platform = platform this.publicConfigStore = publicConfigStore this.approvedOrigins = {} + this.preferencesController = preferencesController platform && platform.addMessageListener && platform.addMessageListener(({ action, origin }) => { if (!action) { return } switch (action) { case 'init-provider-request': this.handleProviderRequest(origin) break - case 'provider-status-request': + case 'init-status-request': this.handleProviderStatusRequest(origin) break + case 'init-privacy-request': + this.handlePrivacyStatusRequest() } }) } @@ -35,9 +37,9 @@ class ProviderApprovalController { * * @param {string} origin - Origin of the window requesting full provider access */ - async handleProviderRequest (origin) { + handleProviderRequest (origin) { this.store.updateState({ providerRequests: [{ origin }] }) - if (await this.isApproved(origin)) { + if (this.isApproved(origin)) { this.approveProviderRequest(origin) return } @@ -45,13 +47,21 @@ class ProviderApprovalController { } /** - * Called by a tab to detemrine if a full Ethereum provider API is exposed + * Called by a tab to determine if a full Ethereum provider API is exposed * * @param {string} origin - Origin of the window requesting provider status */ async handleProviderStatusRequest (origin) { - const isEnabled = await this.isApproved(origin) - this.platform && this.platform.sendMessage({ action: 'provider-status', isEnabled }, { active: true }) + const isEnabled = this.isApproved(origin) + this.platform && this.platform.sendMessage({ action: 'answer-status-request', isEnabled }, { active: true }) + } + + handlePrivacyStatusRequest () { + const privacyMode = this.preferencesController.getFeatureFlags().privacyMode + if (!privacyMode) { + this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) + this.publicConfigStore.emit('update', this.publicConfigStore.getState()) + } } /** @@ -87,7 +97,6 @@ class ProviderApprovalController { */ clearApprovedOrigins () { this.approvedOrigins = {} - extension.storage.local.set({ forcedOrigins: [] }) } /** @@ -97,18 +106,8 @@ class ProviderApprovalController { * @returns {boolean} - True if the origin has been approved */ isApproved (origin) { - return new Promise(resolve => { - extension.storage.local.get(['forcedOrigins'], ({ forcedOrigins = [] }) => { - resolve(this.approvedOrigins[origin] || forcedOrigins.indexOf(origin) > -1) - }) - }) - } - - /** - * Called when a user forces the exposure of a full Ethereum provider API - */ - forceInjection () { - this.platform.sendMessage({ action: 'force-injection' }, { active: true }) + const privacyMode = this.preferencesController.getFeatureFlags().privacyMode + return !privacyMode || this.approvedOrigins[origin] } } -- cgit v1.2.3 From 84874a639d217da36926869fa3cb235c05725cf5 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 17 Oct 2018 18:38:31 -0400 Subject: Add isUnlocked provider hook --- app/scripts/controllers/provider-approval.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index a44d2b3ab..c9680cb46 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -9,7 +9,7 @@ class ProviderApprovalController { * * @param {Object} [config] - Options to configure controller */ - constructor ({ closePopup, openPopup, platform, preferencesController, publicConfigStore } = {}) { + constructor ({ closePopup, openPopup, keyringController, platform, preferencesController, publicConfigStore } = {}) { this.store = new ObservableStore() this.closePopup = closePopup this.openPopup = openPopup @@ -17,6 +17,7 @@ class ProviderApprovalController { this.publicConfigStore = publicConfigStore this.approvedOrigins = {} this.preferencesController = preferencesController + this.keyringController = keyringController platform && platform.addMessageListener && platform.addMessageListener(({ action, origin }) => { if (!action) { return } switch (action) { @@ -26,6 +27,8 @@ class ProviderApprovalController { case 'init-status-request': this.handleProviderStatusRequest(origin) break + case 'init-unlock-request': + this.handleUnlockRequest() case 'init-privacy-request': this.handlePrivacyStatusRequest() } @@ -56,6 +59,11 @@ class ProviderApprovalController { this.platform && this.platform.sendMessage({ action: 'answer-status-request', isEnabled }, { active: true }) } + handleUnlockRequest() { + const isUnlocked = this.keyringController.memStore.getState().isUnlocked + this.platform && this.platform.sendMessage({ action: 'answer-unlock-request', isUnlocked }, { active: true }) + } + handlePrivacyStatusRequest () { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode if (!privacyMode) { -- cgit v1.2.3 From 504f4a50f13b12588576f2f06bb2e371bd966dfb Mon Sep 17 00:00:00 2001 From: bitpshr Date: Wed, 17 Oct 2018 18:43:51 -0400 Subject: Fix lint issues --- app/scripts/controllers/provider-approval.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index c9680cb46..fa2fb2cf8 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -29,8 +29,10 @@ class ProviderApprovalController { break case 'init-unlock-request': this.handleUnlockRequest() + break case 'init-privacy-request': this.handlePrivacyStatusRequest() + break } }) } @@ -59,7 +61,7 @@ class ProviderApprovalController { this.platform && this.platform.sendMessage({ action: 'answer-status-request', isEnabled }, { active: true }) } - handleUnlockRequest() { + handleUnlockRequest () { const isUnlocked = this.keyringController.memStore.getState().isUnlocked this.platform && this.platform.sendMessage({ action: 'answer-unlock-request', isUnlocked }, { active: true }) } -- cgit v1.2.3 From ba40fcbcb43c5adcb3a961afd4050cdb2025b7a6 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 21:55:13 +0100 Subject: Handle logout gracefully --- app/scripts/controllers/provider-approval.js | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index fa2fb2cf8..3af165438 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -24,11 +24,11 @@ class ProviderApprovalController { case 'init-provider-request': this.handleProviderRequest(origin) break - case 'init-status-request': - this.handleProviderStatusRequest(origin) + case 'init-is-approved': + this.handleIsApproved(origin) break - case 'init-unlock-request': - this.handleUnlockRequest() + case 'init-is-unlocked': + this.handleIsUnlocked() break case 'init-privacy-request': this.handlePrivacyStatusRequest() @@ -44,7 +44,8 @@ class ProviderApprovalController { */ handleProviderRequest (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) return } @@ -56,14 +57,14 @@ class ProviderApprovalController { * * @param {string} origin - Origin of the window requesting provider status */ - async handleProviderStatusRequest (origin) { - const isEnabled = this.isApproved(origin) - this.platform && this.platform.sendMessage({ action: 'answer-status-request', isEnabled }, { active: true }) + async handleIsApproved (origin) { + const isApproved = this.isApproved(origin) + this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved }, { active: true }) } - handleUnlockRequest () { + handleIsUnlocked () { 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 () { @@ -119,6 +120,10 @@ class ProviderApprovalController { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode return !privacyMode || this.approvedOrigins[origin] } + + setLocked () { + this.platform.sendMessage({ action: 'metamask-set-locked' }) + } } module.exports = ProviderApprovalController -- cgit v1.2.3 From d7618bd5c6cffe02d8737fe6925a31484a1fc0b0 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 22:28:59 +0100 Subject: Code bath --- app/scripts/controllers/provider-approval.js | 44 +++++++++++++++++----------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 3af165438..42393de85 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -9,29 +9,29 @@ class ProviderApprovalController { * * @param {Object} [config] - Options to configure controller */ - constructor ({ closePopup, openPopup, keyringController, platform, preferencesController, publicConfigStore } = {}) { - this.store = new ObservableStore() + constructor ({ closePopup, keyringController, openPopup, platform, preferencesController, publicConfigStore } = {}) { + this.approvedOrigins = {} this.closePopup = closePopup + this.keyringController = keyringController this.openPopup = openPopup this.platform = platform - this.publicConfigStore = publicConfigStore - this.approvedOrigins = {} this.preferencesController = preferencesController - this.keyringController = keyringController - platform && platform.addMessageListener && platform.addMessageListener(({ action, origin }) => { - if (!action) { return } + this.publicConfigStore = publicConfigStore + this.store = new ObservableStore() + + platform && platform.addMessageListener && platform.addMessageListener(({ action = '', origin }) => { switch (action) { case 'init-provider-request': - this.handleProviderRequest(origin) + this._handleProviderRequest(origin) break case 'init-is-approved': - this.handleIsApproved(origin) + this._handleIsApproved(origin) break case 'init-is-unlocked': - this.handleIsUnlocked() + this._handleIsUnlocked() break case 'init-privacy-request': - this.handlePrivacyStatusRequest() + this._handlePrivacyRequest() break } }) @@ -42,7 +42,7 @@ class ProviderApprovalController { * * @param {string} origin - Origin of the window requesting full provider access */ - handleProviderRequest (origin) { + _handleProviderRequest (origin) { this.store.updateState({ providerRequests: [{ origin }] }) const isUnlocked = this.keyringController.memStore.getState().isUnlocked if (isUnlocked && this.isApproved(origin)) { @@ -53,21 +53,27 @@ class ProviderApprovalController { } /** - * Called by a tab to determine if a full Ethereum provider API is exposed + * Called by a tab to determine if an origin has been approved in the past * - * @param {string} origin - Origin of the window requesting provider status + * @param {string} origin - Origin of the window */ - async handleIsApproved (origin) { + _handleIsApproved (origin) { const isApproved = this.isApproved(origin) this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved }, { active: true }) } - handleIsUnlocked () { + /** + * Called by a tab to determine if MetaMask is currently locked or unlocked + */ + _handleIsUnlocked () { const isUnlocked = this.keyringController.memStore.getState().isUnlocked this.platform && this.platform.sendMessage({ action: 'answer-is-unlocked', isUnlocked }, { active: true }) } - handlePrivacyStatusRequest () { + /** + * Called to check privacy mode; if privacy mode is off, this will automatically enable the provider (legacy behavior) + */ + _handlePrivacyRequest () { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode if (!privacyMode) { this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) @@ -121,6 +127,10 @@ class ProviderApprovalController { return !privacyMode || this.approvedOrigins[origin] } + /** + * Tells all tabs that MetaMask is now locked. This is primarily used to set + * internal flags in the contentscript and inpage script. + */ setLocked () { this.platform.sendMessage({ action: 'metamask-set-locked' }) } -- cgit v1.2.3 From cc1bab6ebbef8d8219f83039fdc3baca6de718fd Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 22:54:39 +0100 Subject: Differentiate locked and enabled --- app/scripts/controllers/provider-approval.js | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 42393de85..66017c58e 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -44,8 +44,7 @@ class ProviderApprovalController { */ _handleProviderRequest (origin) { this.store.updateState({ providerRequests: [{ origin }] }) - const isUnlocked = this.keyringController.memStore.getState().isUnlocked - if (isUnlocked && this.isApproved(origin)) { + if (this.isApproved(origin)) { this.approveProviderRequest(origin) return } @@ -126,14 +125,6 @@ class ProviderApprovalController { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode return !privacyMode || this.approvedOrigins[origin] } - - /** - * Tells all tabs that MetaMask is now locked. This is primarily used to set - * internal flags in the contentscript and inpage script. - */ - setLocked () { - this.platform.sendMessage({ action: 'metamask-set-locked' }) - } } module.exports = ProviderApprovalController -- cgit v1.2.3 From d4171ccea51db04aa40320de8770e22203d4d6c2 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 29 Oct 2018 23:44:04 +0100 Subject: Disable approval caching --- app/scripts/controllers/provider-approval.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 66017c58e..cbdebc3e3 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -4,6 +4,11 @@ const ObservableStore = require('obs-store') * A controller that services user-approved requests for a full Ethereum provider API */ class ProviderApprovalController { + /** + * Determines if caching is enabled + */ + caching = false + /** * Creates a ProviderApprovalController * @@ -44,7 +49,7 @@ class ProviderApprovalController { */ _handleProviderRequest (origin) { this.store.updateState({ providerRequests: [{ origin }] }) - if (this.isApproved(origin)) { + if (this.isApproved(origin) && this.caching) { this.approveProviderRequest(origin) return } @@ -57,8 +62,9 @@ class ProviderApprovalController { * @param {string} origin - Origin of the window */ _handleIsApproved (origin) { - const isApproved = this.isApproved(origin) - this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved }, { active: true }) + const isApproved = this.isApproved(origin) && this.caching + const caching = this.caching + this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved, caching }, { active: true }) } /** @@ -125,6 +131,14 @@ class ProviderApprovalController { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode return !privacyMode || this.approvedOrigins[origin] } + + /** + * Tells all tabs that MetaMask is now locked. This is primarily used to set + * internal flags in the contentscript and inpage script. + */ + setLocked () { + this.platform.sendMessage({ action: 'metamask-set-locked' }) + } } module.exports = ProviderApprovalController -- cgit v1.2.3 From f557d3371892ae7625528aa5168549c57cfd740e Mon Sep 17 00:00:00 2001 From: Paul Bouchon Date: Wed, 31 Oct 2018 10:07:49 +0100 Subject: Enable caching --- app/scripts/controllers/provider-approval.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index cbdebc3e3..003f221ac 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -7,7 +7,7 @@ class ProviderApprovalController { /** * Determines if caching is enabled */ - caching = false + caching = true /** * Creates a ProviderApprovalController -- cgit v1.2.3 From 9984f7edebb0de4432e152a7c6f0d93bb00b9da6 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Sat, 3 Nov 2018 11:06:11 +0000 Subject: Mark origins as unapproved if user explicitly locks MetaMask --- app/scripts/controllers/provider-approval.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 003f221ac..10b971a73 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -49,7 +49,8 @@ class ProviderApprovalController { */ _handleProviderRequest (origin) { this.store.updateState({ providerRequests: [{ origin }] }) - if (this.isApproved(origin) && this.caching) { + const isUnlocked = this.keyringController.memStore.getState().isUnlocked + if (this.isApproved(origin) && this.caching && isUnlocked) { this.approveProviderRequest(origin) return } @@ -128,8 +129,9 @@ class ProviderApprovalController { * @returns {boolean} - True if the origin has been approved */ isApproved (origin) { + const isUnlocked = this.keyringController.memStore.getState().isUnlocked const privacyMode = this.preferencesController.getFeatureFlags().privacyMode - return !privacyMode || this.approvedOrigins[origin] + return !privacyMode || (isUnlocked && this.approvedOrigins[origin]) } /** -- cgit v1.2.3 From 31cb111d2e98c17728a75ebe00430654d827e136 Mon Sep 17 00:00:00 2001 From: bitpshr Date: Sun, 4 Nov 2018 12:19:47 -0500 Subject: Do not modify isApproved when locked --- app/scripts/controllers/provider-approval.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 10b971a73..728361c79 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -129,9 +129,8 @@ class ProviderApprovalController { * @returns {boolean} - True if the origin has been approved */ isApproved (origin) { - const isUnlocked = this.keyringController.memStore.getState().isUnlocked const privacyMode = this.preferencesController.getFeatureFlags().privacyMode - return !privacyMode || (isUnlocked && this.approvedOrigins[origin]) + return !privacyMode || this.approvedOrigins[origin] } /** -- cgit v1.2.3 From 26ada8a828ab684c310080a18115a8ef3234aaee Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Mon, 5 Nov 2018 09:37:56 -0330 Subject: Update Connect Request screen design (#5644) * Parameterize NetworkDisplay background colour * Update design for login request screen * Pass siteTitle, siteImage through for calls to ethereum.enable() * Bring the site images closer together --- app/scripts/controllers/provider-approval.js | 40 +++++++++++++++------------- 1 file changed, 22 insertions(+), 18 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 728361c79..f2d40e67d 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -24,31 +24,35 @@ class ProviderApprovalController { this.publicConfigStore = publicConfigStore this.store = new ObservableStore() - platform && platform.addMessageListener && platform.addMessageListener(({ action = '', origin }) => { - switch (action) { - case 'init-provider-request': - this._handleProviderRequest(origin) - break - case 'init-is-approved': - this._handleIsApproved(origin) - break - case 'init-is-unlocked': - this._handleIsUnlocked() - break - case 'init-privacy-request': - this._handlePrivacyRequest() - break - } - }) + if (platform && platform.addMessageListener) { + platform.addMessageListener(({ action = '', origin, siteTitle, siteImage }) => { + switch (action) { + case 'init-provider-request': + this._handleProviderRequest(origin, siteTitle, siteImage) + break + case 'init-is-approved': + this._handleIsApproved(origin) + break + case 'init-is-unlocked': + this._handleIsUnlocked() + break + case 'init-privacy-request': + this._handlePrivacyRequest() + break + } + }) + } } /** * Called when a tab requests access to a full Ethereum provider API * * @param {string} origin - Origin of the window requesting full provider access + * @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) { - this.store.updateState({ providerRequests: [{ origin }] }) + _handleProviderRequest (origin, siteTitle, siteImage) { + this.store.updateState({ providerRequests: [{ origin, siteTitle, siteImage }] }) const isUnlocked = this.keyringController.memStore.getState().isUnlocked if (this.isApproved(origin) && this.caching && isUnlocked) { this.approveProviderRequest(origin) -- cgit v1.2.3 From 879997af517b36cf701ec74c08ec4293a2206baa Mon Sep 17 00:00:00 2001 From: bitpshr Date: Mon, 5 Nov 2018 09:03:30 -0500 Subject: Add experimental RPC method support --- app/scripts/controllers/provider-approval.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index f2d40e67d..f17220cb9 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -25,10 +25,10 @@ class ProviderApprovalController { this.store = new ObservableStore() if (platform && platform.addMessageListener) { - platform.addMessageListener(({ action = '', origin, siteTitle, siteImage }) => { + platform.addMessageListener(({ action = '', force, origin, siteTitle, siteImage }) => { switch (action) { case 'init-provider-request': - this._handleProviderRequest(origin, siteTitle, siteImage) + this._handleProviderRequest(origin, siteTitle, siteImage, force) break case 'init-is-approved': this._handleIsApproved(origin) @@ -51,10 +51,10 @@ 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) { + _handleProviderRequest (origin, siteTitle, siteImage, force) { this.store.updateState({ providerRequests: [{ origin, siteTitle, siteImage }] }) const isUnlocked = this.keyringController.memStore.getState().isUnlocked - if (this.isApproved(origin) && this.caching && isUnlocked) { + if (!force && this.isApproved(origin) && this.caching && isUnlocked) { this.approveProviderRequest(origin) return } -- cgit v1.2.3 From 34d80f21e2ed4842d196dc580a9441a2731a5c0e Mon Sep 17 00:00:00 2001 From: bitpshr Date: Tue, 6 Nov 2018 14:13:27 -0500 Subject: Clear cached approval after rejection --- app/scripts/controllers/provider-approval.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index f17220cb9..42834f1cd 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -54,7 +54,7 @@ class ProviderApprovalController { _handleProviderRequest (origin, siteTitle, siteImage, force) { this.store.updateState({ providerRequests: [{ origin, siteTitle, siteImage }] }) const isUnlocked = this.keyringController.memStore.getState().isUnlocked - if (!force && this.isApproved(origin) && this.caching && isUnlocked) { + if (!force && this.approvedOrigins[origin] && this.caching && isUnlocked) { this.approveProviderRequest(origin) return } @@ -67,9 +67,11 @@ class ProviderApprovalController { * @param {string} origin - Origin of the window */ _handleIsApproved (origin) { - const isApproved = this.isApproved(origin) && this.caching - const caching = this.caching - this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved, caching }, { active: true }) + this.platform && this.platform.sendMessage({ + action: 'answer-is-approved', + isApproved: this.approvedOrigins[origin] && this.caching, + caching: this.caching + }, { active: true }) } /** @@ -117,6 +119,7 @@ class ProviderApprovalController { this.platform && this.platform.sendMessage({ action: 'reject-provider-request' }, { active: true }) const providerRequests = requests.filter(request => request.origin !== origin) this.store.updateState({ providerRequests }) + delete this.approvedOrigins[origin] } /** @@ -127,12 +130,12 @@ class ProviderApprovalController { } /** - * Determines if a given origin has been approved + * Determines if a given origin should have accounts exposed * * @param {string} origin - Domain origin to check for approval status * @returns {boolean} - True if the origin has been approved */ - isApproved (origin) { + shouldExposeAccounts (origin) { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode return !privacyMode || this.approvedOrigins[origin] } -- cgit v1.2.3 From 896ae0ab89096ed9a206a64c00c351820ed9ab1b Mon Sep 17 00:00:00 2001 From: bitpshr Date: Tue, 6 Nov 2018 14:30:33 -0500 Subject: Fix lint errors --- app/scripts/controllers/provider-approval.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index 42834f1cd..d3b7f6dff 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -70,7 +70,7 @@ class ProviderApprovalController { this.platform && this.platform.sendMessage({ action: 'answer-is-approved', isApproved: this.approvedOrigins[origin] && this.caching, - caching: this.caching + caching: this.caching, }, { active: true }) } -- cgit v1.2.3 From c3176248544e3e0019389b1f177cac68087bfe8f Mon Sep 17 00:00:00 2001 From: Paul Bouchon Date: Fri, 9 Nov 2018 20:40:32 -0500 Subject: EIP-1102: Update publicConfig store concurrently with approval --- app/scripts/controllers/provider-approval.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'app/scripts/controllers/provider-approval.js') diff --git a/app/scripts/controllers/provider-approval.js b/app/scripts/controllers/provider-approval.js index d3b7f6dff..21d7fd22e 100644 --- a/app/scripts/controllers/provider-approval.js +++ b/app/scripts/controllers/provider-approval.js @@ -88,7 +88,10 @@ class ProviderApprovalController { _handlePrivacyRequest () { const privacyMode = this.preferencesController.getFeatureFlags().privacyMode if (!privacyMode) { - this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) + this.platform && this.platform.sendMessage({ + action: 'approve-legacy-provider-request', + selectedAddress: this.publicConfigStore.getState().selectedAddress, + }, { active: true }) this.publicConfigStore.emit('update', this.publicConfigStore.getState()) } } @@ -101,7 +104,10 @@ class ProviderApprovalController { approveProviderRequest (origin) { this.closePopup && this.closePopup() const requests = this.store.getState().providerRequests || [] - this.platform && this.platform.sendMessage({ action: 'approve-provider-request' }, { active: true }) + this.platform && this.platform.sendMessage({ + action: 'approve-provider-request', + selectedAddress: this.publicConfigStore.getState().selectedAddress, + }, { active: true }) this.publicConfigStore.emit('update', this.publicConfigStore.getState()) const providerRequests = requests.filter(request => request.origin !== origin) this.store.updateState({ providerRequests }) -- cgit v1.2.3