mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-22 21:26:23 +00:00
feat(Core/Warden): optimization + PQR detection (#3875)
* Update AuctionHouseHandler.cpp * feat(warden): block PQR * wip * Update Warden.cpp * Core/Warden: minor preperation * Core/Misc: implemented some needed container wrapper functions * Core/Warden: more preperations * Core/Warden: more rework * LUA checks now are splitted to seperate config * LUA checks are always in front of queue * Fixed "Other" checks * Fixed PQR detection * Core/Warden: adjusted and optimized * Core/Warden: optimization * Core/Warden: more optimization * Core/Warden: use warden comments in ban reason * Core/Warden: more warden work * Core/Warden: more optimizations * Core/Warden: more refactors * Core/Warden: some more refactors + use default SHA definitions * Core/Warden: more refactoring * Core/Warden: fixed PQR detection again * Core/Warden: improved detection logging * Core/Misc: removed SmartEnums - we do not need it here + maybe should go as seperate commit * Core/Warden: fixed some warnings * Core/Warden: codestyle * Core/Warden: include warden check comment to console logs * Core/Warden: minor adjustment for previous commit * Core/Warden: fixed static analysis warning * Core/Warden: compilers, you're drunk this time... function is not unused... * Core/Warden: minor correction for logs * Core/Warden: one more improvement for logs * Core/Warden: added missing overrides * Core/Warden: some codestyle * Core/Misc: more codestyle * Core/Misc: more codestyle! * Core/Warden: restored default config options... (if you change it, change in core source too) * Core/Warden: addition to previous commit * DB/Warden: added EWT and WOWPlus checks (provided by lineagedr) * DB/Warden: addition to previous commit * fix: codestyle * Core/Warden: fixed build when extra logs are enabled in cmake Co-authored-by: Stefano Borzì <stefanoborzi32@gmail.com> Co-authored-by: Francesco Borzì <borzifrancesco@gmail.com>
This commit is contained in:
@@ -19,11 +19,6 @@ WardenCheckMgr::WardenCheckMgr()
|
||||
|
||||
WardenCheckMgr::~WardenCheckMgr()
|
||||
{
|
||||
for (uint16 i = 0; i < CheckStore.size(); ++i)
|
||||
delete CheckStore[i];
|
||||
|
||||
for (CheckResultContainer::iterator itr = CheckResultStore.begin(); itr != CheckResultStore.end(); ++itr)
|
||||
delete itr->second;
|
||||
}
|
||||
|
||||
WardenCheckMgr* WardenCheckMgr::instance()
|
||||
@@ -67,6 +62,13 @@ void WardenCheckMgr::LoadWardenChecks()
|
||||
|
||||
uint16 id = fields[0].GetUInt16();
|
||||
uint8 checkType = fields[1].GetUInt8();
|
||||
|
||||
if (checkType == LUA_EVAL_CHECK && id > 9999)
|
||||
{
|
||||
sLog->outError("sql.sql: Warden Lua check with id %u found in `warden_checks`. Lua checks may have four-digit IDs at most. Skipped.", id);
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string data = fields[2].GetString();
|
||||
std::string checkResult = fields[3].GetString();
|
||||
uint32 address = fields[4].GetUInt32();
|
||||
@@ -74,66 +76,96 @@ void WardenCheckMgr::LoadWardenChecks()
|
||||
std::string str = fields[6].GetString();
|
||||
std::string comment = fields[7].GetString();
|
||||
|
||||
WardenCheck* wardenCheck = new WardenCheck();
|
||||
wardenCheck->Type = checkType;
|
||||
wardenCheck->CheckId = id;
|
||||
WardenCheck &wardenCheck = CheckStore.at(id);
|
||||
wardenCheck.Type = checkType;
|
||||
wardenCheck.CheckId = id;
|
||||
|
||||
// Initialize action with default action from config
|
||||
wardenCheck->Action = WardenActions(sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION));
|
||||
|
||||
if (checkType == PAGE_CHECK_A || checkType == PAGE_CHECK_B || checkType == DRIVER_CHECK)
|
||||
wardenCheck.Action = sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_FAIL_ACTION);
|
||||
if (wardenCheck.Action > MAX_WARDEN_ACTION)
|
||||
{
|
||||
wardenCheck->Data.SetHexStr(data.c_str());
|
||||
int len = data.size() / 2;
|
||||
|
||||
if (wardenCheck->Data.GetNumBytes() < len)
|
||||
{
|
||||
uint8 temp[24];
|
||||
memset(temp, 0, len);
|
||||
memcpy(temp, wardenCheck->Data.AsByteArray().get(), wardenCheck->Data.GetNumBytes());
|
||||
std::reverse(temp, temp + len);
|
||||
wardenCheck->Data.SetBinary((uint8*)temp, len);
|
||||
}
|
||||
wardenCheck.Action = WARDEN_ACTION_BAN;
|
||||
}
|
||||
|
||||
if (checkType == MEM_CHECK || checkType == MODULE_CHECK)
|
||||
MemChecksIdPool.push_back(id);
|
||||
else
|
||||
OtherChecksIdPool.push_back(id);
|
||||
|
||||
if (checkType == MEM_CHECK || checkType == PAGE_CHECK_A || checkType == PAGE_CHECK_B || checkType == PROC_CHECK)
|
||||
{
|
||||
wardenCheck->Address = address;
|
||||
wardenCheck->Length = length;
|
||||
wardenCheck.Address = address;
|
||||
wardenCheck.Length = length;
|
||||
}
|
||||
|
||||
// PROC_CHECK support missing
|
||||
if (checkType == MEM_CHECK || checkType == MPQ_CHECK || checkType == LUA_STR_CHECK || checkType == DRIVER_CHECK || checkType == MODULE_CHECK)
|
||||
wardenCheck->Str = str;
|
||||
|
||||
CheckStore[id] = wardenCheck;
|
||||
if (checkType == MEM_CHECK || checkType == MPQ_CHECK || checkType == LUA_EVAL_CHECK || checkType == DRIVER_CHECK || checkType == MODULE_CHECK)
|
||||
{
|
||||
wardenCheck.Str = str;
|
||||
}
|
||||
|
||||
if (checkType == MPQ_CHECK || checkType == MEM_CHECK)
|
||||
{
|
||||
WardenCheckResult* wr = new WardenCheckResult();
|
||||
wr->Result.SetHexStr(checkResult.c_str());
|
||||
int len = checkResult.size() / 2;
|
||||
if (wr->Result.GetNumBytes() < len)
|
||||
WardenCheckResult wr;
|
||||
wr.Result.SetHexStr(checkResult.c_str());
|
||||
int len = static_cast<int>(checkResult.size()) / 2;
|
||||
if (wr.Result.GetNumBytes() < len)
|
||||
{
|
||||
uint8* temp = new uint8[len];
|
||||
memset(temp, 0, len);
|
||||
memcpy(temp, wr->Result.AsByteArray().get(), wr->Result.GetNumBytes());
|
||||
memcpy(temp, wr.Result.AsByteArray().get(), wr.Result.GetNumBytes());
|
||||
std::reverse(temp, temp + len);
|
||||
wr->Result.SetBinary((uint8*)temp, len);
|
||||
wr.Result.SetBinary((uint8*)temp, len);
|
||||
delete [] temp;
|
||||
}
|
||||
CheckResultStore[id] = wr;
|
||||
}
|
||||
|
||||
if (comment.empty())
|
||||
wardenCheck->Comment = "Undocumented Check";
|
||||
wardenCheck.Comment = "Undocumented Check";
|
||||
else
|
||||
wardenCheck->Comment = comment;
|
||||
wardenCheck.Comment = comment;
|
||||
|
||||
// Prepare check pools
|
||||
switch (checkType)
|
||||
{
|
||||
case MEM_CHECK:
|
||||
case MODULE_CHECK:
|
||||
{
|
||||
CheckIdPool[WARDEN_CHECK_MEM_TYPE].push_back(id);
|
||||
break;
|
||||
}
|
||||
case LUA_EVAL_CHECK:
|
||||
{
|
||||
if (wardenCheck.Length > WARDEN_MAX_LUA_CHECK_LENGTH)
|
||||
{
|
||||
sLog->outError("sql.sql: Found over-long Lua check for Warden check with id %u in `warden_checks`. Max length is %u. Skipped.", id, WARDEN_MAX_LUA_CHECK_LENGTH);
|
||||
continue;
|
||||
}
|
||||
|
||||
std::string str = fmt::sprintf("%04u", id);
|
||||
ASSERT(str.size() == 4);
|
||||
std::copy(str.begin(), str.end(), wardenCheck.IdStr.begin());
|
||||
|
||||
CheckIdPool[WARDEN_CHECK_LUA_TYPE].push_back(id);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
if (checkType == PAGE_CHECK_A || checkType == PAGE_CHECK_B || checkType == DRIVER_CHECK)
|
||||
{
|
||||
wardenCheck.Data.SetHexStr(data.c_str());
|
||||
int len = static_cast<int>(data.size()) / 2;
|
||||
|
||||
if (wardenCheck.Data.GetNumBytes() < len)
|
||||
{
|
||||
uint8 temp[24];
|
||||
memset(temp, 0, len);
|
||||
memcpy(temp, wardenCheck.Data.AsByteArray().get(), wardenCheck.Data.GetNumBytes());
|
||||
std::reverse(temp, temp + len);
|
||||
wardenCheck.Data.SetBinary((uint8*)temp, len);
|
||||
}
|
||||
}
|
||||
|
||||
CheckIdPool[WARDEN_CHECK_OTHER_TYPE].push_back(id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
@@ -164,8 +196,6 @@ void WardenCheckMgr::LoadWardenOverrides()
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
ACE_WRITE_GUARD(ACE_RW_Mutex, g, _checkStoreLock);
|
||||
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
@@ -181,7 +211,7 @@ void WardenCheckMgr::LoadWardenOverrides()
|
||||
sLog->outError("Warden check action override for non-existing check (ID: %u, action: %u), skipped", checkId, action);
|
||||
else
|
||||
{
|
||||
CheckStore[checkId]->Action = WardenActions(action);
|
||||
CheckStore.at(checkId).Action = WardenActions(action);
|
||||
++count;
|
||||
}
|
||||
} while (result->NextRow());
|
||||
@@ -190,18 +220,22 @@ void WardenCheckMgr::LoadWardenOverrides()
|
||||
sLog->outString();
|
||||
}
|
||||
|
||||
WardenCheck* WardenCheckMgr::GetWardenDataById(uint16 Id)
|
||||
WardenCheck const* WardenCheckMgr::GetWardenDataById(uint16 Id)
|
||||
{
|
||||
if (Id < CheckStore.size())
|
||||
return CheckStore[Id];
|
||||
return &CheckStore.at(Id);
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
WardenCheckResult* WardenCheckMgr::GetWardenResultById(uint16 Id)
|
||||
WardenCheckResult const* WardenCheckMgr::GetWardenResultById(uint16 Id)
|
||||
{
|
||||
CheckResultContainer::const_iterator itr = CheckResultStore.find(Id);
|
||||
if (itr != CheckResultStore.end())
|
||||
return itr->second;
|
||||
{
|
||||
return &itr->second;
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user