diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2020-08-19 00:25:44 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-02-02 22:47:55 +0100 |
| commit | eaa3c7e5a07802916ab00dd74aac6e0eb9cde957 (patch) | |
| tree | 12328ce2993479f82c9fdf4f29c365d4cbd4d865 /src/server/game | |
| parent | 222b0c16a4b6bd7e06edb68bb76df1556c8668ad (diff) | |
Core/Warden: Add .debug warden force, allowing you to force specific warden checks to be sent
(cherry picked from commit f04f4e91ff3afbf89f30659b85e8593c3206138e)
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Server/WorldSession.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Server/WorldSession.h | 5 | ||||
| -rw-r--r-- | src/server/game/Warden/Warden.h | 2 | ||||
| -rw-r--r-- | src/server/game/Warden/WardenCheckMgr.h | 2 | ||||
| -rw-r--r-- | src/server/game/Warden/WardenMac.h | 1 | ||||
| -rw-r--r-- | src/server/game/Warden/WardenWin.cpp | 28 | ||||
| -rw-r--r-- | src/server/game/Warden/WardenWin.h | 2 |
7 files changed, 39 insertions, 5 deletions
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<uint8>(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<WardenWin>(); _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 <boost/circular_buffer.hpp> #include <array> #include <map> +#include <memory> #include <unordered_map> #include <unordered_set> @@ -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> _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<uint16> 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<WardenCheck> CheckStore; - std::unordered_map<uint32, WardenCheckResult> CheckResultStore; + std::unordered_map<uint16, WardenCheckResult> CheckResultStore; std::vector<uint16> MemChecksIdPool; std::vector<uint16> 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<uint16> 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<uint16> const& checks) +{ + std::vector<uint16>::iterator memChecksIt = _memChecks.begin(); + std::vector<uint16>::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<uint16> const& checks) override; + private: uint32 _serverTicks; std::vector<uint16> _memChecks; |
