aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-08-19 00:25:44 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-02 22:47:55 +0100
commiteaa3c7e5a07802916ab00dd74aac6e0eb9cde957 (patch)
tree12328ce2993479f82c9fdf4f29c365d4cbd4d865
parent222b0c16a4b6bd7e06edb68bb76df1556c8668ad (diff)
Core/Warden: Add .debug warden force, allowing you to force specific warden checks to be sent
(cherry picked from commit f04f4e91ff3afbf89f30659b85e8593c3206138e)
-rw-r--r--sql/updates/world/master/2022_02_02_11_world_2020_08_18_06_world.sql6
-rw-r--r--src/server/game/Server/WorldSession.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h5
-rw-r--r--src/server/game/Warden/Warden.h2
-rw-r--r--src/server/game/Warden/WardenCheckMgr.h2
-rw-r--r--src/server/game/Warden/WardenMac.h1
-rw-r--r--src/server/game/Warden/WardenWin.cpp28
-rw-r--r--src/server/game/Warden/WardenWin.h2
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp23
9 files changed, 68 insertions, 5 deletions
diff --git a/sql/updates/world/master/2022_02_02_11_world_2020_08_18_06_world.sql b/sql/updates/world/master/2022_02_02_11_world_2020_08_18_06_world.sql
new file mode 100644
index 00000000000..e1c80df1475
--- /dev/null
+++ b/sql/updates/world/master/2022_02_02_11_world_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 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;
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 <fstream>
@@ -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<ChatCommand> debugWardenCommandTable =
+ {
+ { "force", rbac::RBAC_PERM_COMMAND_DEBUG, true, &HandleDebugWardenForce, "" }
+ };
static std::vector<ChatCommand> 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<ChatCommand> commandTable =
@@ -1701,6 +1707,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)