fix: check contract source whitelist before loading interactions
This commit is contained in:
@@ -565,6 +565,8 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.warp.executorFactory.checkWhiteListContractSources(contractDefinition, contractEvaluationOptions);
|
||||||
|
|
||||||
if (!remoteState && sortedInteractions.length == 0) {
|
if (!remoteState && sortedInteractions.length == 0) {
|
||||||
sortedInteractions = await interactionsLoader.load(
|
sortedInteractions = await interactionsLoader.load(
|
||||||
contractTxId,
|
contractTxId,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ContractDefinition } from '../../core/ContractDefinition';
|
import { ContractCache, ContractDefinition, SrcCache } from '../../core/ContractDefinition';
|
||||||
import { EvaluationOptions } from './StateEvaluator';
|
import { EvaluationOptions } from './StateEvaluator';
|
||||||
import { Warp } from '../Warp';
|
import { Warp } from '../Warp';
|
||||||
import { InteractionState } from '../../contract/states/InteractionState';
|
import { InteractionState } from '../../contract/states/InteractionState';
|
||||||
@@ -17,4 +17,9 @@ export interface ExecutorFactory<Api> {
|
|||||||
warp: Warp,
|
warp: Warp,
|
||||||
interactionState: InteractionState
|
interactionState: InteractionState
|
||||||
): Promise<Api>;
|
): Promise<Api>;
|
||||||
|
|
||||||
|
checkWhiteListContractSources<State>(
|
||||||
|
contractDefinition: SrcCache & ContractCache<State>,
|
||||||
|
evaluationOptions: EvaluationOptions
|
||||||
|
): void;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import Arweave from 'arweave';
|
import Arweave from 'arweave';
|
||||||
import { rustWasmImports, WarpContractsCrateVersion } from './wasm/rust-wasm-imports';
|
import { rustWasmImports, WarpContractsCrateVersion } from './wasm/rust-wasm-imports';
|
||||||
import { ContractDefinition } from '../../../core/ContractDefinition';
|
import { ContractCache, ContractDefinition, SrcCache } from '../../../core/ContractDefinition';
|
||||||
import { ExecutionContext } from '../../../core/ExecutionContext';
|
import { ExecutionContext } from '../../../core/ExecutionContext';
|
||||||
import { GQLNodeInterface } from '../../../legacy/gqlResult';
|
import { GQLNodeInterface } from '../../../legacy/gqlResult';
|
||||||
import { SmartWeaveGlobal } from '../../../legacy/smartweave-global';
|
import { SmartWeaveGlobal } from '../../../legacy/smartweave-global';
|
||||||
@@ -54,15 +54,7 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
|
|||||||
if (warp.hasPlugin('contract-blacklist')) {
|
if (warp.hasPlugin('contract-blacklist')) {
|
||||||
await this.blacklistContracts<State>(warp, contractDefinition);
|
await this.blacklistContracts<State>(warp, contractDefinition);
|
||||||
}
|
}
|
||||||
|
this.checkWhiteListContractSources(contractDefinition, evaluationOptions);
|
||||||
if (
|
|
||||||
evaluationOptions.whitelistSources.length > 0 &&
|
|
||||||
!evaluationOptions.whitelistSources.includes(contractDefinition.srcTxId)
|
|
||||||
) {
|
|
||||||
throw new NonWhitelistedSourceError(
|
|
||||||
`[NonWhitelistedSourceError] Contract source not part of whitelisted sources list: ${contractDefinition.srcTxId}.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let kvStorage = null;
|
let kvStorage = null;
|
||||||
|
|
||||||
@@ -219,6 +211,21 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkWhiteListContractSources<State>(
|
||||||
|
contractDefinition: SrcCache & ContractCache<State>,
|
||||||
|
evaluationOptions: EvaluationOptions
|
||||||
|
) {
|
||||||
|
if (
|
||||||
|
evaluationOptions &&
|
||||||
|
evaluationOptions.whitelistSources.length > 0 &&
|
||||||
|
!evaluationOptions.whitelistSources.includes(contractDefinition.srcTxId)
|
||||||
|
) {
|
||||||
|
throw new NonWhitelistedSourceError(
|
||||||
|
`[NonWhitelistedSourceError] Contract source not part of whitelisted sources list: ${contractDefinition.srcTxId}.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private async blacklistContracts<State>(warp: Warp, contractDefinition: ContractDefinition<State>) {
|
private async blacklistContracts<State>(warp: Warp, contractDefinition: ContractDefinition<State>) {
|
||||||
const blacklistPlugin = warp.loadPlugin<string, Promise<boolean>>('contract-blacklist');
|
const blacklistPlugin = warp.loadPlugin<string, Promise<boolean>>('contract-blacklist');
|
||||||
let blacklisted = false;
|
let blacklisted = false;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { ContractDefinition } from '../core/ContractDefinition';
|
import { ContractCache, ContractDefinition, SrcCache } from '../core/ContractDefinition';
|
||||||
import { ExecutorFactory } from '../core/modules/ExecutorFactory';
|
import { ExecutorFactory } from '../core/modules/ExecutorFactory';
|
||||||
import { EvaluationOptions } from '../core/modules/StateEvaluator';
|
import { EvaluationOptions } from '../core/modules/StateEvaluator';
|
||||||
import { Warp } from '../core/Warp';
|
import { Warp } from '../core/Warp';
|
||||||
@@ -33,4 +33,11 @@ export class DebuggableExecutorFactory<Api> implements ExecutorFactory<Api> {
|
|||||||
|
|
||||||
return await this.baseImplementation.create(contractDefinition, evaluationOptions, warp, interactionState);
|
return await this.baseImplementation.create(contractDefinition, evaluationOptions, warp, interactionState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkWhiteListContractSources<State>(
|
||||||
|
contractDefinition: SrcCache & ContractCache<State>,
|
||||||
|
evaluationOptions: EvaluationOptions
|
||||||
|
): void {
|
||||||
|
return this.baseImplementation.checkWhiteListContractSources(contractDefinition, evaluationOptions);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user