summaryrefslogtreecommitdiff
path: root/tracker/AdminServer/banlist.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /tracker/AdminServer/banlist.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'tracker/AdminServer/banlist.cpp')
-rw-r--r--tracker/AdminServer/banlist.cpp241
1 files changed, 241 insertions, 0 deletions
diff --git a/tracker/AdminServer/banlist.cpp b/tracker/AdminServer/banlist.cpp
new file mode 100644
index 0000000..bbd6929
--- /dev/null
+++ b/tracker/AdminServer/banlist.cpp
@@ -0,0 +1,241 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: defines a RCon class used to send rcon commands to remote servers
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "banlist.h"
+#include "Iresponse.h"
+
+#include "PlayerMsgHandler.h"
+#include "Socket.h"
+#include "proto_oob.h"
+#include "DialogGameInfo.h"
+#include "inetapi.h"
+#include "TokenLine.h"
+#include "dialogkickplayer.h"
+
+extern void v_strncpy(char *dest, const char *src, int bufsize);
+
+typedef enum
+{
+ NONE = 0,
+ INFO_REQUESTED,
+ INFO_RECEIVED
+} RCONSTATUS;
+
+CBanList::CBanList(IResponse *target,serveritem_t &server, const char *rconPassword) {
+
+ memcpy(&m_Server, &server,sizeof(serveritem_t));
+ m_pResponseTarget=target;
+
+ m_bIsRefreshing=false;
+ m_bNewBanList=false;
+ m_bRconFailed=false;
+ m_bGotIPs = false;
+
+ v_strncpy(m_szRconPassword,rconPassword,100);
+
+ m_pRcon = new CRcon(this , server,rconPassword);
+ m_BanList=NULL;
+}
+
+CBanList::~CBanList() {
+ delete m_pRcon;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: sends a status query packet to a single server
+//-----------------------------------------------------------------------------
+void CBanList::SendQuery()
+{
+ // now use "rcon status" to pull the list of bans
+ m_pRcon->SendRcon("listid");
+ m_bGotIPs=false;
+}
+
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBanList::RunFrame()
+{
+ if(m_pRcon)
+ {
+ m_pRcon->RunFrame();
+ }
+
+}
+
+
+void CBanList::ServerResponded()
+{
+
+ if(m_bGotIPs == false)
+ {
+ m_BanList.RemoveAll();
+
+ const char *rconResp = m_pRcon->RconResponse();
+ const char *cur = strstr(rconResp,"UserID filter list:")
+ + strlen("UserID filter list:");
+
+ if( (unsigned int)cur == strlen("UserID filter list:"))
+ // if strstr returned NULL and we added a strlen to it...
+ {
+ cur=NULL;
+ }
+ // listid format:
+ // UserID filter list:
+ // 1 23434 : 20.000 min
+
+ // and on empty it produces:
+ // IP filter list: empty
+
+ while(cur!=NULL)
+ {
+
+ TokenLine banLine;
+ cur++; // dodge the newline
+ banLine.SetLine(cur); // need to add one here, to remove the "\n"
+ if(banLine.CountToken() >= 4 )
+ {
+ Bans_t ban;
+
+ memset(&ban,0x0,sizeof(Bans_t));
+
+ v_strncpy(ban.name,banLine.GetToken(1),20);
+ sscanf(banLine.GetToken(3),"%f",&ban.time);
+ ban.type= ID;
+ m_BanList.AddToTail(ban);
+
+ }
+ cur=strchr(cur,'\n');
+
+ }
+
+ m_bGotIPs=true;
+
+ // now find out the list of banned ips
+ m_pRcon->SendRcon("listip");
+ }
+ else
+ {
+
+ // listip format:
+ // IP filter list:
+ //192.168. 1. 66 : 20.000 min
+
+ const char *rconResp = m_pRcon->RconResponse();
+ const char *cur = strstr(rconResp,"IP filter list:")
+ + strlen("IP filter list:");
+
+ if( (unsigned int)cur == strlen("IP filter list:"))
+ // if strstr returned NULL and we added a strlen to it...
+ {
+ cur=NULL;
+ }
+
+
+ while(cur!=NULL)
+ {
+
+ char tmpStr[512];
+ Bans_t ban;
+
+ cur++; // dodge past the newline
+ v_strncpy(tmpStr,cur,512);
+
+ memset(&ban,0x0,sizeof(Bans_t));
+
+ if( strchr(tmpStr,':') != NULL )
+ {
+ char *time;
+ time = strchr(tmpStr,':')+1;
+ tmpStr[strchr(tmpStr,':')-tmpStr]=0;
+
+ v_strncpy(ban.name,tmpStr,20);
+ unsigned int i=0;
+ while(i<strlen(ban.name)) // strip all the white space out...
+ {
+ if( ban.name[i]==' ')
+ {
+ strcpy(&ban.name[i],&ban.name[i+1]);
+ }
+ else
+ {
+ i++;
+ }
+ }
+
+ sscanf(time,"%f",&ban.time);
+ ban.type= IP;
+ m_BanList.AddToTail(ban);
+
+ }
+ cur=strchr(cur,'\n');
+
+ }
+
+ m_bNewBanList=true;
+ m_bIsRefreshing=false;
+
+
+
+
+ // notify the UI of the new server info
+ m_pResponseTarget->ServerResponded();
+ }
+
+}
+
+void CBanList::ServerFailedToRespond()
+{
+ m_bNewBanList=true;
+ m_bIsRefreshing=false;
+
+ if(m_bRconFailed==false)
+ {
+ m_bRconFailed=true;
+ // CDialogKickPlayer *box = new CDialogKickPlayer();
+ //box->addActionSignalTarget(this);
+ // box->Activate("","Bad Rcon Password","badrcon");
+ }
+
+// m_pResponseTarget->ServerFailedToRespond();
+}
+
+void CBanList::Refresh()
+{
+ SendQuery();
+}
+
+bool CBanList::IsRefreshing()
+{
+ return m_bIsRefreshing;
+}
+
+serveritem_t &CBanList::GetServer()
+{
+ return m_Server;
+}
+
+
+bool CBanList::NewBanList()
+{
+ return m_bNewBanList;
+}
+
+CUtlVector<Bans_t> *CBanList::GetBanList()
+{
+ m_bNewBanList=false;
+ return &m_BanList;
+}
+
+void CBanList::SetPassword(const char *newPass)
+{
+ m_pRcon->SetPassword(newPass);
+ m_bRconFailed=false;
+} \ No newline at end of file