aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-08-19 00:25:44 +0200
committerGitHub <noreply@github.com>2020-08-19 00:25:44 +0200
commitf04f4e91ff3afbf89f30659b85e8593c3206138e (patch)
tree8a51d515d866297d5cf88afd9d630eb50daae8f9
parent24a494398fec5ff5044d980915a47ab3457ddaca (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.sql6
-rw-r--r--src/server/game/Server/WorldSession.cpp6
-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.cpp25
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)