From ac8f116780a860c8f4acfdf5553bf90d76afe236 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 9 Aug 2022 15:00:45 +0200 Subject: implement peer to peer push payments --- packages/taler-wallet-cli/src/harness/harness.ts | 86 ++++++++-------------- packages/taler-wallet-cli/src/harness/libeufin.ts | 43 +++++++---- .../test-libeufin-api-bankaccount.ts | 3 +- .../src/integrationtests/test-libeufin-basic.ts | 9 +-- .../src/integrationtests/test-peer-to-peer.ts | 8 +- 5 files changed, 62 insertions(+), 87 deletions(-) (limited to 'packages/taler-wallet-cli') diff --git a/packages/taler-wallet-cli/src/harness/harness.ts b/packages/taler-wallet-cli/src/harness/harness.ts index 3b58219bb..c735c9956 100644 --- a/packages/taler-wallet-cli/src/harness/harness.ts +++ b/packages/taler-wallet-cli/src/harness/harness.ts @@ -70,7 +70,7 @@ import { TipCreateConfirmation, TipCreateRequest, TippingReserveStatus, -} from "./merchantApiTypes"; +} from "./merchantApiTypes.js"; const exec = util.promisify(require("child_process").exec); @@ -478,14 +478,14 @@ class BankServiceBase { protected globalTestState: GlobalTestState, protected bankConfig: BankConfig, protected configFile: string, - ) { } + ) {} } /** * Work in progress. The key point is that both Sandbox and Nexus * will be configured and started by this class. */ -class EufinBankService extends BankServiceBase implements BankServiceHandle { +class LibEuFinBankService extends BankServiceBase implements BankServiceHandle { sandboxProc: ProcessWrapper | undefined; nexusProc: ProcessWrapper | undefined; @@ -494,8 +494,8 @@ class EufinBankService extends BankServiceBase implements BankServiceHandle { static async create( gc: GlobalTestState, bc: BankConfig, - ): Promise { - return new EufinBankService(gc, bc, "foo"); + ): Promise { + return new LibEuFinBankService(gc, bc, "foo"); } get port() { @@ -761,7 +761,10 @@ class EufinBankService extends BankServiceBase implements BankServiceHandle { } } -class PybankService extends BankServiceBase implements BankServiceHandle { +/** + * Implementation of the bank service using the "taler-fakebank-run" tool. + */ +class FakebankService extends BankServiceBase implements BankServiceHandle { proc: ProcessWrapper | undefined; http = new NodeHttpLib(); @@ -769,41 +772,23 @@ class PybankService extends BankServiceBase implements BankServiceHandle { static async create( gc: GlobalTestState, bc: BankConfig, - ): Promise { + ): Promise { const config = new Configuration(); setTalerPaths(config, gc.testDir + "/talerhome"); config.setString("taler", "currency", bc.currency); - config.setString("bank", "database", bc.database); config.setString("bank", "http_port", `${bc.httpPort}`); config.setString("bank", "serve", "http"); config.setString("bank", "max_debt_bank", `${bc.currency}:999999`); config.setString("bank", "max_debt", bc.maxDebt ?? `${bc.currency}:100`); - config.setString( - "bank", - "allow_registrations", - bc.allowRegistrations ? "yes" : "no", - ); const cfgFilename = gc.testDir + "/bank.conf"; config.write(cfgFilename); - await sh( - gc, - "taler-bank-manage_django", - `taler-bank-manage -c '${cfgFilename}' django migrate`, - ); - await sh( - gc, - "taler-bank-manage_django", - `taler-bank-manage -c '${cfgFilename}' django provide_accounts`, - ); - - return new PybankService(gc, bc, cfgFilename); + return new FakebankService(gc, bc, cfgFilename); } setSuggestedExchange(e: ExchangeServiceInterface, exchangePayto: string) { const config = Configuration.load(this.configFile); config.setString("bank", "suggested_exchange", e.baseUrl); - config.setString("bank", "suggested_exchange_payto", exchangePayto); config.write(this.configFile); } @@ -815,21 +800,6 @@ class PybankService extends BankServiceBase implements BankServiceHandle { accountName: string, password: string, ): Promise { - await sh( - this.globalTestState, - "taler-bank-manage_django", - `taler-bank-manage -c '${this.configFile}' django add_bank_account ${accountName}`, - ); - await sh( - this.globalTestState, - "taler-bank-manage_django", - `taler-bank-manage -c '${this.configFile}' django changepassword_unsafe ${accountName} ${password}`, - ); - await sh( - this.globalTestState, - "taler-bank-manage_django", - `taler-bank-manage -c '${this.configFile}' django top_up ${accountName} ${this.bankConfig.currency}:100000`, - ); return { accountName: accountName, accountPassword: password, @@ -844,8 +814,8 @@ class PybankService extends BankServiceBase implements BankServiceHandle { async start(): Promise { this.proc = this.globalTestState.spawnService( - "taler-bank-manage", - ["-c", this.configFile, "serve"], + "taler-fakebank-run", + ["-c", this.configFile], "bank", ); } @@ -857,7 +827,7 @@ class PybankService extends BankServiceBase implements BankServiceHandle { } // Use libeufin bank instead of pybank. -const useLibeufinBank = process.env.WALLET_HARNESS_WITH_EUFIN; +const useLibeufinBank = true; /** * Return a euFin or a pyBank implementation of @@ -866,21 +836,21 @@ const useLibeufinBank = process.env.WALLET_HARNESS_WITH_EUFIN; * on a particular env variable. */ function getBankServiceImpl(): { - prototype: typeof PybankService.prototype; - create: typeof PybankService.create; + prototype: typeof FakebankService.prototype; + create: typeof FakebankService.create; } { if (useLibeufinBank) return { - prototype: EufinBankService.prototype, - create: EufinBankService.create, + prototype: LibEuFinBankService.prototype, + create: LibEuFinBankService.create, }; return { - prototype: PybankService.prototype, - create: PybankService.create, + prototype: FakebankService.prototype, + create: FakebankService.create, }; } -export type BankService = PybankService; +export type BankService = FakebankService; export const BankService = getBankServiceImpl(); export class FakeBankService { @@ -923,7 +893,7 @@ export class FakeBankService { private globalTestState: GlobalTestState, private bankConfig: FakeBankConfig, private configFile: string, - ) { } + ) {} async start(): Promise { this.proc = this.globalTestState.spawnService( @@ -1189,7 +1159,7 @@ export class ExchangeService implements ExchangeServiceInterface { private exchangeConfig: ExchangeConfig, private configFilename: string, private keyPair: EddsaKeyPair, - ) { } + ) {} get name() { return this.exchangeConfig.name; @@ -1442,7 +1412,7 @@ export class MerchantApiClient { constructor( private baseUrl: string, public readonly auth: MerchantAuthConfiguration, - ) { } + ) {} async changeAuth(auth: MerchantAuthConfiguration): Promise { const url = new URL("private/auth", this.baseUrl); @@ -1635,7 +1605,7 @@ export class MerchantService implements MerchantServiceInterface { private globalState: GlobalTestState, private merchantConfig: MerchantConfig, private configFilename: string, - ) { } + ) {} private currentTimetravel: Duration | undefined; @@ -1947,8 +1917,10 @@ export class WalletCli { const resp = await sh( self.globalTestState, `wallet-${self.name}`, - `taler-wallet-cli ${self.timetravelArg ?? "" - } --no-throttle -LTRACE --wallet-db '${self.dbfile + `taler-wallet-cli ${ + self.timetravelArg ?? "" + } --no-throttle -LTRACE --wallet-db '${ + self.dbfile }' api '${op}' ${shellWrap(JSON.stringify(payload))}`, ); console.log("--- wallet core response ---"); diff --git a/packages/taler-wallet-cli/src/harness/libeufin.ts b/packages/taler-wallet-cli/src/harness/libeufin.ts index 0107d5a8b..7356a6273 100644 --- a/packages/taler-wallet-cli/src/harness/libeufin.ts +++ b/packages/taler-wallet-cli/src/harness/libeufin.ts @@ -36,7 +36,7 @@ import { runCommand, setupDb, sh, - getRandomIban + getRandomIban, } from "../harness/harness.js"; import { LibeufinSandboxApi, @@ -53,13 +53,10 @@ import { CreateAnastasisFacadeRequest, PostNexusTaskRequest, PostNexusPermissionRequest, - CreateNexusUserRequest + CreateNexusUserRequest, } from "../harness/libeufin-apis.js"; -export { - LibeufinSandboxApi, - LibeufinNexusApi -} +export { LibeufinSandboxApi, LibeufinNexusApi }; export interface LibeufinServices { libeufinSandbox: LibeufinSandboxService; @@ -206,6 +203,16 @@ export class LibeufinSandboxService implements LibeufinSandboxServiceInterface { } async start(): Promise { + await sh( + this.globalTestState, + "libeufin-sandbox-config", + "libeufin-sandbox config default", + { + ...process.env, + LIBEUFIN_SANDBOX_DB_CONNECTION: this.sandboxConfig.databaseJdbcUri, + }, + ); + this.sandboxProc = this.globalTestState.spawnService( "libeufin-sandbox", ["serve", "--port", `${this.sandboxConfig.httpPort}`], @@ -235,7 +242,8 @@ export class LibeufinSandboxService implements LibeufinSandboxServiceInterface { debit: string, credit: string, amount: string, // $currency:x.y - subject: string,): Promise { + subject: string, + ): Promise { const stdout = await sh( this.globalTestState, "libeufin-sandbox-maketransfer", @@ -428,7 +436,7 @@ export class LibeufinCli { LIBEUFIN_SANDBOX_URL: this.cliDetails.sandboxUrl, LIBEUFIN_SANDBOX_USERNAME: "admin", LIBEUFIN_SANDBOX_PASSWORD: "secret", - } + }; } async checkSandbox(): Promise { @@ -436,7 +444,7 @@ export class LibeufinCli { this.globalTestState, "libeufin-cli-checksandbox", "libeufin-cli sandbox check", - this.env() + this.env(), ); } @@ -445,7 +453,7 @@ export class LibeufinCli { this.globalTestState, "libeufin-cli-createebicshost", `libeufin-cli sandbox ebicshost create --host-id=${hostId}`, - this.env() + this.env(), ); console.log(stdout); } @@ -460,7 +468,7 @@ export class LibeufinCli { ` --host-id=${details.hostId}` + ` --partner-id=${details.partnerId}` + ` --user-id=${details.userId}`, - this.env() + this.env(), ); console.log(stdout); } @@ -480,7 +488,7 @@ export class LibeufinCli { ` --ebics-host-id=${sd.hostId}` + ` --ebics-partner-id=${sd.partnerId}` + ` --ebics-user-id=${sd.userId}`, - this.env() + this.env(), ); console.log(stdout); } @@ -490,7 +498,7 @@ export class LibeufinCli { this.globalTestState, "libeufin-cli-generatetransactions", `libeufin-cli sandbox bankaccount generate-transactions ${accountName}`, - this.env() + this.env(), ); console.log(stdout); } @@ -500,7 +508,7 @@ export class LibeufinCli { this.globalTestState, "libeufin-cli-showsandboxtransactions", `libeufin-cli sandbox bankaccount transactions ${accountName}`, - this.env() + this.env(), ); console.log(stdout); } @@ -834,9 +842,12 @@ export async function launchLibeufinServices( libeufinNexus, nb.twgHistoryPermission, ); - break; + break; case "anastasis": - await LibeufinNexusApi.createAnastasisFacade(libeufinNexus, nb.anastasisReq); + await LibeufinNexusApi.createAnastasisFacade( + libeufinNexus, + nb.anastasisReq, + ); } } } diff --git a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-api-bankaccount.ts b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-api-bankaccount.ts index 84b401119..cb57c7d0a 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-api-bankaccount.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-api-bankaccount.ts @@ -96,7 +96,7 @@ export async function runLibeufinApiBankaccountTest(t: GlobalTestState) { debtorName: "mock2", amount: "1", subject: "mock subject", - } + }, ); await LibeufinNexusApi.fetchTransactions(nexus, "local-mock"); let transactions = await LibeufinNexusApi.getAccountTransactions( @@ -106,4 +106,5 @@ export async function runLibeufinApiBankaccountTest(t: GlobalTestState) { let el = findNexusPayment("mock subject", transactions.data); t.assertTrue(el instanceof Object); } + runLibeufinApiBankaccountTest.suites = ["libeufin"]; diff --git a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts index aa5d4c9c0..ca7dc33d8 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-libeufin-basic.ts @@ -17,12 +17,7 @@ /** * Imports. */ -import { - AbsoluteTime, - ContractTerms, - Duration, - durationFromSpec, -} from "@gnu-taler/taler-util"; +import { AbsoluteTime, ContractTerms, Duration } from "@gnu-taler/taler-util"; import { WalletApiOperation, HarnessExchangeBankAccount, @@ -42,7 +37,7 @@ import { LibeufinNexusService, LibeufinSandboxApi, LibeufinSandboxService, -} from "../harness/libeufin"; +} from "../harness/libeufin.js"; const exchangeIban = "DE71500105179674997361"; const customerIban = "DE84500105176881385584"; diff --git a/packages/taler-wallet-cli/src/integrationtests/test-peer-to-peer.ts b/packages/taler-wallet-cli/src/integrationtests/test-peer-to-peer.ts index 5c716dc54..c22258bc8 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-peer-to-peer.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-peer-to-peer.ts @@ -22,7 +22,6 @@ import { GlobalTestState } from "../harness/harness.js"; import { createSimpleTestkudosEnvironment, withdrawViaBank, - makeTestPayment, } from "../harness/helpers.js"; /** @@ -55,9 +54,7 @@ export async function runPeerToPeerTest(t: GlobalTestState) { const checkResp = await wallet.client.call( WalletApiOperation.CheckPeerPushPayment, { - contractPriv: resp.contractPriv, - exchangeBaseUrl: resp.exchangeBaseUrl, - pursePub: resp.pursePub, + talerUri: resp.talerUri, }, ); @@ -66,8 +63,7 @@ export async function runPeerToPeerTest(t: GlobalTestState) { const acceptResp = await wallet.client.call( WalletApiOperation.AcceptPeerPushPayment, { - exchangeBaseUrl: resp.exchangeBaseUrl, - pursePub: resp.pursePub, + peerPushPaymentIncomingId: checkResp.peerPushPaymentIncomingId, }, ); -- cgit v1.2.3