From a69eaabe35fbd1e4f807fd2a2d5ae2c05d2944dc Mon Sep 17 00:00:00 2001 From: Terkoiz Date: Fri, 2 Feb 2024 13:59:10 +0000 Subject: [PATCH] Improved client mod whitelisting feature (!75) * Turns out the Chainloader can be accessed from outside a BepInPlugin. Whoops * A user-friendly error will be displayed before the game exits so that it's clear as to what's going wrong. Should prevent reports of crashing on game load now Co-authored-by: Terkoiz Reviewed-on: https://dev.sp-tarkov.com/SPT-AKI/Modules/pulls/75 Co-authored-by: Terkoiz Co-committed-by: Terkoiz --- project/Aki.Core/AkiCorePlugin.cs | 43 +------------------ .../Patches/PreventClientModsPatch.cs | 34 ++++++++++++++- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/project/Aki.Core/AkiCorePlugin.cs b/project/Aki.Core/AkiCorePlugin.cs index 5973e10..a27100b 100644 --- a/project/Aki.Core/AkiCorePlugin.cs +++ b/project/Aki.Core/AkiCorePlugin.cs @@ -1,12 +1,7 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; using Aki.Common; using Aki.Core.Patches; using BepInEx; -using BepInEx.Bootstrap; -using UnityEngine; namespace Aki.Core { @@ -14,7 +9,7 @@ namespace Aki.Core class AkiCorePlugin : BaseUnityPlugin { // Temp static logger field, remove along with plugin whitelisting before release - private static BepInEx.Logging.ManualLogSource _logger; + internal static BepInEx.Logging.ManualLogSource _logger; public void Awake() { @@ -42,41 +37,5 @@ namespace Aki.Core Logger.LogInfo("Completed: Aki.Core"); } - - /// - /// See for explanation on why this is needed. - /// Yes, I know this is jank but it's temporary and will be removed before release :) - /// - internal static void CheckForNonWhitelistedPlugins() - { - var whitelistedPlugins = new HashSet - { - "com.spt-aki.core", - "com.spt-aki.custom", - "com.spt-aki.debugging", - "com.spt-aki.singleplayer", - "com.bepis.bepinex.configurationmanager", - "com.terkoiz.freecam", - "com.sinai.unityexplorer", - "com.cwx.debuggingtool-dxyz", - "com.cwx.debuggingtool", - "xyz.drakia.botdebug", - "com.kobrakon.camunsnap", - "RuntimeUnityEditor" - }; - - var disallowedPlugins = Chainloader.PluginInfos.Values.Select(pi => pi.Metadata.GUID).Except(whitelistedPlugins).ToArray(); - if (disallowedPlugins.Any()) - { - _logger.LogError($"One or more non-whitelisted plugins were detected. Mods are not allowed in BleedingEdge builds of SPT. Illegal plugins:\n{string.Join("\n", disallowedPlugins)}"); - - // Delay game shutdown by a little bit, since logging sometimes doesn't have enough time to write to file - Task.Run(() => - { - Task.Delay(500); - Application.Quit(0); - }); - } - } } } diff --git a/project/Aki.Core/Patches/PreventClientModsPatch.cs b/project/Aki.Core/Patches/PreventClientModsPatch.cs index 60090a8..ad71dd5 100644 --- a/project/Aki.Core/Patches/PreventClientModsPatch.cs +++ b/project/Aki.Core/Patches/PreventClientModsPatch.cs @@ -1,5 +1,9 @@ -using System.Reflection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; using Aki.Reflection.Patching; +using BepInEx.Bootstrap; using EFT; using HarmonyLib; @@ -18,7 +22,33 @@ namespace Aki.Core.Patches [PatchPrefix] private static void Prefix() { - AkiCorePlugin.CheckForNonWhitelistedPlugins(); + CheckForNonWhitelistedPlugins(); + } + + private static void CheckForNonWhitelistedPlugins() + { + var whitelistedPlugins = new HashSet + { + "com.spt-aki.core", + "com.spt-aki.custom", + "com.spt-aki.debugging", + "com.spt-aki.singleplayer", + "com.bepis.bepinex.configurationmanager", + "com.terkoiz.freecam", + "com.sinai.unityexplorer", + "com.cwx.debuggingtool-dxyz", + "com.cwx.debuggingtool", + "xyz.drakia.botdebug", + "com.kobrakon.camunsnap", + "RuntimeUnityEditor" + }; + + var disallowedPlugins = Chainloader.PluginInfos.Values.Select(pi => pi.Metadata.GUID).Except(whitelistedPlugins).ToArray(); + if (disallowedPlugins.Any()) + { + AkiCorePlugin._logger.LogError($"One or more non-whitelisted plugins were detected. Mods are not allowed in BleedingEdge builds of SPT. Illegal plugins:\n{string.Join("\n", disallowedPlugins)}"); + throw new Exception("Non-debug client mods have been detected. Mods are not allowed in BleedingEdge builds of SPT - please remove them before playing!"); + } } } } \ No newline at end of file