diff options
author | Sebastian <sebasjm@gmail.com> | 2022-04-27 14:33:52 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2022-04-27 14:33:52 -0300 |
commit | 451dd746daeb57cfe0a601d1bf1f2b5506a5fc3c (patch) | |
tree | 975b98de7c3d28f62e05396a01129c69efbeb66b /packages/taler-wallet-webextension/src/platform | |
parent | 0b8e0a0806947472181b13a3c0dda9947a326b28 (diff) | |
download | wallet-core-451dd746daeb57cfe0a601d1bf1f2b5506a5fc3c.tar.xz |
toggle permission
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform')
4 files changed, 66 insertions, 21 deletions
diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts index 65bc36545..cee628a6f 100644 --- a/packages/taler-wallet-webextension/src/platform/api.ts +++ b/packages/taler-wallet-webextension/src/platform/api.ts @@ -34,9 +34,9 @@ export interface Permissions { * Compatibility API that works on multiple browsers. */ export interface CrossBrowserPermissionsApi { - contains(p: Permissions): Promise<boolean>; - request(p: Permissions): Promise<boolean>; - remove(p: Permissions): Promise<boolean>; + containsHostPermissions(): Promise<boolean>; + requestHostPermissions(): Promise<boolean>; + removeHostPermissions(): Promise<boolean>; addPermissionsListener(callback: (p: Permissions, lastError?: string) => void): void; @@ -132,6 +132,10 @@ export interface PlatformAPI { */ registerTalerHeaderListener(onHeader: (tabId: number, url: string) => void): void; /** + * Frontend API + */ + containsTalerHeaderListener(): boolean; + /** * Backend API */ registerOnInstalled(callback: () => void): void; diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts b/packages/taler-wallet-webextension/src/platform/chrome.ts index d1f4585da..d295168bf 100644 --- a/packages/taler-wallet-webextension/src/platform/chrome.ts +++ b/packages/taler-wallet-webextension/src/platform/chrome.ts @@ -16,7 +16,6 @@ */ import { classifyTalerUri, CoreApiResponse, TalerUriType } from "@gnu-taler/taler-util"; -import { getReadRequestPermissions } from "../permissions.js"; import { CrossBrowserPermissionsApi, MessageFromBackend, Permissions, PlatformAPI } from "./api.js"; const api: PlatformAPI = { @@ -37,7 +36,8 @@ const api: PlatformAPI = { registerTalerHeaderListener, sendMessageToAllChannels, sendMessageToWalletBackground, - useServiceWorkerAsBackgroundProcess + useServiceWorkerAsBackgroundProcess, + containsTalerHeaderListener, } export default api; @@ -46,9 +46,15 @@ function isFirefox(): boolean { return false; } -export function contains(p: Permissions): Promise<boolean> { +const hostPermissions = { + permissions: ["webRequest"], + origins: ["http://*/*", "https://*/*"], +} + + +export function containsHostPermissions(): Promise<boolean> { return new Promise((res, rej) => { - chrome.permissions.contains(p, (resp) => { + chrome.permissions.contains(hostPermissions, (resp) => { const le = chrome.runtime.lastError?.message if (le) { rej(le) @@ -58,9 +64,9 @@ export function contains(p: Permissions): Promise<boolean> { }) } -export async function request(p: Permissions): Promise<boolean> { +export async function requestHostPermissions(): Promise<boolean> { return new Promise((res, rej) => { - chrome.permissions.request(p, (resp) => { + chrome.permissions.request(hostPermissions, (resp) => { const le = chrome.runtime.lastError?.message if (le) { rej(le) @@ -70,9 +76,41 @@ export async function request(p: Permissions): Promise<boolean> { }) } -export async function remove(p: Permissions): Promise<boolean> { +type HeaderListenerFunc = (details: chrome.webRequest.WebResponseHeadersDetails) => void +let currentHeaderListener: HeaderListenerFunc | undefined = undefined; + +export function containsTalerHeaderListener(): boolean { + return currentHeaderListener !== undefined; +} + +export async function removeHostPermissions(): Promise<boolean> { + //if there is a handler already, remove it + if ( + "webRequest" in chrome && + "onHeadersReceived" in chrome.webRequest && + currentHeaderListener && + chrome.webRequest.onHeadersReceived.hasListener(currentHeaderListener) + ) { + chrome.webRequest.onHeadersReceived.removeListener(currentHeaderListener); + } + + currentHeaderListener = undefined; + + //notify the browser about this change, this operation is expensive + if ("webRequest" in chrome) { + chrome.webRequest.handlerBehaviorChanged(() => { + if (chrome.runtime.lastError) { + console.error(JSON.stringify(chrome.runtime.lastError)); + } + }); + } + + if (chrome.runtime && chrome.runtime.getManifest().manifest_version === 3) { + // Trying to remove host permissions with manifest >= v3 throws an error + return true; + } return new Promise((res, rej) => { - chrome.permissions.remove(p, (resp) => { + chrome.permissions.remove(hostPermissions, (resp) => { const le = chrome.runtime.lastError?.message if (le) { rej(le) @@ -92,7 +130,7 @@ function addPermissionsListener(callback: (p: Permissions, lastError?: string) = function getPermissionsApi(): CrossBrowserPermissionsApi { return { - addPermissionsListener, contains, request, remove + addPermissionsListener, containsHostPermissions, requestHostPermissions, removeHostPermissions } } @@ -245,7 +283,6 @@ function getWalletVersion(): WalletVersion { return manifestData; } - function registerTalerHeaderListener(callback: (tabId: number, url: string) => void): void { console.log("setting up header listener"); @@ -271,15 +308,18 @@ function registerTalerHeaderListener(callback: (tabId: number, url: string) => v } return; } + const prevHeaderListener = currentHeaderListener; + currentHeaderListener = headerListener; - getPermissionsApi().contains(getReadRequestPermissions()).then(result => { + getPermissionsApi().containsHostPermissions().then(result => { //if there is a handler already, remove it if ( "webRequest" in chrome && "onHeadersReceived" in chrome.webRequest && - chrome.webRequest.onHeadersReceived.hasListener(headerListener) + prevHeaderListener && + chrome.webRequest.onHeadersReceived.hasListener(prevHeaderListener) ) { - chrome.webRequest.onHeadersReceived.removeListener(headerListener); + chrome.webRequest.onHeadersReceived.removeListener(prevHeaderListener); } //if the result was positive, add the headerListener if (result) { diff --git a/packages/taler-wallet-webextension/src/platform/dev.ts b/packages/taler-wallet-webextension/src/platform/dev.ts index 38fcf29f4..e05ff29e9 100644 --- a/packages/taler-wallet-webextension/src/platform/dev.ts +++ b/packages/taler-wallet-webextension/src/platform/dev.ts @@ -22,8 +22,9 @@ const frames = ["popup", "wallet"] const api: PlatformAPI = ({ isFirefox: () => false, findTalerUriInActiveTab: async () => undefined, + containsTalerHeaderListener: () => { return true }, getPermissionsApi: () => ({ - addPermissionsListener: () => undefined, contains: async () => true, remove: async () => false, request: async () => false + addPermissionsListener: () => undefined, containsHostPermissions: async () => true, removeHostPermissions: async () => false, requestHostPermissions: async () => false }), getWalletVersion: () => ({ version: 'none' diff --git a/packages/taler-wallet-webextension/src/platform/firefox.ts b/packages/taler-wallet-webextension/src/platform/firefox.ts index 21d0e187b..d5beda324 100644 --- a/packages/taler-wallet-webextension/src/platform/firefox.ts +++ b/packages/taler-wallet-webextension/src/platform/firefox.ts @@ -15,7 +15,7 @@ */ import { CrossBrowserPermissionsApi, Permissions, PlatformAPI } from "./api.js"; -import chromePlatform, { contains as chromeContains, remove as chromeRemove, request as chromeRequest } from "./chrome.js"; +import chromePlatform, { containsHostPermissions as chromeContains, removeHostPermissions as chromeRemove, requestHostPermissions as chromeRequest } from "./chrome.js"; const api: PlatformAPI = { ...chromePlatform, @@ -40,9 +40,9 @@ function addPermissionsListener(callback: (p: Permissions) => void): void { function getPermissionsApi(): CrossBrowserPermissionsApi { return { addPermissionsListener, - contains: chromeContains, - request: chromeRequest, - remove: chromeRemove + containsHostPermissions: chromeContains, + requestHostPermissions: chromeRequest, + removeHostPermissions: chromeRemove } } |