diff options
author | Treeston <treeston.mmoc@gmail.com> | 2020-08-19 00:25:44 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-19 00:25:44 +0200 |
commit | f04f4e91ff3afbf89f30659b85e8593c3206138e (patch) | |
tree | 8a51d515d866297d5cf88afd9d630eb50daae8f9 | |
parent | 24a494398fec5ff5044d980915a47ab3457ddaca (diff) |
Core/Warden: Add .debug warden force, allowing you to force specific warden checks to be sent
-rw-r--r-- | sql/updates/world/3.3.5/2020_08_18_06_world.sql | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 6 | ||||
-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 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_debug.cpp | 25 |
9 files changed, 70 insertions, 7 deletions
diff --git a/sql/updates/world/3.3.5/2020_08_18_06_world.sql b/sql/updates/world/3.3.5/2020_08_18_06_world.sql new file mode 100644 index 00000000000..e1c80df1475 --- /dev/null +++ b/sql/updates/world/3.3.5/2020_08_18_06_world.sql @@ -0,0 +1,6 @@ +-- +DELETE FROM `command` WHERE `name`='debug warden force'; +INSERT INTO `command` (`name`,`permission`,`help`) VALUES +('debug warden force', 300, 'Syntax: .debug warden force id1 [id2 [id3 [...]]] + +Queues the specified Warden checks for your client. They will be sent according to your Warden settings.'); 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<WorldS _accountId(id), _accountName(std::move(name)), m_expansion(expansion), - _warden(nullptr), _logoutTime(0), m_inQueue(false), m_playerLoading(false), @@ -164,7 +163,6 @@ WorldSession::~WorldSession() m_Socket = nullptr; } - delete _warden; delete _RBACData; ///- empty incoming packet queue @@ -1215,13 +1213,13 @@ void WorldSession::InitWarden(SessionKey const& k, std::string const& os) { if (os == "Win") { - _warden = new WardenWin(); + _warden = std::make_unique<WardenWin>(); _warden->Init(this, k); } else if (os == "OSX") { // Disabled as it is causing the client to crash - // _warden = new WardenMac(); + // _warden = std::make_unique<WardenMac>(); // _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 <string> #include <map> +#include <memory> #include <unordered_map> #include <boost/circular_buffer.hpp> @@ -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> _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 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<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; diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 4b12e66407e..6ce53150238 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -43,6 +43,7 @@ EndScriptData */ #include "RBAC.h" #include "SpellMgr.h" #include "Transport.h" +#include "Warden.h" #include "World.h" #include <fstream> #include <limits> @@ -83,6 +84,10 @@ public: { "memoryleak", rbac::RBAC_PERM_COMMAND_DEBUG_ASAN, true, &HandleDebugMemoryLeak, "" }, { "outofbounds", rbac::RBAC_PERM_COMMAND_DEBUG_ASAN, true, &HandleDebugOutOfBounds, "" }, }; + static std::vector<ChatCommand> debugWardenCommandTable = + { + { "force", rbac::RBAC_PERM_COMMAND_DEBUG, true, &HandleDebugWardenForce, "" } + }; static std::vector<ChatCommand> debugCommandTable = { { "setbit", rbac::RBAC_PERM_COMMAND_DEBUG_SETBIT, false, &HandleDebugSet32BitCommand, "" }, @@ -121,7 +126,8 @@ public: { "asan", rbac::RBAC_PERM_COMMAND_DEBUG_ASAN, true, nullptr, "", debugAsanCommandTable }, { "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, "" } + { "questreset", rbac::RBAC_PERM_COMMAND_DEBUG_QUESTRESET, true, &HandleDebugQuestResetCommand, "" }, + { "warden", rbac::RBAC_PERM_COMMAND_DEBUG, true, nullptr, "", debugWardenCommandTable } }; static std::vector<ChatCommand> commandTable = { @@ -1725,6 +1731,23 @@ public: return true; } + static bool HandleDebugWardenForce(ChatHandler* handler, std::vector<uint16> 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<uint32> mapId) { if (mapId) |