fix: check contract source whitelist before loading interactions

This commit is contained in:
Tadeuchi
2023-11-17 15:39:40 +01:00
parent 339e480131
commit a5aa4b4ecb
4 changed files with 33 additions and 12 deletions

View File

@@ -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,

View File

@@ -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;
} }

View File

@@ -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;

View File

@@ -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);
}
} }