Properly tokenize netconsole input

Use the command tokenizer class.
This commit is contained in:
Kawe Mazidjatari 2023-08-04 15:35:20 +02:00
parent 568f88040e
commit e7420a26af
2 changed files with 31 additions and 29 deletions

View File

@ -26,6 +26,7 @@ CNetCon::CNetCon(void)
, m_bPromptConnect(true) , m_bPromptConnect(true)
, m_flTickInterval(0.05f) , m_flTickInterval(0.05f)
{ {
CharacterSetBuild(&m_CharacterSet, "");
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -122,31 +123,33 @@ void CNetCon::UserInput(void)
} }
std::lock_guard<std::mutex> l(m_Mutex); std::lock_guard<std::mutex> l(m_Mutex);
if (IsConnected()) if (IsConnected())
{ {
if (m_Input.compare("disconnect") == 0) CCommand cmd;
cmd.Tokenize(m_Input.c_str());
if (V_strcmp(cmd.Arg(0), "disconnect") == 0)
{ {
Disconnect("user closed connection"); Disconnect("user closed connection");
return; return;
} }
// !TODO[ AMOS ]: Swap out with CCommand!
const vector<string> vSubStrings = StringSplit(m_Input, ' ', 2);
vector<char> vecMsg; vector<char> vecMsg;
const SocketHandle_t hSocket = GetSocket(); const SocketHandle_t hSocket = GetSocket();
bool bSend = false; bool bSend = false;
if (vSubStrings.size() > 1) if (cmd.ArgC() > 1)
{ {
if (vSubStrings[0].compare("PASS") == 0) // Auth with RCON server. if (V_strcmp(cmd.Arg(0), "PASS") == 0) // Auth with RCON server.
{ {
bSend = Serialize(vecMsg, vSubStrings[1].c_str(), "", bSend = Serialize(vecMsg, cmd.Arg(1), "",
cl_rcon::request_t::SERVERDATA_REQUEST_AUTH); cl_rcon::request_t::SERVERDATA_REQUEST_AUTH);
} }
else // Execute command query. else // Execute command query.
{ {
bSend = Serialize(vecMsg, m_Input.c_str(), "", bSend = Serialize(vecMsg, cmd.Arg(0), cmd.GetCommandString(),
cl_rcon::request_t::SERVERDATA_REQUEST_EXECCOMMAND); cl_rcon::request_t::SERVERDATA_REQUEST_EXECCOMMAND);
} }
} }
@ -165,34 +168,30 @@ void CNetCon::UserInput(void)
} }
else // Setup connection from input. else // Setup connection from input.
{ {
const vector<string> vSubStrings = StringSplit(m_Input, ' ', 2); CCommand cmd;
if (vSubStrings.size() > 1) cmd.Tokenize(m_Input.c_str(), cmd_source_t::kCommandSrcCode, &m_CharacterSet);
if (cmd.ArgC() > 1)
{ {
const string::size_type nPos = m_Input.find(' '); const char* inAddr = cmd.Arg(0);
if (nPos > 0 const char* inPort = cmd.Arg(1);
&& nPos < m_Input.size()
&& nPos != m_Input.size()) if (!*inAddr || !*inPort)
{ {
string svInPort = m_Input.substr(nPos + 1); Warning(eDLL_T::CLIENT, "No IP address or port provided\n");
string svInAdr = m_Input.erase(m_Input.find(' ')); m_bPromptConnect = true;
return;
}
if (svInPort.empty() || svInAdr.empty()) if (!Connect(inAddr, atoi(inPort)))
{ {
Warning(eDLL_T::CLIENT, "No IP address or port provided\n"); m_bPromptConnect = true;
m_bPromptConnect = true; return;
return;
}
if (!Connect(svInAdr.c_str(), atoi(svInPort.c_str())))
{
m_bPromptConnect = true;
return;
}
} }
} }
else // Initialize as [ip]:port. else
{ {
if (m_Input.empty() || !Connect(m_Input.c_str())) if (!Connect(cmd.GetCommandString()))
{ {
m_bPromptConnect = true; m_bPromptConnect = true;
return; return;

View File

@ -4,6 +4,7 @@
// //
//===========================================================================// //===========================================================================//
#pragma once #pragma once
#include "tier1/cmd.h"
#include "protoc/cl_rcon.pb.h" #include "protoc/cl_rcon.pb.h"
#include "protoc/sv_rcon.pb.h" #include "protoc/sv_rcon.pb.h"
#include "engine/shared/base_rcon.h" #include "engine/shared/base_rcon.h"
@ -42,6 +43,8 @@ private:
bool m_bPromptConnect; bool m_bPromptConnect;
float m_flTickInterval; float m_flTickInterval;
characterset_t m_CharacterSet;
std::string m_Input; std::string m_Input;
mutable std::mutex m_Mutex; mutable std::mutex m_Mutex;
}; };