gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] 02/02: toggle permission


From: gnunet
Subject: [taler-wallet-core] 02/02: toggle permission
Date: Wed, 27 Apr 2022 19:34:06 +0200

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

commit 451dd746daeb57cfe0a601d1bf1f2b5506a5fc3c
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Wed Apr 27 14:33:52 2022 -0300

    toggle permission
---
 .../src/components/DebugCheckbox.tsx               |  63 ------------
 .../src/cta/Withdraw.stories.tsx                   |   7 ++
 .../taler-wallet-webextension/src/cta/Withdraw.tsx | 113 ++++++++++++++-------
 .../src/hooks/useExtendedPermissions.ts            |  37 ++++---
 .../taler-wallet-webextension/src/mui/handlers.ts  |   5 +
 .../taler-wallet-webextension/src/permissions.ts   |  21 ----
 .../taler-wallet-webextension/src/platform/api.ts  |  10 +-
 .../src/platform/chrome.ts                         |  66 +++++++++---
 .../taler-wallet-webextension/src/platform/dev.ts  |   3 +-
 .../src/platform/firefox.ts                        |   8 +-
 .../src/wallet/Settings.stories.tsx                |   7 +-
 .../src/wallet/Settings.tsx                        |  23 +++--
 .../src/wallet/Welcome.stories.tsx                 |   6 +-
 .../src/wallet/Welcome.tsx                         |  16 ++-
 packages/taler-wallet-webextension/src/wxApi.ts    |   8 +-
 .../taler-wallet-webextension/src/wxBackend.ts     |   9 +-
 16 files changed, 215 insertions(+), 187 deletions(-)

diff --git 
a/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx 
b/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx
deleted file mode 100644
index 8d431f68..00000000
--- a/packages/taler-wallet-webextension/src/components/DebugCheckbox.tsx
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- This file is part of TALER
- (C) 2016 GNUnet e.V.
-
- TALER is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- TALER is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- TALER; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-import { h, VNode } from "preact";
-import { useTranslationContext } from "../context/translation.js";
-
-export function DebugCheckbox({
-  enabled,
-  onToggle,
-}: {
-  enabled: boolean;
-  onToggle: () => void;
-}): VNode {
-  const { i18n } = useTranslationContext();
-
-  return (
-    <div>
-      <input
-        checked={enabled}
-        onClick={onToggle}
-        type="checkbox"
-        id="checkbox-perm"
-        style={{ width: "1.5em", height: "1.5em", verticalAlign: "middle" }}
-      />
-      <label
-        htmlFor="checkbox-perm"
-        style={{ marginLeft: "0.5em", fontWeight: "bold" }}
-      >
-        <i18n.Translate>
-          Automatically open wallet based on page content
-        </i18n.Translate>
-      </label>
-      <span
-        style={{
-          color: "#383838",
-          fontSize: "smaller",
-          display: "block",
-          marginLeft: "2em",
-        }}
-      >
-        (
-        <i18n.Translate>
-          Enabling this option below will make using the wallet faster, but
-          requires more permissions from your browser.
-        </i18n.Translate>
-        )
-      </span>
-    </div>
-  );
-}
diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw.stories.tsx 
b/packages/taler-wallet-webextension/src/cta/Withdraw.stories.tsx
index f2bc14f7..b77e98a1 100644
--- a/packages/taler-wallet-webextension/src/cta/Withdraw.stories.tsx
+++ b/packages/taler-wallet-webextension/src/cta/Withdraw.stories.tsx
@@ -229,3 +229,10 @@ export const EditExchangeModified = 
createExample(TestedComponent, {
     tosProps: normalTosState,
   },
 });
+
+export const CompletedWithoutBankURL = createExample(TestedComponent, {
+  state: {
+    status: "completed",
+    hook: undefined,
+  },
+});
diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx 
b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx
index 3346512f..cd0ba2cc 100644
--- a/packages/taler-wallet-webextension/src/cta/Withdraw.tsx
+++ b/packages/taler-wallet-webextension/src/cta/Withdraw.tsx
@@ -37,6 +37,7 @@ import {
   ButtonWarning,
   LinkSuccess,
   SubTitle,
+  SuccessBox,
   WalletAction,
 } from "../components/styled/index.js";
 import { useTranslationContext } from "../context/translation.js";
@@ -53,7 +54,12 @@ interface Props {
   talerWithdrawUri?: string;
 }
 
-type State = LoadingUri | LoadingExchange | LoadingInfoError | Success;
+type State =
+  | LoadingUri
+  | LoadingExchange
+  | LoadingInfoError
+  | Success
+  | Completed;
 
 interface LoadingUri {
   status: "loading-uri";
@@ -68,6 +74,11 @@ interface LoadingInfoError {
   hook: HookError | undefined;
 }
 
+type Completed = {
+  status: "completed";
+  hook: undefined;
+};
+
 type Success = {
   status: "success";
   hook: undefined;
@@ -185,6 +196,7 @@ export function useComponentState(
     undefined,
   );
   const [doingWithdraw, setDoingWithdraw] = useState<boolean>(false);
+  const [withdrawCompleted, setWithdrawCompleted] = useState<boolean>(false);
 
   const [showExchangeSelection, setShowExchangeSelection] = useState(false);
   const [nextExchange, setNextExchange] = useState<string | undefined>();
@@ -220,6 +232,7 @@ export function useComponentState(
       if (res.confirmTransferUrl) {
         document.location.href = res.confirmTransferUrl;
       }
+      setWithdrawCompleted(true);
     } catch (e) {
       if (e instanceof TalerError) {
         setWithdrawError(e);
@@ -245,6 +258,12 @@ export function useComponentState(
       hook: undefined,
     };
   }
+  if (withdrawCompleted) {
+    return {
+      status: "completed",
+      hook: undefined,
+    };
+  }
 
   const exchangeHandler: SelectFieldHandler = {
     onChange: async (e) => setNextExchange(e),
@@ -332,8 +351,64 @@ export function useComponentState(
   };
 }
 
-export function View({ state }: { state: Success }): VNode {
+export function View({ state }: { state: State }): VNode {
   const { i18n } = useTranslationContext();
+  if (state.status === "loading-uri") {
+    if (!state.hook) return <Loading />;
+
+    return (
+      <LoadingError
+        title={
+          <i18n.Translate>Could not get the info from the URI</i18n.Translate>
+        }
+        error={state.hook}
+      />
+    );
+  }
+  if (state.status === "loading-exchange") {
+    if (!state.hook) return <Loading />;
+
+    return (
+      <LoadingError
+        title={<i18n.Translate>Could not get exchange</i18n.Translate>}
+        error={state.hook}
+      />
+    );
+  }
+  if (state.status === "loading-info") {
+    if (!state.hook) return <Loading />;
+    return (
+      <LoadingError
+        title={
+          <i18n.Translate>Could not get info of withdrawal</i18n.Translate>
+        }
+        error={state.hook}
+      />
+    );
+  }
+
+  if (state.status === "completed") {
+    return (
+      <WalletAction>
+        <LogoHeader />
+        <SubTitle>
+          <i18n.Translate>Digital cash withdrawal</i18n.Translate>
+        </SubTitle>
+        <SuccessBox>
+          <h3>
+            <i18n.Translate>Withdrawal in process...</i18n.Translate>
+          </h3>
+          <p>
+            <i18n.Translate>
+              You can close the page now. Check your bank if the transaction
+              need a confirmation step to be completed
+            </i18n.Translate>
+          </p>
+        </SuccessBox>
+      </WalletAction>
+    );
+  }
+
   return (
     <WalletAction>
       <LogoHeader />
@@ -460,39 +535,5 @@ export function WithdrawPage({ talerWithdrawUri }: Props): 
VNode {
     return <Loading />;
   }
 
-  if (state.status === "loading-uri") {
-    if (!state.hook) return <Loading />;
-
-    return (
-      <LoadingError
-        title={
-          <i18n.Translate>Could not get the info from the URI</i18n.Translate>
-        }
-        error={state.hook}
-      />
-    );
-  }
-  if (state.status === "loading-exchange") {
-    if (!state.hook) return <Loading />;
-
-    return (
-      <LoadingError
-        title={<i18n.Translate>Could not get exchange</i18n.Translate>}
-        error={state.hook}
-      />
-    );
-  }
-  if (state.status === "loading-info") {
-    if (!state.hook) return <Loading />;
-    return (
-      <LoadingError
-        title={
-          <i18n.Translate>Could not get info of withdrawal</i18n.Translate>
-        }
-        error={state.hook}
-      />
-    );
-  }
-
   return <View state={state} />;
 }
diff --git 
a/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.ts 
b/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.ts
index 18283995..e3ea56d1 100644
--- a/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.ts
+++ b/packages/taler-wallet-webextension/src/hooks/useExtendedPermissions.ts
@@ -17,23 +17,32 @@
 import { useState, useEffect } from "preact/hooks";
 import * as wxApi from "../wxApi.js";
 import { platform } from "../platform/api.js";
-import { getReadRequestPermissions } from "../permissions.js";
+import { ToggleHandler } from "../mui/handlers.js";
+import { TalerError } from "@gnu-taler/taler-wallet-core";
 
-export function useExtendedPermissions(): [boolean, () => Promise<void>] {
+export function useExtendedPermissions(): ToggleHandler {
   const [enabled, setEnabled] = useState(false);
-
+  const [error, setError] = useState<TalerError | undefined>();
   const toggle = async (): Promise<void> => {
-    return handleExtendedPerm(enabled, setEnabled)
+    return handleExtendedPerm(enabled, setEnabled).catch(e => {
+      setError(TalerError.fromException(e))
+    })
   };
 
   useEffect(() => {
     async function getExtendedPermValue(): Promise<void> {
-      const res = await wxApi.getExtendedPermissions();
+      const res = await wxApi.containsHeaderListener();
       setEnabled(res.newValue);
     }
     getExtendedPermValue();
   }, []);
-  return [enabled, toggle];
+  return {
+    value: enabled,
+    button: {
+      onClick: toggle,
+      error
+    }
+  };
 }
 
 async function handleExtendedPerm(isEnabled: boolean, onChange: (value: 
boolean) => void): Promise<void> {
@@ -42,18 +51,20 @@ async function handleExtendedPerm(isEnabled: boolean, 
onChange: (value: boolean)
     // as the result of an input event ...
     let granted: boolean;
     try {
-      granted = await 
platform.getPermissionsApi().request(getReadRequestPermissions());
+      granted = await platform.getPermissionsApi().requestHostPermissions();
     } catch (lastError) {
-      console.error("error requesting permissions");
-      console.error(lastError);
       onChange(false);
-      return
+      throw lastError;
     }
-    console.log("permissions granted:", granted);
-    const res = await wxApi.setExtendedPermissions(granted);
+    const res = await wxApi.toggleHeaderListener(granted);
     onChange(res.newValue);
   } else {
-    await wxApi.setExtendedPermissions(false).then(r => onChange(r.newValue));
+    try {
+      await wxApi.toggleHeaderListener(false).then(r => onChange(r.newValue));
+    } catch (e) {
+      console.log(e)
+    }
+
   }
   return
 }
diff --git a/packages/taler-wallet-webextension/src/mui/handlers.ts 
b/packages/taler-wallet-webextension/src/mui/handlers.ts
index f75070c9..60cfee42 100644
--- a/packages/taler-wallet-webextension/src/mui/handlers.ts
+++ b/packages/taler-wallet-webextension/src/mui/handlers.ts
@@ -11,6 +11,11 @@ export interface ButtonHandler {
   error?: TalerError;
 }
 
+export interface ToggleHandler {
+  value?: boolean;
+  button: ButtonHandler;
+}
+
 export interface SelectFieldHandler {
   onChange: (value: string) => Promise<void>;
   error?: string;
diff --git a/packages/taler-wallet-webextension/src/permissions.ts 
b/packages/taler-wallet-webextension/src/permissions.ts
deleted file mode 100644
index ea714244..00000000
--- a/packages/taler-wallet-webextension/src/permissions.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2020 Taler Systems S.A.
-
- GNU Taler is free software; you can redistribute it and/or modify it under the
- terms of the GNU General Public License as published by the Free Software
- Foundation; either version 3, or (at your option) any later version.
-
- GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along with
- GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
- */
-
-const perms = {
-  permissions: ["webRequest"],
-  origins: ["http://*/*";, "https://*/*";],
-}
-export const getReadRequestPermissions = (): typeof perms => perms
\ No newline at end of file
diff --git a/packages/taler-wallet-webextension/src/platform/api.ts 
b/packages/taler-wallet-webextension/src/platform/api.ts
index 65bc3654..cee628a6 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;
 
@@ -131,6 +131,10 @@ export interface PlatformAPI {
    * Backend API
    */
   registerTalerHeaderListener(onHeader: (tabId: number, url: string) => void): 
void;
+  /**
+   * Frontend API
+   */
+  containsTalerHeaderListener(): boolean;
   /**
    * Backend API
    */
diff --git a/packages/taler-wallet-webextension/src/platform/chrome.ts 
b/packages/taler-wallet-webextension/src/platform/chrome.ts
index d1f4585d..d295168b 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 38fcf29f..e05ff29e 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 21d0e187..d5beda32 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
   }
 }
 
diff --git a/packages/taler-wallet-webextension/src/wallet/Settings.stories.tsx 
b/packages/taler-wallet-webextension/src/wallet/Settings.stories.tsx
index f5077894..936ba511 100644
--- a/packages/taler-wallet-webextension/src/wallet/Settings.stories.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/Settings.stories.tsx
@@ -32,18 +32,19 @@ export default {
 
 export const AllOff = createExample(TestedComponent, {
   deviceName: "this-is-the-device-name",
+  permissionToggle: { value: false, button: {} },
   setDeviceName: () => Promise.resolve(),
 });
 
 export const OneChecked = createExample(TestedComponent, {
   deviceName: "this-is-the-device-name",
-  permissionsEnabled: true,
+  permissionToggle: { value: false, button: {} },
   setDeviceName: () => Promise.resolve(),
 });
 
 export const WithOneExchange = createExample(TestedComponent, {
   deviceName: "this-is-the-device-name",
-  permissionsEnabled: true,
+  permissionToggle: { value: false, button: {} },
   setDeviceName: () => Promise.resolve(),
   knownExchanges: [
     {
@@ -62,7 +63,7 @@ export const WithOneExchange = createExample(TestedComponent, 
{
 
 export const WithExchangeInDifferentState = createExample(TestedComponent, {
   deviceName: "this-is-the-device-name",
-  permissionsEnabled: true,
+  permissionToggle: { value: false, button: {} },
   setDeviceName: () => Promise.resolve(),
   knownExchanges: [
     {
diff --git a/packages/taler-wallet-webextension/src/wallet/Settings.tsx 
b/packages/taler-wallet-webextension/src/wallet/Settings.tsx
index 5a9c776f..83ce76ad 100644
--- a/packages/taler-wallet-webextension/src/wallet/Settings.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/Settings.tsx
@@ -17,6 +17,7 @@
 import { ExchangeListItem } from "@gnu-taler/taler-util";
 import { Fragment, h, VNode } from "preact";
 import { Checkbox } from "../components/Checkbox.js";
+import { ErrorTalerOperation } from "../components/ErrorTalerOperation.js";
 import { JustInDevMode } from "../components/JustInDevMode.js";
 import { SelectList } from "../components/SelectList.js";
 import {
@@ -32,12 +33,13 @@ import { useTranslationContext } from 
"../context/translation.js";
 import { useAsyncAsHook } from "../hooks/useAsyncAsHook.js";
 import { useBackupDeviceName } from "../hooks/useBackupDeviceName.js";
 import { useExtendedPermissions } from "../hooks/useExtendedPermissions.js";
+import { ToggleHandler } from "../mui/handlers.js";
 import { Pages } from "../NavigationBar.js";
 import { buildTermsOfServiceStatus } from "../utils/index.js";
 import * as wxApi from "../wxApi.js";
 
 export function SettingsPage(): VNode {
-  const [permissionsEnabled, togglePermissions] = useExtendedPermissions();
+  const permissionToggle = useExtendedPermissions();
   const { devMode, toggleDevMode } = useDevContext();
   const { name, update } = useBackupDeviceName();
 
@@ -52,8 +54,7 @@ export function SettingsPage(): VNode {
       }
       deviceName={name}
       setDeviceName={update}
-      permissionsEnabled={permissionsEnabled}
-      togglePermissions={togglePermissions}
+      permissionToggle={permissionToggle}
       developerMode={devMode}
       toggleDeveloperMode={toggleDevMode}
     />
@@ -63,8 +64,7 @@ export function SettingsPage(): VNode {
 export interface ViewProps {
   deviceName: string;
   setDeviceName: (s: string) => Promise<void>;
-  permissionsEnabled: boolean;
-  togglePermissions: () => void;
+  permissionToggle: ToggleHandler;
   developerMode: boolean;
   toggleDeveloperMode: () => void;
   knownExchanges: Array<ExchangeListItem>;
@@ -72,8 +72,7 @@ export interface ViewProps {
 
 export function SettingsView({
   knownExchanges,
-  permissionsEnabled,
-  togglePermissions,
+  permissionToggle,
   developerMode,
   toggleDeveloperMode,
 }: ViewProps): VNode {
@@ -82,6 +81,12 @@ export function SettingsView({
   return (
     <Fragment>
       <section>
+        {permissionToggle.button.error && (
+          <ErrorTalerOperation
+            title={<i18n.Translate>Could not toggle auto-open</i18n.Translate>}
+            error={permissionToggle.button.error.errorDetail}
+          />
+        )}
         <SubTitle>
           <i18n.Translate>Navigator</i18n.Translate>
         </SubTitle>
@@ -98,8 +103,8 @@ export function SettingsView({
               requires more permissions from your browser.
             </i18n.Translate>
           }
-          enabled={permissionsEnabled}
-          onToggle={togglePermissions}
+          enabled={permissionToggle.value!}
+          onToggle={permissionToggle.button.onClick!}
         />
 
         <SubTitle>
diff --git a/packages/taler-wallet-webextension/src/wallet/Welcome.stories.tsx 
b/packages/taler-wallet-webextension/src/wallet/Welcome.stories.tsx
index 424eb9d7..10ff78b2 100644
--- a/packages/taler-wallet-webextension/src/wallet/Welcome.stories.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/Welcome.stories.tsx
@@ -28,7 +28,7 @@ export default {
 };
 
 export const Normal = createExample(TestedComponent, {
-  permissionsEnabled: true,
+  permissionToggle: { value: true, button: {} },
   diagnostics: {
     errors: [],
     walletManifestVersion: "1.0",
@@ -40,9 +40,9 @@ export const Normal = createExample(TestedComponent, {
 
 export const TimedoutDiagnostics = createExample(TestedComponent, {
   timedOut: true,
-  permissionsEnabled: false,
+  permissionToggle: { value: true, button: {} },
 });
 
 export const RunningDiagnostics = createExample(TestedComponent, {
-  permissionsEnabled: false,
+  permissionToggle: { value: true, button: {} },
 });
diff --git a/packages/taler-wallet-webextension/src/wallet/Welcome.tsx 
b/packages/taler-wallet-webextension/src/wallet/Welcome.tsx
index 58023a20..38bcf800 100644
--- a/packages/taler-wallet-webextension/src/wallet/Welcome.tsx
+++ b/packages/taler-wallet-webextension/src/wallet/Welcome.tsx
@@ -27,15 +27,15 @@ import { SubTitle, Title } from 
"../components/styled/index.js";
 import { useTranslationContext } from "../context/translation.js";
 import { useDiagnostics } from "../hooks/useDiagnostics.js";
 import { useExtendedPermissions } from "../hooks/useExtendedPermissions.js";
+import { ToggleHandler } from "../mui/handlers.js";
 import { platform } from "../platform/api.js";
 
 export function WelcomePage(): VNode {
-  const [permissionsEnabled, togglePermissions] = useExtendedPermissions();
+  const permissionToggle = useExtendedPermissions();
   const [diagnostics, timedOut] = useDiagnostics();
   return (
     <View
-      permissionsEnabled={permissionsEnabled}
-      togglePermissions={togglePermissions}
+      permissionToggle={permissionToggle}
       diagnostics={diagnostics}
       timedOut={timedOut}
     />
@@ -43,14 +43,12 @@ export function WelcomePage(): VNode {
 }
 
 export interface ViewProps {
-  permissionsEnabled: boolean;
-  togglePermissions: () => void;
+  permissionToggle: ToggleHandler;
   diagnostics: WalletDiagnostics | undefined;
   timedOut: boolean;
 }
 export function View({
-  permissionsEnabled,
-  togglePermissions,
+  permissionToggle,
   diagnostics,
   timedOut,
 }: ViewProps): VNode {
@@ -105,8 +103,8 @@ export function View({
               requires more permissions from your browser.)
             </i18n.Translate>
           }
-          enabled={permissionsEnabled}
-          onToggle={togglePermissions}
+          enabled={permissionToggle.value!}
+          onToggle={permissionToggle.button.onClick!}
         />
         <SubTitle>
           <i18n.Translate>Next Steps</i18n.Translate>
diff --git a/packages/taler-wallet-webextension/src/wxApi.ts 
b/packages/taler-wallet-webextension/src/wxApi.ts
index 128a82fd..da80e9bd 100644
--- a/packages/taler-wallet-webextension/src/wxApi.ts
+++ b/packages/taler-wallet-webextension/src/wxApi.ts
@@ -345,17 +345,17 @@ export function getDiagnostics(): 
Promise<WalletDiagnostics> {
 /**
  * Get diagnostics information
  */
-export function setExtendedPermissions(
+export function toggleHeaderListener(
   value: boolean,
 ): Promise<ExtendedPermissionsResponse> {
-  return callBackend("wxSetExtendedPermissions", { value });
+  return callBackend("toggleHeaderListener", { value });
 }
 
 /**
  * Get diagnostics information
  */
-export function getExtendedPermissions(): Promise<ExtendedPermissionsResponse> 
{
-  return callBackend("wxGetExtendedPermissions", {});
+export function containsHeaderListener(): Promise<ExtendedPermissionsResponse> 
{
+  return callBackend("containsHeaderListener", {});
 }
 
 /**
diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts 
b/packages/taler-wallet-webextension/src/wxBackend.ts
index b0c4102f..b0d690ef 100644
--- a/packages/taler-wallet-webextension/src/wxBackend.ts
+++ b/packages/taler-wallet-webextension/src/wxBackend.ts
@@ -43,7 +43,6 @@ import {
 import { SetTimeoutTimerAPI } from "@gnu-taler/taler-wallet-core";
 import { BrowserCryptoWorkerFactory } from "./browserCryptoWorkerFactory.js";
 import { BrowserHttpLib } from "./browserHttpLib.js";
-import { getReadRequestPermissions } from "./permissions.js";
 import { MessageFromBackend, platform } from "./platform/api.js";
 import { SynchronousCryptoWorkerFactory } from 
"./serviceWorkerCryptoWorkerFactory.js";
 import { ServiceWorkerHttpLib } from "./serviceWorkerHttpLib.js";
@@ -131,19 +130,19 @@ async function dispatch(
       r = wrapResponse(await reinitWallet());
       break;
     }
-    case "wxGetExtendedPermissions": {
-      const res = await 
platform.getPermissionsApi().contains(getReadRequestPermissions());
+    case "containsHeaderListener": {
+      const res = await platform.containsTalerHeaderListener();
       r = wrapResponse({ newValue: res });
       break;
     }
-    case "wxSetExtendedPermissions": {
+    case "toggleHeaderListener": {
       const newVal = req.payload.value;
       logger.trace("new extended permissions value", newVal);
       if (newVal) {
         platform.registerTalerHeaderListener(parseTalerUriAndRedirect);
         r = wrapResponse({ newValue: true });
       } else {
-        const rem = await 
platform.getPermissionsApi().remove(getReadRequestPermissions());
+        const rem = await platform.getPermissionsApi().removeHostPermissions();
         logger.trace("permissions removed:", rem);
         r = wrapResponse({ newVal: false });
       }

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]