aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-08-20 17:56:10 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-04 00:27:11 +0100
commit15d75dea10c058364a2577b73a627b4701d4ce01 (patch)
tree65f7202eeb793b019c090dd157800c0ed2e4fa92 /src
parent317bb198b1152aafe8a48137e3748423eca02448 (diff)
Core/Warden: More refactors lifted from #25286.
(cherry picked from commit a3971ca4b05e2913850b6d4fe7d40884fa645fa0)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Warden/WardenCheckMgr.cpp19
-rw-r--r--src/server/game/Warden/WardenCheckMgr.h64
-rw-r--r--src/server/game/Warden/WardenWin.cpp101
-rw-r--r--src/server/game/Warden/WardenWin.h7
-rw-r--r--src/server/game/Warden/enuminfo_WardenCheckMgr.cpp94
-rw-r--r--src/server/game/World/World.cpp5
-rw-r--r--src/server/game/World/World.h5
-rw-r--r--src/server/worldserver/worldserver.conf.dist27
8 files changed, 198 insertions, 124 deletions
diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp
index e8db4c00b2c..55b1b479dde 100644
--- a/src/server/game/Warden/WardenCheckMgr.cpp
+++ b/src/server/game/Warden/WardenCheckMgr.cpp
@@ -53,7 +53,7 @@ void WardenCheckMgr::LoadWardenChecks()
uint16 maxCheckId = fields[0].GetUInt16();
- _checks.resize(maxCheckId + 1);
+ _checks.resize(maxCheckId+1);
// 0 1 2 3 4 5 6 7
result = WorldDatabase.Query("SELECT id, type, data, result, address, length, str, comment FROM warden_checks ORDER BY id ASC");
@@ -65,14 +65,18 @@ void WardenCheckMgr::LoadWardenChecks()
uint16 const id = fields[0].GetUInt16();
WardenCheckType const type = static_cast<WardenCheckType>(fields[1].GetUInt8());
+ WardenCheckCategory const category = GetWardenCheckCategory(type);
+
+ if (category == NUM_CHECK_CATEGORIES)
+ {
+ TC_LOG_ERROR("sql.sql", "Warden check with id %u lists check type %u in `warden_checks`, which is not supported. Skipped.", id, type);
+ continue;
+ }
WardenCheck& wardenCheck = _checks[id];
wardenCheck.CheckId = id;
wardenCheck.Type = type;
- // Initialize action with default action from config
- wardenCheck.Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION));
-
if (type == PAGE_CHECK_A || type == PAGE_CHECK_B || type == DRIVER_CHECK)
wardenCheck.Data = fields[2].GetBinary();
@@ -93,11 +97,10 @@ void WardenCheckMgr::LoadWardenChecks()
if (wardenCheck.Comment.empty())
wardenCheck.Comment = "Undocumented Check";
- if (type == MEM_CHECK || type == MODULE_CHECK)
- MemChecksIdPool.push_back(id);
- else
- OtherChecksIdPool.push_back(id);
+ // initialize action with default action from config, this may be overridden later
+ wardenCheck.Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION));
+ _pools[category].push_back(id);
++count;
}
while (result->NextRow());
diff --git a/src/server/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h
index e84f405590b..9583684705c 100644
--- a/src/server/game/Warden/WardenCheckMgr.h
+++ b/src/server/game/Warden/WardenCheckMgr.h
@@ -19,6 +19,7 @@
#define _WARDENCHECKMGR_H
#include "Define.h"
+#include "World.h"
#include <shared_mutex>
#include <unordered_map>
#include <vector>
@@ -32,23 +33,61 @@ enum WardenActions : uint8
};
// EnumUtils: DESCRIBE THIS
+enum WardenCheckCategory : uint8
+{
+ INJECT_CHECK_CATEGORY = 0, // checks that test whether the client's execution has been interfered with
+ LUA_CHECK_CATEGORY, // checks that test whether the lua sandbox has been modified
+ MODDED_CHECK_CATEGORY, // checks that test whether the client has been modified
+
+ NUM_CHECK_CATEGORIES // SKIP
+};
+
+// EnumUtils: DESCRIBE THIS
enum WardenCheckType : uint8
{
- MEM_CHECK = 0xF3, // 243: byte moduleNameIndex + uint Offset + byte Len (check to ensure memory isn't modified)
- PAGE_CHECK_A = 0xB2, // 178: uint Seed + byte[20] SHA1 + uint Addr + byte Len (scans all pages for specified hash)
- PAGE_CHECK_B = 0xBF, // 191: uint Seed + byte[20] SHA1 + uint Addr + byte Len (scans only pages starts with MZ+PE headers for specified hash)
- MPQ_CHECK = 0x98, // 152: byte fileNameIndex (check to ensure MPQ file isn't modified)
LUA_STR_CHECK = 0x8B, // 139: byte luaNameIndex (check to ensure LUA string isn't used)
- DRIVER_CHECK = 0x71, // 113: uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)
- TIMING_CHECK = 0x57, // 87: empty (check to ensure GetTickCount() isn't detoured)
- PROC_CHECK = 0x7E, // 126: uint Seed + byte[20] SHA1 + byte moluleNameIndex + byte procNameIndex + uint Offset + byte Len (check to ensure proc isn't detoured)
- MODULE_CHECK = 0xD9 // 217: uint Seed + byte[20] SHA1 (check to ensure module isn't injected)
+ NONE_CHECK = 0, // SKIP
+ TIMING_CHECK = 87, // nyi
+ DRIVER_CHECK = 113, // uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)
+ PROC_CHECK = 126, // nyi
+ MPQ_CHECK = 152, // get hash of MPQ file (to check it is not modified)
+ PAGE_CHECK_A = 178, // scans all pages for specified SHA1 hash
+ PAGE_CHECK_B = 191, // scans only pages starts with MZ+PE headers for specified hash
+ MODULE_CHECK = 217, // check to make sure module isn't injected
+ MEM_CHECK = 243, // retrieve specific memory
};
+constexpr WardenCheckCategory GetWardenCheckCategory(WardenCheckType type)
+{
+ switch (type)
+ {
+ case TIMING_CHECK: return NUM_CHECK_CATEGORIES;
+ case DRIVER_CHECK: return INJECT_CHECK_CATEGORY;
+ case PROC_CHECK: return NUM_CHECK_CATEGORIES;
+ case MPQ_CHECK: return MODDED_CHECK_CATEGORY;
+ case PAGE_CHECK_A: return INJECT_CHECK_CATEGORY;
+ case PAGE_CHECK_B: return INJECT_CHECK_CATEGORY;
+ case MODULE_CHECK: return INJECT_CHECK_CATEGORY;
+ case MEM_CHECK: return MODDED_CHECK_CATEGORY;
+ default: return NUM_CHECK_CATEGORIES;
+ }
+}
+
+constexpr WorldIntConfigs GetWardenCategoryCountConfig(WardenCheckCategory category)
+{
+ switch (category)
+ {
+ case INJECT_CHECK_CATEGORY: return CONFIG_WARDEN_NUM_INJECT_CHECKS;
+ case LUA_CHECK_CATEGORY: return CONFIG_WARDEN_NUM_LUA_CHECKS;
+ case MODDED_CHECK_CATEGORY: return CONFIG_WARDEN_NUM_CLIENT_MOD_CHECKS;
+ default: return INT_CONFIG_VALUE_COUNT;
+ }
+}
+
struct WardenCheck
{
uint16 CheckId;
- WardenCheckType Type;
+ WardenCheckType Type = NONE_CHECK;
std::vector<uint8> Data;
uint32 Address; // PROC_CHECK, MEM_CHECK, PAGE_CHECK
uint8 Length; // PROC_CHECK, MEM_CHECK, PAGE_CHECK
@@ -67,11 +106,11 @@ class TC_GAME_API WardenCheckMgr
public:
static WardenCheckMgr* instance();
+ uint16 GetMaxValidCheckId() const { return static_cast<uint16>(_checks.size()); }
WardenCheck const& GetCheckData(uint16 Id) const;
WardenCheckResult const& GetCheckResult(uint16 Id) const;
- std::vector<uint16> const& GetAvailableMemoryChecks() const { return MemChecksIdPool; }
- std::vector<uint16> const& GetAvailableOtherChecks() const { return OtherChecksIdPool; }
+ std::vector<uint16> const& GetAvailableChecks(WardenCheckCategory category) { return _pools[category]; }
void LoadWardenChecks();
void LoadWardenOverrides();
@@ -79,8 +118,7 @@ class TC_GAME_API WardenCheckMgr
private:
std::vector<WardenCheck> _checks;
std::unordered_map<uint16, WardenCheckResult> _checkResults;
- std::vector<uint16> MemChecksIdPool;
- std::vector<uint16> OtherChecksIdPool;
+ std::array<std::vector<uint16>, NUM_CHECK_CATEGORIES> _pools;
};
#define sWardenCheckMgr WardenCheckMgr::instance()
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index d23e24a63e0..63bf304e6e2 100644
--- a/src/server/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
@@ -39,13 +39,13 @@
WardenWin::WardenWin() : Warden(), _serverTicks(0)
{
- _memChecks = sWardenCheckMgr->GetAvailableMemoryChecks();
- Trinity::Containers::RandomShuffle(_memChecks);
- _memChecksIt = _memChecks.begin();
-
- _otherChecks = sWardenCheckMgr->GetAvailableOtherChecks();
- Trinity::Containers::RandomShuffle(_otherChecks);
- _otherChecksIt = _otherChecks.begin();
+ for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
+ {
+ auto& [checks, checksIt] = _checks[category];
+ checks = sWardenCheckMgr->GetAvailableChecks(category);
+ Trinity::Containers::RandomShuffle(checks);
+ checksIt = checks.begin();
+ }
}
void WardenWin::Init(WorldSession* session, SessionKey const& K)
@@ -184,52 +184,43 @@ void WardenWin::RequestChecks()
TC_LOG_DEBUG("warden", "Request data");
// If all checks were done, fill the todo list again
- if (_memChecksIt == _memChecks.end())
- {
- TC_LOG_DEBUG("warden", "Finished all mem checks, re-shuffling");
- Trinity::Containers::RandomShuffle(_memChecks);
- _memChecksIt = _memChecks.begin();
- }
-
- if (_otherChecksIt == _otherChecks.end())
+ for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
{
- TC_LOG_DEBUG("warden", "Finished all other checks, re-shuffling");
- Trinity::Containers::RandomShuffle(_otherChecks);
- _otherChecksIt = _otherChecks.begin();
+ auto& [checks, checksIt] = _checks[category];
+ if (checksIt == checks.end())
+ {
+ TC_LOG_DEBUG("warden", "Finished all %s checks, re-shuffling", EnumUtils::ToConstant(category));
+ Trinity::Containers::RandomShuffle(checks);
+ checksIt = checks.begin();
+ }
}
_serverTicks = GameTime::GetGameTimeMS();
-
_currentChecks.clear();
// Build check request
ByteBuffer buff;
buff << uint8(WARDEN_SMSG_CHEAT_CHECKS_REQUEST);
- for (uint32 i = 0; i < sWorld->getIntConfig(CONFIG_WARDEN_NUM_MEM_CHECKS); ++i)
+ for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
{
- // If todo list is done break loop (will be filled on next Update() run)
- if (_memChecksIt == _memChecks.end())
- break;
-
- _currentChecks.push_back(*(_memChecksIt++));
- }
+ auto& [checks, checksIt] = _checks[category];
+ for (uint32 i = 0, n = sWorld->getIntConfig(GetWardenCategoryCountConfig(category)); i < n; ++i)
+ {
+ if (checksIt == checks.end()) // all checks were already sent, list will be re-filled on next Update() run
+ break;
- for (uint32 i = 0; i < sWorld->getIntConfig(CONFIG_WARDEN_NUM_OTHER_CHECKS); ++i)
- {
- // If todo list is done break loop (will be filled on next Update() run)
- if (_otherChecksIt == _otherChecks.end())
- break;
+ uint16 const id = *(checksIt++);
- uint16 const id = *(_otherChecksIt++);
+ WardenCheck const& check = sWardenCheckMgr->GetCheckData(id);
+ if (!check.Str.empty())
+ {
+ buff << uint8(check.Str.size());
+ buff.append(check.Str.data(), check.Str.size());
+ }
- WardenCheck const& check = sWardenCheckMgr->GetCheckData(id);
- if (!check.Str.empty())
- {
- buff << uint8(check.Str.size());
- buff.append(check.Str.data(), check.Str.size());
+ _currentChecks.push_back(id);
}
- _currentChecks.push_back(id);
}
uint8 xorByte = _inputKey[0];
@@ -389,6 +380,7 @@ void WardenWin::HandleCheckResult(ByteBuffer &buff)
std::vector<uint8> response;
response.resize(check.Length);
buff.read(response.data(), response.size());
+
WardenCheckResult const& expected = sWardenCheckMgr->GetCheckResult(id);
if (response != expected)
{
@@ -422,10 +414,10 @@ void WardenWin::HandleCheckResult(ByteBuffer &buff)
uint8 Lua_Result;
buff >> Lua_Result;
- if (Lua_Result != 0)
+ if (Lua_Result == 0)
{
uint8 luaStrLen = buff.read<uint8>();
- if (luaStrLen == 0)
+ if (luaStrLen != 0)
{
std::string str;
str.resize(luaStrLen);
@@ -483,28 +475,29 @@ void WardenWin::HandleCheckResult(ByteBuffer &buff)
size_t WardenWin::DEBUG_ForceSpecificChecks(std::vector<uint16> const& checks)
{
- std::vector<uint16>::iterator memChecksIt = _memChecks.begin();
- std::vector<uint16>::iterator otherChecksIt = _otherChecks.begin();
+ std::array<std::vector<uint16>::iterator, NUM_CHECK_CATEGORIES> swapPositions;
+ for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
+ swapPositions[category] = _checks[category].first.begin();
size_t n = 0;
for (uint16 check : checks)
{
- if (auto it = std::find(memChecksIt, _memChecks.end(), check); it != _memChecks.end())
- {
- std::iter_swap(it, memChecksIt);
- ++memChecksIt;
- ++n;
- }
- else if (auto it = std::find(otherChecksIt, _otherChecks.end(), check); it != _otherChecks.end())
+ for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
{
- std::iter_swap(it, otherChecksIt);
- ++otherChecksIt;
- ++n;
+ std::vector<uint16>& checks = _checks[category].first;
+ std::vector<uint16>::iterator& swapPos = swapPositions[category];
+ if (auto it = std::find(swapPos, checks.end(), check); it != checks.end())
+ {
+ std::iter_swap(swapPos, it);
+ ++swapPos;
+ ++n;
+ break;
+ }
}
}
- _memChecksIt = _memChecks.begin();
- _otherChecksIt = _otherChecks.begin();
+ for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
+ _checks[category].second = _checks[category].first.begin();
return n;
}
diff --git a/src/server/game/Warden/WardenWin.h b/src/server/game/Warden/WardenWin.h
index 740bafbe4e3..87b385f9551 100644
--- a/src/server/game/Warden/WardenWin.h
+++ b/src/server/game/Warden/WardenWin.h
@@ -22,7 +22,9 @@
#include "Cryptography/BigNumber.h"
#include "ByteBuffer.h"
#include "Warden.h"
+#include <array>
#include <list>
+#include <utility>
#pragma pack(push, 1)
@@ -79,10 +81,7 @@ class TC_GAME_API WardenWin : public Warden
private:
uint32 _serverTicks;
- std::vector<uint16> _memChecks;
- std::vector<uint16>::const_iterator _memChecksIt;
- std::vector<uint16> _otherChecks;
- std::vector<uint16>::const_iterator _otherChecksIt;
+ std::array<std::pair<std::vector<uint16>, std::vector<uint16>::const_iterator>, NUM_CHECK_CATEGORIES> _checks;
std::vector<uint16> _currentChecks;
};
diff --git a/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp b/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp
index 450760148f0..8496c4ca8aa 100644
--- a/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp
+++ b/src/server/game/Warden/enuminfo_WardenCheckMgr.cpp
@@ -65,6 +65,48 @@ TC_API_EXPORT size_t EnumUtils<WardenActions>::ToIndex(WardenActions value)
}
}
+/****************************************************************************\
+|* data for enum 'WardenCheckCategory' in 'WardenCheckMgr.h' auto-generated *|
+\****************************************************************************/
+template <>
+TC_API_EXPORT EnumText EnumUtils<WardenCheckCategory>::ToString(WardenCheckCategory value)
+{
+ switch (value)
+ {
+ case INJECT_CHECK_CATEGORY: return { "INJECT_CHECK_CATEGORY", "INJECT_CHECK_CATEGORY", "checks that test whether the client's execution has been interfered with" };
+ case LUA_CHECK_CATEGORY: return { "LUA_CHECK_CATEGORY", "LUA_CHECK_CATEGORY", "checks that test whether the lua sandbox has been modified" };
+ case MODDED_CHECK_CATEGORY: return { "MODDED_CHECK_CATEGORY", "MODDED_CHECK_CATEGORY", "checks that test whether the client has been modified" };
+ default: throw std::out_of_range("value");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<WardenCheckCategory>::Count() { return 3; }
+
+template <>
+TC_API_EXPORT WardenCheckCategory EnumUtils<WardenCheckCategory>::FromIndex(size_t index)
+{
+ switch (index)
+ {
+ case 0: return INJECT_CHECK_CATEGORY;
+ case 1: return LUA_CHECK_CATEGORY;
+ case 2: return MODDED_CHECK_CATEGORY;
+ default: throw std::out_of_range("index");
+ }
+}
+
+template <>
+TC_API_EXPORT size_t EnumUtils<WardenCheckCategory>::ToIndex(WardenCheckCategory value)
+{
+ switch (value)
+ {
+ case INJECT_CHECK_CATEGORY: return 0;
+ case LUA_CHECK_CATEGORY: return 1;
+ case MODDED_CHECK_CATEGORY: return 2;
+ default: throw std::out_of_range("value");
+ }
+}
+
/************************************************************************\
|* data for enum 'WardenCheckType' in 'WardenCheckMgr.h' auto-generated *|
\************************************************************************/
@@ -73,15 +115,15 @@ TC_API_EXPORT EnumText EnumUtils<WardenCheckType>::ToString(WardenCheckType valu
{
switch (value)
{
- case MEM_CHECK: return { "MEM_CHECK", "MEM_CHECK", "243: byte moduleNameIndex + uint Offset + byte Len (check to ensure memory isn't modified)" };
- case PAGE_CHECK_A: return { "PAGE_CHECK_A", "PAGE_CHECK_A", "178: uint Seed + byte[20] SHA1 + uint Addr + byte Len (scans all pages for specified hash)" };
- case PAGE_CHECK_B: return { "PAGE_CHECK_B", "PAGE_CHECK_B", "191: uint Seed + byte[20] SHA1 + uint Addr + byte Len (scans only pages starts with MZ+PE headers for specified hash)" };
- case MPQ_CHECK: return { "MPQ_CHECK", "MPQ_CHECK", "152: byte fileNameIndex (check to ensure MPQ file isn't modified)" };
case LUA_STR_CHECK: return { "LUA_STR_CHECK", "LUA_STR_CHECK", "139: byte luaNameIndex (check to ensure LUA string isn't used)" };
- case DRIVER_CHECK: return { "DRIVER_CHECK", "DRIVER_CHECK", "113: uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)" };
- case TIMING_CHECK: return { "TIMING_CHECK", "TIMING_CHECK", "87: empty (check to ensure GetTickCount() isn't detoured)" };
- case PROC_CHECK: return { "PROC_CHECK", "PROC_CHECK", "126: uint Seed + byte[20] SHA1 + byte moluleNameIndex + byte procNameIndex + uint Offset + byte Len (check to ensure proc isn't detoured)" };
- case MODULE_CHECK: return { "MODULE_CHECK", "MODULE_CHECK", "217: uint Seed + byte[20] SHA1 (check to ensure module isn't injected)" };
+ case TIMING_CHECK: return { "TIMING_CHECK", "TIMING_CHECK", "nyi" };
+ case DRIVER_CHECK: return { "DRIVER_CHECK", "DRIVER_CHECK", "uint Seed + byte[20] SHA1 + byte driverNameIndex (check to ensure driver isn't loaded)" };
+ case PROC_CHECK: return { "PROC_CHECK", "PROC_CHECK", "nyi" };
+ case MPQ_CHECK: return { "MPQ_CHECK", "MPQ_CHECK", "get hash of MPQ file (to check it is not modified)" };
+ case PAGE_CHECK_A: return { "PAGE_CHECK_A", "PAGE_CHECK_A", "scans all pages for specified SHA1 hash" };
+ case PAGE_CHECK_B: return { "PAGE_CHECK_B", "PAGE_CHECK_B", "scans only pages starts with MZ+PE headers for specified hash" };
+ case MODULE_CHECK: return { "MODULE_CHECK", "MODULE_CHECK", "check to make sure module isn't injected" };
+ case MEM_CHECK: return { "MEM_CHECK", "MEM_CHECK", "retrieve specific memory" };
default: throw std::out_of_range("value");
}
}
@@ -94,15 +136,15 @@ TC_API_EXPORT WardenCheckType EnumUtils<WardenCheckType>::FromIndex(size_t index
{
switch (index)
{
- case 0: return MEM_CHECK;
- case 1: return PAGE_CHECK_A;
- case 2: return PAGE_CHECK_B;
- case 3: return MPQ_CHECK;
- case 4: return LUA_STR_CHECK;
- case 5: return DRIVER_CHECK;
- case 6: return TIMING_CHECK;
- case 7: return PROC_CHECK;
- case 8: return MODULE_CHECK;
+ case 0: return LUA_STR_CHECK;
+ case 1: return TIMING_CHECK;
+ case 2: return DRIVER_CHECK;
+ case 3: return PROC_CHECK;
+ case 4: return MPQ_CHECK;
+ case 5: return PAGE_CHECK_A;
+ case 6: return PAGE_CHECK_B;
+ case 7: return MODULE_CHECK;
+ case 8: return MEM_CHECK;
default: throw std::out_of_range("index");
}
}
@@ -112,15 +154,15 @@ TC_API_EXPORT size_t EnumUtils<WardenCheckType>::ToIndex(WardenCheckType value)
{
switch (value)
{
- case MEM_CHECK: return 0;
- case PAGE_CHECK_A: return 1;
- case PAGE_CHECK_B: return 2;
- case MPQ_CHECK: return 3;
- case LUA_STR_CHECK: return 4;
- case DRIVER_CHECK: return 5;
- case TIMING_CHECK: return 6;
- case PROC_CHECK: return 7;
- case MODULE_CHECK: return 8;
+ case LUA_STR_CHECK: return 0;
+ case TIMING_CHECK: return 1;
+ case DRIVER_CHECK: return 2;
+ case PROC_CHECK: return 3;
+ case MPQ_CHECK: return 4;
+ case PAGE_CHECK_A: return 5;
+ case PAGE_CHECK_B: return 6;
+ case MODULE_CHECK: return 7;
+ case MEM_CHECK: return 8;
default: throw std::out_of_range("value");
}
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 583939e1b97..6f5681b0bb6 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1533,8 +1533,9 @@ void World::LoadConfigSettings(bool reload)
// Warden
m_bool_configs[CONFIG_WARDEN_ENABLED] = sConfigMgr->GetBoolDefault("Warden.Enabled", false);
- m_int_configs[CONFIG_WARDEN_NUM_MEM_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumMemChecks", 3);
- m_int_configs[CONFIG_WARDEN_NUM_OTHER_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumOtherChecks", 7);
+ m_int_configs[CONFIG_WARDEN_NUM_INJECT_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumInjectionChecks", 9);
+ m_int_configs[CONFIG_WARDEN_NUM_LUA_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumLuaSandboxChecks", 1);
+ m_int_configs[CONFIG_WARDEN_NUM_CLIENT_MOD_CHECKS] = sConfigMgr->GetIntDefault("Warden.NumClientModChecks", 1);
m_int_configs[CONFIG_WARDEN_CLIENT_BAN_DURATION] = sConfigMgr->GetIntDefault("Warden.BanDuration", 86400);
m_int_configs[CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF] = sConfigMgr->GetIntDefault("Warden.ClientCheckHoldOff", 30);
m_int_configs[CONFIG_WARDEN_CLIENT_FAIL_ACTION] = sConfigMgr->GetIntDefault("Warden.ClientCheckFailAction", 0);
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 99649b3bc5b..8d1efd74f0e 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -374,8 +374,9 @@ enum WorldIntConfigs
CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF,
CONFIG_WARDEN_CLIENT_FAIL_ACTION,
CONFIG_WARDEN_CLIENT_BAN_DURATION,
- CONFIG_WARDEN_NUM_MEM_CHECKS,
- CONFIG_WARDEN_NUM_OTHER_CHECKS,
+ CONFIG_WARDEN_NUM_INJECT_CHECKS,
+ CONFIG_WARDEN_NUM_LUA_CHECKS,
+ CONFIG_WARDEN_NUM_CLIENT_MOD_CHECKS,
CONFIG_WINTERGRASP_PLR_MAX,
CONFIG_WINTERGRASP_PLR_MIN,
CONFIG_WINTERGRASP_PLR_MIN_LVL,
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 19afc60ffd2..9bb2a4bad49 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -1528,21 +1528,18 @@ HotSwap.ReCompilerBuildType = ""
Warden.Enabled = 0
#
-# Warden.NumMemChecks
-# Description: Number of Warden memory checks that are sent to the client each cycle.
-# Default: 3 - (Enabled)
-# 0 - (Disabled)
-
-Warden.NumMemChecks = 3
-
-#
-# Warden.NumOtherChecks
-# Description: Number of Warden checks other than memory checks that are added to request
-# each checking cycle.
-# Default: 7 - (Enabled)
-# 0 - (Disabled)
-
-Warden.NumOtherChecks = 7
+# Warden.NumInjectionChecks
+# Warden.NumLuaSandboxChecks
+# Warden.NumClientModChecks
+# Description: Number of Warden checks of the respective category that are sent per cycle.
+# Default: 7 - (Warden.NumInjectionChecks)
+# Default: 1 - (Warden.NumLuaSandboxChecks)
+# Default: 1 - (Warden.NumClientModChecks)
+# 0 - (Disable category)
+
+Warden.NumInjectionChecks = 7
+Warden.NumLuaSandboxChecks = 1
+Warden.NumClientModChecks = 1
#
# Warden.ClientResponseDelay