diff options
| author | Florian Dold <florian@dold.me> | 2022-08-09 15:00:45 +0200 | 
|---|---|---|
| committer | Florian Dold <florian@dold.me> | 2022-08-16 17:55:12 +0200 | 
| commit | ac8f116780a860c8f4acfdf5553bf90d76afe236 (patch) | |
| tree | 38abecb5ad3a3660161909ee9ca229d4ce08eb4a /packages/taler-wallet-cli | |
| parent | fb8372dfbf27b7b4e8b2fe4f81aa2ba18bfcf638 (diff) | |
implement peer to peer push payments
Diffstat (limited to 'packages/taler-wallet-cli')
5 files changed, 62 insertions, 87 deletions
| 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<EufinBankService> { -    return new EufinBankService(gc, bc, "foo"); +  ): Promise<LibEuFinBankService> { +    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<PybankService> { +  ): Promise<FakebankService> {      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<HarnessExchangeBankAccount> { -    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<void> {      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<void> {      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<void> {      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<void> { +    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<string> { +    subject: string, +  ): Promise<string> {      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<void> { @@ -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,      },    ); | 
