diff options
author | Treeston <treeston.mmoc@gmail.com> | 2020-08-21 01:19:28 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-02-04 00:27:11 +0100 |
commit | c6582096ab0d80d67bbbe055468f1ca3e3ab9b2b (patch) | |
tree | 5a0abeeae6b9a9bbaa1d7fe7423dfca163bed7eb /src/server/game/Warden/Warden.cpp | |
parent | b5d0a94ead71290ac5701ea21b4a507d16f00182 (diff) |
Core/Warden: Add Lua checks to Warden (PR #25286)
(cherry picked from commit 0531463a3c02d98ed77e9c7689ad7237ecaddc09)
Diffstat (limited to 'src/server/game/Warden/Warden.cpp')
-rw-r--r-- | src/server/game/Warden/Warden.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 105460ca44b..1f27bda664a 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -31,6 +31,8 @@ #include <openssl/sha.h> #include <openssl/md5.h> +#include <charconv> + Warden::Warden() : _session(nullptr), _checkTimer(10 * IN_MILLISECONDS), _clientResponseTimer(0), _dataSent(false), _initialized(false) { @@ -254,6 +256,30 @@ void Warden::HandleData(ByteBuffer& buff) } } +bool Warden::ProcessLuaCheckResponse(std::string const& msg) +{ + static constexpr char WARDEN_TOKEN[] = "_TW\t"; + if (!StringStartsWith(msg, WARDEN_TOKEN)) + return false; + + uint16 id = 0; + std::from_chars(msg.data() + sizeof(WARDEN_TOKEN) - 1, msg.data() + msg.size(), id, 10); + if (id < sWardenCheckMgr->GetMaxValidCheckId()) + { + WardenCheck const& check = sWardenCheckMgr->GetCheckData(id); + if (check.Type == LUA_EVAL_CHECK) + { + char const* penalty = ApplyPenalty(&check); + TC_LOG_WARN("warden", "%s failed Warden check %u (%s). Action: %s", _session->GetPlayerInfo().c_str(), id, EnumUtils::ToConstant(check.Type), penalty); + return true; + } + } + + char const* penalty = ApplyPenalty(nullptr); + TC_LOG_WARN("warden", "%s sent bogus Lua check response for Warden. Action: %s", _session->GetPlayerInfo().c_str(), penalty); + return true; +} + void WorldSession::HandleWardenData(WorldPackets::Warden::WardenData& packet) { if (!_warden || packet.Data.empty()) |