From 19013a478ff4e10279c7ddcca26eea42e486f53e Mon Sep 17 00:00:00 2001 From: DrakiaXYZ Date: Sat, 24 Feb 2024 23:26:27 +0000 Subject: [PATCH] If a preset has a different _id property than its object key, output an error and skip it. (!233) This resolves an issue where a mod with bad preset data is able to break loot generation Can be tested by changing the "\_id" property of an item preset in globals.json, and seeing the error output to the console. A better solution for the future may be to deprecate the "\_id" property entirely, and use just the object key, however that would have more far reaching changes compared to this simple fix Co-authored-by: DrakiaXYZ <565558+TheDgtl@users.noreply.github.com> Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Server/pulls/233 Co-authored-by: DrakiaXYZ Co-committed-by: DrakiaXYZ --- project/src/controllers/PresetController.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/project/src/controllers/PresetController.ts b/project/src/controllers/PresetController.ts index ceaa0b12..a3365ebc 100644 --- a/project/src/controllers/PresetController.ts +++ b/project/src/controllers/PresetController.ts @@ -2,12 +2,14 @@ import { inject, injectable } from "tsyringe"; import { PresetHelper } from "@spt-aki/helpers/PresetHelper"; import { IPreset } from "@spt-aki/models/eft/common/IGlobals"; +import { ILogger } from "@spt-aki/models/spt/utils/ILogger"; import { DatabaseServer } from "@spt-aki/servers/DatabaseServer"; @injectable() export class PresetController { constructor( + @inject("WinstonLogger") protected logger: ILogger, @inject("PresetHelper") protected presetHelper: PresetHelper, @inject("DatabaseServer") protected databaseServer: DatabaseServer, ) @@ -15,11 +17,17 @@ export class PresetController public initialize(): void { - const presets: IPreset[] = Object.values(this.databaseServer.getTables().globals.ItemPresets); + const presets: [string, IPreset][] = Object.entries(this.databaseServer.getTables().globals.ItemPresets); const reverse: Record = {}; - for (const preset of presets) + for (const [id, preset] of presets) { + if (id != preset._id) + { + this.logger.error(`Preset for template '${preset._items[0]._tpl}' has invalid id (${id} != ${preset._id}). Skipping`); + continue; + } + const tpl = preset._items[0]._tpl; if (!(tpl in reverse))