From f04f4e91ff3afbf89f30659b85e8593c3206138e 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 --- src/server/game/Server/WorldSession.cpp | 6 ++---- 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 ++ 7 files changed, 40 insertions(+), 6 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 64e909e8e7c..bded746ed5f 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -115,7 +115,6 @@ WorldSession::WorldSession(uint32 id, std::string&& name, std::shared_ptr(); _warden->Init(this, k); } else if (os == "OSX") { // Disabled as it is causing the client to crash - // _warden = new WardenMac(); + // _warden = std::make_unique(); // _warden->Init(this, k); } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 9c132c39e0d..3553c549c68 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -32,6 +32,7 @@ #include "SharedDefines.h" #include #include +#include #include #include @@ -429,6 +430,8 @@ class TC_GAME_API WorldSession uint8 Expansion() const { return m_expansion; } void InitWarden(SessionKey const& k, std::string const& os); + Warden* GetWarden() { return _warden.get(); } + Warden const* GetWarden() const { return _warden.get(); } /// Session in auth.queue currently void SetInQueue(bool state) { m_inQueue = state; } @@ -1167,7 +1170,7 @@ class TC_GAME_API WorldSession uint8 m_expansion; // 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 b25d6322c2c..60d0267175e 100644 --- a/src/server/game/Warden/WardenWin.cpp +++ b/src/server/game/Warden/WardenWin.cpp @@ -476,3 +476,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; -- cgit v1.2.3