From eaa3c7e5a07802916ab00dd74aac6e0eb9cde957 Mon Sep 17 00:00:00 2001 From: Treeston Date: Wed, 19 Aug 2020 00:25:44 +0200 Subject: Core/Warden: Add .debug warden force, allowing you to force specific warden checks to be sent (cherry picked from commit f04f4e91ff3afbf89f30659b85e8593c3206138e) --- src/server/game/Server/WorldSession.cpp | 4 +--- src/server/game/Server/WorldSession.h | 5 ++++- src/server/game/Warden/Warden.h | 2 ++ src/server/game/Warden/WardenCheckMgr.h | 2 +- src/server/game/Warden/WardenMac.h | 1 + src/server/game/Warden/WardenWin.cpp | 28 ++++++++++++++++++++++++++++ src/server/game/Warden/WardenWin.h | 2 ++ src/server/scripts/Commands/cs_debug.cpp | 23 +++++++++++++++++++++++ 8 files changed, 62 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 2f71f2c9a45..c4b8bea8a33 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -119,7 +119,6 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun m_expansion(std::min(expansion, sWorld->getIntConfig(CONFIG_EXPANSION))), _os(os), _battlenetRequestToken(0), - _warden(nullptr), _logoutTime(0), m_inQueue(false), m_playerLogout(false), @@ -175,7 +174,6 @@ WorldSession::~WorldSession() } } - delete _warden; delete _RBACData; ///- empty incoming packet queue @@ -998,7 +996,7 @@ void WorldSession::InitWarden(SessionKey const& k) { if (_os == "Win") { - _warden = new WardenWin(); + _warden = std::make_unique(); _warden->Init(this, k); } else if (_os == "Wn64") diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 3e71131fff0..89f0038d6fc 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -1003,6 +1004,8 @@ class TC_GAME_API WorldSession std::string const& GetOS() const { return _os; } bool CanAccessAlliedRaces() const; + Warden* GetWarden() { return _warden.get(); } + Warden const* GetWarden() const { return _warden.get(); } void InitWarden(SessionKey const& k); @@ -1908,7 +1911,7 @@ class TC_GAME_API WorldSession uint32 _battlenetRequestToken; // Warden - Warden* _warden; // Remains NULL if Warden system is not enabled by config + std::unique_ptr _warden; // Remains NULL if Warden system is not enabled by config time_t _logoutTime; bool m_inQueue; // session wait in auth.queue diff --git a/src/server/game/Warden/Warden.h b/src/server/game/Warden/Warden.h index bcf3cd92122..d404622af17 100644 --- a/src/server/game/Warden/Warden.h +++ b/src/server/game/Warden/Warden.h @@ -92,6 +92,8 @@ class TC_GAME_API Warden void Update(uint32 diff); void HandleData(ByteBuffer& buff); + virtual size_t DEBUG_ForceSpecificChecks(std::vector const& checks) = 0; + protected: void DecryptData(uint8* buffer, uint32 length); void EncryptData(uint8* buffer, uint32 length); diff --git a/src/server/game/Warden/WardenCheckMgr.h b/src/server/game/Warden/WardenCheckMgr.h index bee75667095..bb269ce8cf8 100644 --- a/src/server/game/Warden/WardenCheckMgr.h +++ b/src/server/game/Warden/WardenCheckMgr.h @@ -78,7 +78,7 @@ class TC_GAME_API WardenCheckMgr private: std::vector CheckStore; - std::unordered_map CheckResultStore; + std::unordered_map CheckResultStore; std::vector MemChecksIdPool; std::vector OtherChecksIdPool; }; diff --git a/src/server/game/Warden/WardenMac.h b/src/server/game/Warden/WardenMac.h index d9fbf2a9870..9a8031d0a29 100644 --- a/src/server/game/Warden/WardenMac.h +++ b/src/server/game/Warden/WardenMac.h @@ -37,6 +37,7 @@ class TC_GAME_API WardenMac : public Warden void RequestHash() override; void HandleHashResult(ByteBuffer& buff) override; void RequestChecks() override; + size_t DEBUG_ForceSpecificChecks(std::vector const& /*checks*/) override { return 0; } void HandleCheckResult(ByteBuffer& buff) override; }; diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp index 4b14f448a08..9d83f9bbb97 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -477,3 +477,31 @@ void WardenWin::HandleCheckResult(ByteBuffer &buff) uint32 holdOff = sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_CHECK_HOLDOFF); _checkTimer = (holdOff < 1 ? 1 : holdOff) * IN_MILLISECONDS; } + +size_t WardenWin::DEBUG_ForceSpecificChecks(std::vector const& checks) +{ + std::vector::iterator memChecksIt = _memChecks.begin(); + std::vector::iterator otherChecksIt = _otherChecks.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()) + { + std::iter_swap(it, otherChecksIt); + ++otherChecksIt; + ++n; + } + } + + _memChecksIt = _memChecks.begin(); + _otherChecksIt = _otherChecks.begin(); + + return n; +} diff --git a/src/server/game/Warden/WardenWin.h b/src/server/game/Warden/WardenWin.h index e8bcbd56e9f..740bafbe4e3 100644 --- a/src/server/game/Warden/WardenWin.h +++ b/src/server/game/Warden/WardenWin.h @@ -75,6 +75,8 @@ class TC_GAME_API WardenWin : public Warden void RequestChecks() override; void HandleCheckResult(ByteBuffer &buff) override; + size_t DEBUG_ForceSpecificChecks(std::vector const& checks) override; + private: uint32 _serverTicks; std::vector _memChecks; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 09f14dae1d2..63f183d319e 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -50,6 +50,7 @@ EndScriptData */ #include "SpellMgr.h" #include "SpellPackets.h" #include "Transport.h" +#include "Warden.h" #include "World.h" #include "WorldSession.h" #include @@ -97,6 +98,10 @@ public: { "memoryleak", rbac::RBAC_PERM_COMMAND_DEBUG_ASAN, true, &HandleDebugMemoryLeak, "" }, { "outofbounds", rbac::RBAC_PERM_COMMAND_DEBUG_ASAN, true, &HandleDebugOutOfBounds, "" }, }; + static std::vector debugWardenCommandTable = + { + { "force", rbac::RBAC_PERM_COMMAND_DEBUG, true, &HandleDebugWardenForce, "" } + }; static std::vector debugCommandTable = { { "threat", rbac::RBAC_PERM_COMMAND_DEBUG_THREAT, false, &HandleDebugThreatListCommand, "" }, @@ -134,6 +139,7 @@ public: { "guidlimits", rbac::RBAC_PERM_COMMAND_DEBUG, true, &HandleDebugGuidLimitsCommand, "" }, { "objectcount", rbac::RBAC_PERM_COMMAND_DEBUG, true, &HandleDebugObjectCountCommand, "" }, { "questreset", rbac::RBAC_PERM_COMMAND_DEBUG_QUESTRESET, true, &HandleDebugQuestResetCommand, "" }, + { "warden", rbac::RBAC_PERM_COMMAND_DEBUG, true, nullptr, "", debugWardenCommandTable }, { "personalclone", rbac::RBAC_PERM_COMMAND_DEBUG, false, &HandleDebugBecomePersonalClone, "" } }; static std::vector commandTable = @@ -1701,6 +1707,23 @@ public: return true; } + static bool HandleDebugWardenForce(ChatHandler* handler, std::vector checkIds) + { + if (checkIds.empty()) + return false; + + Warden* const warden = handler->GetSession()->GetWarden(); + if (!warden) + { + handler->SendSysMessage("Warden system is not enabled"); + return true; + } + + size_t const nQueued = warden->DEBUG_ForceSpecificChecks(checkIds); + handler->PSendSysMessage("%zu/%zu checks queued for your Warden, they should be sent over the next few minutes (depending on settings)", nQueued, checkIds.size()); + return true; + } + static bool HandleDebugGuidLimitsCommand(ChatHandler* handler, Optional mapId) { if (mapId) -- cgit v1.2.3