From 905be0124a1b013d802db33265879d4b80501362 Mon Sep 17 00:00:00 2001
From: Sebastian
Date: Sun, 10 Sep 2023 15:38:43 -0300
Subject: [PATCH 01/11] more codespell
---
contrib/articles/spending.txt | 2 +-
contrib/articles/ui/ui-cameraready.tex | 4 +-
contrib/articles/ui/ui.tex | 4 +-
.../pages/home/AuthenticationEditorScreen.tsx | 2 +-
.../idb-wpt-ported/idbcursor-reused.test.ts | 4 +-
.../idb-bridge/src/util/fakeDOMStringList.ts | 2 +-
packages/taler-harness/src/harness/harness.ts | 23 +++---
.../taler-harness/src/harness/libeufin.ts | 74 +++++++++----------
packages/taler-util/src/taler-crypto.ts | 11 ++-
packages/taler-wallet-core/src/wallet.ts | 8 +-
10 files changed, 65 insertions(+), 69 deletions(-)
diff --git a/contrib/articles/spending.txt b/contrib/articles/spending.txt
index 7f2c716f8..887a80910 100644
--- a/contrib/articles/spending.txt
+++ b/contrib/articles/spending.txt
@@ -45,7 +45,7 @@ If the above parameters have an optimal assignment, then replacing
v'[x] := 0
gives another optimal solution, as otherwise we'd get a better one for the first situation.
-There is however no assurence that t[x] = price mod v[x] for some x in D, so nievely such solutions give you running times like O(price * |D|), which kinda sucks actually. Just one simplified example :
+There is however no assurence that t[x] = price mod v[x] for some x in D, so naively such solutions give you running times like O(price * |D|), which kinda sucks actually. Just one simplified example :
http://www.codeproject.com/Articles/31002/Coin-Change-Problem-Using-Dynamic-Programming
diff --git a/contrib/articles/ui/ui-cameraready.tex b/contrib/articles/ui/ui-cameraready.tex
index ef79d91ba..305b77258 100644
--- a/contrib/articles/ui/ui-cameraready.tex
+++ b/contrib/articles/ui/ui-cameraready.tex
@@ -881,7 +881,7 @@ the page. Then the wallet inspects the response as it may contain
error reports about a failed payment which the wallet has to handle.
By submitting the payment this way, we also ensure that this
intermediate request does not require JavaScript and still does not
-interfer with navigation. Once the Web shop confirms the payment, the
+interfere with navigation. Once the Web shop confirms the payment, the
wallet causes the fulfillment URL to be reloaded.
If the contract hash does not match a payment which the user
@@ -937,7 +937,7 @@ it has the following key advantages:
other users has the expected behavior
of asking the other user to pay for the resource.
\item Asynchronously transmitting coins from injected JavaScript costs
- one roundtrip, but does not interfer with navigation and allows
+ one roundtrip, but does not interfere with navigation and allows
proper error handling.
\item The different pages of the merchant have clear
delineations: the shopping pages conclude by making an offer, and
diff --git a/contrib/articles/ui/ui.tex b/contrib/articles/ui/ui.tex
index 37cd8b076..620dd5ecd 100644
--- a/contrib/articles/ui/ui.tex
+++ b/contrib/articles/ui/ui.tex
@@ -933,7 +933,7 @@ the page. Then the wallet inspects the response as it may contain
error reports about a failed payment which the wallet has to handle.
By submitting the payment this way, we also ensure that this
intermediate request does not require JavaScript and still does not
-interfer with navigation. Once the Web shop confirms the payment, the
+interfere with navigation. Once the Web shop confirms the payment, the
wallet causes the fulfillment URL to be reloaded.
If the contract hash does not match a payment which the user
@@ -989,7 +989,7 @@ it has the following key advantages:
other users has the expected behavior
of asking the other user to pay for the resource.
\item Asynchronously transmitting coins from injected JavaScript costs
- one roundtrip, but does not interfer with navigation and allows
+ one roundtrip, but does not interfere with navigation and allows
proper error handling.
\item The different pages of the merchant have clear
delineations: the shopping pages conclude by making an offer, and
diff --git a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx
index 3018f88dd..54bbc626d 100644
--- a/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx
+++ b/packages/anastasis-webui/src/pages/home/AuthenticationEditorScreen.tsx
@@ -241,7 +241,7 @@ export function AuthenticationEditorScreen(): VNode {
{authAvailableSet.size > 0 && (
- We couldn't find provider for some of the authentication
+ We couldn't find provider for some of the authentication
methods.
)}
diff --git a/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts b/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts
index b13bd1fc3..e0e6c2bf8 100644
--- a/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts
+++ b/packages/idb-bridge/src/idb-wpt-ported/idbcursor-reused.test.ts
@@ -26,7 +26,7 @@ test("WPT idbcursor-reused.htm", async (t) => {
case 0:
cursor = e.target.result;
- t.deepEqual(cursor.value, "data", "prequisite cursor.value");
+ t.deepEqual(cursor.value, "data", "prerequisite cursor.value");
cursor.custom_cursor_value = 1;
e.target.custom_request_value = 2;
@@ -34,7 +34,7 @@ test("WPT idbcursor-reused.htm", async (t) => {
break;
case 1:
- t.deepEqual(cursor.value, "data2", "prequisite cursor.value");
+ t.deepEqual(cursor.value, "data2", "prerequisite cursor.value");
t.deepEqual(cursor.custom_cursor_value, 1, "custom cursor value");
t.deepEqual(
e.target.custom_request_value,
diff --git a/packages/idb-bridge/src/util/fakeDOMStringList.ts b/packages/idb-bridge/src/util/fakeDOMStringList.ts
index 92785f9e1..24f5c96f4 100644
--- a/packages/idb-bridge/src/util/fakeDOMStringList.ts
+++ b/packages/idb-bridge/src/util/fakeDOMStringList.ts
@@ -21,7 +21,7 @@ export interface FakeDOMStringList extends Array {
item: (i: number) => string | null;
}
-// Would be nicer to sublcass Array, but I'd have to sacrifice Node 4 support to do that.
+// Would be nicer to subclass Array, but I'd have to sacrifice Node 4 support to do that.
export const fakeDOMStringList = (arr: string[]): FakeDOMStringList => {
const arr2 = arr.slice();
diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts
index 24e42099e..0c3c367af 100644
--- a/packages/taler-harness/src/harness/harness.ts
+++ b/packages/taler-harness/src/harness/harness.ts
@@ -565,7 +565,7 @@ class BankServiceBase {
protected globalTestState: GlobalTestState,
protected bankConfig: BankConfig,
protected configFile: string,
- ) {}
+ ) { }
}
export interface HarnessExchangeBankAccount {
@@ -580,8 +580,7 @@ export interface HarnessExchangeBankAccount {
*/
export class FakebankService
extends BankServiceBase
- implements BankServiceHandle
-{
+ implements BankServiceHandle {
proc: ProcessWrapper | undefined;
http = createPlatformHttpLib({ enableThrottling: false });
@@ -790,7 +789,7 @@ export class ExchangeService implements ExchangeServiceInterface {
async runWirewatchOnce() {
if (useLibeufinBank) {
- // Not even 2 secods showed to be enough!
+ // Not even 2 seconds showed to be enough!
await waitMs(4000);
}
await runCommand(
@@ -1013,7 +1012,7 @@ export class ExchangeService implements ExchangeServiceInterface {
private exchangeConfig: ExchangeConfig,
private configFilename: string,
private keyPair: EddsaKeyPair,
- ) {}
+ ) { }
get name() {
return this.exchangeConfig.name;
@@ -1369,7 +1368,7 @@ export class MerchantService implements MerchantServiceInterface {
private globalState: GlobalTestState,
private merchantConfig: MerchantConfig,
private configFilename: string,
- ) {}
+ ) { }
private currentTimetravelOffsetMs: number | undefined;
@@ -1707,7 +1706,7 @@ export class WalletService {
constructor(
private globalState: GlobalTestState,
private opts: WalletServiceOptions,
- ) {}
+ ) { }
get socketPath() {
const unixPath = path.join(
@@ -1816,7 +1815,7 @@ export class WalletClient {
return client.call(operation, payload);
}
- constructor(private args: WalletClientArgs) {}
+ constructor(private args: WalletClientArgs) { }
async connect(): Promise {
const waiter = this.waiter;
@@ -1883,11 +1882,9 @@ export class WalletCli {
? `--crypto-worker=${cliOpts.cryptoWorkerType}`
: "";
const logName = `wallet-${self.name}`;
- const command = `taler-wallet-cli ${
- self.timetravelArg ?? ""
- } ${cryptoWorkerArg} --no-throttle -LTRACE --skip-defaults --wallet-db '${
- self.dbfile
- }' api '${op}' ${shellWrap(JSON.stringify(payload))}`;
+ const command = `taler-wallet-cli ${self.timetravelArg ?? ""
+ } ${cryptoWorkerArg} --no-throttle -LTRACE --skip-defaults --wallet-db '${self.dbfile
+ }' api '${op}' ${shellWrap(JSON.stringify(payload))}`;
const resp = await sh(self.globalTestState, logName, command);
logger.info("--- wallet core response ---");
logger.info(resp);
diff --git a/packages/taler-harness/src/harness/libeufin.ts b/packages/taler-harness/src/harness/libeufin.ts
index 9f3e7a5a0..caeea85ae 100644
--- a/packages/taler-harness/src/harness/libeufin.ts
+++ b/packages/taler-harness/src/harness/libeufin.ts
@@ -251,7 +251,7 @@ export interface NexusTask {
taskCronSpec: string;
// Only meaningful for "fetch" types.
taskParams: FetchParams;
- // Timestamp in secons when the next iteration will run.
+ // Timestamp in seconds when the next iteration will run.
nextScheduledExecutionSec: number;
// Timestamp in seconds when the previous iteration ran.
prevScheduledExecutionSec: number;
@@ -618,9 +618,9 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-createebicssubscriber",
"libeufin-cli sandbox ebicssubscriber create" +
- ` --host-id=${details.hostId}` +
- ` --partner-id=${details.partnerId}` +
- ` --user-id=${details.userId}`,
+ ` --host-id=${details.hostId}` +
+ ` --partner-id=${details.partnerId}` +
+ ` --user-id=${details.userId}`,
this.env(),
);
console.log(stdout);
@@ -634,13 +634,13 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-createebicsbankaccount",
"libeufin-cli sandbox ebicsbankaccount create" +
- ` --iban=${bankAccountDetails.iban}` +
- ` --bic=${bankAccountDetails.bic}` +
- ` --person-name='${bankAccountDetails.personName}'` +
- ` --account-name=${bankAccountDetails.accountName}` +
- ` --ebics-host-id=${sd.hostId}` +
- ` --ebics-partner-id=${sd.partnerId}` +
- ` --ebics-user-id=${sd.userId}`,
+ ` --iban=${bankAccountDetails.iban}` +
+ ` --bic=${bankAccountDetails.bic}` +
+ ` --person-name='${bankAccountDetails.personName}'` +
+ ` --account-name=${bankAccountDetails.accountName}` +
+ ` --ebics-host-id=${sd.hostId}` +
+ ` --ebics-partner-id=${sd.partnerId}` +
+ ` --ebics-user-id=${sd.userId}`,
this.env(),
);
console.log(stdout);
@@ -673,11 +673,11 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-createebicsconnection",
`libeufin-cli connections new-ebics-connection` +
- ` --ebics-url=${connectionDetails.ebicsUrl}` +
- ` --host-id=${connectionDetails.subscriberDetails.hostId}` +
- ` --partner-id=${connectionDetails.subscriberDetails.partnerId}` +
- ` --ebics-user-id=${connectionDetails.subscriberDetails.userId}` +
- ` ${connectionDetails.connectionName}`,
+ ` --ebics-url=${connectionDetails.ebicsUrl}` +
+ ` --host-id=${connectionDetails.subscriberDetails.hostId}` +
+ ` --partner-id=${connectionDetails.subscriberDetails.partnerId}` +
+ ` --ebics-user-id=${connectionDetails.subscriberDetails.userId}` +
+ ` ${connectionDetails.connectionName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -693,9 +693,9 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-createbackupfile",
`libeufin-cli connections export-backup` +
- ` --passphrase=${details.passphrase}` +
- ` --output-file=${details.outputFile}` +
- ` ${details.connectionName}`,
+ ` --passphrase=${details.passphrase}` +
+ ` --output-file=${details.outputFile}` +
+ ` ${details.connectionName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -711,7 +711,7 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-createkeyletter",
`libeufin-cli connections get-key-letter` +
- ` ${details.connectionName} ${details.outputFile}`,
+ ` ${details.connectionName} ${details.outputFile}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -774,9 +774,9 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-importbankaccount",
"libeufin-cli connections import-bank-account" +
- ` --offered-account-id=${importDetails.offeredBankAccountName}` +
- ` --nexus-bank-account-id=${importDetails.nexusBankAccountName}` +
- ` ${importDetails.connectionName}`,
+ ` --offered-account-id=${importDetails.offeredBankAccountName}` +
+ ` --nexus-bank-account-id=${importDetails.nexusBankAccountName}` +
+ ` ${importDetails.connectionName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -822,12 +822,12 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-preparepayment",
`libeufin-cli accounts prepare-payment` +
- ` --creditor-iban=${details.creditorIban}` +
- ` --creditor-bic=${details.creditorBic}` +
- ` --creditor-name='${details.creditorName}'` +
- ` --payment-subject='${details.subject}'` +
- ` --payment-amount=${details.currency}:${details.amount}` +
- ` ${details.nexusBankAccountName}`,
+ ` --creditor-iban=${details.creditorIban}` +
+ ` --creditor-bic=${details.creditorBic}` +
+ ` --creditor-name='${details.creditorName}'` +
+ ` --payment-subject='${details.subject}'` +
+ ` --payment-amount=${details.currency}:${details.amount}` +
+ ` ${details.nexusBankAccountName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -846,8 +846,8 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-submitpayments",
`libeufin-cli accounts submit-payments` +
- ` --payment-uuid=${paymentUuid}` +
- ` ${details.nexusBankAccountName}`,
+ ` --payment-uuid=${paymentUuid}` +
+ ` ${details.nexusBankAccountName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -863,9 +863,9 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-new-anastasis-facade",
`libeufin-cli facades new-anastasis-facade` +
- ` --currency ${req.currency}` +
- ` --facade-name ${req.facadeName}` +
- ` ${req.connectionName} ${req.accountName}`,
+ ` --currency ${req.currency}` +
+ ` --facade-name ${req.facadeName}` +
+ ` ${req.connectionName} ${req.accountName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
@@ -881,9 +881,9 @@ export class LibeufinCli {
this.globalTestState,
"libeufin-cli-new-taler-wire-gateway-facade",
`libeufin-cli facades new-taler-wire-gateway-facade` +
- ` --currency ${req.currency}` +
- ` --facade-name ${req.facadeName}` +
- ` ${req.connectionName} ${req.accountName}`,
+ ` --currency ${req.currency}` +
+ ` --facade-name ${req.facadeName}` +
+ ` ${req.connectionName} ${req.accountName}`,
{
...process.env,
LIBEUFIN_NEXUS_URL: this.cliDetails.nexusUrl,
diff --git a/packages/taler-util/src/taler-crypto.ts b/packages/taler-util/src/taler-crypto.ts
index 9425a9320..3ad388794 100644
--- a/packages/taler-util/src/taler-crypto.ts
+++ b/packages/taler-util/src/taler-crypto.ts
@@ -392,7 +392,7 @@ function csKdfMod(
// Newer versions of node have TextEncoder and TextDecoder as a global,
// just like modern browsers.
// In older versions of node or environments that do not have these
-// globals, they must be polyfilled (by adding them to globa/globalThis)
+// globals, they must be polyfilled (by adding them to global/globalThis)
// before stringToBytes or bytesToString is called the first time.
let encoder: any;
@@ -693,7 +693,7 @@ export async function csBlind(
* Unblind operation to unblind the signature
* @param bseed seed to derive secrets
* @param rPub public R received from /csr
- * @param csPub denomination publick key
+ * @param csPub denomination public key
* @param b returned from exchange to select c
* @param csSig blinded signature
* @returns unblinded signature
@@ -721,7 +721,7 @@ export async function csUnblind(
* Verification algorithm for CS signatures
* @param hm message signed
* @param csSig unblinded signature
- * @param csPub denomination publick key
+ * @param csPub denomination public key
* @returns true if valid, false if invalid
*/
export async function csVerify(
@@ -844,8 +844,7 @@ export function hashDenomPub(pub: DenominationPubKey): Uint8Array {
return hash(uint8ArrayBuf);
} else {
throw Error(
- `unsupported cipher (${
- (pub as DenominationPubKey).cipher
+ `unsupported cipher (${(pub as DenominationPubKey).cipher
}), unable to hash`,
);
}
@@ -1023,7 +1022,7 @@ export enum WalletAccountMergeFlags {
export class SignaturePurposeBuilder {
private chunks: Uint8Array[] = [];
- constructor(private purposeNum: number) {}
+ constructor(private purposeNum: number) { }
put(bytes: Uint8Array): SignaturePurposeBuilder {
this.chunks.push(Uint8Array.from(bytes));
diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts
index 1a60b148c..2d0878afc 100644
--- a/packages/taler-wallet-core/src/wallet.ts
+++ b/packages/taler-wallet-core/src/wallet.ts
@@ -15,7 +15,7 @@
*/
/**
- * High-level wallet operations that should be indepentent from the underlying
+ * High-level wallet operations that should be independent from the underlying
* browser extension interface.
*/
@@ -923,9 +923,9 @@ async function dumpCoins(ws: InternalWalletState): Promise {
ageCommitmentProof: c.ageCommitmentProof,
spend_allocation: c.spendAllocation
? {
- amount: c.spendAllocation.amount,
- id: c.spendAllocation.id,
- }
+ amount: c.spendAllocation.amount,
+ id: c.spendAllocation.id,
+ }
: undefined,
});
}
From cc27750a79d8d4dbbedaa0dfcf21fe21a7464936 Mon Sep 17 00:00:00 2001
From: Florian Dold
Date: Mon, 11 Sep 2023 18:19:45 +0200
Subject: [PATCH 02/11] -WalletContractData doesn't belong to the DB
---
build-system/taler-build-scripts | 2 +-
packages/taler-util/src/wallet-types.ts | 48 +++++++++++++++++++
packages/taler-wallet-core/src/db.ts | 46 ------------------
.../src/operations/balance.ts | 6 +--
.../src/operations/pay-merchant.ts | 16 ++-----
.../src/operations/transactions.ts | 2 +-
.../src/util/coinSelection.ts | 18 ++-----
.../taler-wallet-core/src/wallet-api-types.ts | 24 +++++-----
.../ShowFullContractTermPopup.stories.tsx | 3 +-
.../components/ShowFullContractTermPopup.tsx | 12 +++--
10 files changed, 81 insertions(+), 96 deletions(-)
diff --git a/build-system/taler-build-scripts b/build-system/taler-build-scripts
index 001f5dd08..23538677f 160000
--- a/build-system/taler-build-scripts
+++ b/build-system/taler-build-scripts
@@ -1 +1 @@
-Subproject commit 001f5dd081fc8729ff8def90c4a1c3f93eb8689a
+Subproject commit 23538677f6c6be2a62f38dc6137ecdd1c76b7b15
diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts
index c6f19c73f..f7bd3d120 100644
--- a/packages/taler-util/src/wallet-types.ts
+++ b/packages/taler-util/src/wallet-types.ts
@@ -57,7 +57,9 @@ import {
DenomKeyType,
DenominationPubKey,
ExchangeAuditor,
+ InternationalizedString,
MerchantContractTerms,
+ MerchantInfo,
PeerContractTerms,
UnblindedSignature,
codecForMerchantContractTerms,
@@ -2667,3 +2669,49 @@ export const codecForTestingSetTimetravelRequest =
buildCodecForObject()
.property("offsetMs", codecForNumber())
.build("TestingSetTimetravelRequest");
+
+export interface AllowedAuditorInfo {
+ auditorBaseUrl: string;
+ auditorPub: string;
+}
+
+export interface AllowedExchangeInfo {
+ exchangeBaseUrl: string;
+ exchangePub: string;
+}
+
+/**
+ * Data extracted from the contract terms that is relevant for payment
+ * processing in the wallet.
+ */
+export interface WalletContractData {
+ /**
+ * Fulfillment URL, or the empty string if the order has no fulfillment URL.
+ *
+ * Stored as a non-nullable string as we use this field for IndexedDB indexing.
+ */
+ fulfillmentUrl: string;
+
+ contractTermsHash: string;
+ fulfillmentMessage?: string;
+ fulfillmentMessageI18n?: InternationalizedString;
+ merchantSig: string;
+ merchantPub: string;
+ merchant: MerchantInfo;
+ amount: AmountString;
+ orderId: string;
+ merchantBaseUrl: string;
+ summary: string;
+ summaryI18n: { [lang_tag: string]: string } | undefined;
+ autoRefund: TalerProtocolDuration | undefined;
+ maxWireFee: AmountString;
+ wireFeeAmortization: number;
+ payDeadline: TalerProtocolTimestamp;
+ refundDeadline: TalerProtocolTimestamp;
+ allowedExchanges: AllowedExchangeInfo[];
+ timestamp: TalerProtocolTimestamp;
+ wireMethod: string;
+ wireInfoHash: string;
+ maxDepositFee: AmountString;
+ minimumAge?: number;
+}
diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts
index 3a8109320..ba1f5b8c0 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -1035,52 +1035,6 @@ export enum RefundReason {
AbortRefund = "abort-pay-refund",
}
-export interface AllowedAuditorInfo {
- auditorBaseUrl: string;
- auditorPub: string;
-}
-
-export interface AllowedExchangeInfo {
- exchangeBaseUrl: string;
- exchangePub: string;
-}
-
-/**
- * Data extracted from the contract terms that is relevant for payment
- * processing in the wallet.
- */
-export interface WalletContractData {
- /**
- * Fulfillment URL, or the empty string if the order has no fulfillment URL.
- *
- * Stored as a non-nullable string as we use this field for IndexedDB indexing.
- */
- fulfillmentUrl: string;
-
- contractTermsHash: string;
- fulfillmentMessage?: string;
- fulfillmentMessageI18n?: InternationalizedString;
- merchantSig: string;
- merchantPub: string;
- merchant: MerchantInfo;
- amount: AmountString;
- orderId: string;
- merchantBaseUrl: string;
- summary: string;
- summaryI18n: { [lang_tag: string]: string } | undefined;
- autoRefund: TalerProtocolDuration | undefined;
- maxWireFee: AmountString;
- wireFeeAmortization: number;
- payDeadline: TalerProtocolTimestamp;
- refundDeadline: TalerProtocolTimestamp;
- allowedExchanges: AllowedExchangeInfo[];
- timestamp: TalerProtocolTimestamp;
- wireMethod: string;
- wireInfoHash: string;
- maxDepositFee: AmountString;
- minimumAge?: number;
-}
-
export enum PurchaseStatus {
/**
* Not downloaded yet.
diff --git a/packages/taler-wallet-core/src/operations/balance.ts b/packages/taler-wallet-core/src/operations/balance.ts
index a20ded2af..8034f78ea 100644
--- a/packages/taler-wallet-core/src/operations/balance.ts
+++ b/packages/taler-wallet-core/src/operations/balance.ts
@@ -50,6 +50,8 @@
* Imports.
*/
import {
+ AllowedAuditorInfo,
+ AllowedExchangeInfo,
AmountJson,
Amounts,
BalancesResponse,
@@ -60,17 +62,15 @@ import {
ScopeType,
} from "@gnu-taler/taler-util";
import {
- AllowedAuditorInfo,
- AllowedExchangeInfo,
RefreshGroupRecord,
WalletStoresV1,
WithdrawalGroupStatus,
} from "../db.js";
import { InternalWalletState } from "../internal-wallet-state.js";
+import { assertUnreachable } from "../util/assertUnreachable.js";
import { checkLogicInvariant } from "../util/invariants.js";
import { GetReadOnlyAccess } from "../util/query.js";
import { getExchangeDetails } from "./exchanges.js";
-import { assertUnreachable } from "../util/assertUnreachable.js";
/**
* Logger.
diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts
index 57367bb20..fe0cbeda0 100644
--- a/packages/taler-wallet-core/src/operations/pay-merchant.ts
+++ b/packages/taler-wallet-core/src/operations/pay-merchant.ts
@@ -63,7 +63,6 @@ import {
RefreshReason,
SharePaymentResult,
StartRefundQueryForUriResponse,
- stringifyPaytoUri,
stringifyPayUri,
stringifyTalerUri,
TalerError,
@@ -78,6 +77,7 @@ import {
TransactionState,
TransactionType,
URL,
+ WalletContractData,
} from "@gnu-taler/taler-util";
import {
getHttpResponseErrorDetails,
@@ -95,7 +95,6 @@ import {
PurchaseRecord,
PurchaseStatus,
RefundReason,
- WalletContractData,
WalletStoresV1,
} from "../db.js";
import {
@@ -115,15 +114,13 @@ import { checkDbInvariant } from "../util/invariants.js";
import { GetReadOnlyAccess } from "../util/query.js";
import {
constructTaskIdentifier,
- TaskRunResult,
- TaskRunResultType,
RetryInfo,
- TaskIdentifiers,
-} from "./common.js";
-import {
runLongpollAsync,
runTaskWithErrorReporting,
spendCoins,
+ TaskIdentifiers,
+ TaskRunResult,
+ TaskRunResultType,
} from "./common.js";
import {
calculateRefreshOutput,
@@ -173,10 +170,7 @@ export async function getTotalPaymentCost(
const allDenoms = await tx.denominations.indexes.byExchangeBaseUrl
.iter(coin.exchangeBaseUrl)
.filter((x) =>
- Amounts.isSameCurrency(
- x.value,
- pcs.coinContributions[i],
- ),
+ Amounts.isSameCurrency(x.value, pcs.coinContributions[i]),
);
const amountLeft = Amounts.sub(
denom.value,
diff --git a/packages/taler-wallet-core/src/operations/transactions.ts b/packages/taler-wallet-core/src/operations/transactions.ts
index 7bdb9af5b..31655ad71 100644
--- a/packages/taler-wallet-core/src/operations/transactions.ts
+++ b/packages/taler-wallet-core/src/operations/transactions.ts
@@ -41,6 +41,7 @@ import {
TransactionsResponse,
TransactionState,
TransactionType,
+ WalletContractData,
WithdrawalType,
} from "@gnu-taler/taler-util";
import {
@@ -60,7 +61,6 @@ import {
RefreshOperationStatus,
RefundGroupRecord,
RewardRecord,
- WalletContractData,
WithdrawalGroupRecord,
WithdrawalGroupStatus,
WithdrawalRecordType,
diff --git a/packages/taler-wallet-core/src/util/coinSelection.ts b/packages/taler-wallet-core/src/util/coinSelection.ts
index ef2f85789..6fd0f1b86 100644
--- a/packages/taler-wallet-core/src/util/coinSelection.ts
+++ b/packages/taler-wallet-core/src/util/coinSelection.ts
@@ -28,21 +28,20 @@ import {
AbsoluteTime,
AgeCommitmentProof,
AgeRestriction,
+ AllowedAuditorInfo,
+ AllowedExchangeInfo,
AmountJson,
AmountLike,
- AmountResponse,
Amounts,
AmountString,
CoinPublicKeyString,
CoinStatus,
- ConvertAmountRequest,
DenominationInfo,
DenominationPubKey,
DenomSelectionState,
Duration,
ForcedCoinSel,
ForcedDenomSel,
- GetAmountRequest,
j2s,
Logger,
parsePaytoUri,
@@ -50,24 +49,13 @@ import {
PayMerchantInsufficientBalanceDetails,
PayPeerInsufficientBalanceDetails,
strcmp,
- TransactionAmountMode,
- TransactionType,
UnblindedSignature,
} from "@gnu-taler/taler-util";
+import { DenominationRecord } from "../db.js";
import {
- AllowedAuditorInfo,
- AllowedExchangeInfo,
- DenominationRecord,
-} from "../db.js";
-import {
- DbReadOnlyTransaction,
getExchangeDetails,
- GetReadOnlyAccess,
- GetReadWriteAccess,
isWithdrawableDenom,
- StoreNames,
WalletDbReadOnlyTransaction,
- WalletStoresV1,
} from "../index.js";
import { InternalWalletState } from "../internal-wallet-state.js";
import {
diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts
index d89ad257a..67c05a42f 100644
--- a/packages/taler-wallet-core/src/wallet-api-types.ts
+++ b/packages/taler-wallet-core/src/wallet-api-types.ts
@@ -38,7 +38,6 @@ import {
ApplyDevExperimentRequest,
BackupRecovery,
BalancesResponse,
- FailTransactionRequest,
CheckPeerPullCreditRequest,
CheckPeerPullCreditResponse,
CheckPeerPushDebitRequest,
@@ -51,14 +50,19 @@ import {
ConvertAmountRequest,
CreateDepositGroupRequest,
CreateDepositGroupResponse,
+ CreateStoredBackupResponse,
+ DeleteStoredBackupRequest,
DeleteTransactionRequest,
ExchangeDetailedResponse,
ExchangesListResponse,
+ FailTransactionRequest,
ForceRefreshRequest,
ForgetKnownBankAccountsRequest,
GetAmountRequest,
GetBalanceDetailRequest,
GetContractTermsDetailsRequest,
+ GetCurrencyInfoRequest,
+ GetCurrencyInfoResponse,
GetExchangeTosRequest,
GetExchangeTosResult,
GetPlanForOperationRequest,
@@ -85,16 +89,21 @@ import {
PreparePeerPushCreditRequest,
PreparePeerPushCreditResponse,
PrepareRefundRequest,
- PrepareRewardRequest as PrepareRewardRequest,
+ PrepareRewardRequest,
PrepareTipResult as PrepareRewardResult,
+ RecoverStoredBackupRequest,
RecoveryLoadRequest,
RetryTransactionRequest,
SetCoinSuspendedRequest,
SetWalletDeviceIdRequest,
+ SharePaymentRequest,
+ SharePaymentResult,
StartRefundQueryForUriResponse,
StartRefundQueryRequest,
+ StoredBackupList,
TestPayArgs,
TestPayResult,
+ TestingSetTimetravelRequest,
Transaction,
TransactionByIdRequest,
TransactionsRequest,
@@ -106,22 +115,13 @@ import {
UserAttentionsResponse,
ValidateIbanRequest,
ValidateIbanResponse,
+ WalletContractData,
WalletCoreVersion,
WalletCurrencyInfo,
WithdrawFakebankRequest,
WithdrawTestBalanceRequest,
WithdrawUriInfoResponse,
- SharePaymentRequest,
- SharePaymentResult,
- GetCurrencyInfoRequest,
- GetCurrencyInfoResponse,
- StoredBackupList,
- CreateStoredBackupResponse,
- RecoverStoredBackupRequest,
- DeleteStoredBackupRequest,
- TestingSetTimetravelRequest,
} from "@gnu-taler/taler-util";
-import { WalletContractData } from "./db.js";
import {
AddBackupProviderRequest,
AddBackupProviderResponse,
diff --git a/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.stories.tsx b/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.stories.tsx
index 74c92cbc6..1b1802b8c 100644
--- a/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.stories.tsx
+++ b/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.stories.tsx
@@ -18,8 +18,6 @@
*
* @author Sebastian Javier Marchano (sebasjm)
*/
-
-import { WalletContractData } from "@gnu-taler/taler-wallet-core";
import * as tests from "@gnu-taler/web-util/testing";
import {
ErrorView,
@@ -27,6 +25,7 @@ import {
LoadingView,
ShowView,
} from "./ShowFullContractTermPopup.js";
+import { WalletContractData } from "@gnu-taler/taler-util";
export default {
title: "ShowFullContractTermPopup",
diff --git a/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx b/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx
index db9b6ebcd..0b3cca0b2 100644
--- a/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx
+++ b/packages/taler-wallet-webextension/src/components/ShowFullContractTermPopup.tsx
@@ -13,11 +13,13 @@
You should have received a copy of the GNU General Public License along with
GNU Taler; see the file COPYING. If not, see
*/
-import { AbsoluteTime, Duration, Location } from "@gnu-taler/taler-util";
import {
- WalletApiOperation,
+ AbsoluteTime,
+ Duration,
+ Location,
WalletContractData,
-} from "@gnu-taler/taler-wallet-core";
+} from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
import { styled } from "@linaria/react";
import { Fragment, h, VNode } from "preact";
import { useState } from "preact/hooks";
@@ -334,8 +336,8 @@ export function ShowView({ contractTerms, hideHandler }: States.Show): VNode {
!contractTerms.autoRefund
? Duration.getZero()
: Duration.fromTalerProtocolDuration(
- contractTerms.autoRefund,
- ),
+ contractTerms.autoRefund,
+ ),
)}
format="dd MMMM yyyy, HH:mm"
/>
From d118ffb88b393f0ab2c2d534486d5651186fcd92 Mon Sep 17 00:00:00 2001
From: Devan Carpenter
Date: Mon, 11 Sep 2023 11:09:48 -0400
Subject: [PATCH 03/11] ci: add script for running CI locally
---
ci/ci.sh | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
create mode 100755 ci/ci.sh
diff --git a/ci/ci.sh b/ci/ci.sh
new file mode 100755
index 000000000..fc523d8f5
--- /dev/null
+++ b/ci/ci.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+set -evuo pipefail
+
+# Use podman if available, otherwise use docker.
+# Fails if neither is found in PATH
+OCI_RUNTIME=$(which podman || which docker)
+REPO_NAME=$(basename "${PWD}")
+JOB_NAME="${1}"
+JOB_CONTAINER=$((grep CONTAINER_NAME ci/jobs/${JOB_NAME}/config.ini | cut -d' ' -f 3) || echo "${REPO_NAME}")
+
+echo "${JOB_CONTAINER}"
+
+if [ "${JOB_CONTAINER}" = "${REPO_NAME}" ] ; then
+ "${OCI_RUNTIME}" build \
+ -t "${JOB_CONTAINER}" \
+ -f ci/Containerfile .
+fi
+
+"${OCI_RUNTIME}" run \
+ --rm \
+ -ti \
+ --volume "${PWD}":/workdir \
+ --workdir /workdir \
+ "${JOB_CONTAINER}" \
+ ci/jobs/"${JOB_NAME}"/job.sh
+
+top_dir=$(dirname "${BASH_SOURCE[0]}")
+
+#"${top_dir}"/build.sh
From f444a497589ddf8815b04008210c69fdea0d4803 Mon Sep 17 00:00:00 2001
From: Devan Carpenter
Date: Mon, 11 Sep 2023 11:17:33 -0400
Subject: [PATCH 04/11] ci: add more generated dirs to codespell skip
---
ci/jobs/0-codespell/job.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ci/jobs/0-codespell/job.sh b/ci/jobs/0-codespell/job.sh
index cb41388c3..d27d0888b 100755
--- a/ci/jobs/0-codespell/job.sh
+++ b/ci/jobs/0-codespell/job.sh
@@ -3,4 +3,4 @@ set -exuo pipefail
job_dir=$(dirname "${BASH_SOURCE[0]}")
-codespell -I "${job_dir}"/dictionary.txt -S "*.bib,*.bst,*.cls,*.json,*.png,*.svg,*.wav,*.gz,*/templating/test?/**,**/auditor/*.sql,**/templating/mustach**,*.fees,*key,*.tag,*.info,*.latexmkrc,*.ecc,*.jpg,*.zkey,*.sqlite,*/contrib/hellos/**,*/vpn/tests/**,*.priv,*.file,*.tgz,*.woff,*.gif,*.odt,*.fee,*.deflate,*.dat,*.jpeg,*.eps,*.odg,*/m4/ax_lib_postgresql.m4,*/m4/libgcrypt.m4,*.rpath,config.status,ABOUT-NLS,*/doc/texinfo.tex,*.PNG,*.??.json,*.docx,*.ods,*.doc,*.docx,*.xcf,*.xlsx,*.ecc,*.ttf,*.woff2,*.eot,*.ttf,*.eot,*.mp4,*.pptx,*.epgz,*.min.js,**/*.map,**/fonts/**,*.pack.js,*.po,*.bbl,*/afl-tests/*,*/.git/**,*.pdf,*.epub,**/signing-key.asc,**/pnpm-lock.yaml,**/*.svg,**/*.cls,**/rfc.bib,**/*.bst,*/cbdc-es.tex,*/cbdc-it.tex,**/ExchangeSelection/example.ts,*/testcurl/test_tricky.c,*/i18n/strings.ts,*/src/anastasis-data.ts,**/doc/flows/main.de.tex,*/vendor/**"
+codespell -I "${job_dir}"/dictionary.txt -S "*.bib,*.bst,*.cls,*.json,*.png,*.svg,*.wav,*.gz,*/templating/test?/**,**/auditor/*.sql,**/templating/mustach**,*.fees,*key,*.tag,*.info,*.latexmkrc,*.ecc,*.jpg,*.zkey,*.sqlite,*/contrib/hellos/**,*/vpn/tests/**,*.priv,*.file,*.tgz,*.woff,*.gif,*.odt,*.fee,*.deflate,*.dat,*.jpeg,*.eps,*.odg,*/m4/ax_lib_postgresql.m4,*/m4/libgcrypt.m4,*.rpath,config.status,ABOUT-NLS,*/doc/texinfo.tex,*.PNG,*.??.json,*.docx,*.ods,*.doc,*.docx,*.xcf,*.xlsx,*.ecc,*.ttf,*.woff2,*.eot,*.ttf,*.eot,*.mp4,*.pptx,*.epgz,*.min.js,**/*.map,**/fonts/**,*.pack.js,*.po,*.bbl,*/afl-tests/*,*/.git/**,*.pdf,*.epub,**/signing-key.asc,**/pnpm-lock.yaml,**/*.svg,**/*.cls,**/rfc.bib,**/*.bst,*/cbdc-es.tex,*/cbdc-it.tex,**/ExchangeSelection/example.ts,*/testcurl/test_tricky.c,*/i18n/strings.ts,*/src/anastasis-data.ts,**/doc/flows/main.de.tex,*/vendor/**,*/node_modules/**,*.pnpm-store/**"
From 7e55b25c37c78614eb5012c6aade8b054aa59dcb Mon Sep 17 00:00:00 2001
From: Florian Dold
Date: Mon, 11 Sep 2023 19:35:50 +0200
Subject: [PATCH 05/11] build system: missing compile step
---
build-system/taler-build-scripts | 2 +-
packages/demobank-ui/Makefile | 1 +
packages/taler-wallet-cli/Makefile | 1 +
3 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/build-system/taler-build-scripts b/build-system/taler-build-scripts
index 23538677f..001f5dd08 160000
--- a/build-system/taler-build-scripts
+++ b/build-system/taler-build-scripts
@@ -1 +1 @@
-Subproject commit 23538677f6c6be2a62f38dc6137ecdd1c76b7b15
+Subproject commit 001f5dd081fc8729ff8def90c4a1c3f93eb8689a
diff --git a/packages/demobank-ui/Makefile b/packages/demobank-ui/Makefile
index fc570b270..7abb3d101 100644
--- a/packages/demobank-ui/Makefile
+++ b/packages/demobank-ui/Makefile
@@ -20,6 +20,7 @@ spa_dir=$(prefix)/share/taler/demobank-ui
.PHONY: deps
deps:
pnpm install --frozen-lockfile --filter @gnu-taler/demobank-ui...
+ pnpm run compile --frozen-lockfile --filter @gnu-taler/demobank-ui...
pnpm run check
pnpm run build
diff --git a/packages/taler-wallet-cli/Makefile b/packages/taler-wallet-cli/Makefile
index 388401eae..9bd8767dc 100644
--- a/packages/taler-wallet-cli/Makefile
+++ b/packages/taler-wallet-cli/Makefile
@@ -39,6 +39,7 @@ install-nodeps:
ln -sf $(install_target)/node_modules/taler-wallet-cli/bin/taler-wallet-cli.mjs $(prefix)/bin/taler-wallet-cli
deps:
pnpm install --frozen-lockfile --filter @gnu-taler/taler-wallet-cli...
+ pnpm compile --frozen-lockfile --filter @gnu-taler/taler-wallet-cli...
install:
$(MAKE) deps
$(MAKE) install-nodeps
From e2422b68ebb2a29fb2e4d86f8a8cf9ec2a33e099 Mon Sep 17 00:00:00 2001
From: Florian Dold
Date: Mon, 11 Sep 2023 19:56:32 +0200
Subject: [PATCH 06/11] -fix pnpm invocation
---
packages/demobank-ui/Makefile | 2 +-
packages/taler-wallet-cli/Makefile | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/packages/demobank-ui/Makefile b/packages/demobank-ui/Makefile
index 7abb3d101..8e41cc7c6 100644
--- a/packages/demobank-ui/Makefile
+++ b/packages/demobank-ui/Makefile
@@ -20,7 +20,7 @@ spa_dir=$(prefix)/share/taler/demobank-ui
.PHONY: deps
deps:
pnpm install --frozen-lockfile --filter @gnu-taler/demobank-ui...
- pnpm run compile --frozen-lockfile --filter @gnu-taler/demobank-ui...
+ pnpm run --filter @gnu-taler/demobank-ui... compile
pnpm run check
pnpm run build
diff --git a/packages/taler-wallet-cli/Makefile b/packages/taler-wallet-cli/Makefile
index 9bd8767dc..6d695e9c1 100644
--- a/packages/taler-wallet-cli/Makefile
+++ b/packages/taler-wallet-cli/Makefile
@@ -39,7 +39,7 @@ install-nodeps:
ln -sf $(install_target)/node_modules/taler-wallet-cli/bin/taler-wallet-cli.mjs $(prefix)/bin/taler-wallet-cli
deps:
pnpm install --frozen-lockfile --filter @gnu-taler/taler-wallet-cli...
- pnpm compile --frozen-lockfile --filter @gnu-taler/taler-wallet-cli...
+ pnpm run --filter @gnu-taler/taler-wallet-cli... compile
install:
$(MAKE) deps
$(MAKE) install-nodeps
From 8c20f4b27946679267bb44255721a9f14ae1077a Mon Sep 17 00:00:00 2001
From: Sebastian
Date: Mon, 11 Sep 2023 15:07:55 -0300
Subject: [PATCH 07/11] new login token
---
.../src/Application.tsx | 32 +-
.../src/ApplicationReadyRoutes.tsx | 42 ++-
.../src/InstanceRoutes.tsx | 35 +-
.../src/components/exception/login.tsx | 244 --------------
.../instance/DefaultInstanceFormFields.tsx | 4 +-
.../src/components/menu/SideBar.tsx | 5 +-
.../src/components/product/ProductForm.tsx | 4 +-
.../src/context/backend.test.ts | 6 +-
.../src/context/backend.ts | 66 +---
.../src/context/instance.ts | 5 +-
.../src/declaration.d.ts | 39 +++
.../src/hooks/backend.ts | 139 ++++++--
.../merchant-backoffice-ui/src/hooks/index.ts | 84 ++---
.../src/hooks/instance.test.ts | 4 +-
.../src/hooks/instance.ts | 38 ++-
.../src/hooks/testing.tsx | 5 +-
.../src/hooks/useSettings.ts | 9 -
.../instance/orders/details/DetailPage.tsx | 8 +-
.../instance/reserves/details/RewardInfo.tsx | 6 +-
.../instance/templates/create/CreatePage.tsx | 12 +-
.../paths/instance/templates/qr/QrPage.tsx | 15 +-
.../instance/templates/update/UpdatePage.tsx | 16 +-
.../src/paths/instance/token/DetailPage.tsx | 6 +-
.../src/paths/instance/token/index.tsx | 8 +-
.../src/paths/instance/update/index.tsx | 18 +-
.../validators/create/CreatedSuccessfully.tsx | 6 +-
.../src/paths/login/index.tsx | 299 +++++++++++++++++-
.../src/paths/settings/index.tsx | 18 +-
packages/web-util/src/utils/request.ts | 75 ++++-
29 files changed, 697 insertions(+), 551 deletions(-)
delete mode 100644 packages/merchant-backoffice-ui/src/components/exception/login.tsx
diff --git a/packages/merchant-backoffice-ui/src/Application.tsx b/packages/merchant-backoffice-ui/src/Application.tsx
index 5e82821ae..1a7617643 100644
--- a/packages/merchant-backoffice-ui/src/Application.tsx
+++ b/packages/merchant-backoffice-ui/src/Application.tsx
@@ -41,7 +41,8 @@ import {
import { ConfigContextProvider } from "./context/config.js";
import { useBackendConfig } from "./hooks/backend.js";
import { strings } from "./i18n/strings.js";
-import LoginPage from "./paths/login/index.js";
+import { ConnectionPage, LoginPage } from "./paths/login/index.js";
+import { LoginToken } from "./declaration.js";
export function Application(): VNode {
return (
@@ -59,25 +60,20 @@ export function Application(): VNode {
* @returns
*/
function ApplicationStatusRoutes(): VNode {
- const { url, updateLoginStatus, triedToLog } = useBackendContext();
+ const { url: backendURL, updateToken, changeBackend } = useBackendContext();
const result = useBackendConfig();
const { i18n } = useTranslationContext();
- const updateLoginInfoAndGoToRoot = (url: string, token?: string) => {
- updateLoginStatus(url, token);
- route("/");
- };
-
const { currency, version } = result.ok
? result.data
: { currency: "unknown", version: "unknown" };
const ctx = useMemo(() => ({ currency, version }), [currency, version]);
- if (!triedToLog) {
+ if (!backendURL) {
return (
-
+
);
}
@@ -91,7 +87,7 @@ function ApplicationStatusRoutes(): VNode {
return (
-
+
);
}
@@ -109,7 +105,7 @@ function ApplicationStatusRoutes(): VNode {
description: `Check your url`,
}}
/>
-
+
);
}
@@ -120,10 +116,10 @@ function ApplicationStatusRoutes(): VNode {
notification={{
message: i18n.str`Server response with an error code`,
type: "ERROR",
- description: i18n.str`Got message ${result.message} from ${result.info?.url}`,
+ description: i18n.str`Got message "${result.message}" from ${result.info?.url}`,
}}
/>
-
+
;
}
if (result.type === ErrorType.UNREADABLE) {
@@ -133,10 +129,10 @@ function ApplicationStatusRoutes(): VNode {
notification={{
message: i18n.str`Response from server is unreadable, http status: ${result.status}`,
type: "ERROR",
- description: i18n.str`Got message ${result.message} from ${result.info?.url}`,
+ description: i18n.str`Got message "${result.message}" from ${result.info?.url}`,
}}
/>
-
+
;
}
return (
@@ -146,10 +142,10 @@ function ApplicationStatusRoutes(): VNode {
notification={{
message: i18n.str`Unexpected Error`,
type: "ERROR",
- description: i18n.str`Got message ${result.message} from ${result.info?.url}`,
+ description: i18n.str`Got message "${result.message}" from ${result.info?.url}`,
}}
/>
-
+
);
}
@@ -168,7 +164,7 @@ function ApplicationStatusRoutes(): VNode {
description: i18n.str`Merchant backend server version ${result.data.version} is not compatible with the supported version ${SUPPORTED_VERSION}`,
}}
/>
-
+
}
diff --git a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
index 46dea98e3..8bfbdb076 100644
--- a/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/ApplicationReadyRoutes.tsx
@@ -18,22 +18,23 @@
*
* @author Sebastian Javier Marchano (sebasjm)
*/
+import { HttpStatusCode } from "@gnu-taler/taler-util";
import { ErrorType, useTranslationContext } from "@gnu-taler/web-util/browser";
import { createHashHistory } from "history";
-import { Fragment, h, VNode } from "preact";
-import { Router, Route, route } from "preact-router";
-import { useEffect, useState } from "preact/hooks";
+import { Fragment, VNode, h } from "preact";
+import { Route, Router, route } from "preact-router";
+import { useState } from "preact/hooks";
+import { InstanceRoutes } from "./InstanceRoutes.js";
import {
- NotificationCard,
NotYetReadyAppMenu,
+ NotificationCard,
} from "./components/menu/index.js";
import { useBackendContext } from "./context/backend.js";
+import { LoginToken } from "./declaration.js";
import { useBackendInstancesTestForAdmin } from "./hooks/backend.js";
-import { InstanceRoutes } from "./InstanceRoutes.js";
-import LoginPage from "./paths/login/index.js";
-import { INSTANCE_ID_LOOKUP } from "./utils/constants.js";
-import { HttpStatusCode } from "@gnu-taler/taler-util";
+import { ConnectionPage, LoginPage } from "./paths/login/index.js";
import { Settings } from "./paths/settings/index.js";
+import { INSTANCE_ID_LOOKUP } from "./utils/constants.js";
/**
* Check if admin against /management/instances
@@ -41,15 +42,14 @@ import { Settings } from "./paths/settings/index.js";
*/
export function ApplicationReadyRoutes(): VNode {
const { i18n } = useTranslationContext();
+ const { url: backendURL, changeBackend } = useBackendContext()
const [unauthorized, setUnauthorized] = useState(false)
const {
- url: backendURL,
- updateLoginStatus: updateLoginStatus2,
+ updateToken,
} = useBackendContext();
- function updateLoginStatus(url: string, token: string | undefined) {
- console.log("updateing", url, token)
- updateLoginStatus2(url, token)
+ function updateLoginStatus(token: LoginToken | undefined) {
+ updateToken(token)
setUnauthorized(false)
}
@@ -59,15 +59,15 @@ export function ApplicationReadyRoutes(): VNode {
route("/");
};
const [showSettings, setShowSettings] = useState(false)
- // useEffect(() => {
- // setUnauthorized(FF)
- // }, [FF])
- const unauthorizedAdmin = !result.loading && !result.ok && result.type === ErrorType.CLIENT && result.status === HttpStatusCode.Unauthorized
+ const unauthorizedAdmin = !result.loading
+ && !result.ok
+ && result.type === ErrorType.CLIENT
+ && result.status === HttpStatusCode.Unauthorized;
if (showSettings) {
return setShowSettings(true)} title="UI Settings" onLogout={clearTokenAndGoToRoot} isPasswordOk={false} />
-
+ setShowSettings(false)} />
}
@@ -100,7 +100,7 @@ export function ApplicationReadyRoutes(): VNode {
type: "ERROR",
}}
/>
-
+
);
}
@@ -108,14 +108,13 @@ export function ApplicationReadyRoutes(): VNode {
instanceNameByBackendURL = match[1];
}
- console.log(unauthorized, unauthorizedAdmin)
if (unauthorized || unauthorizedAdmin) {
return setShowSettings(true)} title="Login" onLogout={clearTokenAndGoToRoot} isPasswordOk={false} />
@@ -132,7 +131,6 @@ export function ApplicationReadyRoutes(): VNode {
admin={admin}
onUnauthorized={() => setUnauthorized(true)}
onLoginPass={() => {
- console.log("ahora si")
setUnauthorized(false)
}}
instanceNameByBackendURL={instanceNameByBackendURL}
diff --git a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
index ee8db9a9f..c2a9d3b18 100644
--- a/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
+++ b/packages/merchant-backoffice-ui/src/InstanceRoutes.tsx
@@ -35,7 +35,7 @@ import { InstanceContextProvider } from "./context/instance.js";
import {
useBackendDefaultToken,
useBackendInstanceToken,
- useLocalStorage,
+ useSimpleLocalStorage,
} from "./hooks/index.js";
import { useInstanceKYCDetails } from "./hooks/instance.js";
import InstanceCreatePage from "./paths/admin/create/index.js";
@@ -71,10 +71,10 @@ import InstanceUpdatePage, {
AdminUpdate as InstanceAdminUpdatePage,
Props as InstanceUpdatePageProps,
} from "./paths/instance/update/index.js";
-import LoginPage from "./paths/login/index.js";
+import { LoginPage } from "./paths/login/index.js";
import NotFoundPage from "./paths/notfound/index.js";
import { Notification } from "./utils/types.js";
-import { MerchantBackend } from "./declaration.js";
+import { LoginToken, MerchantBackend } from "./declaration.js";
import { Settings } from "./paths/settings/index.js";
import { dateFormatForSettings, useSettings } from "./hooks/useSettings.js";
@@ -143,7 +143,7 @@ export function InstanceRoutes({
id,
admin,
path,
- onUnauthorized,
+ // onUnauthorized,
onLoginPass,
setInstanceName,
}: Props): VNode {
@@ -155,7 +155,7 @@ export function InstanceRoutes({
const [globalNotification, setGlobalNotification] =
useState(undefined);
- const changeToken = (token?: string) => {
+ const changeToken = (token?: LoginToken) => {
if (admin) {
updateToken(token);
} else {
@@ -201,14 +201,17 @@ export function InstanceRoutes({
// const LoginPageAccessDeniend = onUnauthorized
const LoginPageAccessDenied = () => {
- onUnauthorized()
- return
+ return
+
+
+
+
}
function IfAdminCreateDefaultOr(Next: FunctionComponent) {
@@ -687,9 +690,7 @@ function AdminInstanceUpdatePage({
...rest
}: { id: string } & InstanceUpdatePageProps): VNode {
const [token, changeToken] = useBackendInstanceToken(id);
- const { updateLoginStatus: changeBackend } = useBackendContext();
- const updateLoginStatus = (url: string, token?: string): void => {
- changeBackend(url);
+ const updateLoginStatus = (token?: LoginToken): void => {
changeToken(token);
};
const value = useMemo(
@@ -752,7 +753,7 @@ function KycBanner(): VNode {
const { i18n } = useTranslationContext();
const [settings] = useSettings();
const today = format(new Date(), dateFormatForSettings(settings));
- const [lastHide, setLastHide] = useLocalStorage("kyc-last-hide");
+ const [lastHide, setLastHide] = useSimpleLocalStorage("kyc-last-hide");
const hasBeenHidden = today === lastHide;
const needsToBeShown = kycStatus.ok && kycStatus.data.type === "redirect";
if (hasBeenHidden || !needsToBeShown) return ;
diff --git a/packages/merchant-backoffice-ui/src/components/exception/login.tsx b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
deleted file mode 100644
index 4fa440fc7..000000000
--- a/packages/merchant-backoffice-ui/src/components/exception/login.tsx
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- This file is part of GNU Taler
- (C) 2021-2023 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
- */
-
-/**
- *
- * @author Sebastian Javier Marchano (sebasjm)
- */
-
-import { useTranslationContext } from "@gnu-taler/web-util/browser";
-import { ComponentChildren, h, VNode } from "preact";
-import { useState } from "preact/hooks";
-import { useBackendContext } from "../../context/backend.js";
-import { useInstanceContext } from "../../context/instance.js";
-import { useCredentialsChecker } from "../../hooks/backend.js";
-import { Notification } from "../../utils/types.js";
-
-interface Props {
- withMessage?: Notification;
- onConfirm: (backend: string, token?: string) => void;
-}
-
-function getTokenValuePart(t: string): string {
- if (!t) return t;
- const match = /secret-token:(.*)/.exec(t);
- if (!match || !match[1]) return "";
- return match[1];
-}
-
-function normalizeToken(r: string): string {
- return `secret-token:${r}`;
-}
-
-function cleanUp(s: string): string {
- let result = s;
- if (result.indexOf("webui/") !== -1) {
- result = result.substring(0, result.indexOf("webui/"));
- }
- return result;
-}
-
-export function LoginModal({ onConfirm, withMessage }: Props): VNode {
- const { url: backendUrl, token: baseToken } = useBackendContext();
- const { admin, token: instanceToken, id } = useInstanceContext();
- const testLogin = useCredentialsChecker();
- const currentToken = getTokenValuePart(
- (!admin ? baseToken : instanceToken) ?? "",
- );
- const [token, setToken] = useState(currentToken);
-
- const [url, setURL] = useState(cleanUp(backendUrl));
- const { i18n } = useTranslationContext();
-
- if (admin && id !== "default") {
- //admin trying to access another instance
- return (