From 23f37bfa5089de14d5718c0cecc0ff8c19f37005 Mon Sep 17 00:00:00 2001 From: Amos <48657826+Mauler125@users.noreply.github.com> Date: Thu, 24 Feb 2022 16:44:33 +0100 Subject: [PATCH] RCON QOL improvements --- r5dev/engine/sv_rcon.cpp | 10 ++++++++++ r5dev/engine/sv_rcon.h | 1 + r5dev/netconsole/netconsole.cpp | 10 +++++----- r5dev/tier0/cmd.cpp | 3 ++- r5dev/tier0/completion.cpp | 16 ++++++++++++++++ r5dev/tier0/completion.h | 1 + 6 files changed, 35 insertions(+), 6 deletions(-) diff --git a/r5dev/engine/sv_rcon.cpp b/r5dev/engine/sv_rcon.cpp index e9130381..b436a6df 100644 --- a/r5dev/engine/sv_rcon.cpp +++ b/r5dev/engine/sv_rcon.cpp @@ -247,6 +247,9 @@ void CRConServer::Authenticate(const cl_rcon::request& cl_request, CConnectedNet pData->m_bAuthorized = true; m_pSocket->CloseListenSocket(); this->CloseNonAuthConnection(); + + std::string svAuth = this->Serialize(s_pszAuthMessage, "", sv_rcon::response_t::SERVERDATA_RESPONSE_AUTH); + ::send(pData->m_hSocket, svAuth.c_str(), static_cast(svAuth.size()), MSG_NOSIGNAL); } else // Bad password. { @@ -430,6 +433,13 @@ bool CRConServer::CheckForBan(CConnectedNetConsoleData* pData) //----------------------------------------------------------------------------- void CRConServer::CloseConnection(void) // NETMGR { + CConnectedNetConsoleData* pData = m_pSocket->GetAcceptedSocketData(m_nConnIndex); + if (pData->m_bAuthorized) + { + // Inform server owner when authenticated connection has been closed. + CNetAdr2 netAdr2 = m_pSocket->GetAcceptedSocketAddress(m_nConnIndex); + DevMsg(eDLL_T::SERVER, "Net console '%s' closed RCON connection\n", netAdr2.GetIPAndPort().c_str()); + } m_pSocket->CloseAcceptedSocket(m_nConnIndex); } diff --git a/r5dev/engine/sv_rcon.h b/r5dev/engine/sv_rcon.h index 22ed27e3..b1adf930 100644 --- a/r5dev/engine/sv_rcon.h +++ b/r5dev/engine/sv_rcon.h @@ -7,6 +7,7 @@ constexpr char s_pszNoAuthMessage[] = "This server is password protected for console access. Must send 'PASS ' command.\n\r"; constexpr char s_pszWrongPwMessage[] = "Password incorrect.\n\r"; constexpr char s_pszBannedMessage[] = "Go away.\n\r"; +constexpr char s_pszAuthMessage[] = "RCON authentication succesfull.\n\r"; class CRConServer { diff --git a/r5dev/netconsole/netconsole.cpp b/r5dev/netconsole/netconsole.cpp index 47472f7a..43426432 100644 --- a/r5dev/netconsole/netconsole.cpp +++ b/r5dev/netconsole/netconsole.cpp @@ -24,7 +24,7 @@ bool CNetCon::Init(void) if (nError != 0) { - std::cerr << "Failed to start Winsock via WSAStartup: (" << NET_ErrorString(WSAGetLastError()) << ")." << std::endl; + std::cerr << "Failed to start Winsock via WSAStartup: (" << NET_ErrorString(WSAGetLastError()) << ")" << std::endl; return false; } @@ -48,7 +48,7 @@ bool CNetCon::Shutdown(void) int nError = ::WSACleanup(); if (nError != 0) { - std::cerr << "Failed to stop winsock via WSACleanup: (" << NET_ErrorString(WSAGetLastError()) << ")." << std::endl; + std::cerr << "Failed to stop winsock via WSACleanup: (" << NET_ErrorString(WSAGetLastError()) << ")" << std::endl; return false; } return true; @@ -241,7 +241,7 @@ void CNetCon::Send(const std::string& svMessage) const int nSendResult = ::send(m_pSocket->GetAcceptedSocketData(0)->m_hSocket, svMessage.c_str(), svMessage.size(), MSG_NOSIGNAL); if (nSendResult == SOCKET_ERROR) { - std::cout << "Failed to send message: (SOCKET_ERROR)." << std::endl; + std::cout << "Failed to send message: (SOCKET_ERROR)" << std::endl; } } @@ -261,7 +261,7 @@ void CNetCon::Recv(void) if (nPendingLen <= 0 && m_abConnEstablished) // EOF or error. { this->Disconnect(); - std::cout << "Server closed connection." << std::endl; + std::cout << "Server closed connection" << std::endl; return; } }////////////////////////////////////////////// @@ -277,7 +277,7 @@ void CNetCon::Recv(void) if (nRecvLen == 0 && m_abConnEstablished) // Socket was closed. { this->Disconnect(); - std::cout << "Server closed connection." << std::endl; + std::cout << "Server closed connection" << std::endl; break; } if (nRecvLen < 0 && !m_pSocket->IsSocketBlocking()) diff --git a/r5dev/tier0/cmd.cpp b/r5dev/tier0/cmd.cpp index 57ebfe67..e0356957 100644 --- a/r5dev/tier0/cmd.cpp +++ b/r5dev/tier0/cmd.cpp @@ -115,7 +115,8 @@ void ConCommand::Init(void) // CLIENT DLL | ConCommand* cl_showconsole = new ConCommand("cl_showconsole", "Opens the game console.", FCVAR_CLIENTDLL | FCVAR_RELEASE, _CGameConsole_f_CompletionFunc, nullptr); ConCommand* cl_showbrowser = new ConCommand("cl_showbrowser", "Opens the server browser.", FCVAR_CLIENTDLL | FCVAR_RELEASE, _CCompanion_f_CompletionFunc, nullptr); - ConCommand* rcon = new ConCommand("rcon", "Forward RCON query to remote server. | Usage: rcon \"\".", FCVAR_CLIENTDLL | FCVAR_RELEASE, _RCON_CmdQuery_f_CompletionFunc, nullptr); + ConCommand* rcon = new ConCommand("rcon", "Forward RCON query to remote server. | Usage: rcon \"\".", FCVAR_CLIENTDLL | FCVAR_RELEASE, _RCON_CmdQuery_f_CompletionFunc, nullptr); + ConCommand* rcon_disconnect = new ConCommand("rcon_disconnect", "Disconnect from RCON server.", FCVAR_CLIENTDLL | FCVAR_RELEASE, _RCON_Disconnect_f_CompletionFunc, nullptr); #endif // !DEDICATED //------------------------------------------------------------------------- // FILESYSTEM API | diff --git a/r5dev/tier0/completion.cpp b/r5dev/tier0/completion.cpp index 3bfaa29c..a32c4461 100644 --- a/r5dev/tier0/completion.cpp +++ b/r5dev/tier0/completion.cpp @@ -789,4 +789,20 @@ void _RCON_CmdQuery_f_CompletionFunc(CCommand* cmd) } } } + +/* +===================== +_RCON_CmdQuery_f_CompletionFunc + + Disconnect from RCON server +===================== +*/ +void _RCON_Disconnect_f_CompletionFunc(CCommand* cmd) +{ + if (g_pRConClient->IsConnected()) + { + g_pRConClient->Disconnect(); + DevMsg(eDLL_T::CLIENT, "User closed RCON connection\n"); + } +} #endif // !DEDICATED diff --git a/r5dev/tier0/completion.h b/r5dev/tier0/completion.h index 133e9a3b..54696b9a 100644 --- a/r5dev/tier0/completion.h +++ b/r5dev/tier0/completion.h @@ -35,6 +35,7 @@ void _NET_SetKey_f_CompletionFunc(CCommand* cmd); void _NET_GenerateKey_f_CompletionFunc(CCommand* cmd); #ifndef DEDICATED void _RCON_CmdQuery_f_CompletionFunc(CCommand* cmd); +void _RCON_Disconnect_f_CompletionFunc(CCommand* cmd); #endif // !DEDICATED ///////////////////////////////////////////////////////////////////////////////