搜索
查看: 2766|回复: 6

远程永久加入op的插件!(修改admin.sma而成)

[复制链接]
发表于 2003-9-20 17:16:37 | 显示全部楼层 |阅读模式 来自 中国–福建–厦门
我修改了一下admin.sma,可以远程永久加入新的op!且不需重启,马上生效~覆盖原来的admin.amx即可~,主要是为最高op着想。调用命令是amx_admin  < name|ip|wonid > < password > < access > < flags >,只有l(即ADMIN_RCON)权限的人才能使用。下面是原代码

/* AMX Mod script.
*
* (c) 2003, OLO
* This file is provided as is (no warranties).
*/

#include <amxmod>
#include <amxmisc>

#define MAX_ADMINS  64

// Uncomment if you are using Steam (Counter-Strine 1.6)
//#define STEAM_VERSION

new g_aPassword[MAX_ADMINS][32]
new g_aName[MAX_ADMINS][32]
new g_aFlags[MAX_ADMINS]
new g_aAccess[MAX_ADMINS]
new g_aNum
new g_logFile[16]

public plugin_init()
{
  register_plugin("Admin Base","0.9","default")
  register_concmd("amx_admin","admin_cmd",ADMIN_RCON,"< name|ip|wonid > < password > < access > < flags >")
  register_cvar("amx_mode","2.0")
  register_cvar("amx_password_field","_pw")
  register_cvar("amx_default_access","")
  
  get_logfile(g_logFile,15)
  
  remove_user_flags(0,read_flags("z")) // Remove 'user' flag from server rights
  
  new filename[64]
  get_basedir( filename , 31 )
  server_cmd("exec %s/amx.cfg" , filename ) // Execute main configuration file
  format( filename, 63 , "%s/users.ini" , filename )
  loadSettings(  filename ) // Load admins accounts
  
}

loadSettings(szFilename[])
{
  if (!file_exists(szFilename)) return 0
   
  new szText[256], szFlags[32], szAccess[32]
  new a, pos = 0
  
  while ( g_aNum < MAX_ADMINS && read_file(szFilename,pos++,szText,255,a) )
  {         
    if ( szText[0] == ';' ) continue
   
    if ( parse(szText, g_aName[ g_aNum ] ,31,
      g_aPassword[ g_aNum ], 31, szAccess,31,szFlags,31 ) < 2 ) continue
      
    g_aAccess[ g_aNum ] = read_flags( szAccess )
    g_aFlags[ g_aNum ] = read_flags( szFlags )  
    ++g_aNum
  }
  
  return 1
}

public admin_cmd(id,level,cid){
        if (!cmd_access(id,level,cid,5))
                return PLUGIN_HANDLED
        if (g_aNum >= MAX_ADMINS){
                server_print("Admins limit reached!")
                return PLUGIN_HANDLED
        }
        new data[32],data2[32],name[32],authid[32],setadmininfo[256]
        get_user_name(id,name,31)
        get_user_authid(id,authid,31)
        read_argv(1,g_aName[g_aNum],31)
        read_argv(2,g_aPassword[g_aNum],31)
        read_argv(3,data,31)
        g_aAccess[g_aNum] = read_flags(data)
        read_argv(4,data2,31)
        g_aFlags[g_aNum] = read_flags(data2)
        format(setadmininfo,255,"^n^"%s^" ^"%s^" ^"%s^" ^"%s^"",g_aName[g_aNum],g_aPassword[g_aNum],data,data2)
        write_file("addons\amx\users.ini",setadmininfo)
        console_print(id,"^"%s^" have been setted to admin with access ^"%s^"",g_aName[g_aNum],data)
        log_to_file(g_logFile,"Setadmin: ^"%s<%d><%s><>^" set access(^"%s^") to ^"%s^"",name,get_user_userid(id),authid,data,g_aName[g_aNum])
        g_aNum++
        return PLUGIN_HANDLED
}

getAccess(id,name[],authid[],ip[], password[])
{
  new index = -1
  new result = 0
  for(new i = 0; i < g_aNum; ++i) {
    if (g_aFlags & FLAG_AUTHID) {
      if (equal(authid,g_aName)) {
        index = i
        break
      }
    }
    else if (g_aFlags & FLAG_IP) {
      new c = strlen( g_aName )
      if ( g_aName[ c - 1 ] == '.' ) { /* check if this is not a xxx.xxx. format */
        if (  equal( g_aName , ip , c ) ) {
          index = i
          break
        }
      } /* in other case an IP must just match */
      else  if ( equal(ip,g_aName) ){
        index = i
        break
      }
    }
    else {
      if (g_aFlags & FLAG_TAG) {
        if (contain(name,g_aName)!=-1){
          index = i
          break
        }
      }
      else if (equal(name,g_aName)) {
        index = i
        break
      }
    }
  }
  if (index != -1) {
    if (g_aFlags[index] & FLAG_NOPASS){
      result |= 8
      new sflags[32]
      get_flags(g_aAccess[index],sflags,31)
      set_user_flags(id,g_aAccess[index])
      log_to_file(g_logFile,"Login: ^"%s<%d><%s><>^" become an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")",
        name,get_user_userid(id),authid,g_aName[index] ,sflags,ip)
    }
    else if (equal(password,g_aPassword[index])) {
      result |= 12
      set_user_flags(id,g_aAccess[index])
      new sflags[32]
      get_flags(g_aAccess[index],sflags,31)
      log_to_file(g_logFile,"Login: ^"%s<%d><%s><>^" become an admin (account ^"%s^") (access ^"%s^") (address ^"%s^")",
        name,get_user_userid(id),authid,g_aName[index] ,sflags,ip)
    }
    else {
      result |= 1
      if (g_aFlags[index] & FLAG_KICK){
        result |= 2
        log_to_file(g_logFile,"Login: ^"%s<%d><%s><>^" kicked due to invalid password (account ^"%s^") (address ^"%s^")",
          name,get_user_userid(id),authid,g_aName[index],ip)
      }
    }
  }
  else if (get_cvar_float("amx_mode")==2.0) {
    result |= 2
  }
  else {
    new defaccess[32]
    get_cvar_string("amx_default_access",defaccess,31)
    new idefaccess = read_flags(defaccess)
    if (idefaccess){
      result |= 8
      set_user_flags(id,idefaccess)
    }
  }   
  
  return result
}

accessUser( id, name[] = "" )
{
  remove_user_flags(id)
  new userip[32],userauthid[32],password[32],passfield[32],username[32]
  get_user_ip(id,userip,31,1)
  get_user_authid(id,userauthid,31)
  if ( name[0] ) copy( username , 31, name)
  else get_user_name(id,username,31 )
  get_cvar_string("amx_password_field",passfield,31)
  get_user_info(id,passfield,password,31)
  new result = getAccess(id,username,userauthid,userip,password)
  if (result & 1) client_cmd(id,"echo ^"* Invalid Password!^"")
  if (result & 2) {
    client_cmd(id,"echo ^"* You have no entry to the server...^";disconnect")
    return PLUGIN_HANDLED
  }
  if (result & 4) client_cmd(id,"echo ^"* Password accepted^"")
  if (result & 8) client_cmd(id,"echo ^"* Privileges set^"")
  return PLUGIN_CONTINUE
}

public client_infochanged(id)
{
  if ( !is_user_connected(id) || !get_cvar_num("amx_mode") )
    return PLUGIN_CONTINUE
  
  new newname[32], oldname[32]
  get_user_name(id,oldname,31)
  get_user_info(id,"name",newname,31)
  
  if ( !equal(newname,oldname) )
    accessUser( id, newname )
  
  return PLUGIN_CONTINUE
}

#if defined STEAM_VERSION
public client_putinserver(id)
  set_task(0.5,"client_entered",id)

public client_entered(id)
#else
public client_connect(id)
#endif

  return get_cvar_num( "amx_mode" ) ? accessUser( id ) : PLUGIN_CONTINUE

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
发表于 2003-9-20 17:40:55 | 显示全部楼层 来自 中国–江西–南昌
其实这里最重要的就是要用AMX来修改users.ini文件。可惜我的WIN2K没装MYSQL,不然就可以不通过users.ini而是通过MYSQL数据库来控制权限了
回复

使用道具 举报

 楼主| 发表于 2003-9-20 18:56:51 | 显示全部楼层 来自 中国–福建–厦门
偶没接触过MYSQL,HarryPotter兄能给详细的讲一讲吗?谢谢~
回复

使用道具 举报

发表于 2003-9-20 21:50:05 | 显示全部楼层 来自 中国–江西–南昌
MySQL是可以兼容WIN和UNIX的数据库系统,多用于PHP的网站。用户名、密码、权限就可以存储在MYSQL数据里,这样查询和修改就非常方便,比操作文件要好多了,因为你只要指定删除那个用户名就可以删除那一行,而不用象文件一样还要自己去查那个用户名在哪行。这就是数据库的优点了。可是现在WIN32服务器一般都是装的MS SQL SERVER 2000,而AMX又没有MSSQL的模块(主要是因为MYSQL可以同时运行在2个平台,而MSSQL不行),所以就不好操作了。
回复

使用道具 举报

发表于 2003-9-26 02:24:50 | 显示全部楼层 来自 中国–上海–上海
能不能把某个IP或者name写到admin.sma里面,而不是通过命令修改user.ini啊?
即就算user.ini是空的,password field是未知,某个IP或者name还是具有admin权限啊?
回复

使用道具 举报

发表于 2003-9-26 10:40:23 | 显示全部楼层 来自 中国–上海–上海
好~~good work!!
回复

使用道具 举报

发表于 2003-9-26 12:02:17 | 显示全部楼层 来自 中国–上海–上海
…………,0.93的代码+0.94的代码
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表