From 1548086f50a7e33f17c5a5218fa0fc3383a8a2d5 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Fri, 21 Aug 2020 20:56:25 +0530 Subject: make diagnostics, welcome page and permissions work again --- .../taler-wallet-webextension/src/pages/refund.tsx | 4 +- .../taler-wallet-webextension/src/pages/tip.tsx | 74 +------------ packages/taler-wallet-webextension/src/wxApi.ts | 59 +---------- .../taler-wallet-webextension/src/wxBackend.ts | 114 ++++++++++++++++++--- .../taler-wallet-webextension/static/welcome.html | 8 +- 5 files changed, 112 insertions(+), 147 deletions(-) (limited to 'packages/taler-wallet-webextension') diff --git a/packages/taler-wallet-webextension/src/pages/refund.tsx b/packages/taler-wallet-webextension/src/pages/refund.tsx index b34b98f63..1ace50226 100644 --- a/packages/taler-wallet-webextension/src/pages/refund.tsx +++ b/packages/taler-wallet-webextension/src/pages/refund.tsx @@ -37,8 +37,8 @@ function RefundStatusView(props: { talerRefundUri: string }): JSX.Element { try { const result = await wxApi.applyRefund(props.talerRefundUri); setApplied(true); - const r = await wxApi.getPurchaseDetails(result.proposalId); - setPurchaseDetails(r); + // const r = await wxApi.getPurchaseDetails(result.proposalId); + // setPurchaseDetails(r); } catch (e) { console.error(e); setErrMsg(e.message); diff --git a/packages/taler-wallet-webextension/src/pages/tip.tsx b/packages/taler-wallet-webextension/src/pages/tip.tsx index 1f164ad1b..1290037e7 100644 --- a/packages/taler-wallet-webextension/src/pages/tip.tsx +++ b/packages/taler-wallet-webextension/src/pages/tip.tsx @@ -22,79 +22,7 @@ */ import * as React from "react"; -import { acceptTip, getTipStatus } from "../wxApi"; -import { renderAmount, ProgressButton } from "../renderHtml"; -import { useState, useEffect } from "react"; -import { TipStatus } from "taler-wallet-core"; - -function TipDisplay(props: { talerTipUri: string }): JSX.Element { - const [tipStatus, setTipStatus] = useState(undefined); - const [discarded, setDiscarded] = useState(false); - const [loading, setLoading] = useState(false); - const [finished, setFinished] = useState(false); - - useEffect(() => { - const doFetch = async (): Promise => { - const ts = await getTipStatus(props.talerTipUri); - setTipStatus(ts); - }; - doFetch(); - }, [props.talerTipUri]); - - if (discarded) { - return You've discarded the tip.; - } - - if (finished) { - return Tip has been accepted!; - } - - if (!tipStatus) { - return Loading ...; - } - - const discard = (): void => { - setDiscarded(true); - }; - - const accept = async (): Promise => { - setLoading(true); - await acceptTip(tipStatus.tipId); - setFinished(true); - }; - - return ( -
-

Tip Received!

-

- You received a tip of {renderAmount(tipStatus.amount)}{" "} - from - {tipStatus.merchantOrigin}. -

-

- The tip is handled by the exchange{" "} - {tipStatus.exchangeUrl}. This exchange will charge fees - of {renderAmount(tipStatus.totalFees)} for this - operation. -

-
- accept()}> - Accept Tip - {" "} - -
-
- ); -} export function createTipPage(): JSX.Element { - const url = new URL(document.location.href); - const talerTipUri = url.searchParams.get("talerTipUri"); - if (typeof talerTipUri !== "string") { - throw Error("talerTipUri must be a string"); - } - - return ; + return not implemented; } diff --git a/packages/taler-wallet-webextension/src/wxApi.ts b/packages/taler-wallet-webextension/src/wxApi.ts index 455d0b8ae..947b63cea 100644 --- a/packages/taler-wallet-webextension/src/wxApi.ts +++ b/packages/taler-wallet-webextension/src/wxApi.ts @@ -130,62 +130,13 @@ export function getTransactions(): Promise { return callBackend("getTransactions", {}); } -/** - * Return coins to a bank account. - */ -export function returnCoins(args: { - amount: AmountJson; - exchange: string; - senderWire: string; -}): Promise { - return callBackend("return-coins", args); -} - -/** - * Look up a purchase in the wallet database from - * the contract terms hash. - */ -export function getPurchaseDetails( - proposalId: string, -): Promise { - return callBackend("get-purchase-details", { proposalId }); -} - -/** - * Get the status of processing a tip. - */ -export function getTipStatus(talerTipUri: string): Promise { - return callBackend("get-tip-status", { talerTipUri }); -} - -/** - * Mark a tip as accepted by the user. - */ -export function acceptTip(talerTipUri: string): Promise { - return callBackend("accept-tip", { talerTipUri }); -} - /** * Download a refund and accept it. */ export function applyRefund( - refundUrl: string, + talerRefundUri: string, ): Promise<{ contractTermsHash: string; proposalId: string }> { - return callBackend("accept-refund", { refundUrl }); -} - -/** - * Abort a failed payment and try to get a refund. - */ -export function abortFailedPayment(contractTermsHash: string): Promise { - return callBackend("abort-failed-payment", { contractTermsHash }); -} - -/** - * Abort a failed payment and try to get a refund. - */ -export function benchmarkCrypto(repetitions: number): Promise { - return callBackend("benchmark-crypto", { repetitions }); + return callBackend("applyRefund", { talerRefundUri }); } /** @@ -212,7 +163,7 @@ export function acceptWithdrawal( * Get diagnostics information */ export function getDiagnostics(): Promise { - return callBackend("get-diagnostics", {}); + return callBackend("wxGetDiagnostics", {}); } /** @@ -221,14 +172,14 @@ export function getDiagnostics(): Promise { export function setExtendedPermissions( value: boolean, ): Promise { - return callBackend("set-extended-permissions", { value }); + return callBackend("wxSetExtendedPermissions", { value }); } /** * Get diagnostics information */ export function getExtendedPermissions(): Promise { - return callBackend("get-extended-permissions", {}); + return callBackend("wxGetExtendedPermissions", {}); } /** diff --git a/packages/taler-wallet-webextension/src/wxBackend.ts b/packages/taler-wallet-webextension/src/wxBackend.ts index 60d0b6d49..a77b173fe 100644 --- a/packages/taler-wallet-webextension/src/wxBackend.ts +++ b/packages/taler-wallet-webextension/src/wxBackend.ts @@ -37,12 +37,13 @@ import { TalerUriType, makeErrorDetails, TalerErrorCode, + CoreApiResponse, + WalletDiagnostics, + CoreApiResponseSuccess, } from "taler-wallet-core"; import { BrowserHttpLib } from "./browserHttpLib"; import { BrowserCryptoWorkerFactory } from "./browserCryptoWorkerFactory"; -const NeedsWallet = Symbol("NeedsWallet"); - /** * Currently active wallet instance. Might be unloaded and * re-instantiated when the database is reset. @@ -60,24 +61,109 @@ const walletInit: OpenedPromise = openPromise(); const notificationPorts: chrome.runtime.Port[] = []; +async function getDiagnostics(): Promise { + const manifestData = chrome.runtime.getManifest(); + const errors: string[] = []; + let firefoxIdbProblem = false; + let dbOutdated = false; + try { + await walletInit.promise; + } catch (e) { + errors.push("Error during wallet initialization: " + e); + if ( + currentDatabase === undefined && + outdatedDbVersion === undefined && + isFirefox() + ) { + firefoxIdbProblem = true; + } + } + if (!currentWallet) { + errors.push("Could not create wallet backend."); + } + if (!currentDatabase) { + errors.push("Could not open database"); + } + if (outdatedDbVersion !== undefined) { + errors.push(`Outdated DB version: ${outdatedDbVersion}`); + dbOutdated = true; + } + const diagnostics: WalletDiagnostics = { + walletManifestDisplayVersion: manifestData.version_name || "(undefined)", + walletManifestVersion: manifestData.version, + errors, + firefoxIdbProblem, + dbOutdated, + }; + return diagnostics; +} + async function dispatch( req: any, sender: any, sendResponse: any, ): Promise { - const w = currentWallet; - if (!w) { - sendResponse( - makeErrorDetails( - TalerErrorCode.WALLET_CORE_NOT_AVAILABLE, - "wallet core not available", - {}, - ), - ); - return; + let r: CoreApiResponse; + + const wrapResponse = (result: unknown): CoreApiResponseSuccess => { + return { + type: "response", + id: req.id, + operation: req.operation, + result, + }; + }; + + switch (req.operation) { + case "wxGetDiagnostics": { + r = wrapResponse(await getDiagnostics()); + break; + } + case "wxGetExtendedPermissions": { + const res = await new Promise((resolve, reject) => { + getPermissionsApi().contains(extendedPermissions, (result: boolean) => { + resolve(result); + }); + }); + r = wrapResponse({ newValue: res }); + break; + } + case "wxSetExtendedPermissions": { + const newVal = req.payload.value; + console.log("new extended permissions value", newVal); + if (newVal) { + setupHeaderListener(); + r = wrapResponse({ newValue: true }); + } else { + await new Promise((resolve, reject) => { + getPermissionsApi().remove(extendedPermissions, (rem) => { + console.log("permissions removed:", rem); + resolve(); + }); + }); + r = wrapResponse({ newVal: false }); + } + break; + } + default: + const w = currentWallet; + if (!w) { + r = { + type: "error", + id: req.id, + operation: req.operation, + error: makeErrorDetails( + TalerErrorCode.WALLET_CORE_NOT_AVAILABLE, + "wallet core not available", + {}, + ), + }; + break; + } + r = await w.handleCoreApiRequest(req.operation, req.id, req.payload); + break; } - const r = await w.handleCoreApiRequest(req.operation, req.id, req.payload); try { sendResponse(r); } catch (e) { @@ -188,7 +274,7 @@ try { chrome.runtime.onInstalled.addListener((details) => { console.log("onInstalled with reason", details.reason); if (details.reason === "install") { - const url = chrome.extension.getURL("/welcome.html"); + const url = chrome.extension.getURL("/static/welcome.html"); chrome.tabs.create({ active: true, url: url }); } }); diff --git a/packages/taler-wallet-webextension/static/welcome.html b/packages/taler-wallet-webextension/static/welcome.html index 07ecac707..e0b429f4b 100644 --- a/packages/taler-wallet-webextension/static/welcome.html +++ b/packages/taler-wallet-webextension/static/welcome.html @@ -4,10 +4,10 @@ Taler Wallet Installed - - - - + + + + -- cgit v1.2.3