You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
9.4 KiB
291 lines
9.4 KiB
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================
|
||
|
|
||
|
//#include "..\..\serverbrowser\pch_serverbrowser.h"
|
||
|
|
||
|
#undef _snprintf // needed since matchmakingtypes.h inlines a bare _snprintf
|
||
|
|
||
|
#include "convar.h"
|
||
|
#include "KeyValues.h"
|
||
|
#include "filesystem.h"
|
||
|
#include "steam/steamclientpublic.h"
|
||
|
#include "steam/matchmakingtypes.h"
|
||
|
#include <time.h>
|
||
|
#include "blacklisted_server_manager.h"
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CBlacklistedServerManager::CBlacklistedServerManager()
|
||
|
{
|
||
|
m_iNextServerID = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Reset the list of blacklisted servers to empty.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CBlacklistedServerManager::Reset( void )
|
||
|
{
|
||
|
m_Blacklist.RemoveAll();
|
||
|
m_iNextServerID = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Appends all the servers inside the specified file to the blacklist.
|
||
|
// Returns count of appended servers, zero for failure.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int CBlacklistedServerManager::LoadServersFromFile( const char *pszFilename, bool bResetTimes )
|
||
|
{
|
||
|
KeyValues *pKV = new KeyValues( "serverblacklist" );
|
||
|
if ( !pKV->LoadFromFile( g_pFullFileSystem, pszFilename, "MOD" ) )
|
||
|
return 0;
|
||
|
|
||
|
int count = 0;
|
||
|
|
||
|
for ( KeyValues *pData = pKV->GetFirstSubKey(); pData != NULL; pData = pData->GetNextKey() )
|
||
|
{
|
||
|
const char *pszName = pData->GetString( "name" );
|
||
|
|
||
|
uint32 ulDate = pData->GetInt( "date" );
|
||
|
if ( bResetTimes )
|
||
|
{
|
||
|
time_t today;
|
||
|
time( &today );
|
||
|
ulDate = today;
|
||
|
}
|
||
|
|
||
|
const char *pszNetAddr = pData->GetString( "addr" );
|
||
|
if ( pszNetAddr && pszNetAddr[0] && pszName && pszName[0] )
|
||
|
{
|
||
|
int iIdx = m_Blacklist.AddToTail();
|
||
|
|
||
|
m_Blacklist[iIdx].m_nServerID = m_iNextServerID++;
|
||
|
V_strncpy( m_Blacklist[iIdx].m_szServerName, pszName, sizeof( m_Blacklist[iIdx].m_szServerName ) );
|
||
|
m_Blacklist[iIdx].m_ulTimeBlacklistedAt = ulDate;
|
||
|
m_Blacklist[iIdx].m_NetAdr.SetFromString( pszNetAddr );
|
||
|
|
||
|
++count;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pKV->deleteThis();
|
||
|
|
||
|
return count;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: save blacklist to disk
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CBlacklistedServerManager::SaveToFile( const char *pszFilename )
|
||
|
{
|
||
|
KeyValues *pKV = new KeyValues( "serverblacklist" );
|
||
|
|
||
|
for ( int i = 0; i < m_Blacklist.Count(); i++ )
|
||
|
{
|
||
|
KeyValues *pSubKey = new KeyValues( "server" );
|
||
|
pSubKey->SetString( "name", m_Blacklist[i].m_szServerName );
|
||
|
pSubKey->SetInt( "date", m_Blacklist[i].m_ulTimeBlacklistedAt );
|
||
|
pSubKey->SetString( "addr", m_Blacklist[i].m_NetAdr.ToString() );
|
||
|
pKV->AddSubKey( pSubKey );
|
||
|
}
|
||
|
|
||
|
pKV->SaveToFile( g_pFullFileSystem, pszFilename, "MOD" );
|
||
|
|
||
|
pKV->deleteThis();
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Add the given server to the blacklist. Return added server.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
blacklisted_server_t *CBlacklistedServerManager::AddServer( gameserveritem_t &server )
|
||
|
{
|
||
|
// Make sure we don't already have this IP in the list somewhere
|
||
|
netadr_t netAdr( server.m_NetAdr.GetIP(), server.m_NetAdr.GetConnectionPort() );
|
||
|
|
||
|
// Don't let them add reserved addresses to their blacklists
|
||
|
if ( netAdr.IsReservedAdr() )
|
||
|
return NULL;
|
||
|
|
||
|
int iIdx = m_Blacklist.AddToTail();
|
||
|
V_strncpy( m_Blacklist[iIdx].m_szServerName, server.GetName(), sizeof( m_Blacklist[iIdx].m_szServerName ) );
|
||
|
|
||
|
time_t today;
|
||
|
time( &today );
|
||
|
m_Blacklist[iIdx].m_ulTimeBlacklistedAt = today;
|
||
|
m_Blacklist[iIdx].m_NetAdr = netAdr;
|
||
|
m_Blacklist[iIdx].m_nServerID = m_iNextServerID++;
|
||
|
|
||
|
return &m_Blacklist[iIdx];
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Add the given server to the blacklist. Return added server.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
blacklisted_server_t *CBlacklistedServerManager::AddServer( const char *serverName, uint32 serverIP, int serverPort )
|
||
|
{
|
||
|
netadr_t netAdr( serverIP, serverPort );
|
||
|
|
||
|
// Don't let them add reserved addresses to their blacklists
|
||
|
if ( netAdr.IsReservedAdr() )
|
||
|
return NULL;
|
||
|
|
||
|
int iIdx = m_Blacklist.AddToTail();
|
||
|
|
||
|
V_strncpy( m_Blacklist[iIdx].m_szServerName, serverName, sizeof( m_Blacklist[iIdx].m_szServerName ) );
|
||
|
|
||
|
time_t today;
|
||
|
time( &today );
|
||
|
m_Blacklist[iIdx].m_ulTimeBlacklistedAt = today;
|
||
|
|
||
|
m_Blacklist[iIdx].m_NetAdr = netAdr;
|
||
|
m_Blacklist[iIdx].m_nServerID = m_iNextServerID++;
|
||
|
|
||
|
return &m_Blacklist[iIdx];
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Add the given server to the blacklist. Return added server.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
blacklisted_server_t *CBlacklistedServerManager::AddServer( const char *serverName, const char *netAddressString, uint32 timestamp )
|
||
|
{
|
||
|
netadr_t netAdr( netAddressString );
|
||
|
|
||
|
// Don't let them add reserved addresses to their blacklists
|
||
|
if ( netAdr.IsReservedAdr() )
|
||
|
return NULL;
|
||
|
|
||
|
int iIdx = m_Blacklist.AddToTail();
|
||
|
|
||
|
V_strncpy( m_Blacklist[iIdx].m_szServerName, serverName, sizeof( m_Blacklist[iIdx].m_szServerName ) );
|
||
|
m_Blacklist[iIdx].m_ulTimeBlacklistedAt = timestamp;
|
||
|
m_Blacklist[iIdx].m_NetAdr = netAdr;
|
||
|
m_Blacklist[iIdx].m_nServerID = m_iNextServerID++;
|
||
|
|
||
|
return &m_Blacklist[iIdx];
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Remove server with matching 'server id' from list
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CBlacklistedServerManager::RemoveServer( int iServerID )
|
||
|
{
|
||
|
for ( int i = 0; i < m_Blacklist.Count(); i++ )
|
||
|
{
|
||
|
if ( m_Blacklist[i].m_nServerID == iServerID )
|
||
|
{
|
||
|
m_Blacklist.Remove(i);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Given a serverID, return its blacklist entry
|
||
|
//-----------------------------------------------------------------------------
|
||
|
blacklisted_server_t *CBlacklistedServerManager::GetServer( int iServerID )
|
||
|
{
|
||
|
for ( int i = 0; i < m_Blacklist.Count(); i++ )
|
||
|
{
|
||
|
if ( m_Blacklist[i].m_nServerID == iServerID )
|
||
|
return &m_Blacklist[i];
|
||
|
}
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Returns true if given server is blacklisted
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CBlacklistedServerManager::IsServerBlacklisted( const gameserveritem_t &server ) const
|
||
|
{
|
||
|
return IsServerBlacklisted( server.m_NetAdr.GetIP(), server.m_NetAdr.GetConnectionPort(), server.GetName() );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Returns true if given server is blacklisted
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CBlacklistedServerManager::IsServerBlacklisted( uint32 serverIP, int serverPort, const char *serverName ) const
|
||
|
{
|
||
|
netadr_t netAdr( serverIP, serverPort );
|
||
|
|
||
|
ConVarRef sb_showblacklists( "sb_showblacklists" );
|
||
|
|
||
|
for ( int i = 0; i < m_Blacklist.Count(); i++ )
|
||
|
{
|
||
|
if ( m_Blacklist[i].m_NetAdr.ip[3] == 0 )
|
||
|
{
|
||
|
if ( m_Blacklist[i].m_NetAdr.CompareClassCAdr( netAdr ) )
|
||
|
{
|
||
|
if ( sb_showblacklists.IsValid() && sb_showblacklists.GetBool() )
|
||
|
{
|
||
|
Msg( "Blacklisted '%s' (%s), due to rule '%s' (Class C).\n", serverName, netAdr.ToString(), m_Blacklist[i].m_NetAdr.ToString() );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ( m_Blacklist[i].m_NetAdr.CompareAdr( netAdr, (m_Blacklist[i].m_NetAdr.GetPort() == 0) ) )
|
||
|
{
|
||
|
if ( sb_showblacklists.IsValid() && sb_showblacklists.GetBool() )
|
||
|
{
|
||
|
Msg( "Blacklisted '%s' (%s), due to rule '%s'.\n", serverName, netAdr.ToString(), m_Blacklist[i].m_NetAdr.ToString() );
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Returns true if the given server is allowed to be blacklisted at all
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CBlacklistedServerManager::CanServerBeBlacklisted( gameserveritem_t &server ) const
|
||
|
{
|
||
|
return CanServerBeBlacklisted( server.m_NetAdr.GetIP(), server.m_NetAdr.GetConnectionPort(), server.GetName() );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Returns true if the given server is allowed to be blacklisted at all
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CBlacklistedServerManager::CanServerBeBlacklisted( uint32 serverIP, int serverPort, const char *serverName ) const
|
||
|
{
|
||
|
netadr_t netAdr( serverIP, serverPort );
|
||
|
|
||
|
if ( !netAdr.IsValid() )
|
||
|
return false;
|
||
|
|
||
|
// Don't let them add reserved addresses to their blacklists
|
||
|
if ( netAdr.IsReservedAdr() )
|
||
|
return false;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Returns vector of blacklisted servers
|
||
|
//-----------------------------------------------------------------------------
|
||
|
const CUtlVector< blacklisted_server_t > &CBlacklistedServerManager::GetServerVector( void ) const
|
||
|
{
|
||
|
return m_Blacklist;
|
||
|
}
|