aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Warden/Warden.cpp
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2020-08-21 01:19:28 +0200
committerShauren <shauren.trinity@gmail.com>2022-02-04 00:27:11 +0100
commitc6582096ab0d80d67bbbe055468f1ca3e3ab9b2b (patch)
tree5a0abeeae6b9a9bbaa1d7fe7423dfca163bed7eb /src/server/game/Warden/Warden.cpp
parentb5d0a94ead71290ac5701ea21b4a507d16f00182 (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.cpp26
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())