diff --git a/contrib/enumutils_describe.py b/contrib/enumutils_describe.py
index 1efe6b68377..630fe86c1f0 100644
--- a/contrib/enumutils_describe.py
+++ b/contrib/enumutils_describe.py
@@ -19,7 +19,7 @@ notice = ('''/*
* with this program. If not, see .
*/
-''' % datetime.now().year)
+''')
if not getcwd().endswith('src'):
print('Run this from the src directory!')
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql
index ffbc5ede914..2d790eac527 100644
--- a/sql/base/auth_database.sql
+++ b/sql/base/auth_database.sql
@@ -842,7 +842,6 @@ INSERT INTO `rbac_linked_permissions` VALUES
(196,702),
(196,703),
(196,704),
-(196,705),
(196,706),
(196,707),
(196,708),
@@ -1665,7 +1664,6 @@ INSERT INTO `rbac_permissions` VALUES
(702,'Command: reload spell_threats'),
(703,'Command: reload spell_group_stack_rules'),
(704,'Command: reload trinity_string'),
-(705,'Command: reload warden_action'),
(706,'Command: reload waypoint_scripts'),
(707,'Command: reload waypoint_data'),
(708,'Command: reload vehicle_accessory'),
@@ -1972,7 +1970,8 @@ INSERT INTO `updates` VALUES
('2020_07_15_00_auth.sql','56748440894EA78C3BE72C4A3F2E97E256E6EE40','RELEASED','2020-07-15 00:00:00',0),
('2020_08_02_00_auth.sql','B0290F6558C59262D9DDD8071060A8803DD56930','RELEASED','2020-08-02 00:00:00',0),
('2020_08_03_00_auth.sql','492CA77C0FAEEEF3E0492121B3A92689373ECFA3','RELEASED','2020-08-03 00:00:00',0),
-('2020_08_03_01_auth.sql','EC1063396CA20A2303D83238470D41EF4439EC72','RELEASED','2020-08-03 00:00:01',0);
+('2020_08_03_01_auth.sql','EC1063396CA20A2303D83238470D41EF4439EC72','RELEASED','2020-08-03 00:00:01',0),
+('2020_08_11_00_auth.sql','14C99177E43003D83A4D6F2227722F15FC15A1D0','RELEASED','2020-08-11 00:00:00',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/auth/3.3.5/2020_08_11_00_auth.sql b/sql/updates/auth/3.3.5/2020_08_11_00_auth.sql
new file mode 100644
index 00000000000..16296ac7c90
--- /dev/null
+++ b/sql/updates/auth/3.3.5/2020_08_11_00_auth.sql
@@ -0,0 +1,5 @@
+--
+DELETE FROM `rbac_permissions` WHERE `id`=705;
+DELETE FROM `rbac_linked_permissions` WHERE `linkedId`=705;
+DELETE FROM `rbac_account_permissions` WHERE `permissionId`=705;
+DELETE FROM `rbac_default_permissions` WHERE `permissionId`=705;
diff --git a/sql/updates/world/3.3.5/2020_08_11_00_world_335.sql b/sql/updates/world/3.3.5/2020_08_11_00_world_335.sql
new file mode 100644
index 00000000000..6e66caa8855
--- /dev/null
+++ b/sql/updates/world/3.3.5/2020_08_11_00_world_335.sql
@@ -0,0 +1,15 @@
+--
+ALTER TABLE `warden_checks`
+ CHANGE COLUMN `data` `oldData` VARCHAR(48),
+ CHANGE COLUMN `result` `oldResult` VARCHAR(24),
+ ADD COLUMN `data` BINARY(24) DEFAULT NULL,
+ ADD COLUMN `result` VARBINARY(12) DEFAULT NULL;
+
+UPDATE `warden_checks` SET `data`=UNHEX(`oldData`) WHERE `type` IN (113,178,191);
+UPDATE `warden_checks` SET `result`=UNHEX(`oldResult`) WHERE `type` IN (152,243);
+
+ALTER TABLE `warden_checks`
+ DROP COLUMN `oldData`,
+ DROP COLUMN `oldResult`;
+
+DELETE FROM `command` WHERE `name`='reload warden_action';
diff --git a/src/common/Utilities/Util.h b/src/common/Utilities/Util.h
index 4ee7c99c4ff..f13f39c8912 100644
--- a/src/common/Utilities/Util.h
+++ b/src/common/Utilities/Util.h
@@ -330,6 +330,15 @@ std::array HexStrToByteArray(std::string const& str, bool reverse =
return arr;
}
+inline std::vector HexStrToByteVector(std::string const& str, bool reverse = false)
+{
+ std::vector buf;
+ size_t const sz = (str.size() / 2);
+ buf.resize(sz);
+ Trinity::Impl::HexStrToByteArray(str, buf.data(), sz, reverse);
+ return buf;
+}
+
TC_COMMON_API bool StringToBool(std::string const& str);
TC_COMMON_API bool StringContainsStringI(std::string const& haystack, std::string const& needle);
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 9e248e7f0c0..64a61b70bc3 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -606,7 +606,7 @@ enum RBACPermissions
RBAC_PERM_COMMAND_RELOAD_SPELL_THREATS = 702,
RBAC_PERM_COMMAND_RELOAD_SPELL_GROUP_STACK_RULES = 703,
RBAC_PERM_COMMAND_RELOAD_TRINITY_STRING = 704,
- RBAC_PERM_COMMAND_RELOAD_WARDEN_ACTION = 705,
+ // 705 unused
RBAC_PERM_COMMAND_RELOAD_WAYPOINT_SCRIPTS = 706,
RBAC_PERM_COMMAND_RELOAD_WAYPOINT_DATA = 707,
RBAC_PERM_COMMAND_RELOAD_VEHICLE_ACCESORY = 708,
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 2f91160e308..64e909e8e7c 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -422,7 +422,7 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
_recvQueue.readd(requeuePackets.begin(), requeuePackets.end());
if (m_Socket && m_Socket->IsOpen() && _warden)
- _warden->Update();
+ _warden->Update(diff);
if (!updater.ProcessUnsafe()) // <=> updater is of type MapSessionFilter
{
@@ -446,12 +446,12 @@ bool WorldSession::Update(uint32 diff, PacketFilter& updater)
if (ShouldLogOut(currentTime) && !m_playerLoading)
LogoutPlayer(true);
- if (m_Socket && GetPlayer() && _warden)
- _warden->Update();
-
///- Cleanup socket pointer if need
if (m_Socket && !m_Socket->IsOpen())
{
+ if (GetPlayer() && _warden)
+ _warden->Update(diff);
+
expireTime -= expireTime > diff ? diff : expireTime;
if (expireTime < diff || forceExit || !GetPlayer())
{
diff --git a/src/server/game/Warden/Modules/WardenModuleMac.h b/src/server/game/Warden/Modules/WardenModuleMac.h
index 8efdf401b8c..a699261a284 100644
--- a/src/server/game/Warden/Modules/WardenModuleMac.h
+++ b/src/server/game/Warden/Modules/WardenModuleMac.h
@@ -18,7 +18,7 @@
#ifndef _WARDEN_MODULE_MAC_H
#define _WARDEN_MODULE_MAC_H
-uint8 Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data[9318] =
+std::array Module_0DBBF209A27B1E279A9FEC5C168A15F7_Data =
{
0x07, 0x0C, 0x44, 0xCD, 0xC9, 0xFB, 0x99, 0xBC, 0x7C, 0x77, 0xDC, 0xE8, 0x8D, 0x07, 0xBE, 0x55,
0x37, 0x5C, 0x84, 0x10, 0x23, 0xE1, 0x36, 0x5B, 0xF1, 0xBC, 0x60, 0xF3, 0x68, 0xBA, 0x60, 0x69,
diff --git a/src/server/game/Warden/Modules/WardenModuleWin.h b/src/server/game/Warden/Modules/WardenModuleWin.h
index d282e0090b5..faf9bf44d4e 100644
--- a/src/server/game/Warden/Modules/WardenModuleWin.h
+++ b/src/server/game/Warden/Modules/WardenModuleWin.h
@@ -18,22 +18,25 @@
#ifndef _WARDEN_MODULE_WIN_H
#define _WARDEN_MODULE_WIN_H
+#include "CryptoHash.h"
+#include
+
/*
Seed: 4D808D2C77D905C41A6380EC08586AFE (0x05 packet)
Hash: 568C054C781A972A6037A2290C22B52571A06F4E (0x04 packet)
Module MD5: 79C0768D657977D697E10BAD956CCED1
New Client Key: 7F 96 EE FD A5 B6 3D 20 A4 DF 8E 00 CB F4 83 04
-New Cerver Key: C2 B7 AD ED FC CC A9 C2 BF B3 F8 56 02 BA 80 9B
+New Server Key: C2 B7 AD ED FC CC A9 C2 BF B3 F8 56 02 BA 80 9B
*/
struct Module_79C0768D657977D697E10BAD956CCED1
{
- uint8 Module[18756];
- uint8 ModuleKey[16];
- uint8 Seed[16];
- uint8 ServerKeySeed[16];
- uint8 ClientKeySeed[16];
- uint8 ClientKeySeedHash[20];
+ std::array Module;
+ std::array ModuleKey;
+ std::array Seed;
+ std::array ServerKeySeed;
+ std::array ClientKeySeed;
+ Trinity::Crypto::SHA1::Digest ClientKeySeedHash;
} Module =
{
{
diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp
index 7fc532fd961..4a99ae9155e 100644
--- a/src/server/game/Warden/Warden.cpp
+++ b/src/server/game/Warden/Warden.cpp
@@ -28,23 +28,29 @@
#include "AccountMgr.h"
#include
+#include
-Warden::Warden() : _session(nullptr), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0),
- _dataSent(false), _previousTimestamp(0), _module(nullptr), _initialized(false)
+Warden::Warden() : _session(nullptr), _checkTimer(10 * IN_MILLISECONDS), _clientResponseTimer(0),
+ _dataSent(false), _initialized(false)
{
- memset(_inputKey, 0, sizeof(_inputKey));
- memset(_outputKey, 0, sizeof(_outputKey));
- memset(_seed, 0, sizeof(_seed));
}
Warden::~Warden()
{
- delete[] _module->CompressedData;
- delete _module;
- _module = nullptr;
_initialized = false;
}
+void Warden::MakeModuleForClient()
+{
+ TC_LOG_DEBUG("warden", "Make module for client");
+ InitializeModuleForClient(_module.emplace());
+
+ MD5_CTX ctx;
+ MD5_Init(&ctx);
+ MD5_Update(&ctx, _module->CompressedData, _module->CompressedSize);
+ MD5_Final(_module->Id.data(), &ctx);
+}
+
void Warden::SendModuleToClient()
{
TC_LOG_DEBUG("warden", "Send module to client");
@@ -60,13 +66,15 @@ void Warden::SendModuleToClient()
burstSize = sizeLeft < 500 ? sizeLeft : 500;
packet.Command = WARDEN_SMSG_MODULE_CACHE;
packet.DataSize = burstSize;
- memcpy(packet.Data, &_module->CompressedData[pos], burstSize);
+ memcpy(packet.Data, _module->CompressedData + pos, burstSize);
sizeLeft -= burstSize;
pos += burstSize;
- EncryptData((uint8*)&packet, burstSize + 3);
+ EndianConvert(packet.DataSize);
+
+ EncryptData(reinterpret_cast(&packet), burstSize + 3);
WorldPacket pkt1(SMSG_WARDEN_DATA, burstSize + 3);
- pkt1.append((uint8*)&packet, burstSize + 3);
+ pkt1.append(reinterpret_cast(&packet), burstSize + 3);
_session->SendPacket(&pkt1);
}
}
@@ -79,53 +87,49 @@ void Warden::RequestModule()
WardenModuleUse request;
request.Command = WARDEN_SMSG_MODULE_USE;
- memcpy(request.ModuleId, _module->Id, 16);
- memcpy(request.ModuleKey, _module->Key, 16);
+ request.ModuleId = _module->Id;
+ request.ModuleKey = _module->Key;
request.Size = _module->CompressedSize;
+ EndianConvert(request.Size);
+
// Encrypt with warden RC4 key.
- EncryptData((uint8*)&request, sizeof(WardenModuleUse));
+ EncryptData(reinterpret_cast(&request), sizeof(WardenModuleUse));
WorldPacket pkt(SMSG_WARDEN_DATA, sizeof(WardenModuleUse));
- pkt.append((uint8*)&request, sizeof(WardenModuleUse));
+ pkt.append(reinterpret_cast(&request), sizeof(WardenModuleUse));
_session->SendPacket(&pkt);
}
-void Warden::Update()
+void Warden::Update(uint32 diff)
{
- if (_initialized)
+ if (!_initialized)
+ return;
+
+ if (_dataSent)
{
- uint32 currentTimestamp = GameTime::GetGameTimeMS();
- uint32 diff = currentTimestamp - _previousTimestamp;
- _previousTimestamp = currentTimestamp;
+ uint32 maxClientResponseDelay = sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_RESPONSE_DELAY);
- if (_dataSent)
+ if (maxClientResponseDelay > 0)
{
- uint32 maxClientResponseDelay = sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_RESPONSE_DELAY);
-
- if (maxClientResponseDelay > 0)
+ // Kick player if client response delays more than set in config
+ if (_clientResponseTimer > maxClientResponseDelay * IN_MILLISECONDS)
{
- // Kick player if client response delays more than set in config
- if (_clientResponseTimer > maxClientResponseDelay * IN_MILLISECONDS)
- {
- TC_LOG_WARN("warden", "%s (latency: %u, IP: %s) exceeded Warden module response delay for more than %s - disconnecting client",
- _session->GetPlayerInfo().c_str(), _session->GetLatency(), _session->GetRemoteAddress().c_str(), secsToTimeString(maxClientResponseDelay, TimeFormat::ShortText).c_str());
- _session->KickPlayer("Warden::Update Warden module response delay exceeded");
- }
- else
- _clientResponseTimer += diff;
- }
- }
- else
- {
- if (diff >= _checkTimer)
- {
- RequestData();
+ TC_LOG_WARN("warden", "%s (latency: %u, IP: %s) exceeded Warden module response delay (%s) - disconnecting client",
+ _session->GetPlayerInfo().c_str(), _session->GetLatency(), _session->GetRemoteAddress().c_str(), secsToTimeString(maxClientResponseDelay, TimeFormat::ShortText).c_str());
+ _session->KickPlayer("Warden::Update Warden module response delay exceeded");
}
else
- _checkTimer -= diff;
+ _clientResponseTimer += diff;
}
}
+ else
+ {
+ if (diff >= _checkTimer)
+ RequestChecks();
+ else
+ _checkTimer -= diff;
+ }
}
void Warden::DecryptData(uint8* buffer, uint32 length)
@@ -180,7 +184,7 @@ uint32 Warden::BuildChecksum(uint8 const* data, uint32 length)
return checkSum;
}
-std::string Warden::Penalty(WardenCheck* check /*= nullptr*/)
+char const* Warden::ApplyPenalty(WardenCheck const* check)
{
WardenActions action;
@@ -191,17 +195,11 @@ std::string Warden::Penalty(WardenCheck* check /*= nullptr*/)
switch (action)
{
- case WARDEN_ACTION_LOG:
- return "None";
- break;
- case WARDEN_ACTION_KICK:
- _session->KickPlayer("Warden::Penalty");
- return "Kick";
- break;
- case WARDEN_ACTION_BAN:
+ case WARDEN_ACTION_KICK:
+ _session->KickPlayer("Warden::Penalty");
+ break;
+ case WARDEN_ACTION_BAN:
{
- std::stringstream duration;
- duration << sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_BAN_DURATION) << "s";
std::string accountName;
AccountMgr::GetName(_session->GetAccountId(), accountName);
std::stringstream banReason;
@@ -210,14 +208,50 @@ std::string Warden::Penalty(WardenCheck* check /*= nullptr*/)
if (check)
banReason << ": " << check->Comment << " (CheckId: " << check->CheckId << ")";
- sWorld->BanAccount(BAN_ACCOUNT, accountName, duration.str(), banReason.str(),"Server");
+ sWorld->BanAccount(BAN_ACCOUNT, accountName, sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_BAN_DURATION), banReason.str(),"Server");
- return "Ban";
+ break;
}
+ case WARDEN_ACTION_LOG:
+ default:
+ return "None";
+ }
+ return EnumUtils::ToTitle(action);
+}
+
+void Warden::HandleData(ByteBuffer& buff)
+{
+ DecryptData(buff.contents(), buff.size());
+ uint8 opcode;
+ buff >> opcode;
+ TC_LOG_DEBUG("warden", "Got packet, opcode %02X, size %u", opcode, uint32(buff.size() - 1));
+ buff.hexlike();
+
+ switch (opcode)
+ {
+ case WARDEN_CMSG_MODULE_MISSING:
+ SendModuleToClient();
+ break;
+ case WARDEN_CMSG_MODULE_OK:
+ RequestHash();
+ break;
+ case WARDEN_CMSG_CHEAT_CHECKS_RESULT:
+ HandleCheckResult(buff);
+ break;
+ case WARDEN_CMSG_MEM_CHECKS_RESULT:
+ TC_LOG_DEBUG("warden", "NYI WARDEN_CMSG_MEM_CHECKS_RESULT received!");
+ break;
+ case WARDEN_CMSG_HASH_RESULT:
+ HandleHashResult(buff);
+ InitializeModule();
+ break;
+ case WARDEN_CMSG_MODULE_FAILED:
+ TC_LOG_DEBUG("warden", "NYI WARDEN_CMSG_MODULE_FAILED received!");
+ break;
default:
+ TC_LOG_WARN("warden", "Got unknown warden opcode %02X of size %u.", opcode, uint32(buff.size() - 1));
break;
}
- return "Undefined";
}
void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData)
@@ -225,35 +259,5 @@ void WorldSession::HandleWardenDataOpcode(WorldPacket& recvData)
if (!_warden || recvData.empty())
return;
- _warden->DecryptData(recvData.contents(), recvData.size());
- uint8 opcode;
- recvData >> opcode;
- TC_LOG_DEBUG("warden", "Got packet, opcode %02X, size %u", opcode, uint32(recvData.size()));
- recvData.hexlike();
-
- switch (opcode)
- {
- case WARDEN_CMSG_MODULE_MISSING:
- _warden->SendModuleToClient();
- break;
- case WARDEN_CMSG_MODULE_OK:
- _warden->RequestHash();
- break;
- case WARDEN_CMSG_CHEAT_CHECKS_RESULT:
- _warden->HandleData(recvData);
- break;
- case WARDEN_CMSG_MEM_CHECKS_RESULT:
- TC_LOG_DEBUG("warden", "NYI WARDEN_CMSG_MEM_CHECKS_RESULT received!");
- break;
- case WARDEN_CMSG_HASH_RESULT:
- _warden->HandleHashResult(recvData);
- _warden->InitializeModule();
- break;
- case WARDEN_CMSG_MODULE_FAILED:
- TC_LOG_DEBUG("warden", "NYI WARDEN_CMSG_MODULE_FAILED received!");
- break;
- default:
- TC_LOG_DEBUG("warden", "Got unknown warden opcode %02X of size %u.", opcode, uint32(recvData.size() - 1));
- break;
- }
+ _warden->HandleData(recvData);
}
diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h
index a5fe29fe889..bcf3cd92122 100644
--- a/src/server/game/Warden/Warden.h
+++ b/src/server/game/Warden/Warden.h
@@ -21,6 +21,7 @@
#include "ARC4.h"
#include "AuthDefines.h"
#include "ByteBuffer.h"
+#include "Optional.h"
#include "WardenCheckMgr.h"
#include
@@ -43,28 +44,16 @@ enum WardenOpcodes
WARDEN_SMSG_HASH_REQUEST = 5
};
-enum WardenCheckType
-{
- 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)
-};
-
#pragma pack(push, 1)
struct WardenModuleUse
{
uint8 Command;
- uint8 ModuleId[16];
- uint8 ModuleKey[16];
+ std::array ModuleId;
+ std::array ModuleKey;
uint32 Size;
};
+static_assert(sizeof(WardenModuleUse) == (1 + 16 + 16 + 4));
struct WardenModuleTransfer
{
@@ -72,66 +61,68 @@ struct WardenModuleTransfer
uint16 DataSize;
uint8 Data[500];
};
+static_assert(sizeof(WardenModuleTransfer) == (1 + 2 + 500));
struct WardenHashRequest
{
uint8 Command;
- uint8 Seed[16];
+ std::array Seed;
};
+static_assert(sizeof(WardenHashRequest) == (1 + 16));
#pragma pack(pop)
struct ClientWardenModule
{
- uint8 Id[16];
- uint8 Key[16];
- uint32 CompressedSize;
- uint8* CompressedData;
+ std::array Id;
+ std::array Key;
+ uint8 const* CompressedData;
+ size_t CompressedSize;
};
class WorldSession;
class TC_GAME_API Warden
{
- friend class WardenWin;
- friend class WardenMac;
-
public:
Warden();
virtual ~Warden();
virtual void Init(WorldSession* session, SessionKey const& K) = 0;
- virtual ClientWardenModule* GetModuleForClient() = 0;
- virtual void InitializeModule() = 0;
- virtual void RequestHash() = 0;
- virtual void HandleHashResult(ByteBuffer &buff) = 0;
- virtual void RequestData() = 0;
- virtual void HandleData(ByteBuffer &buff) = 0;
+ void Update(uint32 diff);
+ void HandleData(ByteBuffer& buff);
- void SendModuleToClient();
- void RequestModule();
- void Update();
+ protected:
void DecryptData(uint8* buffer, uint32 length);
void EncryptData(uint8* buffer, uint32 length);
+ virtual void InitializeModule() = 0;
+ virtual void RequestHash() = 0;
+ virtual void HandleHashResult(ByteBuffer& buff) = 0;
+ virtual void HandleCheckResult(ByteBuffer& buff) = 0;
+ virtual void InitializeModuleForClient(ClientWardenModule& module) = 0;
+ virtual void RequestChecks() = 0;
+
+ void MakeModuleForClient();
+ void SendModuleToClient();
+ void RequestModule();
+
static bool IsValidCheckSum(uint32 checksum, const uint8 *data, const uint16 length);
static uint32 BuildChecksum(const uint8 *data, uint32 length);
- // If no check is passed, the default action from config is executed
- std::string Penalty(WardenCheck* check = nullptr);
+ // If nullptr is passed, the default action from config is executed
+ char const* ApplyPenalty(WardenCheck const* check);
- private:
WorldSession* _session;
- uint8 _inputKey[16];
- uint8 _outputKey[16];
- uint8 _seed[16];
+ std::array _inputKey = {};
+ std::array _outputKey = {};
+ std::array _seed = {};
Trinity::Crypto::ARC4 _inputCrypto;
Trinity::Crypto::ARC4 _outputCrypto;
uint32 _checkTimer; // Timer for sending check requests
uint32 _clientResponseTimer; // Timer for client response delay
bool _dataSent;
- uint32 _previousTimestamp;
- ClientWardenModule* _module;
+ Optional _module;
bool _initialized;
};
diff --git a/src/server/game/Warden/WardenCheckMgr.cpp b/src/server/game/Warden/WardenCheckMgr.cpp
index 34225901aab..c2bff22c4af 100644
--- a/src/server/game/Warden/WardenCheckMgr.cpp
+++ b/src/server/game/Warden/WardenCheckMgr.cpp
@@ -15,26 +15,19 @@
* with this program. If not, see .
*/
-#include "Common.h"
-#include "WorldPacket.h"
-#include "WorldSession.h"
-#include "Log.h"
-#include "Database/DatabaseEnv.h"
#include "WardenCheckMgr.h"
+
+#include "Common.h"
+#include "DatabaseEnv.h"
+#include "Errors.h"
+#include "Log.h"
#include "Warden.h"
#include "World.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
WardenCheckMgr::WardenCheckMgr() { }
-WardenCheckMgr::~WardenCheckMgr()
-{
- for (uint16 i = 0; i < CheckStore.size(); ++i)
- delete CheckStore[i];
-
- for (CheckResultContainer::iterator itr = CheckResultStore.begin(); itr != CheckResultStore.end(); ++itr)
- delete itr->second;
-}
-
void WardenCheckMgr::LoadWardenChecks()
{
uint32 oldMSTime = getMSTime();
@@ -68,53 +61,40 @@ void WardenCheckMgr::LoadWardenChecks()
{
fields = result->Fetch();
- uint16 id = fields[0].GetUInt16();
- uint8 checkType = fields[1].GetUInt8();
- std::string data = fields[2].GetString();
- std::string checkResult = fields[3].GetString();
- uint32 address = fields[4].GetUInt32();
- uint8 length = fields[5].GetUInt8();
- std::string str = fields[6].GetString();
- std::string comment = fields[7].GetString();
+ uint16 const id = fields[0].GetUInt16();
+ uint8 const type = fields[1].GetUInt8();
- WardenCheck* wardenCheck = new WardenCheck();
- wardenCheck->Type = checkType;
- wardenCheck->CheckId = id;
+ WardenCheck& wardenCheck = CheckStore[id];
+ wardenCheck.CheckId = id;
+ wardenCheck.Type = WardenCheckType(type);
// Initialize action with default action from config
- wardenCheck->Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION));
+ wardenCheck.Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION));
- if (checkType == PAGE_CHECK_A || checkType == PAGE_CHECK_B || checkType == DRIVER_CHECK)
- wardenCheck->Data.SetHexStr(data.c_str());
+ if (type == PAGE_CHECK_A || type == PAGE_CHECK_B || type == DRIVER_CHECK)
+ wardenCheck.Data = fields[2].GetBinary();
- if (checkType == MEM_CHECK || checkType == MODULE_CHECK)
- MemChecksIdPool.push_back(id);
- else
- OtherChecksIdPool.push_back(id);
+ if (type == MPQ_CHECK || type == MEM_CHECK)
+ CheckResultStore.emplace(id, fields[3].GetBinary());
- if (checkType == MEM_CHECK || checkType == PAGE_CHECK_A || checkType == PAGE_CHECK_B || checkType == PROC_CHECK)
+ if (type == MEM_CHECK || type == PAGE_CHECK_A || type == PAGE_CHECK_B || type == PROC_CHECK)
{
- wardenCheck->Address = address;
- wardenCheck->Length = length;
+ wardenCheck.Address = fields[4].GetUInt32();
+ wardenCheck.Length = fields[5].GetUInt8();
}
// PROC_CHECK support missing
- if (checkType == MEM_CHECK || checkType == MPQ_CHECK || checkType == LUA_STR_CHECK || checkType == DRIVER_CHECK || checkType == MODULE_CHECK)
- wardenCheck->Str = str;
+ if (type == MEM_CHECK || type == MPQ_CHECK || type == LUA_STR_CHECK || type == DRIVER_CHECK || type == MODULE_CHECK)
+ wardenCheck.Str = fields[6].GetString();
- CheckStore[id] = wardenCheck;
+ wardenCheck.Comment = fields[7].GetString();
+ if (wardenCheck.Comment.empty())
+ wardenCheck.Comment = "Undocumented Check";
- if (checkType == MPQ_CHECK || checkType == MEM_CHECK)
- {
- WardenCheckResult* wr = new WardenCheckResult();
- wr->Result.SetHexStr(checkResult.c_str());
- CheckResultStore[id] = wr;
- }
-
- if (comment.empty())
- wardenCheck->Comment = "Undocumented Check";
+ if (type == MEM_CHECK || type == MODULE_CHECK)
+ MemChecksIdPool.push_back(id);
else
- wardenCheck->Comment = comment;
+ OtherChecksIdPool.push_back(id);
++count;
}
@@ -145,8 +125,6 @@ void WardenCheckMgr::LoadWardenOverrides()
uint32 count = 0;
- std::unique_lock lock(sWardenCheckMgr->_checkStoreLock);
-
do
{
Field* fields = result->Fetch();
@@ -162,7 +140,7 @@ void WardenCheckMgr::LoadWardenOverrides()
TC_LOG_ERROR("warden", "Warden check action override for non-existing check (ID: %u, action: %u), skipped", checkId, action);
else
{
- CheckStore[checkId]->Action = WardenActions(action);
+ CheckStore[checkId].Action = WardenActions(action);
++count;
}
}
@@ -177,18 +155,15 @@ WardenCheckMgr* WardenCheckMgr::instance()
return &instance;
}
-WardenCheck* WardenCheckMgr::GetWardenDataById(uint16 Id)
+WardenCheck const& WardenCheckMgr::GetCheckDataById(uint16 Id) const
{
- if (Id < CheckStore.size())
- return CheckStore[Id];
-
- return nullptr;
+ ASSERT(Id < CheckStore.size(), "Requested Warden data for invalid check ID %u", uint32(Id));
+ return CheckStore[Id];
}
-WardenCheckResult* WardenCheckMgr::GetWardenResultById(uint16 Id)
+WardenCheckResult const& WardenCheckMgr::GetCheckResultById(uint16 Id) const
{
- CheckResultContainer::const_iterator itr = CheckResultStore.find(Id);
- if (itr != CheckResultStore.end())
- return itr->second;
- return nullptr;
+ auto it = CheckResultStore.find(Id);
+ ASSERT(it != CheckResultStore.end(), "Requested Warden result for invalid check ID %u", uint32(Id));
+ return it->second;
}
diff --git a/src/server/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h
index 9784740e7ac..bee75667095 100644
--- a/src/server/game/Warden/WardenCheckMgr.h
+++ b/src/server/game/Warden/WardenCheckMgr.h
@@ -18,61 +18,69 @@
#ifndef _WARDENCHECKMGR_H
#define _WARDENCHECKMGR_H
-#include