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 + -
显示快捷键?