summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-webextension/src/platform
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2023-10-30 18:42:39 -0300
committerSebastian <sebasjm@gmail.com>2023-10-30 18:44:41 -0300
commitf1967ab0baf825cdfa767d36bb7cce78521e4e4b (patch)
tree43650091b8542dfa750a69524efa3e5ff16b7201 /packages/taler-wallet-webextension/src/platform
parentfb4c172bb430936268bcebe34142d4206a0d422e (diff)
downloadwallet-core-f1967ab0baf825cdfa767d36bb7cce78521e4e4b.tar.gz
wallet-core-f1967ab0baf825cdfa767d36bb7cce78521e4e4b.tar.bz2
wallet-core-f1967ab0baf825cdfa767d36bb7cce78521e4e4b.zip
testing auto open feature
Diffstat (limited to 'packages/taler-wallet-webextension/src/platform')
-rw-r--r--packages/taler-wallet-webextension/src/platform/api.ts18
-rw-r--r--packages/taler-wallet-webextension/src/platform/chrome.ts473
-rw-r--r--packages/taler-wallet-webextension/src/platform/dev.ts7
-rw-r--r--packages/taler-wallet-webextension/src/platform/firefox.ts12
4 files changed, 267 insertions, 243 deletions
diff --git a/packages/taler-wallet-webextension/src/platform/api.ts b/packages/taler-wallet-webextension/src/platform/api.ts
index 820711ea9..76add93d1 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>;
@@ -100,7 +100,7 @@ type WebexWalletConfig = {
export interface Settings extends WebexWalletConfig {
injectTalerSupport: boolean;
- autoOpenByHeader: boolean;
+ autoOpen: boolean;
advanceMode: boolean;
backup: boolean;
langSelector: boolean;
@@ -111,7 +111,7 @@ export interface Settings extends WebexWalletConfig {
export const defaultSettings: Settings = {
injectTalerSupport: true,
- autoOpenByHeader: true,
+ autoOpen: true,
advanceMode: false,
backup: false,
langSelector: false,
@@ -207,14 +207,6 @@ export interface BackgroundPlatformAPI {
) => Promise<MessageResponse>,
): void;
- /**
- * Backend API
- */
- registerTalerHeaderListener(
- // onHeader: (tabId: number, url: string) => void,
- ): 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 fa9ad0522..4fb4bddfd 100644
--- a/packages/taler-wallet-webextension/src/platform/chrome.ts
+++ b/packages/taler-wallet-webextension/src/platform/chrome.ts
@@ -59,8 +59,6 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = {
useServiceWorkerAsBackgroundProcess,
keepAlive,
listenNetworkConnectionState,
- registerTalerHeaderListener,
- containsTalerHeaderListener,
};
export default api;
@@ -151,9 +149,6 @@ function addPermissionsListener(
function getPermissionsApi(): CrossBrowserPermissionsApi {
return {
addPermissionsListener,
- containsHostPermissions,
- requestHostPermissions,
- removeHostPermissions,
requestClipboardPermissions,
removeClipboardPermissions,
containsClipboardPermissions,
@@ -395,10 +390,17 @@ function registerReloadOnNewVersion(): void {
});
}
-function redirectTabToWalletPage(tabId: number, page: string): void {
+async function redirectCurrentTabToWalletPage(page: string): Promise<void> {
+ let queryOptions = { active: true, lastFocusedWindow: true };
+ let [tab] = await chrome.tabs.query(queryOptions);
+
+ return redirectTabToWalletPage(tab.id!, page);
+}
+
+async function redirectTabToWalletPage(tabId: number, page: string): Promise<void> {
const url = chrome.runtime.getURL(`/static/wallet.html#${page}`);
logger.trace("redirecting tabId: ", tabId, " to: ", url);
- chrome.tabs.update(tabId, { url });
+ await chrome.tabs.update(tabId, { url });
}
interface WalletVersion {
@@ -709,218 +711,247 @@ function listenNetworkConnectionState(
};
}
-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;
-
-
-function containsTalerHeaderListener(): boolean {
- return (
- currentHeaderListener !== undefined || currentTabListener !== undefined
- );
-}
-
-function headerListener(
- details: chrome.webRequest.WebResponseHeadersDetails,
-): void {
- if (chrome.runtime.lastError) {
- logger.error(JSON.stringify(chrome.runtime.lastError));
- return;
- }
- console.log("HEADER", details.statusCode, details.url, details.responseHeaders)
- 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}`,
- );
- redirectTabToWalletPage(details.tabId, values[0]);
- }
- }
- return;
-}
-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;
- }
- 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);
- }
-}
-
-function registerTalerHeaderListener(
- // callback: (tabId: number, url: string) => void,
-): 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));
- }
- });
- });
-}
-
-const hostPermissions = {
- permissions: ["webRequest"],
- origins: ["http://*/*", "https://*/*"],
-};
+// 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;
+
+
+// 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)}`,
+// );
+// }
+
+// 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);
+// }
+// }
-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
+/**
+ * unused, declarative redirect is not good enough
+ *
+ */
+// async function registerDeclarativeRedirect() {
+// await chrome.declarativeNetRequest.updateDynamicRules({
+// removeRuleIds: [1],
+// addRules: [
+// {
+// id: 1,
+// priority: 1,
+// condition: {
+// urlFilter: "https://developer.chrome.com/docs/extensions/mv2/",
+// regexFilter: ".*taler_uri=([^&]*).*",
+// // isUrlFilterCaseSensitive: false,
+// // requestMethods: [chrome.declarativeNetRequest.RequestMethod.GET]
+// // resourceTypes: [chrome.declarativeNetRequest.ResourceType.MAIN_FRAME],
+// },
+// action: {
+// type: chrome.declarativeNetRequest.RuleActionType.REDIRECT,
+// redirect: {
+// regexSubstitution: `chrome-extension://${chrome.runtime.id}/static/wallet.html?action=\\1`,
+// },
+// },
+// },
+// ],
+// });
+// }
+
+// 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));
+// }
+// });
+// });
+// }
+
+// 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 218422ded..02d11566a 100644
--- a/packages/taler-wallet-webextension/src/platform/dev.ts
+++ b/packages/taler-wallet-webextension/src/platform/dev.ts
@@ -44,8 +44,10 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = {
removeClipboardPermissions: async () => false,
requestClipboardPermissions: async () => false,
}),
- registerTalerHeaderListener: () => false,
- containsTalerHeaderListener: () => false,
+
+ // registerDeclarativeRedirect: () => false,
+ // registerTalerHeaderListener: () => false,
+ // containsTalerHeaderListener: () => false,
getWalletWebExVersion: () => ({
version: "none",
}),
@@ -88,7 +90,6 @@ const api: BackgroundPlatformAPI & ForegroundPlatformAPI = {
redirectTabToWalletPage: (tabId: number, page: string) => {
alert("redirectTabToWalletPage not implemented yet");
},
-
registerAllIncomingConnections: () => undefined,
registerOnInstalled: () => Promise.resolve(),
registerReloadOnNewVersion: () => undefined,
diff --git a/packages/taler-wallet-webextension/src/platform/firefox.ts b/packages/taler-wallet-webextension/src/platform/firefox.ts
index cc734ebf7..cca2833ad 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,