diff options
9 files changed, 315 insertions, 265 deletions
diff --git a/packages/taler-wallet-webextension/manifest-v2.json b/packages/taler-wallet-webextension/manifest-v2.json index 36d10f4f3..4717b1ab0 100644 --- a/packages/taler-wallet-webextension/manifest-v2.json +++ b/packages/taler-wallet-webextension/manifest-v2.json @@ -18,8 +18,12 @@ "permissions": [ "unlimitedStorage", "storage", + "webRequest", "activeTab" ], + "host_permissions": [ + "<all_urls>" + ], "web_accessible_resources": [ "static/wallet.html", "dist/taler-wallet-interaction-loader.js.map", diff --git a/packages/taler-wallet-webextension/manifest-v3.json b/packages/taler-wallet-webextension/manifest-v3.json index ae1be5181..d6a303ed6 100644 --- a/packages/taler-wallet-webextension/manifest-v3.json +++ b/packages/taler-wallet-webextension/manifest-v3.json @@ -17,9 +17,13 @@ "storage", "activeTab", "scripting", + "webRequest", "declarativeContent", "alarms" ], + "host_permissions": [ + "<all_urls>" + ], "commands": { "_execute_action": { "suggested_key": { 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, diff --git a/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx b/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx index 7c0f1938d..0a01b8a95 100644 --- a/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx +++ b/packages/taler-wallet-webextension/src/wallet/DeveloperPage.tsx @@ -258,6 +258,20 @@ export function View({ </Button> </Grid> <Grid item> + <Button variant="contained" onClick={async () => { + api.background.call("toggleHeaderListener", true) + }}> + <i18n.Translate>enable header listener</i18n.Translate> + </Button> + </Grid> + <Grid item> + <Button variant="contained" onClick={async () => { + api.background.call("toggleHeaderListener", false) + }}> + <i18n.Translate>disable header listener</i18n.Translate> + </Button> + </Grid> + <Grid item> <Button variant="contained" onClick={async () => { diff --git a/packages/taler-wallet-webextension/src/wxApi.ts b/packages/taler-wallet-webextension/src/wxApi.ts index 9683bf34b..8fb8211ae 100644 --- a/packages/taler-wallet-webextension/src/wxApi.ts +++ b/packages/taler-wallet-webextension/src/wxApi.ts @@ -83,14 +83,14 @@ export interface BackgroundOperations { }; response: void; }; - // containsHeaderListener: { - // request: void; - // response: ExtendedPermissionsResponse; - // }; - // toggleHeaderListener: { - // request: boolean; - // response: ExtendedPermissionsResponse; - // }; + containsHeaderListener: { + request: void; + response: ExtendedPermissionsResponse; + }; + toggleHeaderListener: { + request: boolean; + response: ExtendedPermissionsResponse; + }; } export interface BackgroundApiClient { diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts b/packages/taler-wallet-webextension/src/wxBackend.ts index f3d2375c5..a194de0ff 100644 --- a/packages/taler-wallet-webextension/src/wxBackend.ts +++ b/packages/taler-wallet-webextension/src/wxBackend.ts @@ -53,7 +53,7 @@ import { import { MessageFromFrontend, MessageResponse } from "./platform/api.js"; import { platform } from "./platform/background.js"; import { ExtensionOperations } from "./taler-wallet-interaction-loader.js"; -import { BackgroundOperations } from "./wxApi.js"; +import { BackgroundOperations, ExtendedPermissionsResponse } from "./wxApi.js"; /** * Currently active wallet instance. Might be unloaded and @@ -142,12 +142,14 @@ const backendHandlers: BackendHandlerType = { resetDb, runGarbageCollector, setLoggingLevel, + containsHeaderListener, + toggleHeaderListener, }; -// async function containsHeaderListener(): Promise<ExtendedPermissionsResponse> { -// const result = await platform.containsTalerHeaderListener(); -// return { newValue: result }; -// } +async function containsHeaderListener(): Promise<ExtendedPermissionsResponse> { + const result = platform.containsTalerHeaderListener(); + return { newValue: result }; +} async function setLoggingLevel({ tag, @@ -329,10 +331,12 @@ export async function wxMain(): Promise<void> { logger.trace("starting"); const afterWalletIsInitialized = reinitWallet(); + logger.trace("reload on new version"); platform.registerReloadOnNewVersion(); // Handlers for messages coming directly from the content // script on the page + logger.trace("listen all channels"); platform.listenToAllChannels(async (message) => { //wait until wallet is initialized await afterWalletIsInitialized; @@ -340,10 +344,12 @@ export async function wxMain(): Promise<void> { return result; }); + logger.trace("register all incoming connections"); platform.registerAllIncomingConnections(); + logger.trace("redirect if first start"); try { - await platform.registerOnInstalled(() => { + platform.registerOnInstalled(() => { platform.openWalletPage("/welcome"); }); } catch (e) { @@ -358,46 +364,57 @@ export async function wxMain(): Promise<void> { * which doesn't make sense, keeping it to make more tests */ - // if (await isHeaderListenerEnabled()) { - // if (await platform.getPermissionsApi().containsHostPermissions()) { - // try { - // platform.registerTalerHeaderListener(); - // } catch (e) { - // logger.error("could not register header listener", e); - // } - // } else { - // await platform.getPermissionsApi().requestHostPermissions() - // } - // } + logger.trace("check taler header listener"); + const enabled = platform.containsTalerHeaderListener() + if (!enabled) { + logger.info("header listener on") + const perm = await platform.getPermissionsApi().containsHostPermissions() + if (perm) { + logger.info("header listener allowed") + try { + platform.registerTalerHeaderListener(); + } catch (e) { + logger.error("could not register header listener", e); + } + } else { + logger.info("header listener requested") + await platform.getPermissionsApi().requestHostPermissions() + } + } // On platforms that support it, also listen to external // modification of permissions. - // platform.getPermissionsApi().addPermissionsListener((perm, lastError) => { - // logger.info(`permission added: ${perm}`,) - // if (lastError) { - // logger.error( - // `there was a problem trying to get permission ${perm}`, - // lastError, - // ); - // return; - // } - // platform.registerTalerHeaderListener(); - // }); + platform.getPermissionsApi().addPermissionsListener((perm, lastError) => { + logger.info(`permission added: ${perm}`,) + if (lastError) { + logger.error( + `there was a problem trying to get permission ${perm}`, + lastError, + ); + return; + } + platform.registerTalerHeaderListener(); + }); // } } -// async function toggleHeaderListener( -// newVal: boolean, -// ): Promise<ExtendedPermissionsResponse> { -// logger.trace("new extended permissions value", newVal); -// if (newVal) { -// platform.registerTalerHeaderListener(); -// return { newValue: true }; -// } +async function toggleHeaderListener( + newVal: boolean, +): Promise<ExtendedPermissionsResponse> { + logger.trace("new extended permissions value", newVal); + if (newVal) { + try { + platform.registerTalerHeaderListener(); + return { newValue: true }; + } catch (e) { + logger.error("FAIL to toggle",e) + } + return { newValue: false } + } -// const rem = await platform.getPermissionsApi().removeHostPermissions(); -// logger.trace("permissions removed:", rem); -// return { newValue: false }; -// } + const rem = await platform.getPermissionsApi().removeHostPermissions(); + logger.trace("permissions removed:", rem); + return { newValue: false }; +} |