aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/platform
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2022-04-27 14:33:52 -0300
committerSebastian <sebasjm@gmail.com>2022-04-27 14:33:52 -0300
commit451dd746daeb57cfe0a601d1bf1f2b5506a5fc3c (patch)
tree975b98de7c3d28f62e05396a01129c69efbeb66b /packages/taler-wallet-webextension/src/platform
parent0b8e0a0806947472181b13a3c0dda9947a326b28 (diff)
downloadwallet-core-451dd746daeb57cfe0a601d1bf1f2b5506a5fc3c.tar.xz
toggle permission
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform')
-rw-r--r--packages/taler-wallet-webextension/src/platform/api.ts10
-rw-r--r--packages/taler-wallet-webextension/src/platform/chrome.ts66
-rw-r--r--packages/taler-wallet-webextension/src/platform/dev.ts3
-rw-r--r--packages/taler-wallet-webextension/src/platform/firefox.ts8
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
}
}