gnunet-svn
[Top][All Lists]
Advanced

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

[taler-wallet-core] branch master updated: consider supported wire types


From: gnunet
Subject: [taler-wallet-core] branch master updated: consider supported wire types when selecting coins
Date: Mon, 05 Sep 2022 15:39:13 +0200

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

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

The following commit(s) were added to refs/heads/master by this push:
     new 43b893b8 consider supported wire types when selecting coins
43b893b8 is described below

commit 43b893b8c4538f66b7f0161a85277e4db82bb192
Author: Florian Dold <florian@dold.me>
AuthorDate: Mon Sep 5 15:38:47 2022 +0200

    consider supported wire types when selecting coins
    
    Also add an integration test to check for the correct wallet behavior.
---
 .../src/integrationtests/test-wallet-balance.ts    | 150 +++++++++++++++++++++
 .../src/integrationtests/testrunner.ts             |   2 +
 packages/taler-wallet-core/src/db.ts               |   4 +
 packages/taler-wallet-core/src/operations/pay.ts   |  17 ++-
 4 files changed, 172 insertions(+), 1 deletion(-)

diff --git 
a/packages/taler-wallet-cli/src/integrationtests/test-wallet-balance.ts 
b/packages/taler-wallet-cli/src/integrationtests/test-wallet-balance.ts
new file mode 100644
index 00000000..025762e3
--- /dev/null
+++ b/packages/taler-wallet-cli/src/integrationtests/test-wallet-balance.ts
@@ -0,0 +1,150 @@
+/*
+ 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/>
+ */
+
+/**
+ * Imports.
+ */
+import { Duration, PreparePayResultType } from "@gnu-taler/taler-util";
+import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";
+import { CoinConfig, defaultCoinConfig } from "../harness/denomStructures.js";
+import {
+  BankService,
+  ExchangeService,
+  FakebankService,
+  getPayto,
+  getRandomIban,
+  GlobalTestState,
+  MerchantPrivateApi,
+  MerchantService,
+  setupDb,
+  WalletCli,
+} from "../harness/harness.js";
+import {
+  createSimpleTestkudosEnvironment,
+  withdrawViaBank,
+  makeTestPayment,
+} from "../harness/helpers.js";
+
+/**
+ * Test for wallet balance error messages / different types of insufficient 
balance.
+ *
+ * Related bugs:
+ * https://bugs.taler.net/n/7299
+ */
+export async function runWalletBalanceTest(t: GlobalTestState) {
+  // Set up test environment
+
+  const db = await setupDb(t);
+
+  const bank = await FakebankService.create(t, {
+    allowRegistrations: true,
+    currency: "TESTKUDOS",
+    database: db.connStr,
+    httpPort: 8082,
+  });
+
+  const exchange = ExchangeService.create(t, {
+    name: "testexchange-1",
+    currency: "TESTKUDOS",
+    httpPort: 8081,
+    database: db.connStr,
+  });
+
+  const merchant = await MerchantService.create(t, {
+    name: "testmerchant-1",
+    currency: "TESTKUDOS",
+    httpPort: 8083,
+    database: db.connStr,
+  });
+
+  const exchangeBankAccount = await bank.createExchangeAccount(
+    "myexchange",
+    "x",
+  );
+  exchange.addBankAccount("1", exchangeBankAccount);
+
+  bank.setSuggestedExchange(exchange, exchangeBankAccount.accountPaytoUri);
+
+  await bank.start();
+
+  await bank.pingUntilAvailable();
+
+  const coinConfig: CoinConfig[] = defaultCoinConfig.map((x) => 
x("TESTKUDOS"));
+  exchange.addCoinConfigList(coinConfig);
+
+  await exchange.start();
+  await exchange.pingUntilAvailable();
+
+  merchant.addExchange(exchange);
+
+  await merchant.start();
+  await merchant.pingUntilAvailable();
+
+  // Fakebank uses x-taler-bank, but merchant is configured to only accept 
sepa!
+  const label = "mymerchant";
+  await merchant.addInstance({
+    id: "default",
+    name: "Default Instance",
+    paytoUris: [
+      `payto://iban/SANDBOXX/${getRandomIban(label)}?receiver-name=${label}`,
+    ],
+    defaultWireTransferDelay: Duration.toTalerProtocolDuration(
+      Duration.fromSpec({ minutes: 1 }),
+    ),
+  });
+
+  console.log("setup done!");
+
+  const wallet = new WalletCli(t);
+
+  // Withdraw digital cash into the wallet.
+
+  await withdrawViaBank(t, { wallet, bank, exchange, amount: "TESTKUDOS:20" });
+
+  const order = {
+    summary: "Buy me!",
+    amount: "TESTKUDOS:5",
+    fulfillment_url: "taler://fulfillment-success/thx",
+  };
+
+  const orderResp = await MerchantPrivateApi.createOrder(merchant, "default", {
+    order,
+  });
+
+  let orderStatus = await MerchantPrivateApi.queryPrivateOrderStatus(merchant, 
{
+    orderId: orderResp.order_id,
+  });
+
+  t.assertTrue(orderStatus.order_status === "unpaid");
+
+  // Make wallet pay for the order
+
+  const preparePayResult = await wallet.client.call(
+    WalletApiOperation.PreparePayForUri,
+    {
+      talerPayUri: orderStatus.taler_pay_uri,
+    },
+  );
+
+  t.assertDeepEqual(
+    preparePayResult.status,
+    PreparePayResultType.InsufficientBalance,
+  );
+
+  await wallet.runUntilDone();
+}
+
+runWalletBalanceTest.suites = ["wallet"];
diff --git a/packages/taler-wallet-cli/src/integrationtests/testrunner.ts 
b/packages/taler-wallet-cli/src/integrationtests/testrunner.ts
index de6e246d..3c1ccfe0 100644
--- a/packages/taler-wallet-cli/src/integrationtests/testrunner.ts
+++ b/packages/taler-wallet-cli/src/integrationtests/testrunner.ts
@@ -91,6 +91,7 @@ import { runWithdrawalBankIntegratedTest } from 
"./test-withdrawal-bank-integrat
 import { runWithdrawalFakebankTest } from "./test-withdrawal-fakebank.js";
 import { runTestWithdrawalManualTest } from "./test-withdrawal-manual.js";
 import { runAgeRestrictionsPeerTest } from "./test-age-restrictions-peer.js";
+import { runWalletBalanceTest } from "./test-wallet-balance.js";
 
 /**
  * Test runner.
@@ -169,6 +170,7 @@ const allTests: TestMainFunction[] = [
   runTippingTest,
   runWalletBackupBasicTest,
   runWalletBackupDoublespendTest,
+  runWalletBalanceTest,
   runWallettestingTest,
   runWalletDblessTest,
   runWithdrawalAbortBankTest,
diff --git a/packages/taler-wallet-core/src/db.ts 
b/packages/taler-wallet-core/src/db.ts
index 903dfa47..9c57a79c 100644
--- a/packages/taler-wallet-core/src/db.ts
+++ b/packages/taler-wallet-core/src/db.ts
@@ -361,11 +361,15 @@ export interface ExchangeDetailsRecord {
    * Terms of service text or undefined if not downloaded yet.
    *
    * This is just used as a cache of the last downloaded ToS.
+   * 
+   * FIXME:  Put in separate object store!
    */
   termsOfServiceText: string | undefined;
 
   /**
    * content-type of the last downloaded termsOfServiceText.
+   * 
+   * * FIXME:  Put in separate object store!
    */
   termsOfServiceContentType: string | undefined;
 
diff --git a/packages/taler-wallet-core/src/operations/pay.ts 
b/packages/taler-wallet-core/src/operations/pay.ts
index d41a20e7..8193bf86 100644
--- a/packages/taler-wallet-core/src/operations/pay.ts
+++ b/packages/taler-wallet-core/src/operations/pay.ts
@@ -47,6 +47,7 @@ import {
   j2s,
   Logger,
   NotificationType,
+  parsePaytoUri,
   parsePayUri,
   PayCoinSelection,
   PreparePayResult,
@@ -241,6 +242,20 @@ export async function getCandidatePayCoins(
           continue;
         }
 
+        const wireTypes = new Set<string>();
+        for (const acc of exchangeDetails.wireInfo.accounts) {
+          const p = parsePaytoUri(acc.payto_uri);
+          if (p) {
+            wireTypes.add(p.targetType);
+          }
+        }
+
+        if (!wireTypes.has(req.wireMethod)) {
+          // Exchange can't be used, because it doesn't support
+          // the wire type that the merchant requested.
+          continue;
+        }
+
         // is the exchange explicitly allowed?
         for (const allowedExchange of req.allowedExchanges) {
           if (allowedExchange.exchangePub === exchangeDetails.masterPublicKey) 
{
@@ -1338,7 +1353,7 @@ export async function getContractTermsDetails(
     throw Error("proposal is in invalid state");
   }
 
-  return proposal.download.contractData
+  return proposal.download.contractData;
 }
 
 /**

-- 
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]