2014-08-04 16:12:15 +04:00
// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Admin Base Plugin
//
2004-01-31 23:56:22 +03:00
2004-07-29 14:41:55 +04:00
// Uncomment for SQL version
2007-03-09 06:04:40 +03:00
// #define USING_SQL
2004-06-24 11:57:55 +04:00
2004-03-05 22:35:38 +03:00
# include <amxmodx>
2004-03-07 17:30:53 +03:00
# include <amxmisc>
2004-06-24 11:57:55 +04:00
# if defined USING_SQL
2006-06-04 04:58:17 +04:00
# include <sqlx>
2004-06-24 11:57:55 +04:00
# endif
2004-01-31 23:56:22 +03:00
2007-04-25 21:24:02 +04:00
//new Vector:AdminList;
2007-04-24 20:38:36 +04:00
2007-03-09 06:04:40 +03:00
new AdminCount ;
2006-05-11 17:04:37 +04:00
new PLUGINNAME [ ] = " AMX Mod X "
2004-01-31 23:56:22 +03:00
2006-05-11 17:04:37 +04:00
# define ADMIN_LOOKUP (1<<0)
# define ADMIN_NORMAL (1<<1)
2005-09-11 22:37:55 +04:00
# define ADMIN_STEAM (1<<2)
# define ADMIN_IPADDR (1<<3)
2006-05-11 17:04:37 +04:00
# define ADMIN_NAME (1<<4)
2005-09-11 22:37:55 +04:00
2015-02-01 21:20:55 +03:00
new bool : g_CaseSensitiveName [ MAX_PLAYERS + 1 ] ;
2007-03-09 06:04:40 +03:00
// pcvars
new amx_mode ;
new amx_password_field ;
new amx_default_access ;
2005-09-11 22:37:55 +04:00
public plugin_init ( )
{
2004-06-24 11:57:55 +04:00
# if defined USING_SQL
2005-09-13 05:00:19 +04:00
register_plugin ( " Admin Base (SQL) " , AMXX_VERSION_STR , " AMXX Dev Team " )
2004-06-30 04:19:24 +04:00
# else
2005-09-13 05:00:19 +04:00
register_plugin ( " Admin Base " , AMXX_VERSION_STR , " AMXX Dev Team " )
2004-06-24 11:57:55 +04:00
# endif
2005-09-13 05:00:19 +04:00
register_dictionary ( " admin.txt " )
register_dictionary ( " common.txt " )
2014-07-29 01:33:08 +04:00
amx_mode = register_cvar ( " amx_mode " , " 1 " , FCVAR_PROTECTED )
amx_password_field = register_cvar ( " amx_password_field " , " _pw " , FCVAR_PROTECTED )
amx_default_access = register_cvar ( " amx_default_access " , " " , FCVAR_PROTECTED )
2005-09-13 05:00:19 +04:00
register_cvar ( " amx_vote_ratio " , " 0.02 " )
register_cvar ( " amx_vote_time " , " 10 " )
register_cvar ( " amx_vote_answers " , " 1 " )
register_cvar ( " amx_vote_delay " , " 60 " )
register_cvar ( " amx_last_voting " , " 0 " )
2014-07-29 01:33:08 +04:00
register_cvar ( " amx_show_activity " , " 2 " , FCVAR_PROTECTED )
2005-09-13 05:00:19 +04:00
register_cvar ( " amx_votekick_ratio " , " 0.40 " )
register_cvar ( " amx_voteban_ratio " , " 0.40 " )
register_cvar ( " amx_votemap_ratio " , " 0.40 " )
set_cvar_float ( " amx_last_voting " , 0.0 )
2004-08-08 15:05:59 +04:00
2004-06-24 11:57:55 +04:00
# if defined USING_SQL
2005-09-13 05:00:19 +04:00
register_srvcmd ( " amx_sqladmins " , " adminSql " )
2014-07-29 01:33:08 +04:00
register_cvar ( " amx_sql_table " , " admins " , FCVAR_PROTECTED )
2004-08-31 06:53:06 +04:00
# endif
2014-07-29 01:33:08 +04:00
register_cvar ( " amx_sql_host " , " 127.0.0.1 " , FCVAR_PROTECTED )
register_cvar ( " amx_sql_user " , " root " , FCVAR_PROTECTED )
register_cvar ( " amx_sql_pass " , " " , FCVAR_PROTECTED )
register_cvar ( " amx_sql_db " , " amx " , FCVAR_PROTECTED )
register_cvar ( " amx_sql_type " , " mysql " , FCVAR_PROTECTED )
2015-01-29 15:50:13 +03:00
register_cvar ( " amx_sql_timeout " , " 60 " , FCVAR_PROTECTED )
2004-03-07 03:55:22 +03:00
2005-09-13 05:00:19 +04:00
register_concmd ( " amx_reloadadmins " , " cmdReload " , ADMIN_CFG )
2006-08-19 00:31:23 +04:00
register_concmd ( " amx_addadmin " , " addadminfn " , ADMIN_RCON , " <playername|auth> <accessflags> [password] [authtype] - add specified player as an admin to users.ini " )
2004-03-07 13:57:57 +03:00
2005-09-13 05:00:19 +04:00
remove_user_flags ( 0 , read_flags ( " z " ) ) // Remove 'user' flag from server rights
2004-08-08 15:05:59 +04:00
2005-09-13 05:00:19 +04:00
new configsDir [ 64 ]
2014-07-29 18:32:32 +04:00
get_configsdir ( configsDir , charsmax ( configsDir ) )
2015-07-19 22:43:03 +03:00
2005-09-13 05:00:19 +04:00
server_cmd ( " exec %s/sql.cfg " , configsDir )
2007-04-24 20:38:36 +04:00
// Create a vector of 5 cells to store the info.
2007-04-25 21:24:02 +04:00
//AdminList=vector_create(5);
2007-04-24 20:38:36 +04:00
2005-09-12 00:35:35 +04:00
# if defined USING_SQL
2005-09-13 05:00:19 +04:00
server_cmd ( " amx_sqladmins " )
2004-06-24 11:57:55 +04:00
# else
2005-09-13 05:00:19 +04:00
format ( configsDir , 63 , " %s/users.ini " , configsDir )
loadSettings ( configsDir ) // Load admins accounts
2004-06-24 11:57:55 +04:00
# endif
2004-01-31 23:56:22 +03:00
}
2008-03-30 23:28:36 +04:00
public client_connect ( id )
{
g_CaseSensitiveName [ id ] = false ;
}
2005-09-11 22:37:55 +04:00
public addadminfn ( id , level , cid )
{
2005-03-24 13:59:46 +03:00
if ( ! cmd_access ( id , level , cid , 3 ) )
return PLUGIN_HANDLED
2005-09-11 22:37:55 +04:00
new idtype = ADMIN_STEAM | ADMIN_LOOKUP
2006-06-04 04:58:17 +04:00
if ( read_argc ( ) > = 5 )
2005-09-11 22:37:55 +04:00
{
new t_arg [ 16 ]
2014-07-29 18:32:32 +04:00
read_argv ( 4 , t_arg , charsmax ( t_arg ) )
2005-09-13 05:00:19 +04:00
if ( equali ( t_arg , " steam " ) | | equali ( t_arg , " steamid " ) | | equali ( t_arg , " auth " ) )
2005-09-11 22:37:55 +04:00
{
idtype = ADMIN_STEAM
2005-09-13 05:00:19 +04:00
}
else if ( equali ( t_arg , " ip " ) )
{
2005-09-11 22:37:55 +04:00
idtype = ADMIN_IPADDR
2005-09-13 05:00:19 +04:00
}
else if ( equali ( t_arg , " name " ) | | equali ( t_arg , " nick " ) )
{
2005-09-11 22:37:55 +04:00
idtype = ADMIN_NAME
2006-06-04 04:58:17 +04:00
if ( equali ( t_arg , " name " ) )
idtype | = ADMIN_LOOKUP
2005-09-11 22:37:55 +04:00
} else {
2007-02-11 00:10:55 +03:00
console_print ( id , " [%s] Unknown id type ^ " % s ^ " , use one of: steamid, ip, name " , PLUGINNAME , t_arg )
2005-09-11 22:37:55 +04:00
return PLUGIN_HANDLED
}
}
2005-03-24 13:59:46 +03:00
new arg [ 33 ]
2014-07-29 18:32:32 +04:00
read_argv ( 1 , arg , charsmax ( arg ) )
2005-09-11 22:37:55 +04:00
new player = - 1
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
if ( idtype & ADMIN_STEAM )
{
if ( containi ( arg , " STEAM_0: " ) = = - 1 )
{
idtype | = ADMIN_LOOKUP
2007-07-25 22:10:08 +04:00
player = cmd_target ( id , arg , CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS )
2006-05-11 17:04:37 +04:00
} else {
2007-03-09 06:04:40 +03:00
new _steamid [ 44 ]
2015-02-01 21:20:55 +03:00
static _players [ MAX_PLAYERS ] , _num , _pv
2006-05-11 17:04:37 +04:00
get_players ( _players , _num )
for ( new _i = 0 ; _i < _num ; _i + + )
{
_pv = _players [ _i ]
2014-07-29 18:32:32 +04:00
get_user_authid ( _pv , _steamid , charsmax ( _steamid ) )
2006-05-11 17:04:37 +04:00
if ( ! _steamid [ 0 ] )
continue
if ( equal ( _steamid , arg ) )
{
player = _pv
break
}
2006-06-04 04:58:17 +04:00
}
if ( player < 1 )
{
idtype & = ~ ADMIN_LOOKUP
}
2005-09-11 22:37:55 +04:00
}
2005-09-13 05:00:19 +04:00
}
else if ( idtype & ADMIN_NAME )
{
2007-07-25 22:10:08 +04:00
player = cmd_target ( id , arg , CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS )
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
if ( player )
idtype | = ADMIN_LOOKUP
2006-06-04 04:58:17 +04:00
else
idtype & = ~ ADMIN_LOOKUP
2005-09-13 05:00:19 +04:00
}
else if ( idtype & ADMIN_IPADDR )
{
2005-09-11 22:37:55 +04:00
new len = strlen ( arg )
new dots , chars
2005-09-13 05:00:19 +04:00
for ( new i = 0 ; i < len ; i + + )
2005-09-11 22:37:55 +04:00
{
if ( arg [ i ] = = '.' )
{
if ( ! chars | | chars > 3 )
break
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
if ( + + dots > 3 )
break
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
chars = 0
} else {
chars + +
}
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
if ( dots ! = 3 | | ! chars | | chars > 3 )
{
idtype | = ADMIN_LOOKUP
player = find_player ( " dh " , arg )
}
}
}
if ( idtype & ADMIN_LOOKUP & & ! player )
{
console_print ( id , " %L " , id , " CL_NOT_FOUND " )
2005-03-24 13:59:46 +03:00
return PLUGIN_HANDLED
2005-09-11 22:37:55 +04:00
}
2005-03-24 13:59:46 +03:00
new flags [ 64 ]
2014-07-29 18:32:32 +04:00
read_argv ( 2 , flags , charsmax ( flags ) )
2005-03-24 13:59:46 +03:00
new password [ 64 ]
2014-07-29 18:32:32 +04:00
if ( read_argc ( ) > = 4 ) {
read_argv ( 3 , password , charsmax ( password ) )
}
2005-03-24 13:59:46 +03:00
2005-09-11 22:37:55 +04:00
new auth [ 33 ]
2014-07-20 14:27:02 +04:00
new Comment [ MAX_NAME_LENGTH ] ; // name of player to pass to comment field
2005-09-11 22:37:55 +04:00
if ( idtype & ADMIN_LOOKUP )
{
2014-07-29 18:32:32 +04:00
get_user_name ( player , Comment , charsmax ( Comment ) )
2005-09-11 22:37:55 +04:00
if ( idtype & ADMIN_STEAM )
{
2014-07-29 18:32:32 +04:00
get_user_authid ( player , auth , charsmax ( auth ) )
2005-09-13 05:00:19 +04:00
}
else if ( idtype & ADMIN_IPADDR )
{
2014-07-29 18:32:32 +04:00
get_user_ip ( player , auth , charsmax ( auth ) , 1 )
2005-09-13 05:00:19 +04:00
}
else if ( idtype & ADMIN_NAME )
{
2014-07-29 18:32:32 +04:00
get_user_name ( player , auth , charsmax ( auth ) )
2005-09-11 22:37:55 +04:00
}
} else {
2014-07-29 18:32:32 +04:00
copy ( auth , charsmax ( auth ) , arg )
2005-09-11 22:37:55 +04:00
}
new type [ 16 ] , len
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
if ( idtype & ADMIN_STEAM )
2014-07-29 18:32:32 +04:00
len + = format ( type [ len ] , charsmax ( type ) - len , " c " )
2005-09-11 22:37:55 +04:00
else if ( idtype & ADMIN_IPADDR )
2014-07-29 18:32:32 +04:00
len + = format ( type [ len ] , charsmax ( type ) - len , " d " )
2005-09-13 05:00:19 +04:00
2005-09-11 22:37:55 +04:00
if ( strlen ( password ) > 0 )
2014-07-29 18:32:32 +04:00
len + = format ( type [ len ] , charsmax ( type ) - len , " a " )
2005-09-11 22:37:55 +04:00
else
2014-07-29 18:32:32 +04:00
len + = format ( type [ len ] , charsmax ( type ) - len , " e " )
2005-09-11 22:37:55 +04:00
2007-03-09 06:04:40 +03:00
AddAdmin ( id , auth , flags , password , type , Comment )
2005-03-24 13:59:46 +03:00
cmdReload ( id , ADMIN_CFG , 0 )
2005-09-11 22:37:55 +04:00
if ( player > 0 )
{
2014-07-20 14:27:02 +04:00
new name [ MAX_NAME_LENGTH ]
2014-07-29 18:32:32 +04:00
get_user_info ( player , " name " , name , charsmax ( name ) )
2005-09-11 22:37:55 +04:00
accessUser ( player , name )
}
2005-03-24 13:59:46 +03:00
return PLUGIN_HANDLED
}
2007-03-09 06:04:40 +03:00
AddAdmin ( id , auth [ ] , accessflags [ ] , password [ ] , flags [ ] , comment [ ] = " " )
2005-09-11 22:37:55 +04:00
{
# if defined USING_SQL
2006-06-04 04:58:17 +04:00
new error [ 128 ] , errno
2005-09-11 22:37:55 +04:00
2006-06-04 04:58:17 +04:00
new Handle : info = SQL_MakeStdTuple ( )
2014-07-29 18:32:32 +04:00
new Handle : sql = SQL_Connect ( info , errno , error , charsmax ( error ) )
2005-09-13 05:00:19 +04:00
2006-06-04 04:58:17 +04:00
if ( sql = = Empty_Handle )
2005-09-13 05:00:19 +04:00
{
2005-09-11 22:37:55 +04:00
server_print ( " [AMXX] %L " , LANG_SERVER , " SQL_CANT_CON " , error )
//backup to users.ini
# endif
2005-09-13 05:00:19 +04:00
// Make sure that the users.ini file exists.
new configsDir [ 64 ]
2014-07-29 18:32:32 +04:00
get_configsdir ( configsDir , charsmax ( configsDir ) )
format ( configsDir , charsmax ( configsDir ) , " %s/users.ini " , configsDir )
2005-03-24 13:59:46 +03:00
2005-09-13 05:00:19 +04:00
if ( ! file_exists ( configsDir ) )
{
console_print ( id , " [%s] File ^ " % s ^ " doesn't exist. " , PLUGINNAME , configsDir )
2005-03-24 13:59:46 +03:00
return
}
2005-09-13 05:00:19 +04:00
// Make sure steamid isn't already in file.
new line = 0 , textline [ 256 ] , len
const SIZE = 63
new line_steamid [ SIZE + 1 ] , line_password [ SIZE + 1 ] , line_accessflags [ SIZE + 1 ] , line_flags [ SIZE + 1 ] , parsedParams
// <name|ip|steamid> <password> <access flags> <account flags>
2014-07-29 18:32:32 +04:00
while ( ( line = read_file ( configsDir , line , textline , charsmax ( textline ) , len ) ) )
2005-09-13 05:00:19 +04:00
{
if ( len = = 0 | | equal ( textline , " ; " , 1 ) )
continue // comment line
parsedParams = parse ( textline , line_steamid , SIZE , line_password , SIZE , line_accessflags , SIZE , line_flags , SIZE )
if ( parsedParams ! = 4 )
continue // Send warning/error?
if ( containi ( line_flags , flags ) ! = - 1 & & equal ( line_steamid , auth ) )
{
console_print ( id , " [%s] %s already exists! " , PLUGINNAME , auth )
return
}
}
// If we came here, steamid doesn't exist in users.ini. Add it.
new linetoadd [ 512 ]
2007-03-09 06:04:40 +03:00
if ( comment [ 0 ] = = 0 )
{
2014-07-29 18:32:32 +04:00
formatex ( linetoadd , charsmax ( linetoadd ) , " ^r^n^ " % s ^ " ^ " % s ^ " ^ " % s ^ " ^ " % s ^ " " , auth , password , accessflags , flags )
2007-03-09 06:04:40 +03:00
}
else
{
2014-07-29 18:32:32 +04:00
formatex ( linetoadd , charsmax ( linetoadd ) , " ^r^n^ " % s ^ " ^ " % s ^ " ^ " % s ^ " ^ " % s ^ " ; %s " , auth , password , accessflags , flags , comment )
2007-03-09 06:04:40 +03:00
}
2005-09-13 05:00:19 +04:00
console_print ( id , " Adding:^n%s " , linetoadd )
2005-03-24 13:59:46 +03:00
2005-09-13 05:00:19 +04:00
if ( ! write_file ( configsDir , linetoadd ) )
console_print ( id , " [%s] Failed writing to %s! " , PLUGINNAME , configsDir )
2005-09-11 22:37:55 +04:00
# if defined USING_SQL
2005-09-13 05:00:19 +04:00
}
2006-06-04 04:58:17 +04:00
new table [ 32 ]
2014-07-29 18:32:32 +04:00
get_cvar_string ( " amx_sql_table " , table , charsmax ( table ) )
2006-06-04 04:58:17 +04:00
new Handle : query = SQL_PrepareQuery ( sql , " SELECT * FROM `%s` WHERE (`auth` = '%s') " , table , auth )
2005-09-11 22:37:55 +04:00
2006-06-04 04:58:17 +04:00
if ( ! SQL_Execute ( query ) )
2005-09-13 05:00:19 +04:00
{
2014-07-29 18:32:32 +04:00
SQL_QueryError ( query , error , charsmax ( error ) )
2005-09-11 22:37:55 +04:00
server_print ( " [AMXX] %L " , LANG_SERVER , " SQL_CANT_LOAD_ADMINS " , error )
console_print ( id , " [AMXX] %L " , LANG_SERVER , " SQL_CANT_LOAD_ADMINS " , error )
2006-06-04 04:58:17 +04:00
} else if ( SQL_NumResults ( query ) ) {
2005-09-11 22:37:55 +04:00
console_print ( id , " [%s] %s already exists! " , PLUGINNAME , auth )
2006-06-04 04:58:17 +04:00
} else {
console_print ( id , " Adding to database:^n^ " % s ^ " ^ " % s ^ " ^ " % s ^ " ^ " % s ^ " " , auth , password , accessflags , flags )
SQL_QueryAndIgnore ( sql , " REPLACE INTO `%s` (`auth`, `password`, `access`, `flags`) VALUES ('%s', '%s', '%s', '%s') " , table , auth , password , accessflags , flags )
2005-09-11 22:37:55 +04:00
}
2005-09-13 05:00:19 +04:00
2006-06-04 04:58:17 +04:00
SQL_FreeHandle ( query )
SQL_FreeHandle ( sql )
SQL_FreeHandle ( info )
2005-09-11 22:37:55 +04:00
# endif
2005-03-24 13:59:46 +03:00
2004-06-30 00:17:25 +04:00
}
2005-09-13 05:00:19 +04:00
loadSettings ( szFilename [ ] )
{
2007-03-09 06:04:40 +03:00
new File = fopen ( szFilename , " r " ) ;
if ( File )
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
new Text [ 512 ] ;
new Flags [ 32 ] ;
new Access [ 32 ]
new AuthData [ 44 ] ;
new Password [ 32 ] ;
2021-08-07 18:28:35 +03:00
while ( fgets ( File , Text , charsmax ( Text ) ) )
2007-03-09 06:04:40 +03:00
{
2007-08-16 21:58:34 +04:00
trim ( Text ) ;
2007-03-09 06:04:40 +03:00
// comment
if ( Text [ 0 ] = = ';' )
{
continue ;
}
Flags [ 0 ] = 0 ;
Access [ 0 ] = 0 ;
AuthData [ 0 ] = 0 ;
Password [ 0 ] = 0 ;
// not enough parameters
2014-07-29 18:32:32 +04:00
if ( parse ( Text , AuthData , charsmax ( AuthData ) , Password , charsmax ( Password ) , Access , charsmax ( Access ) , Flags , charsmax ( Flags ) ) < 2 )
2007-03-09 06:04:40 +03:00
{
continue ;
}
admins_push ( AuthData , Password , read_flags ( Access ) , read_flags ( Flags ) ) ;
2004-08-08 15:05:59 +04:00
2007-03-09 06:04:40 +03:00
AdminCount + + ;
}
fclose ( File ) ;
}
2004-08-08 15:05:59 +04:00
2007-03-09 06:04:40 +03:00
if ( AdminCount = = 1 )
{
server_print ( " [AMXX] %L " , LANG_SERVER , " LOADED_ADMIN " ) ;
2005-09-13 05:00:19 +04:00
}
else
2007-03-09 06:04:40 +03:00
{
server_print ( " [AMXX] %L " , LANG_SERVER , " LOADED_ADMINS " , AdminCount ) ;
}
return 1 ;
2004-01-31 23:56:22 +03:00
}
2004-06-24 11:57:55 +04:00
# if defined USING_SQL
2005-09-13 05:00:19 +04:00
public adminSql ( )
{
2006-06-04 04:58:17 +04:00
new table [ 32 ] , error [ 128 ] , type [ 12 ] , errno
2005-09-13 05:00:19 +04:00
2006-06-04 04:58:17 +04:00
new Handle : info = SQL_MakeStdTuple ( )
2014-07-29 18:32:32 +04:00
new Handle : sql = SQL_Connect ( info , errno , error , charsmax ( error ) )
2005-09-13 05:00:19 +04:00
2014-07-29 18:32:32 +04:00
get_cvar_string ( " amx_sql_table " , table , charsmax ( table ) )
2005-09-13 05:00:19 +04:00
2014-07-29 18:32:32 +04:00
SQL_GetAffinity ( type , charsmax ( type ) )
2006-06-04 04:58:17 +04:00
if ( sql = = Empty_Handle )
2005-09-13 05:00:19 +04:00
{
server_print ( " [AMXX] %L " , LANG_SERVER , " SQL_CANT_CON " , error )
//backup to users.ini
new configsDir [ 64 ]
2014-07-29 18:32:32 +04:00
get_configsdir ( configsDir , charsmax ( configsDir ) )
format ( configsDir , charsmax ( configsDir ) , " %s/users.ini " , configsDir )
2005-09-13 05:00:19 +04:00
loadSettings ( configsDir ) // Load admins accounts
return PLUGIN_HANDLED
}
2006-06-04 04:58:17 +04:00
new Handle : query
2005-09-13 05:00:19 +04:00
2006-06-04 04:58:17 +04:00
if ( equali ( type , " sqlite " ) )
2005-09-13 05:00:19 +04:00
{
2006-06-04 04:58:17 +04:00
if ( ! sqlite_TableExists ( sql , table ) )
2005-09-13 05:00:19 +04:00
{
2006-06-04 04:58:17 +04:00
SQL_QueryAndIgnore ( sql , " CREATE TABLE %s ( auth TEXT NOT NULL DEFAULT '', password TEXT NOT NULL DEFAULT '', access TEXT NOT NULL DEFAULT '', flags TEXT NOT NULL DEFAULT '' ) " , table )
2005-09-13 05:00:19 +04:00
}
2006-06-04 04:58:17 +04:00
query = SQL_PrepareQuery ( sql , " SELECT auth, password, access, flags FROM %s " , table )
2005-09-13 05:00:19 +04:00
} else {
2006-06-04 04:58:17 +04:00
SQL_QueryAndIgnore ( sql , " CREATE TABLE IF NOT EXISTS `%s` ( `auth` VARCHAR( 32 ) NOT NULL, `password` VARCHAR( 32 ) NOT NULL, `access` VARCHAR( 32 ) NOT NULL, `flags` VARCHAR( 32 ) NOT NULL ) COMMENT = 'AMX Mod X Admins' " , table )
query = SQL_PrepareQuery ( sql , " SELECT `auth`,`password`,`access`,`flags` FROM `%s` " , table )
2005-09-13 05:00:19 +04:00
}
2006-06-04 04:58:17 +04:00
if ( ! SQL_Execute ( query ) )
2005-09-13 05:00:19 +04:00
{
2014-07-29 18:32:32 +04:00
SQL_QueryError ( query , error , charsmax ( error ) )
2005-09-13 05:00:19 +04:00
server_print ( " [AMXX] %L " , LANG_SERVER , " SQL_CANT_LOAD_ADMINS " , error )
2006-06-04 04:58:17 +04:00
} else if ( ! SQL_NumResults ( query ) ) {
2005-09-13 05:00:19 +04:00
server_print ( " [AMXX] %L " , LANG_SERVER , " NO_ADMINS " )
2006-06-04 04:58:17 +04:00
} else {
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
AdminCount = 0
2006-06-04 04:58:17 +04:00
/** do this incase people change the query order and forget to modify below */
new qcolAuth = SQL_FieldNameToNum ( query , " auth " )
new qcolPass = SQL_FieldNameToNum ( query , " password " )
new qcolAccess = SQL_FieldNameToNum ( query , " access " )
new qcolFlags = SQL_FieldNameToNum ( query , " flags " )
2007-03-09 06:04:40 +03:00
new AuthData [ 44 ] ;
new Password [ 44 ] ;
new Access [ 32 ] ;
new Flags [ 32 ] ;
while ( SQL_MoreResults ( query ) )
2006-06-04 04:58:17 +04:00
{
2014-07-29 18:32:32 +04:00
SQL_ReadResult ( query , qcolAuth , AuthData , charsmax ( AuthData ) ) ;
SQL_ReadResult ( query , qcolPass , Password , charsmax ( Password ) ) ;
SQL_ReadResult ( query , qcolAccess , Access , charsmax ( Access ) ) ;
SQL_ReadResult ( query , qcolFlags , Flags , charsmax ( Flags ) ) ;
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
admins_push ( AuthData , Password , read_flags ( Access ) , read_flags ( Flags ) ) ;
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
+ + AdminCount ;
2006-06-04 04:58:17 +04:00
SQL_NextRow ( query )
}
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
if ( AdminCount = = 1 )
{
2006-06-04 04:58:17 +04:00
server_print ( " [AMXX] %L " , LANG_SERVER , " SQL_LOADED_ADMIN " )
2007-03-09 06:04:40 +03:00
}
2006-06-04 04:58:17 +04:00
else
2007-03-09 06:04:40 +03:00
{
server_print ( " [AMXX] %L " , LANG_SERVER , " SQL_LOADED_ADMINS " , AdminCount )
}
2006-06-04 04:58:17 +04:00
SQL_FreeHandle ( query )
SQL_FreeHandle ( sql )
SQL_FreeHandle ( info )
}
2005-09-13 05:00:19 +04:00
return PLUGIN_HANDLED
2004-06-24 11:57:55 +04:00
}
# endif
2004-01-31 23:56:22 +03:00
2005-09-13 05:00:19 +04:00
public cmdReload ( id , level , cid )
{
if ( ! cmd_access ( id , level , cid , 1 ) )
return PLUGIN_HANDLED
//strip original flags (patch submitted by mrhunt)
remove_user_flags ( 0 , read_flags ( " z " ) )
2007-08-03 20:29:53 +04:00
admins_flush ( ) ;
2004-03-07 13:57:57 +03:00
2004-06-24 11:57:55 +04:00
# if !defined USING_SQL
2005-09-13 05:00:19 +04:00
new filename [ 128 ]
2014-07-29 18:32:32 +04:00
get_configsdir ( filename , charsmax ( filename ) )
format ( filename , charsmax ( filename ) , " %s/users.ini " , filename )
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
AdminCount = 0 ;
loadSettings ( filename ) ; // Re-Load admins accounts
2005-09-13 05:00:19 +04:00
if ( id ! = 0 )
{
2007-03-09 06:04:40 +03:00
if ( AdminCount = = 1 )
{
console_print ( id , " [AMXX] %L " , LANG_SERVER , " LOADED_ADMIN " ) ;
}
2005-09-13 05:00:19 +04:00
else
2007-03-09 06:04:40 +03:00
{
console_print ( id , " [AMXX] %L " , LANG_SERVER , " LOADED_ADMINS " , AdminCount ) ;
}
2005-09-13 05:00:19 +04:00
}
2004-06-24 11:57:55 +04:00
# else
2007-03-09 06:04:40 +03:00
AdminCount = 0
2005-09-13 05:00:19 +04:00
adminSql ( )
if ( id ! = 0 )
{
2007-03-09 06:04:40 +03:00
if ( AdminCount = = 1 )
2005-09-13 05:00:19 +04:00
console_print ( id , " [AMXX] %L " , LANG_SERVER , " SQL_LOADED_ADMIN " )
else
2007-03-09 06:04:40 +03:00
console_print ( id , " [AMXX] %L " , LANG_SERVER , " SQL_LOADED_ADMINS " , AdminCount )
2005-09-13 05:00:19 +04:00
}
2004-08-21 01:40:17 +04:00
# endif
2004-08-20 02:21:53 +04:00
2015-02-01 21:20:55 +03:00
new players [ MAX_PLAYERS ] , num , pv
2014-07-20 14:27:02 +04:00
new name [ MAX_NAME_LENGTH ]
2006-05-11 17:04:37 +04:00
get_players ( players , num )
for ( new i = 0 ; i < num ; i + + )
{
pv = players [ i ]
2014-07-29 18:32:32 +04:00
get_user_name ( pv , name , charsmax ( name ) )
2006-05-11 17:04:37 +04:00
accessUser ( pv , name )
}
2005-09-13 05:00:19 +04:00
return PLUGIN_HANDLED
2004-03-07 13:57:57 +03:00
}
2005-09-13 05:00:19 +04:00
getAccess ( id , name [ ] , authid [ ] , ip [ ] , password [ ] )
{
new index = - 1
new result = 0
2007-03-09 06:04:40 +03:00
static Count ;
static Flags ;
static Access ;
static AuthData [ 44 ] ;
static Password [ 32 ] ;
2008-03-30 23:38:01 +04:00
g_CaseSensitiveName [ id ] = false ;
2007-03-09 06:04:40 +03:00
Count = admins_num ( ) ;
for ( new i = 0 ; i < Count ; + + i )
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
Flags = admins_lookup ( i , AdminProp_Flags ) ;
2014-07-29 18:32:32 +04:00
admins_lookup ( i , AdminProp_Auth , AuthData , charsmax ( AuthData ) ) ;
2007-03-09 06:04:40 +03:00
if ( Flags & FLAG_AUTHID )
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
if ( equal ( authid , AuthData ) )
2005-09-13 05:00:19 +04:00
{
index = i
break
}
}
2007-03-09 06:04:40 +03:00
else if ( Flags & FLAG_IP )
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
new c = strlen ( AuthData )
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
if ( AuthData [ c - 1 ] = = '.' ) /* check if this is not a xxx.xxx. format */
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
if ( equal ( AuthData , ip , c ) )
2005-09-13 05:00:19 +04:00
{
index = i
break
}
} /* in other case an IP must just match */
2007-03-09 06:04:40 +03:00
else if ( equal ( ip , AuthData ) )
2005-09-13 05:00:19 +04:00
{
index = i
break
}
2007-03-09 06:04:40 +03:00
}
else
{
2008-03-30 23:28:36 +04:00
if ( Flags & FLAG_CASE_SENSITIVE )
2005-09-13 05:00:19 +04:00
{
2008-03-30 23:28:36 +04:00
if ( Flags & FLAG_TAG )
{
if ( contain ( name , AuthData ) ! = - 1 )
{
index = i
g_CaseSensitiveName [ id ] = true
break
}
}
else if ( equal ( name , AuthData ) )
2005-09-13 05:00:19 +04:00
{
index = i
2008-03-30 23:28:36 +04:00
g_CaseSensitiveName [ id ] = true
2005-09-13 05:00:19 +04:00
break
}
}
2008-03-30 23:28:36 +04:00
else
2005-09-13 05:00:19 +04:00
{
2008-03-30 23:28:36 +04:00
if ( Flags & FLAG_TAG )
{
if ( containi ( name , AuthData ) ! = - 1 )
{
index = i
break
}
}
else if ( equali ( name , AuthData ) )
{
index = i
break
}
2005-09-13 05:00:19 +04:00
}
}
}
if ( index ! = - 1 )
{
2007-03-09 06:04:40 +03:00
Access = admins_lookup ( index , AdminProp_Access ) ;
if ( Flags & FLAG_NOPASS )
2005-09-13 05:00:19 +04:00
{
result | = 8
new sflags [ 32 ]
2014-07-29 18:32:32 +04:00
get_flags ( Access , sflags , charsmax ( sflags ) )
2007-03-09 06:04:40 +03:00
set_user_flags ( id , Access )
2005-09-13 05:00:19 +04:00
2007-03-09 06:04:40 +03:00
log_amx ( " Login: ^ " % s < % d > < % s > < > ^ " became an admin (account ^ " % s ^ " ) (access ^ " % s ^ " ) (address ^ " % s ^ " ) " , name , get_user_userid ( id ) , authid , AuthData , sflags , ip )
2005-09-13 05:00:19 +04:00
}
2007-03-09 06:04:40 +03:00
else
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
2014-07-29 18:32:32 +04:00
admins_lookup ( index , AdminProp_Password , Password , charsmax ( Password ) ) ;
2007-03-09 06:04:40 +03:00
if ( equal ( password , Password ) )
{
result | = 12
set_user_flags ( id , Access )
new sflags [ 32 ]
2014-07-29 18:32:32 +04:00
get_flags ( Access , sflags , charsmax ( sflags ) )
2007-03-09 06:04:40 +03:00
log_amx ( " Login: ^ " % s < % d > < % s > < > ^ " became an admin (account ^ " % s ^ " ) (access ^ " % s ^ " ) (address ^ " % s ^ " ) " , name , get_user_userid ( id ) , authid , AuthData , sflags , ip )
}
else
2005-09-13 05:00:19 +04:00
{
2007-03-09 06:04:40 +03:00
result | = 1
if ( Flags & FLAG_KICK )
{
result | = 2
log_amx ( " Login: ^ " % s < % d > < % s > < > ^ " kicked due to invalid password (account ^ " % s ^ " ) (address ^ " % s ^ " ) " , name , get_user_userid ( id ) , authid , AuthData , ip )
}
2005-09-13 05:00:19 +04:00
}
}
}
2007-03-09 06:04:40 +03:00
else if ( get_pcvar_float ( amx_mode ) = = 2.0 )
2005-09-13 05:00:19 +04:00
{
result | = 2
2007-03-09 06:04:40 +03:00
}
else
{
2005-09-13 05:00:19 +04:00
new defaccess [ 32 ]
2014-07-29 18:32:32 +04:00
get_pcvar_string ( amx_default_access , defaccess , charsmax ( defaccess ) )
2005-09-13 05:00:19 +04:00
if ( ! strlen ( defaccess ) )
2007-03-09 06:04:40 +03:00
{
2014-07-29 18:32:32 +04:00
copy ( defaccess , charsmax ( defaccess ) , " z " )
2007-03-09 06:04:40 +03:00
}
2005-09-13 05:00:19 +04:00
new idefaccess = read_flags ( defaccess )
if ( idefaccess )
{
result | = 8
set_user_flags ( id , idefaccess )
}
}
return result
2004-01-31 23:56:22 +03:00
}
2005-09-13 05:00:19 +04:00
accessUser ( id , name [ ] = " " )
{
remove_user_flags ( id )
2015-02-01 21:20:55 +03:00
new userip [ 32 ] , userauthid [ 32 ] , password [ 32 ] , passfield [ 32 ] , username [ MAX_NAME_LENGTH ]
2005-09-13 05:00:19 +04:00
2014-07-29 18:32:32 +04:00
get_user_ip ( id , userip , charsmax ( userip ) , 1 )
get_user_authid ( id , userauthid , charsmax ( userauthid ) )
2005-09-13 05:00:19 +04:00
if ( name [ 0 ] )
2007-02-09 11:34:33 +03:00
{
2014-07-29 18:32:32 +04:00
copy ( username , charsmax ( username ) , name )
2007-02-09 11:34:33 +03:00
}
2005-09-13 05:00:19 +04:00
else
2007-02-09 11:34:33 +03:00
{
2014-07-29 18:32:32 +04:00
get_user_name ( id , username , charsmax ( username ) )
2007-02-09 11:34:33 +03:00
}
2005-09-13 05:00:19 +04:00
2014-07-29 18:32:32 +04:00
get_pcvar_string ( amx_password_field , passfield , charsmax ( passfield ) )
get_user_info ( id , passfield , password , charsmax ( password ) )
2005-09-13 05:00:19 +04:00
new result = getAccess ( id , username , userauthid , userip , password )
if ( result & 1 )
2007-02-09 11:34:33 +03:00
{
2015-06-15 18:54:29 +03:00
engclient_print ( id , engprint_console , " * %L " , id , " INV_PAS " )
2007-02-09 11:34:33 +03:00
}
2005-09-13 05:00:19 +04:00
if ( result & 2 )
{
2014-04-16 19:27:20 +04:00
server_cmd ( " kick #%d ^ " % L ^ " " , get_user_userid ( id ) , id , " NO_ENTRY " )
2005-09-13 05:00:19 +04:00
return PLUGIN_HANDLED
}
if ( result & 4 )
2007-02-09 11:34:33 +03:00
{
2015-06-15 18:54:29 +03:00
engclient_print ( id , engprint_console , " * %L " , id , " PAS_ACC " )
2007-02-09 11:34:33 +03:00
}
2005-09-13 05:00:19 +04:00
if ( result & 8 )
2007-02-09 11:34:33 +03:00
{
2015-06-15 18:54:29 +03:00
engclient_print ( id , engprint_console , " * %L " , id , " PRIV_SET " )
2007-02-09 11:34:33 +03:00
}
2005-09-13 05:00:19 +04:00
return PLUGIN_CONTINUE
2004-01-31 23:56:22 +03:00
}
2005-09-13 05:00:19 +04:00
public client_infochanged ( id )
{
2007-03-09 06:04:40 +03:00
if ( ! is_user_connected ( id ) | | ! get_pcvar_num ( amx_mode ) )
2007-02-09 11:34:33 +03:00
{
2005-09-13 05:00:19 +04:00
return PLUGIN_CONTINUE
2007-02-09 11:34:33 +03:00
}
2004-08-08 15:05:59 +04:00
2014-07-20 14:27:02 +04:00
new newname [ MAX_NAME_LENGTH ] , oldname [ MAX_NAME_LENGTH ]
2005-09-13 05:00:19 +04:00
2014-07-29 18:32:32 +04:00
get_user_name ( id , oldname , charsmax ( oldname ) )
get_user_info ( id , " name " , newname , charsmax ( newname ) )
2004-08-08 15:05:59 +04:00
2008-03-30 23:28:36 +04:00
if ( g_CaseSensitiveName [ id ] )
2007-02-09 11:34:33 +03:00
{
2008-03-30 23:28:36 +04:00
if ( ! equal ( newname , oldname ) )
{
accessUser ( id , newname )
}
}
else
{
if ( ! equali ( newname , oldname ) )
{
accessUser ( id , newname )
}
2007-02-09 11:34:33 +03:00
}
2005-09-13 05:00:19 +04:00
return PLUGIN_CONTINUE
2004-01-31 23:56:22 +03:00
}
public client_authorized ( id )
2007-03-09 06:04:40 +03:00
return get_pcvar_num ( amx_mode ) ? accessUser ( id ) : PLUGIN_CONTINUE
2005-09-02 06:46:42 +04:00
public client_putinserver ( id )
{
if ( ! is_dedicated_server ( ) & & id = = 1 )
2007-03-09 06:04:40 +03:00
return get_pcvar_num ( amx_mode ) ? accessUser ( id ) : PLUGIN_CONTINUE
2005-09-13 05:00:19 +04:00
2005-09-02 06:46:42 +04:00
return PLUGIN_CONTINUE
}