aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
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 /src/server/game
parent222b0c16a4b6bd7e06edb68bb76df1556c8668ad (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.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
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;