implement debug flag for allowing late withdrawal

This commit is contained in:
Florian Dold 2021-04-14 18:21:23 +02:00
parent 14f13250a0
commit f4b5f3cff8
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
5 changed files with 81 additions and 11 deletions

View File

@ -4,4 +4,4 @@ try {
} catch (e) { } catch (e) {
// Do nothing. // Do nothing.
} }
require('../dist/taler-wallet-cli.js').walletCli.run(); require('../dist/taler-wallet-cli.js').main();

View File

@ -22,8 +22,30 @@ import fs from "fs";
import * as clk from "./clk.js"; import * as clk from "./clk.js";
import { deepStrictEqual } from "assert"; import { deepStrictEqual } from "assert";
import { getTestInfo, runTests } from "./integrationtests/testrunner.js"; import { getTestInfo, runTests } from "./integrationtests/testrunner.js";
import { PreparePayResultType, setDangerousTimetravel, classifyTalerUri, TalerUriType, RecoveryMergeStrategy, Amounts, addPaytoQueryParams, codecForList, codecForString } from "@gnu-taler/taler-util"; import {
import { Logger, Wallet, NodeHttpLib, getDefaultNodeWallet, OperationFailedAndReportedError, OperationFailedError, decodeCrock, rsaBlind, NodeThreadCryptoWorkerFactory, CryptoApi } from "@gnu-taler/taler-wallet-core"; PreparePayResultType,
setDangerousTimetravel,
classifyTalerUri,
TalerUriType,
RecoveryMergeStrategy,
Amounts,
addPaytoQueryParams,
codecForList,
codecForString,
} from "@gnu-taler/taler-util";
import {
Logger,
Wallet,
NodeHttpLib,
getDefaultNodeWallet,
OperationFailedAndReportedError,
OperationFailedError,
decodeCrock,
rsaBlind,
NodeThreadCryptoWorkerFactory,
CryptoApi,
walletCoreDebugFlags,
} from "@gnu-taler/taler-wallet-core";
// This module also serves as the entry point for the crypto // This module also serves as the entry point for the crypto
// thread worker, and thus must expose these two handlers. // thread worker, and thus must expose these two handlers.
@ -780,10 +802,10 @@ testCli
help: "Glob pattern to select which tests to run", help: "Glob pattern to select which tests to run",
}) })
.maybeOption("suites", ["--suites"], clk.STRING, { .maybeOption("suites", ["--suites"], clk.STRING, {
help: "Only run selected suites (string-separated list)" help: "Only run selected suites (string-separated list)",
}) })
.flag("dryRun", ["--dry"], { .flag("dryRun", ["--dry"], {
help: "Only print tests that will be selected to run." help: "Only print tests that will be selected to run.",
}) })
.action(async (args) => { .action(async (args) => {
await runTests({ await runTests({
@ -793,7 +815,6 @@ testCli
}); });
}); });
async function read(stream: NodeJS.ReadStream) { async function read(stream: NodeJS.ReadStream) {
const chunks = []; const chunks = [];
for await (const chunk of stream) chunks.push(chunk); for await (const chunk of stream) chunks.push(chunk);
@ -858,3 +879,11 @@ testCli.subcommand("cryptoworker", "cryptoworker").action(async (args) => {
const res = await cryptoApi.hashString("foo"); const res = await cryptoApi.hashString("foo");
console.log(res); console.log(res);
}); });
export function main() {
if (process.env["TALER_WALLET_DEBUG_DENOMSEL_ALLOW_LATE"]) {
logger.warn("Allowing withdrawal of late denominations for debugging");
walletCoreDebugFlags.denomselAllowLate = true;
}
walletCli.run();
}

View File

@ -51,4 +51,6 @@ export * from "./util/promiseUtils";
export * from "./util/query"; export * from "./util/query";
export * from "./util/http"; export * from "./util/http";
export * from "./pending-types"; export * from "./pending-types";
export * from "./util/debugFlags";

View File

@ -20,6 +20,7 @@
import { import {
AmountJson, AmountJson,
Amounts, Amounts,
durationFromSpec,
parseWithdrawUri, parseWithdrawUri,
Timestamp, Timestamp,
} from "@gnu-taler/taler-util"; } from "@gnu-taler/taler-util";
@ -74,6 +75,7 @@ import { URL } from "../util/url";
import { TalerErrorCode } from "@gnu-taler/taler-util"; import { TalerErrorCode } from "@gnu-taler/taler-util";
import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries"; import { updateRetryInfoTimeout, initRetryInfo } from "../util/retries";
import { compare } from "@gnu-taler/taler-util"; import { compare } from "@gnu-taler/taler-util";
import { walletCoreDebugFlags } from "../util/debugFlags.js";
/** /**
* Logger for this file. * Logger for this file.
@ -174,10 +176,15 @@ interface ExchangeWithdrawDetails {
export function isWithdrawableDenom(d: DenominationRecord): boolean { export function isWithdrawableDenom(d: DenominationRecord): boolean {
const now = getTimestampNow(); const now = getTimestampNow();
const started = timestampCmp(now, d.stampStart) >= 0; const started = timestampCmp(now, d.stampStart) >= 0;
const lastPossibleWithdraw = timestampSubtractDuraction( let lastPossibleWithdraw: Timestamp;
d.stampExpireWithdraw, if (walletCoreDebugFlags.denomselAllowLate) {
{ d_ms: 50 * 1000 }, lastPossibleWithdraw = d.stampExpireWithdraw;
); } else {
lastPossibleWithdraw = timestampSubtractDuraction(
d.stampExpireWithdraw,
durationFromSpec({ minutes: 5 }),
);
}
const remaining = getDurationRemaining(lastPossibleWithdraw, now); const remaining = getDurationRemaining(lastPossibleWithdraw, now);
const stillOkay = remaining.d_ms !== 0; const stillOkay = remaining.d_ms !== 0;
return started && stillOkay && !d.isRevoked; return started && stillOkay && !d.isRevoked;

View File

@ -0,0 +1,32 @@
/*
This file is part of GNU Taler
(C) 2021 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/>
*/
/**
* Debug flags for wallet-core.
*
* @author Florian Dold
*/
export interface WalletCoreDebugFlags {
/**
* Allow withdrawal of denominations even though they are about to expire.
*/
denomselAllowLate: boolean;
}
export const walletCoreDebugFlags: WalletCoreDebugFlags = {
denomselAllowLate: false,
};