2019-06-08 15:42:13 +02:00
# pragma semicolon 1
# include <sourcemod>
# include <basecomm>
# include <connect>
# pragma newdecls required
/* CONVARS */
ConVar g_hCvar_BlockSpoof ;
ConVar g_hCvar_BlockAdmin ;
ConVar g_hCvar_BlockVoice ;
/* DATABASE */
Database g_hDatabase ;
2019-10-08 14:07:48 +02:00
/* STRING */
char g_cPlayerGUID [ MAXPLAYERS + 1 ] [ 40 ] ;
2019-06-08 15:42:13 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Plugin myinfo =
{
name = " PlayerManager: Connect " ,
author = " zaCade + Neon " ,
description = " Manage clients, denying admin access, ect. " ,
version = " 2.0.0 "
} ;
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public APLRes AskPluginLoad2 ( Handle hMyself , bool bLate , char [ ] sError , int errorSize )
{
CreateNative ( " PM_IsPlayerSteam " , Native_IsPlayerSteam ) ;
CreateNative ( " PM_GetPlayerType " , Native_GetPlayerType ) ;
2019-10-08 14:07:48 +02:00
CreateNative ( " PM_GetPlayerGUID " , Native_GetPlayerGUID ) ;
2019-06-08 15:42:13 +02:00
RegPluginLibrary ( " PlayerManager " ) ;
return APLRes_Success ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginStart ( )
{
2019-10-22 17:48:08 +02:00
LoadTranslations ( " common.phrases " ) ;
2019-06-08 15:42:13 +02:00
g_hCvar_BlockSpoof = CreateConVar ( " sm_manager_block_spoof " , " 1 " , " Kick unauthenticated people that join with known steamids. " , FCVAR_NONE , true , 0.0 , true , 1.0 ) ;
g_hCvar_BlockAdmin = CreateConVar ( " sm_manager_block_admin " , " 1 " , " Should unauthenticated people be blocked from admin? " , FCVAR_NONE , true , 0.0 , true , 1.0 ) ;
g_hCvar_BlockVoice = CreateConVar ( " sm_manager_block_voice " , " 1 " , " Should unauthenticated people be blocked from voice? " , FCVAR_NONE , true , 0.0 , true , 1.0 ) ;
AddMultiTargetFilter ( " @steam " , Filter_Steam , " Steam Players " , false ) ;
AddMultiTargetFilter ( " @nosteam " , Filter_NoSteam , " No-Steam Players " , false ) ;
RegConsoleCmd ( " sm_steam " , Command_DisplaySteamStats , " Shows the number of Steam and No-Steam players " ) ;
RegConsoleCmd ( " sm_nosteam " , Command_DisplaySteamStats , " Shows the number of Steam and No-Steam players " ) ;
2019-10-22 17:48:08 +02:00
RegAdminCmd ( " sm_auth " , Command_GetAuth , ADMFLAG_GENERIC , " Retreives the Steam ID of a player " ) ;
2019-06-08 15:42:13 +02:00
AutoExecConfig ( ) ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnConfigsExecuted ( )
{
if ( ! g_hCvar_BlockSpoof . BoolValue )
return ;
Database . Connect ( SQL_OnDatabaseConnect , " PlayerManager " ) ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnPluginEnd ( )
{
RemoveMultiTargetFilter ( " @steam " , Filter_Steam ) ;
RemoveMultiTargetFilter ( " @nosteam " , Filter_NoSteam ) ;
}
2019-10-22 17:48:08 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action Command_GetAuth ( int client , int args )
{
if ( args < 1 )
{
ReplyToCommand ( client , " [SM] Usage: sm_auth <#userid|name> " ) ;
return Plugin_Handled ;
}
char sTarget [ MAX_TARGET_LENGTH ] ;
GetCmdArg ( 1 , sTarget , sizeof ( sTarget ) ) ;
int iTarget ;
if ( ( iTarget = FindTarget ( client , sTarget , false , false ) ) < = 0 )
return Plugin_Handled ;
char sAuthID [ 32 ] ;
GetClientAuthId ( iTarget , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) ) ;
ReplyToCommand ( client , " [SM] The Steam ID of %N is: " , iTarget ) ;
ReplyToCommand ( client , " %s " , sAuthID ) ;
return Plugin_Handled ;
}
2019-06-08 15:42:13 +02:00
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action Command_DisplaySteamStats ( int client , int args )
{
char aBuf [ 1024 ] ;
char aBuf2 [ MAX_NAME_LENGTH ] ;
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( IsClientInGame ( i ) & & ! IsFakeClient ( i ) )
{
char sAuthID [ 32 ] ;
2019-10-24 14:22:55 +02:00
GetClientAuthId ( i , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( ! SteamClientAuthenticated ( sAuthID ) )
{
GetClientName ( i , aBuf2 , sizeof ( aBuf2 ) ) ;
StrCat ( aBuf , sizeof ( aBuf ) , aBuf2 ) ;
StrCat ( aBuf , sizeof ( aBuf ) , " , " ) ;
}
}
}
if ( strlen ( aBuf ) )
{
aBuf [ strlen ( aBuf ) - 2 ] = 0 ;
ReplyToCommand ( client , " [SM] No-Steam clients online: %s " , aBuf ) ;
}
else
ReplyToCommand ( client , " [SM] No-Steam clients online: none " ) ;
return Plugin_Handled ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public bool Filter_Steam ( const char [ ] sPattern , Handle hClients )
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( IsClientInGame ( i ) & & ! IsFakeClient ( i ) )
{
char sAuthID [ 32 ] ;
2019-10-24 14:22:55 +02:00
GetClientAuthId ( i , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( SteamClientAuthenticated ( sAuthID ) )
PushArrayCell ( hClients , i ) ;
}
}
return true ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public bool Filter_NoSteam ( const char [ ] sPattern , Handle hClients )
{
for ( int i = 1 ; i < = MaxClients ; i + + )
{
if ( IsClientInGame ( i ) & & ! IsFakeClient ( i ) )
{
char sAuthID [ 32 ] ;
2019-10-24 14:22:55 +02:00
GetClientAuthId ( i , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( ! SteamClientAuthenticated ( sAuthID ) )
PushArrayCell ( hClients , i ) ;
}
}
return true ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnClientAuthorized ( int client , const char [ ] sAuthID )
{
if ( ! g_hCvar_BlockSpoof . BoolValue | | ! g_hDatabase )
return ;
if ( IsFakeClient ( client ) | | IsClientSourceTV ( client ) )
return ;
char sQuery [ 512 ] ;
Format ( sQuery , sizeof ( sQuery ) , " SELECT * FROM connections WHERE auth='%s' " , sAuthID ) ;
g_hDatabase . Query ( SQL_OnQueryCompleted , sQuery , GetClientSerial ( client ) , DBPrio_Low ) ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public Action OnClientPreAdminCheck ( int client )
{
if ( ! g_hCvar_BlockAdmin . BoolValue )
return Plugin_Continue ;
if ( IsFakeClient ( client ) | | IsClientSourceTV ( client ) )
return Plugin_Continue ;
char sAuthID [ 32 ] ;
2019-10-24 14:22:55 +02:00
GetClientAuthId ( client , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( ! SteamClientAuthenticated ( sAuthID ) )
{
LogMessage ( " %L was not authenticated with steam, denying admin. " , client ) ;
NotifyPostAdminCheck ( client ) ;
return Plugin_Handled ;
}
else return Plugin_Continue ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void OnClientPostAdminCheck ( int client )
{
if ( ! g_hCvar_BlockVoice . BoolValue )
return ;
if ( IsFakeClient ( client ) | | IsClientSourceTV ( client ) )
return ;
char sAuthID [ 32 ] ;
2019-10-24 14:22:55 +02:00
GetClientAuthId ( client , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( ! SteamClientAuthenticated ( sAuthID ) )
{
LogMessage ( " %L was not authenticated with steam, muting client. " , client ) ;
BaseComm_SetClientMute ( client , true ) ;
return ;
}
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void SQL_OnDatabaseConnect ( Database db , const char [ ] error , any data )
{
if ( ! db | | strlen ( error ) )
{
LogError ( " Database error: %s " , error ) ;
return ;
}
g_hDatabase = db ;
char sQuery [ 512 ] ;
Format ( sQuery , sizeof ( sQuery ) , " CREATE TABLE IF NOT EXISTS connections (`auth` varchar(32), `type` varchar(32), `address` varchar(16), PRIMARY KEY (`auth`)) " ) ;
g_hDatabase . Query ( SQL_OnQueryCompleted , sQuery , _ , DBPrio_High ) ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public void SQL_OnQueryCompleted ( Database db , DBResultSet results , const char [ ] error , any data )
{
if ( ! db | | strlen ( error ) )
{
LogError ( " Query error: %s " , error ) ;
return ;
}
int client ;
if ( ( client = GetClientFromSerial ( data ) ) = = 0 )
return ;
char sAuthID [ 32 ] ;
2019-10-24 14:22:55 +02:00
GetClientAuthId ( client , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
char sAddress [ 16 ] ;
GetClientIP ( client , sAddress , sizeof ( sAddress ) ) ;
char sConnectionType [ 32 ] ;
if ( SteamClientAuthenticated ( sAuthID ) )
sConnectionType = " SteamLegit " ;
else
sConnectionType = " NoAuth " ;
if ( results . RowCount & & results . FetchRow ( ) )
{
int iFieldNum ;
char sResultAddress [ 16 ] ;
char sResultConnectionType [ 32 ] ;
results . FieldNameToNum ( " address " , iFieldNum ) ;
results . FetchString ( iFieldNum , sResultAddress , sizeof ( sResultAddress ) ) ;
results . FieldNameToNum ( " type " , iFieldNum ) ;
results . FetchString ( iFieldNum , sResultConnectionType , sizeof ( sResultConnectionType ) ) ;
delete results ;
if ( ! SteamClientAuthenticated ( sAuthID ) )
{
if ( ! StrEqual ( sConnectionType , sResultConnectionType , false ) & & StrEqual ( sResultConnectionType , " SteamLegit " , false ) )
{
if ( StrEqual ( sAddress , sResultAddress , false ) )
{
LogMessage ( " %L tried to join with a legitimate steamid while not authenticated with steam. Allowing connection, IPs match. (Known: %s) " , client , sAddress ) ;
}
else
{
LogAction ( client , - 1 , " \" %L \" tried to join with a legitimate steamid while not authenticated with steam. Refusing connection, IPs dont match. (Known: %s | Current: %s) " , client , sResultAddress , sAddress ) ;
KickClient ( client , " Trying to join with a legitimate steamid while not authenticated with steam. " ) ;
return ;
}
}
}
}
char sQuery [ 512 ] ;
Format ( sQuery , sizeof ( sQuery ) , " INSERT INTO connections (auth, type, address) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE type='%s', address='%s'; " , sAuthID , sConnectionType , sAddress , sConnectionType , sAddress ) ;
g_hDatabase . Query ( SQL_OnQueryCompleted , sQuery , _ , DBPrio_Low ) ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public int Native_IsPlayerSteam ( Handle hPlugin , int numParams )
{
int client = GetNativeCell ( 1 ) ;
if ( client < 1 | | client > MaxClients )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client index %d is invalid " , client ) ;
}
else if ( ! IsClientConnected ( client ) )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client %d is not connected " , client ) ;
}
else if ( IsFakeClient ( client ) )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client %d is a bot " , client ) ;
}
char sAuthID [ 32 ] ;
2019-08-01 15:37:37 +02:00
GetClientAuthId ( client , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( SteamClientAuthenticated ( sAuthID ) )
return true ;
return false ;
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public int Native_GetPlayerType ( Handle hPlugin , int numParams )
{
int client = GetNativeCell ( 1 ) ;
int length = GetNativeCell ( 3 ) ;
if ( client < 1 | | client > MaxClients )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client index %d is invalid " , client ) ;
}
else if ( ! IsClientConnected ( client ) )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client %d is not connected " , client ) ;
}
else if ( IsFakeClient ( client ) )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client %d is a bot " , client ) ;
}
char sAuthID [ 32 ] ;
2019-08-01 15:37:37 +02:00
GetClientAuthId ( client , AuthId_Steam2 , sAuthID , sizeof ( sAuthID ) , false ) ;
2019-06-08 15:42:13 +02:00
if ( SteamClientAuthenticated ( sAuthID ) )
2019-06-09 10:14:35 +02:00
return ! SetNativeString ( 2 , " SteamLegit " , length + 1 ) ;
2019-06-08 15:42:13 +02:00
2019-06-09 10:14:35 +02:00
return ! SetNativeString ( 2 , " NoAuth " , length + 1 ) ;
2019-10-08 14:07:48 +02:00
}
//----------------------------------------------------------------------------------------------------
// Purpose:
//----------------------------------------------------------------------------------------------------
public int Native_GetPlayerGUID ( Handle hPlugin , int numParams )
{
int client = GetNativeCell ( 1 ) ;
int length = GetNativeCell ( 3 ) ;
if ( client < 1 | | client > MaxClients )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client index %d is invalid " , client ) ;
}
else if ( ! IsClientConnected ( client ) )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client %d is not connected " , client ) ;
}
else if ( IsFakeClient ( client ) )
{
return ThrowNativeError ( SP_ERROR_NATIVE , " Client %d is a bot " , client ) ;
}
return ! SetNativeString ( 2 , g_cPlayerGUID [ client ] , length + 1 ) ;
2019-06-08 15:42:13 +02:00
}