aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Warden/WardenWin.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/WardenWin.cpp
parentb5d0a94ead71290ac5701ea21b4a507d16f00182 (diff)
Core/Warden: Add Lua checks to Warden (PR #25286)
(cherry picked from commit 0531463a3c02d98ed77e9c7689ad7237ecaddc09)
Diffstat (limited to 'src/server/game/Warden/WardenWin.cpp')
-rw-r--r--src/server/game/Warden/WardenWin.cpp46
1 files changed, 25 insertions, 21 deletions
diff --git a/src/server/game/Warden/WardenWin.cpp b/src/server/game/Warden/WardenWin.cpp
index 92e77378198..dcee3ba2a3a 100644
--- a/src/server/game/Warden/WardenWin.cpp
+++ b/src/server/game/Warden/WardenWin.cpp
@@ -37,6 +37,14 @@
#include "WorldSession.h"
#include <sstream>
+ // GUILD is the shortest string that has no client validation (RAID only sends if in a raid group)
+static constexpr char _luaEvalPrefix[] = "local S,T,R=SendAddonMessage,function()";
+static constexpr char _luaEvalMidfix[] = " end R=S and T()if R then S('_TW',";
+static constexpr char _luaEvalPostfix[] = ",'GUILD')end";
+
+static_assert((sizeof(_luaEvalPrefix)-1 + sizeof(_luaEvalMidfix)-1 + sizeof(_luaEvalPostfix)-1 + WARDEN_MAX_LUA_CHECK_LENGTH) == 255);
+
+
WardenWin::WardenWin() : Warden(), _serverTicks(0)
{
for (WardenCheckCategory category : EnumUtils::Iterate<WardenCheckCategory>())
@@ -104,7 +112,7 @@ void WardenWin::InitializeModule()
Request.Unk3 = 4;
Request.Unk4 = 0;
Request.String_library2 = 0;
- Request.Function2 = 0x00419D40; // 0x00400000 + 0x00419D40 FrameScript::GetText
+ Request.Function2 = 0x00419210; // 0x00400000 + 0x00419210 FrameScript::Execute
Request.Function2_set = 1;
Request.CheckSumm2 = BuildChecksum(&Request.Unk3, 8);
@@ -213,7 +221,16 @@ void WardenWin::RequestChecks()
uint16 const id = *(checksIt++);
WardenCheck const& check = sWardenCheckMgr->GetCheckData(id);
- if (!check.Str.empty())
+ if (check.Type == LUA_EVAL_CHECK)
+ {
+ buff << uint8(sizeof(_luaEvalPrefix)-1 + check.Str.size() + sizeof(_luaEvalMidfix)-1 + check.IdStr.size() + sizeof(_luaEvalPostfix)-1);
+ buff.append(_luaEvalPrefix, sizeof(_luaEvalPrefix)-1);
+ buff.append(check.Str.data(), check.Str.size());
+ buff.append(_luaEvalMidfix, sizeof(_luaEvalMidfix)-1);
+ buff.append(check.IdStr.data(), check.IdStr.size());
+ buff.append(_luaEvalPostfix, sizeof(_luaEvalPostfix)-1);
+ }
+ else if (!check.Str.empty())
{
buff << uint8(check.Str.size());
buff.append(check.Str.data(), check.Str.size());
@@ -255,7 +272,7 @@ void WardenWin::RequestChecks()
break;
}
case MPQ_CHECK:
- case LUA_STR_CHECK:
+ case LUA_EVAL_CHECK:
{
buff << uint8(index++);
break;
@@ -410,26 +427,13 @@ void WardenWin::HandleCheckResult(ByteBuffer &buff)
TC_LOG_DEBUG("warden", "RESULT %s passed CheckId %u account Id %u", EnumUtils::ToConstant(check.Type), id, _session->GetAccountId());
break;
}
- case LUA_STR_CHECK:
+ case LUA_EVAL_CHECK:
{
- uint8 Lua_Result;
- buff >> Lua_Result;
+ uint8 const result = buff.read<uint8>();
+ if (result == 0)
+ buff.read_skip(buff.read<uint8>()); // discard attached string
- if (Lua_Result == 0)
- {
- uint8 luaStrLen = buff.read<uint8>();
- if (luaStrLen != 0)
- {
- std::string str;
- str.resize(luaStrLen);
- buff.read(reinterpret_cast<uint8*>(str.data()), luaStrLen);
- TC_LOG_DEBUG("warden", "Lua string: %s", str.c_str());
- TC_LOG_DEBUG("warden", "RESULT LUA_STR_CHECK fail, CheckId %u account Id %u", id, _session->GetAccountId());
- checkFailed = id;
- continue;
- }
- }
- TC_LOG_DEBUG("warden", "RESULT LUA_STR_CHECK passed, CheckId %u account Id %u", id, _session->GetAccountId());
+ TC_LOG_DEBUG("warden", "LUA_EVAL_CHECK CheckId %u account Id %u got in-warden dummy response (%u)", id, _session->GetAccountId(), result);
break;
}
case MPQ_CHECK: