summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/platform
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2023-12-15 00:45:01 -0300
committerSebastian <sebasjm@gmail.com>2023-12-15 00:45:01 -0300
commitb99ef78dea6c43d430e3aad4c9f3f8cff0a06844 (patch)
tree48f824ffcf9828a6cdf2bf30cc2e2e646f532c39 /packages/taler-wallet-webextension/src/platform
parent834d87e48448cf5e4ac8f57333b6552a5d1d7334 (diff)
downloadwallet-core-b99ef78dea6c43d430e3aad4c9f3f8cff0a06844.tar.gz
wallet-core-b99ef78dea6c43d430e3aad4c9f3f8cff0a06844.tar.bz2
wallet-core-b99ef78dea6c43d430e3aad4c9f3f8cff0a06844.zip
testing header listener
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform')
-rw-r--r--packages/taler-wallet-webextension/src/platform/api.ts13
-rw-r--r--packages/taler-wallet-webextension/src/platform/chrome.ts416
-rw-r--r--packages/taler-wallet-webextension/src/platform/dev.ts4
-rw-r--r--packages/taler-wallet-webextension/src/platform/firefox.ts12
4 files changed, 228 insertions, 217 deletions
diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts
index d425a9992..a2b26441b 100644
--- a/packages/taler-wallet-webextension/src/platform/api.ts
+++ b/packages/taler-wallet-webextension/src/platform/api.ts
@@ -46,9 +46,9 @@ export interface Permissions {
* Compatibility API that works on multiple browsers.
*/
export interface CrossBrowserPermissionsApi {
- // containsHostPermissions(): Promise<boolean>;
- // requestHostPermissions(): Promise<boolean>;
- // removeHostPermissions(): Promise<boolean>;
+ containsHostPermissions(): Promise<boolean>;
+ requestHostPermissions(): Promise<boolean>;
+ removeHostPermissions(): Promise<boolean>;
containsClipboardPermissions(): Promise<boolean>;
requestClipboardPermissions(): Promise<boolean>;
@@ -207,6 +207,13 @@ export interface BackgroundPlatformAPI {
) => Promise<MessageResponse>,
): void;
+ /**
+ * Use by the wallet backend to activate the listener of HTTP request
+ */
+ registerTalerHeaderListener(): void;
+
+ containsTalerHeaderListener(): boolean;
+
}
export interface ForegroundPlatformAPI {
/**
diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts b/packages/taler-wallet-webextension/src/platform/chrome.ts
index 04ecd80cc..7f384f7d4 100644
--- a/packages/taler-wallet-webextension/src/platform/chrome.ts
+++ b/packages/taler-wallet-webextension/src/platform/chrome.ts
@@ -60,6 +60,8 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = {
useServiceWorkerAsBackgroundProcess,
keepAlive,
listenNetworkConnectionState,
+ registerTalerHeaderListener,
+ containsTalerHeaderListener,
};
export default api;
@@ -149,6 +151,9 @@ function addPermissionsListener(
function getPermissionsApi(): CrossBrowserPermissionsApi {
return {
+ containsHostPermissions,
+ requestHostPermissions,
+ removeHostPermissions,
addPermissionsListener,
requestClipboardPermissions,
removeClipboardPermissions,
@@ -718,79 +723,81 @@ function listenNetworkConnectionState(
};
}
-// type HeaderListenerFunc = (
-// details: chrome.webRequest.WebResponseHeadersDetails,
-// ) => void;
-// let currentHeaderListener: HeaderListenerFunc | undefined = undefined;
+type HeaderListenerFunc = (
+ details: chrome.webRequest.WebResponseHeadersDetails,
+) => void;
+let currentHeaderListener: HeaderListenerFunc | undefined = undefined;
-// type TabListenerFunc = (tabId: number, info: chrome.tabs.TabChangeInfo) => void;
-// let currentTabListener: TabListenerFunc | undefined = undefined;
+type TabListenerFunc = (tabId: number, info: chrome.tabs.TabChangeInfo) => void;
+let currentTabListener: TabListenerFunc | undefined = undefined;
-// function containsTalerHeaderListener(): boolean {
-// return (
-// currentHeaderListener !== undefined || currentTabListener !== undefined
-// );
-// }
+function containsTalerHeaderListener(): boolean {
+ return (
+ currentHeaderListener !== undefined || currentTabListener !== undefined
+ );
+}
-// function headerListener(
-// details: chrome.webRequest.WebResponseHeadersDetails,
-// ): chrome.webRequest.BlockingResponse | undefined {
-// if (chrome.runtime.lastError) {
-// logger.error(JSON.stringify(chrome.runtime.lastError));
-// return;
-// }
-// console.log("HEADER", JSON.stringify(details, undefined, 2))
-// if (
-// details.statusCode === 402 ||
-// details.statusCode === 202 ||
-// details.statusCode === 200
-// ) {
-// const values = (details.responseHeaders || [])
-// .filter((h) => h.name.toLowerCase() === "taler")
-// .map((h) => h.value)
-// .filter((value): value is string => !!value);
-// if (values.length > 0) {
-// logger.info(
-// `Found a Taler URI in a response header for the request ${details.url} from tab ${details.tabId}`,
-// );
-// const redirectUrl = redirectTabToWalletPage(details.tabId, values[0]);
-// return { redirectUrl }
-// }
-// }
-// return details;
-// }
-// function parseTalerUriAndRedirect(tabId: number, maybeTalerUri: string): void {
-// const talerUri = maybeTalerUri.startsWith("ext+")
-// ? maybeTalerUri.substring(4)
-// : maybeTalerUri;
-// const uri = parseTalerUri(talerUri);
-// if (!uri) {
-// logger.warn(
-// `Response with HTTP 402 the Taler header but could not classify ${talerUri}`,
-// );
-// return;
-// }
-// redirectTabToWalletPage(
-// tabId,
-// `/taler-uri/${encodeURIComponent(talerUri)}`,
-// );
-// }
+function headerListener(
+ details: chrome.webRequest.WebResponseHeadersDetails,
+): chrome.webRequest.BlockingResponse | undefined {
+ if (chrome.runtime.lastError) {
+ logger.error(JSON.stringify(chrome.runtime.lastError));
+ return;
+ }
-// async function tabListener(
-// tabId: number,
-// info: chrome.tabs.TabChangeInfo,
-// ): Promise<void> {
-// if (tabId < 0) return;
-// const tabLocationHasBeenUpdated = info.status === "complete";
-// const tabTitleHasBeenUpdated = info.title !== undefined;
-// if (tabLocationHasBeenUpdated || tabTitleHasBeenUpdated) {
-// const uri = await findTalerUriInTab(tabId);
-// if (!uri) return;
-// logger.info(`Found a Taler URI in the tab ${tabId}`);
-// parseTalerUriAndRedirect(tabId, uri);
-// }
-// }
+ if (
+ details.statusCode === 402 ||
+ details.statusCode === 202 ||
+ details.statusCode === 200
+ ) {
+ const values = (details.responseHeaders || [])
+ .filter((h) => h.name.toLowerCase() === "taler")
+ .map((h) => h.value)
+ .filter((value): value is string => !!value);
+
+ const talerUri = values.length > 0 ? values[0] : undefined
+ if (talerUri) {
+ logger.info(
+ `Found a Taler URI in a response header for the request ${details.url} from tab ${details.tabId}: ${talerUri}`,
+ );
+ parseTalerUriAndRedirect(details.tabId, talerUri);
+ return;
+ }
+ }
+ return details;
+}
+function parseTalerUriAndRedirect(tabId: number, maybeTalerUri: string): void {
+ const talerUri = maybeTalerUri.startsWith("ext+")
+ ? maybeTalerUri.substring(4)
+ : maybeTalerUri;
+ const uri = parseTalerUri(talerUri);
+ if (!uri) {
+ logger.warn(
+ `Response with HTTP 402 the Taler header but could not classify ${talerUri}`,
+ );
+ return;
+ }
+ redirectTabToWalletPage(
+ tabId,
+ `/taler-uri/${encodeURIComponent(talerUri)}`,
+ );
+}
+
+async function tabListener(
+ tabId: number,
+ info: chrome.tabs.TabChangeInfo,
+): Promise<void> {
+ if (tabId < 0) return;
+ const tabLocationHasBeenUpdated = info.status === "complete";
+ const tabTitleHasBeenUpdated = info.title !== undefined;
+ if (tabLocationHasBeenUpdated || tabTitleHasBeenUpdated) {
+ const uri = await findTalerUriInTab(tabId);
+ if (!uri) return;
+ logger.info(`Found a Taler URI in the tab ${tabId}`);
+ parseTalerUriAndRedirect(tabId, uri);
+ }
+}
/**
* unused, declarative redirect is not good enough
@@ -821,144 +828,141 @@ function listenNetworkConnectionState(
// });
// }
-// function registerTalerHeaderListener(
-// ): void {
-// logger.info("setting up header listener");
-
-// const prevHeaderListener = currentHeaderListener;
-// const prevTabListener = currentTabListener;
-
-// getPermissionsApi()
-// .containsHostPermissions()
-// .then((result) => {
-// //if there is a handler already, remove it
-// if (
-// prevHeaderListener &&
-// chrome?.webRequest?.onHeadersReceived?.hasListener(prevHeaderListener)
-// ) {
-// console.log("removming on header listener")
-// chrome.webRequest.onHeadersReceived.removeListener(prevHeaderListener);
-// // chrome.webRequest.onCompleted.removeListener(prevHeaderListener);
-// // chrome.webRequest.onResponseStarted.removeListener(prevHeaderListener);
-// // chrome.webRequest.onErrorOccurred.removeListener(prevHeaderListener);
-// }
-// if (
-// prevTabListener &&
-// chrome?.tabs?.onUpdated?.hasListener(prevTabListener)
-// ) {
-// console.log("removming on tab listener")
-// chrome.tabs.onUpdated.removeListener(prevTabListener);
-// }
-
-// //if the result was positive, add the headerListener
-// if (result) {
-// console.log("headers on, disabled:", chrome?.webRequest?.onHeadersReceived === undefined)
-// if (chrome?.webRequest) {
-// chrome.webRequest.onHeadersReceived.addListener(headerListener,
-// { urls: ["<all_urls>"] },
-// ["responseHeaders", "extraHeaders"]
-// );
-// // chrome.webRequest.onCompleted.addListener(headerListener,
-// // { urls: ["<all_urls>"] },
-// // ["responseHeaders", "extraHeaders"]
-// // );
-// // chrome.webRequest.onResponseStarted.addListener(headerListener,
-// // { urls: ["<all_urls>"] },
-// // ["responseHeaders", "extraHeaders"]
-// // );
-// // chrome.webRequest.onErrorOccurred.addListener(headerListener,
-// // { urls: ["<all_urls>"] },
-// // ["extraHeaders"]
-// // );
-// currentHeaderListener = headerListener;
-// }
-
-// const tabsEvent: chrome.tabs.TabUpdatedEvent | undefined =
-// chrome?.tabs?.onUpdated;
-// if (tabsEvent) {
-// tabsEvent.addListener(tabListener);
-// currentTabListener = tabListener;
-// }
-// } else {
-// console.log("headers off")
-// }
-
-// //notify the browser about this change, this operation is expensive
-// chrome?.webRequest?.handlerBehaviorChanged(() => {
-// if (chrome.runtime.lastError) {
-// logger.error(JSON.stringify(chrome.runtime.lastError));
-// }
-// });
-// });
-// }
+function registerTalerHeaderListener(): void {
+ logger.info("setting up header listener");
+
+ const prevHeaderListener = currentHeaderListener;
+ const prevTabListener = currentTabListener;
+
+ if (
+ prevHeaderListener &&
+ chrome?.webRequest?.onHeadersReceived?.hasListener(prevHeaderListener)
+ ) {
+ console.log("removming on header listener")
+ chrome.webRequest.onHeadersReceived.removeListener(prevHeaderListener);
+ // chrome.webRequest.onCompleted.removeListener(prevHeaderListener);
+ // chrome.webRequest.onResponseStarted.removeListener(prevHeaderListener);
+ // chrome.webRequest.onErrorOccurred.removeListener(prevHeaderListener);
+ }
+ if (
+ prevTabListener &&
+ chrome?.tabs?.onUpdated?.hasListener(prevTabListener)
+ ) {
+ console.log("removming on tab listener")
+ chrome.tabs.onUpdated.removeListener(prevTabListener);
+ }
-// const hostPermissions = {
-// permissions: ["webRequest"],
-// origins: ["http://*/*", "https://*/*"],
-// };
-
-// export function containsHostPermissions(): Promise<boolean> {
-// return new Promise((res, rej) => {
-// chrome.permissions.contains(hostPermissions, (resp) => {
-// const le = chrome.runtime.lastError?.message;
-// if (le) {
-// rej(le);
-// }
-// res(resp);
-// });
-// });
-// }
+ console.log("headers on, disabled:", chrome?.webRequest?.onHeadersReceived === undefined)
+ if (chrome?.webRequest) {
+ if (extensionIsManifestV3()) {
+ chrome.webRequest.onHeadersReceived.addListener(headerListener,
+ { urls: ["<all_urls>"] },
+ ["responseHeaders", "extraHeaders"]
+ );
+ } else {
+ //Firefox doesnt support extra headers
+ chrome.webRequest.onHeadersReceived.addListener(headerListener,
+ { urls: ["<all_urls>"] },
+ ["responseHeaders"]
+ );
+ }
+ // chrome.webRequest.onCompleted.addListener(headerListener,
+ // { urls: ["<all_urls>"] },
+ // ["responseHeaders", "extraHeaders"]
+ // );
+ // chrome.webRequest.onResponseStarted.addListener(headerListener,
+ // { urls: ["<all_urls>"] },
+ // ["responseHeaders", "extraHeaders"]
+ // );
+ // chrome.webRequest.onErrorOccurred.addListener(headerListener,
+ // { urls: ["<all_urls>"] },
+ // ["extraHeaders"]
+ // );
+ currentHeaderListener = headerListener;
+ }
-// export async function requestHostPermissions(): Promise<boolean> {
-// return new Promise((res, rej) => {
-// chrome.permissions.request(hostPermissions, (resp) => {
-// const le = chrome.runtime.lastError?.message;
-// if (le) {
-// rej(le);
-// }
-// res(resp);
-// });
-// });
-// }
+ const tabsEvent: chrome.tabs.TabUpdatedEvent | undefined =
+ chrome?.tabs?.onUpdated;
+ if (tabsEvent) {
+ tabsEvent.addListener(tabListener);
+ currentTabListener = tabListener;
+ }
-// export async function removeHostPermissions(): Promise<boolean> {
-// //if there is a handler already, remove it
-// if (
-// currentHeaderListener &&
-// chrome?.webRequest?.onHeadersReceived?.hasListener(currentHeaderListener)
-// ) {
-// chrome.webRequest.onHeadersReceived.removeListener(currentHeaderListener);
-// }
-// if (
-// currentTabListener &&
-// chrome?.tabs?.onUpdated?.hasListener(currentTabListener)
-// ) {
-// chrome.tabs.onUpdated.removeListener(currentTabListener);
-// }
-
-// currentHeaderListener = undefined;
-// currentTabListener = undefined;
-
-// //notify the browser about this change, this operation is expensive
-// if ("webRequest" in chrome) {
-// chrome.webRequest.handlerBehaviorChanged(() => {
-// if (chrome.runtime.lastError) {
-// logger.error(JSON.stringify(chrome.runtime.lastError));
-// }
-// });
-// }
-
-// if (extensionIsManifestV3()) {
-// // Trying to remove host permissions with manifest >= v3 throws an error
-// return true;
-// }
-// return new Promise((res, rej) => {
-// chrome.permissions.remove(hostPermissions, (resp) => {
-// const le = chrome.runtime.lastError?.message;
-// if (le) {
-// rej(le);
-// }
-// res(resp);
-// });
-// });
-// } \ No newline at end of file
+ //notify the browser about this change, this operation is expensive
+ chrome?.webRequest?.handlerBehaviorChanged(() => {
+ if (chrome.runtime.lastError) {
+ logger.error(JSON.stringify(chrome.runtime.lastError));
+ }
+ });
+}
+
+const hostPermissions = {
+ permissions: ["webRequest"],
+ origins: ["http://*/*", "https://*/*"],
+};
+
+export function containsHostPermissions(): Promise<boolean> {
+ return new Promise((res, rej) => {
+ chrome.permissions.contains(hostPermissions, (resp) => {
+ const le = chrome.runtime.lastError?.message;
+ if (le) {
+ rej(le);
+ }
+ res(resp);
+ });
+ });
+}
+
+export async function requestHostPermissions(): Promise<boolean> {
+ return new Promise((res, rej) => {
+ chrome.permissions.request(hostPermissions, (resp) => {
+ const le = chrome.runtime.lastError?.message;
+ if (le) {
+ rej(le);
+ }
+ res(resp);
+ });
+ });
+}
+
+export async function removeHostPermissions(): Promise<boolean> {
+ //if there is a handler already, remove it
+ if (
+ currentHeaderListener &&
+ chrome?.webRequest?.onHeadersReceived?.hasListener(currentHeaderListener)
+ ) {
+ chrome.webRequest.onHeadersReceived.removeListener(currentHeaderListener);
+ }
+ if (
+ currentTabListener &&
+ chrome?.tabs?.onUpdated?.hasListener(currentTabListener)
+ ) {
+ chrome.tabs.onUpdated.removeListener(currentTabListener);
+ }
+
+ currentHeaderListener = undefined;
+ currentTabListener = undefined;
+
+ //notify the browser about this change, this operation is expensive
+ if ("webRequest" in chrome) {
+ chrome.webRequest.handlerBehaviorChanged(() => {
+ if (chrome.runtime.lastError) {
+ logger.error(JSON.stringify(chrome.runtime.lastError));
+ }
+ });
+ }
+
+ if (extensionIsManifestV3()) {
+ // Trying to remove host permissions with manifest >= v3 throws an error
+ return true;
+ }
+ return new Promise((res, rej) => {
+ chrome.permissions.remove(hostPermissions, (resp) => {
+ const le = chrome.runtime.lastError?.message;
+ if (le) {
+ rej(le);
+ }
+ res(resp);
+ });
+ });
+} \ No newline at end of file
diff --git a/packages/taler-wallet-webextension/src/platform/dev.ts b/packages/taler-wallet-webextension/src/platform/dev.ts
index 8d37930fa..51744e318 100644
--- a/packages/taler-wallet-webextension/src/platform/dev.ts
+++ b/packages/taler-wallet-webextension/src/platform/dev.ts
@@ -47,8 +47,8 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = {
}),
// registerDeclarativeRedirect: () => false,
- // registerTalerHeaderListener: () => false,
- // containsTalerHeaderListener: () => false,
+ registerTalerHeaderListener: () => false,
+ containsTalerHeaderListener: () => false,
getWalletWebExVersion: () => ({
version: "none",
}),
diff --git a/packages/taler-wallet-webextension/src/platform/firefox.ts b/packages/taler-wallet-webextension/src/platform/firefox.ts
index cca2833ad..cc734ebf7 100644
--- a/packages/taler-wallet-webextension/src/platform/firefox.ts
+++ b/packages/taler-wallet-webextension/src/platform/firefox.ts
@@ -26,9 +26,9 @@ import chromePlatform, {
containsClipboardPermissions as chromeClipContains,
removeClipboardPermissions as chromeClipRemove,
requestClipboardPermissions as chromeClipRequest,
- // containsHostPermissions as chromeHostContains,
- // requestHostPermissions as chromeHostRequest,
- // removeHostPermissions as chromeHostRemove,
+ containsHostPermissions as chromeHostContains,
+ requestHostPermissions as chromeHostRequest,
+ removeHostPermissions as chromeHostRemove,
} from "./chrome.js";
const api: BackgroundPlatformAPI & ForegroundPlatformAPI = {
@@ -54,9 +54,9 @@ function addPermissionsListener(callback: (p: Permissions) => void): void {
function getPermissionsApi(): CrossBrowserPermissionsApi {
return {
addPermissionsListener,
- // containsHostPermissions: chromeHostContains,
- // requestHostPermissions: chromeHostRequest,
- // removeHostPermissions: chromeHostRemove,
+ containsHostPermissions: chromeHostContains,
+ requestHostPermissions: chromeHostRequest,
+ removeHostPermissions: chromeHostRemove,
containsClipboardPermissions: chromeClipContains,
removeClipboardPermissions: chromeClipRemove,
requestClipboardPermissions: chromeClipRequest,