summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2020-07-31 20:13:59 +0530
committerFlorian Dold <florian.dold@gmail.com>2020-07-31 20:13:59 +0530
commit3db00d9d73c7fcd88f8450330c01639a6b171df9 (patch)
tree2b480413b377e6c70fdb5aba776347cca483d68f
parent119c1c708f9922e3e92ff592dcf08a1bd4f2f2e4 (diff)
downloadwallet-core-3db00d9d73c7fcd88f8450330c01639a6b171df9.tar.gz
wallet-core-3db00d9d73c7fcd88f8450330c01639a6b171df9.tar.bz2
wallet-core-3db00d9d73c7fcd88f8450330c01639a6b171df9.zip
fix concurrency bug in bank-integrated withdrawal, better response parsingv0.7.1-dev.17
-rw-r--r--src/operations/reserves.ts25
-rw-r--r--src/types/talerTypes.ts14
2 files changed, 28 insertions, 11 deletions
diff --git a/src/operations/reserves.ts b/src/operations/reserves.ts
index fdc35bb1..405a02f9 100644
--- a/src/operations/reserves.ts
+++ b/src/operations/reserves.ts
@@ -43,7 +43,10 @@ import {
getExchangeTrust,
getExchangePaytoUri,
} from "./exchanges";
-import { codecForWithdrawOperationStatusResponse } from "../types/talerTypes";
+import {
+ codecForWithdrawOperationStatusResponse,
+ codecForBankWithdrawalOperationPostResponse,
+} from "../types/talerTypes";
import { assertUnreachable } from "../util/assertUnreachable";
import { encodeCrock, getRandomBytes } from "../crypto/talerCrypto";
import { randomBytes } from "../crypto/primitives/nacl-fast";
@@ -71,7 +74,9 @@ import { TalerErrorCode } from "../TalerErrorCode";
import {
readSuccessResponseJsonOrErrorCode,
throwUnexpectedRequestError,
+ readSuccessResponseJsonOrThrow,
} from "../util/http";
+import { codecForAny } from "../util/codec";
const logger = new Logger("reserves.ts");
@@ -324,14 +329,14 @@ async function registerReserveWithBank(
return;
}
const bankStatusUrl = bankInfo.statusUrl;
- if (reserve.timestampReserveInfoPosted) {
- throw Error("bank claims that reserve info selection is not done");
- }
- // FIXME: parse bank response
- await ws.http.postJson(bankStatusUrl, {
+ const httpResp = await ws.http.postJson(bankStatusUrl, {
reserve_pub: reservePub,
selected_exchange: bankInfo.exchangePaytoUri,
});
+ await readSuccessResponseJsonOrThrow(
+ httpResp,
+ codecForBankWithdrawalOperationPostResponse(),
+ );
await ws.db.mutate(Stores.reserves, reservePub, (r) => {
switch (r.reserveStatus) {
case ReserveRecordStatus.REGISTERING_BANK:
@@ -382,11 +387,9 @@ async function processReserveBankStatusImpl(
}
const statusResp = await ws.http.get(bankStatusUrl);
- if (statusResp.status !== 200) {
- throw Error(`unexpected status ${statusResp.status} for bank status query`);
- }
- const status = codecForWithdrawOperationStatusResponse().decode(
- await statusResp.json(),
+ const status = await readSuccessResponseJsonOrThrow(
+ statusResp,
+ codecForWithdrawOperationStatusResponse(),
);
if (status.selection_done) {
diff --git a/src/types/talerTypes.ts b/src/types/talerTypes.ts
index 823f437b..95c1a711 100644
--- a/src/types/talerTypes.ts
+++ b/src/types/talerTypes.ts
@@ -940,6 +940,20 @@ export interface WithdrawUriInfoResponse {
possibleExchanges: ExchangeListItem[];
}
+/**
+ * Response body for the following endpoint:
+ *
+ * POST {talerBankIntegrationApi}/withdrawal-operation/{wopid}
+ */
+export interface BankWithdrawalOperationPostResponse {
+ transfer_done: boolean;
+}
+
+export const codecForBankWithdrawalOperationPostResponse = (): Codec<BankWithdrawalOperationPostResponse> =>
+ makeCodecForObject<BankWithdrawalOperationPostResponse>()
+ .property("transfer_done", codecForBoolean)
+ .build("BankWithdrawalOperationPostResponse");
+
export type AmountString = string;
export type Base32String = string;
export type EddsaSignatureString = string;