securd.c
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 429 行 · 第 1/2 页
C
429 行
//securityd.c
//by jackyboy@cctx
inherit F_DBASE;
inherit F_SAVE;
static mapping wiz_status=([]);//
string *wiz_levels = ({
"(player)",
"(immortal)",
"(apprentice)",
"(wizard)",
"(arch)",
"(admin)",
});
//初始设置为空,然后在create()的时候从数据文件里读取进来
static mapping trusted_write = ([]);
mapping exclude_write = ([]);
static mapping trusted_read = ([]);
static mapping exclude_read = ([]);
string query_save_file()
{
return __DIR__"securd.o";
}
void restore_list()
{
//这个函数不可以调用modify_access_list(),否则造成死循环!
string *t_read,*t_write;
string *e_read,*e_write;
//预先留个门,不然无法给系统增加巫师,但是一定要保证管理者最先获取这个ID
set("wiz_status/hxsd","(admin)"); // "/" 是比较特殊的目录,一定要允许Root和(admin)读取和写入!
// 但是同时还要注意有一些设置是不允许exclude的,比如Root对/的读写,Domain对/d的读取等等
// 这些应该用代码控制不可改变,然后在这个最小化的可启动设置上让admin做灵活的权限分配!
// 另外四个属性表都不可以为空,否则在valid_read和valid_write里检查时将会出错!所以最好在
// 这里增加一些默认的值!exclude本无须默认设置,但是可以定义上(player)不可以读写"/",尽管
// 这个本来就不允许的!(虽然多余,却并非画蛇添足!)
t_read=query("trusted_read/\n");
t_write=query("trusted_write/\n");
if(sizeof(t_read))
{
t_read=t_read - ({ROOT_UID});
t_read=t_read - ({"(admin)"});
t_read=t_read + ({ROOT_UID,"(admin)"});
}
else
t_read=({ROOT_UID,"(admin)"});
if(sizeof(t_write))
{
t_write=t_write - ({ROOT_UID});
t_write=t_write - ({"(admin)"});
t_write=t_write + ({ROOT_UID,"(admin)"});
}
else
t_write=({ROOT_UID,"(admin)"});
set("trusted_read/\n",t_read);
set("trusted_write/\n",t_write);
e_read=query("exclude_read/\n");
e_write=query("exclude_write/\n");
if(sizeof(e_read))
{
e_read=e_read - ({"(player)"});
e_read=e_read + ({"(player)"});
}
else
e_read=({"(player)"});
if(sizeof(e_write))
{
e_write=e_write - ({"(player)"});
e_write=e_write + ({"(player)"});
}
else
e_write=({"(player)"});
set("exclude_read/\n",e_read);
set("exclude_write/\n",e_write);
wiz_status = query("wiz_status");
trusted_write = query("trusted_write");
trusted_read = query("trusted_read");
exclude_write = query("exclude_write");
exclude_read = query("exclude_read");
return ;
}
void save_list()
{
set("trusted_write",trusted_write);
set("trusted_read",trusted_read);
set("exclude_write",exclude_write);
set("exclude_read",exclude_read);
return ;
}
int save()
{
save_list();
return ::save();
}
//用户接口程序,负责输出权限列表!
string print_access_list(object user,string type)
{
string str,file,*acc;
if(wiz_level(user)<wiz_level("(admin)"))
return "权限不够无法读取Access_List!\n";
str="权限分配表如下:\n";
if(type=="all"||type=="exclude_read")
{
str+="不可读>>\n";
if(sizeof(exclude_read))
foreach(file in keys(exclude_read))
{
acc=exclude_read[file];
file=replace_string(file,"\n","/");
str+=file+"\t: "+implode(acc,",")+"\n";
}
}
if(type=="all"||type=="trusted_read")
{
str+="可读>>\n";
if(sizeof(trusted_read))
foreach(file in keys(trusted_read))
{
acc=trusted_read[file];
file=replace_string(file,"\n","/");
str+=file+"\t: "+implode(acc,",")+"\n";
}
}
if(type=="all"||type=="exclude_write")
{
str+="不可写>>\n";
if(sizeof(exclude_write))
foreach(file in keys(exclude_write))
{
acc=exclude_write[file];
file=replace_string(file,"\n","/");
str+=file+"\t: "+implode(acc,",")+"\n";
}
}
if(type=="all"||type=="trusted_write")
{
str+="可写>>\n";
if(sizeof(trusted_write))
foreach(file in keys(trusted_write))
{
acc=trusted_write[file];
file=replace_string(file,"\n","/");
str+=file+"\t: "+implode(acc,",")+"\n";
}
}
return str;
}
//用户接口程序,负责维护权限列表access_list
int modify_access_list(object user,string op,string type,string file,string *acc_user)
{
string *acc;
int i;
if(!file||!sizeof(acc_user))
return 0;
if(wiz_level(user)!=wiz_level("(admin)"))//只允许admin维护列表
return 0;
file=replace_string(file,"/","\n");//对文件进行编码操作!不然路径的"/"和mapping的"/"混淆!
switch(op)
{
case "add":
switch(type)
{
case "trusted_read":
case "trusted_write":
case "exclude_read":
case "exclude_write":
sscanf(file,"/%s",file);//处理掉第一个/符号
acc=query(type+"/"+file);
if(sizeof(acc))
{
for(i=sizeof(acc_user);i>0;i--)
{
acc=acc - ({acc_user[i-1]});
acc=acc + ({acc_user[i-1]});
}
}
else
acc= acc_user;
set(type+"/"+file,acc);
break;
default:
//不能识别的类型
return 0;
}
break;
case "del":
switch(type)
{
case "trusted_read"://
case "trusted_write":
case "exclude_read":
case "exclude_write":
sscanf(file,"/%s",file);//处理掉第一个/符号
acc=query(type+"/"+file);
if(sizeof(acc))
{
for(i=sizeof(acc_user);i>0;i--)
acc=acc - ({acc_user[i-1]});
}
if(sizeof(acc))
set(type+"/"+file,acc);
else
delete(type+"/" +file);
break;
default:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?