From 6bb622314e55fe011b9ee51453a497af6acd04a3 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Wed, 19 Jul 2023 02:16:06 +0200 Subject: [PATCH] Improve persona name validations Move all server convars out of the EbisuSDK lib, the min/max name len are now parameterized. This also makes it possible to use the code on the client if ever needed. --- r5dev/ebisusdk/EbisuSDK.cpp | 12 +++--------- r5dev/ebisusdk/EbisuSDK.h | 2 +- r5dev/engine/server/server.cpp | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/r5dev/ebisusdk/EbisuSDK.cpp b/r5dev/ebisusdk/EbisuSDK.cpp index 4f19f94c..a87115a5 100644 --- a/r5dev/ebisusdk/EbisuSDK.cpp +++ b/r5dev/ebisusdk/EbisuSDK.cpp @@ -1,5 +1,4 @@ #include "core/stdafx.h" -#include "tier1/cvar.h" #include "ebisusdk/EbisuSDK.h" #include "engine/server/sv_main.h" @@ -44,17 +43,12 @@ bool IsOriginInitialized() // Input : *pszName - // Output : true on success, false on failure //----------------------------------------------------------------------------- -bool IsValidPersonaName(const char* pszName) +bool IsValidPersonaName(const char* pszName, int nMinLen, int nMaxLen) { - if (!sv_validatePersonaName->GetBool()) - { - return true; - } - size_t len = strlen(pszName); - if (len < sv_minPersonaNameLength->GetInt() || - len > sv_maxPersonaNameLength->GetInt()) + if (len < nMinLen || + len > nMaxLen) { return false; } diff --git a/r5dev/ebisusdk/EbisuSDK.h b/r5dev/ebisusdk/EbisuSDK.h index 384c8a54..e1f91265 100644 --- a/r5dev/ebisusdk/EbisuSDK.h +++ b/r5dev/ebisusdk/EbisuSDK.h @@ -19,7 +19,7 @@ inline bool* g_EbisuProfileInit = nullptr; /////////////////////////////////////////////////////////////////////////////// void HEbisuSDK_Init(); bool IsOriginInitialized(); -bool IsValidPersonaName(const char* pszName); +bool IsValidPersonaName(const char* pszName, int nMinLen, int nMaxLen); /////////////////////////////////////////////////////////////////////////////// class VEbisuSDK : public IDetour diff --git a/r5dev/engine/server/server.cpp b/r5dev/engine/server/server.cpp index 6a355f14..2242269b 100644 --- a/r5dev/engine/server/server.cpp +++ b/r5dev/engine/server/server.cpp @@ -105,8 +105,24 @@ CClient* CServer::ConnectClient(CServer* pServer, user_creds_s* pChallenge) DevMsg(eDLL_T::SERVER, "Processing connectionless challenge for '[%s]:%i' ('%llu')\n", pszAddresBuffer, nPort, nNucleusID); + bool bValidName = false; + + if (VALID_CHARSTAR(pszPersonaName) && + V_IsValidUTF8(pszPersonaName)) + { + if (sv_validatePersonaName->GetBool() && + !IsValidPersonaName(pszPersonaName, sv_minPersonaNameLength->GetInt(), sv_maxPersonaNameLength->GetInt())) + { + bValidName = false; + } + else + { + bValidName = true; + } + } + // Only proceed connection if the client's name is valid and UTF-8 encoded. - if (!VALID_CHARSTAR(pszPersonaName) || !V_IsValidUTF8(pszPersonaName) || !IsValidPersonaName(pszPersonaName)) + if (!bValidName) { pServer->RejectConnection(pServer->m_Socket, &pChallenge->netAdr, "#Valve_Reject_Invalid_Name"); if (bEnableLogging)