summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/operations
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2020-11-03 16:46:43 +0100
committerFlorian Dold <florian@dold.me>2020-11-03 16:46:43 +0100
commit0d37ec5e91f6704261070e01bb77d7c46f85b7a2 (patch)
tree7ab9e9679e71a8c8bedd2f8f616295fbfc144401 /packages/taler-wallet-core/src/operations
parentce326361b4ab87167656b6250fb53a99da70f5e5 (diff)
downloadwallet-core-0d37ec5e91f6704261070e01bb77d7c46f85b7a2.tar.gz
wallet-core-0d37ec5e91f6704261070e01bb77d7c46f85b7a2.tar.bz2
wallet-core-0d37ec5e91f6704261070e01bb77d7c46f85b7a2.zip
complain about merchant base URL mismatch, fixing #6616
Diffstat (limited to 'packages/taler-wallet-core/src/operations')
-rw-r--r--packages/taler-wallet-core/src/operations/errors.ts8
-rw-r--r--packages/taler-wallet-core/src/operations/pay.ts20
2 files changed, 27 insertions, 1 deletions
diff --git a/packages/taler-wallet-core/src/operations/errors.ts b/packages/taler-wallet-core/src/operations/errors.ts
index de78203e4..4eeda898b 100644
--- a/packages/taler-wallet-core/src/operations/errors.ts
+++ b/packages/taler-wallet-core/src/operations/errors.ts
@@ -31,6 +31,14 @@ import { TalerErrorCode } from "../TalerErrorCode";
* but the error has already been reported by writing it to the database.
*/
export class OperationFailedAndReportedError extends Error {
+ static fromCode(
+ ec: TalerErrorCode,
+ message: string,
+ details: Record<string, unknown>,
+ ): OperationFailedAndReportedError {
+ return new OperationFailedAndReportedError(makeErrorDetails(ec, message, details));
+ }
+
constructor(public operationError: TalerErrorDetails) {
super(operationError.message);
diff --git a/packages/taler-wallet-core/src/operations/pay.ts b/packages/taler-wallet-core/src/operations/pay.ts
index 8dbc2af41..0c45290fc 100644
--- a/packages/taler-wallet-core/src/operations/pay.ts
+++ b/packages/taler-wallet-core/src/operations/pay.ts
@@ -56,7 +56,11 @@ import * as Amounts from "../util/amounts";
import { AmountJson } from "../util/amounts";
import { Logger } from "../util/logging";
import { parsePayUri } from "../util/taleruri";
-import { guardOperationException, OperationFailedError } from "./errors";
+import {
+ guardOperationException,
+ OperationFailedAndReportedError,
+ OperationFailedError,
+} from "./errors";
import { createRefreshGroup, getTotalRefreshCost } from "./refresh";
import { InternalWalletState, EXCHANGE_COINS_LOCK } from "./state";
import {
@@ -661,6 +665,20 @@ async function processDownloadProposalImpl(
);
const fulfillmentUrl = parsedContractTerms.fulfillment_url;
+ const baseUrlForDownload = proposal.merchantBaseUrl;
+ const baseUrlFromContractTerms = parsedContractTerms.merchant_base_url;
+
+ if (baseUrlForDownload !== baseUrlFromContractTerms) {
+ throw OperationFailedAndReportedError.fromCode(
+ TalerErrorCode.WALLET_CONTRACT_TERMS_BASE_URL_MISMATCH,
+ "merchant base URL mismatch",
+ {
+ baseUrlForDownload,
+ baseUrlFromContractTerms,
+ },
+ );
+ }
+
await ws.db.runWithWriteTransaction(
[Stores.proposals, Stores.purchases],
async (tx) => {