if checkmasterpub is specified, throw if master pub is not equal to the expected value

This commit is contained in:
Sebastian 2023-06-26 14:22:34 -03:00
parent 1e173e279f
commit 87fc6ebf48
No known key found for this signature in database
GPG Key ID: 173909D1A5F66069
2 changed files with 47 additions and 11 deletions

View File

@ -75,7 +75,13 @@ import {
GetReadWriteAccess,
} from "../util/query.js";
import { WALLET_EXCHANGE_PROTOCOL_VERSION } from "../versions.js";
import { OperationAttemptResult, OperationAttemptResultType, runTaskWithErrorReporting, TaskIdentifiers, unwrapOperationHandlerResultOrThrow } from "./common.js";
import {
OperationAttemptResult,
OperationAttemptResultType,
runTaskWithErrorReporting,
TaskIdentifiers,
unwrapOperationHandlerResultOrThrow,
} from "./common.js";
const logger = new Logger("exchanges.ts");
@ -544,6 +550,7 @@ export async function updateExchangeFromUrl(
ws: InternalWalletState,
baseUrl: string,
options: {
checkMasterPub?: string;
forceNow?: boolean;
cancellationToken?: CancellationToken;
} = {},
@ -570,6 +577,7 @@ export async function updateExchangeFromUrlHandler(
ws: InternalWalletState,
exchangeBaseUrl: string,
options: {
checkMasterPub?: string;
forceNow?: boolean;
cancellationToken?: CancellationToken;
} = {},
@ -605,6 +613,13 @@ export async function updateExchangeFromUrlHandler(
)
) {
logger.info("using existing exchange info");
if (options.checkMasterPub) {
if (exchangeDetails.masterPublicKey !== options.checkMasterPub) {
throw Error(`master public key mismatch`);
}
}
return {
type: OperationAttemptResultType.Finished,
result: { exchange, exchangeDetails },
@ -621,6 +636,12 @@ export async function updateExchangeFromUrlHandler(
timeout,
);
if (options.checkMasterPub) {
if (keysInfo.masterPublicKey !== options.checkMasterPub) {
throw Error(`master public key mismatch`);
}
}
logger.info("updating exchange /wire info");
const wireInfoDownload = await downloadExchangeWireInfo(
exchangeBaseUrl,

View File

@ -243,7 +243,12 @@ import {
testPay,
withdrawTestBalance,
} from "./operations/testing.js";
import { acceptTip, computeTipTransactionStatus, prepareTip, processTip } from "./operations/tip.js";
import {
acceptTip,
computeTipTransactionStatus,
prepareTip,
processTip,
} from "./operations/tip.js";
import {
abortTransaction,
deleteTransaction,
@ -281,7 +286,10 @@ import {
GetReadOnlyAccess,
GetReadWriteAccess,
} from "./util/query.js";
import { OperationAttemptResult, TaskIdentifiers } from "./operations/common.js";
import {
OperationAttemptResult,
TaskIdentifiers,
} from "./operations/common.js";
import { TimerAPI, TimerGroup } from "./util/timer.js";
import {
WALLET_BANK_INTEGRATION_PROTOCOL_VERSION,
@ -1068,6 +1076,7 @@ async function dispatchRequestInternal<Op extends WalletApiOperation>(
case WalletApiOperation.AddExchange: {
const req = codecForAddExchangeRequest().decode(payload);
await updateExchangeFromUrl(ws, req.exchangeBaseUrl, {
checkMasterPub: req.masterPub,
forceNow: req.forceUpdate,
});
return {};
@ -1783,36 +1792,42 @@ class InternalWalletStateImpl implements InternalWalletState {
return computePayMerchantTransactionState(rec);
}
case TransactionType.Refund: {
const rec = await tx.refundGroups.get(
parsedTxId.refundGroupId,
);
const rec = await tx.refundGroups.get(parsedTxId.refundGroupId);
if (!rec) {
return undefined;
}
return computeRefundTransactionState(rec);
}
case TransactionType.PeerPullCredit:
const rec = await tx.peerPullPaymentInitiations.get(parsedTxId.pursePub);
const rec = await tx.peerPullPaymentInitiations.get(
parsedTxId.pursePub,
);
if (!rec) {
return undefined;
}
return computePeerPullCreditTransactionState(rec);
case TransactionType.PeerPullDebit: {
const rec = await tx.peerPullPaymentIncoming.get(parsedTxId.peerPullPaymentIncomingId);
const rec = await tx.peerPullPaymentIncoming.get(
parsedTxId.peerPullPaymentIncomingId,
);
if (!rec) {
return undefined;
}
return computePeerPullDebitTransactionState(rec);
}
case TransactionType.PeerPushCredit: {
const rec = await tx.peerPushPaymentIncoming.get(parsedTxId.peerPushPaymentIncomingId);
const rec = await tx.peerPushPaymentIncoming.get(
parsedTxId.peerPushPaymentIncomingId,
);
if (!rec) {
return undefined;
}
return computePeerPushCreditTransactionState(rec);
}
case TransactionType.PeerPushDebit: {
const rec = await tx.peerPushPaymentInitiations.get(parsedTxId.pursePub);
const rec = await tx.peerPushPaymentInitiations.get(
parsedTxId.pursePub,
);
if (!rec) {
return undefined;
}
@ -1823,7 +1838,7 @@ class InternalWalletStateImpl implements InternalWalletState {
if (!rec) {
return undefined;
}
return computeRefreshTransactionState(rec)
return computeRefreshTransactionState(rec);
}
case TransactionType.Tip: {
const rec = await tx.tips.get(parsedTxId.walletTipId);