file_access.c-Dateireferenz

#include "/secure/master.h"
Include-Abhängigkeitsdiagramm für file_access.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define PATH_ARRAY(x)   (explode(x, "/")-({"."}))

Funktionen

int ReloadInsecureFile ()
void LoadDeputyFileList ()
string * full_path_array (string path, string user)
string _get_path (string path, string user)
static int project_access (string user, string project)
void OutdateProjectCache (string project)
static void _cleanup_projects ()
int access_rights (string *p_arr, string euid)
string make_path_absolute (string str)
mixed valid_write (string path, string euid, string fun, object obj)
mixed valid_read (string path, string euid, string fun, object obj)

Variablen

static mapping projects = ([])
static string * insecure
static string * deputy_files

Makro-Dokumentation

#define PATH_ARRAY ( x   )     (explode(x, "/")-({"."}))

Definiert in Zeile 24 der Datei file_access.c.

Wird benutzt von full_path_array().


Dokumentation der Funktionen

static void _cleanup_projects (  )  [static]

Definiert in Zeile 117 der Datei file_access.c.

Benutzt i, m_delete() und projects.

00117                                 {
00118   int i;
00119   mixed *users;
00120 
00121   for (users=m_indices(projects),i=sizeof(users)-1;i>=0;i--)
00122     if((time()-projects[users[i]][1])>1800)
00123       efun::m_delete(projects,users[i]);
00124 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string _get_path ( string  path,
string  user 
)

Definiert in Zeile 77 der Datei file_access.c.

Benutzt full_path_array().

Wird benutzt von AddPotionroom(), AddQuest(), ChangeMiniQuest(), ChangeRoomPath(), get_edit_line(), goto(), make_path_absolute() und set_player_object().

00077                                            {
00078   string *p_arr = full_path_array(path, user);
00079   // make path absolute
00080   if (p_arr[0] != "")
00081       p_arr = ({""}) + p_arr;
00082 
00083   return implode(p_arr,"/");
00084 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int access_rights ( string *  p_arr,
string  euid 
)

Definiert in Zeile 126 der Datei file_access.c.

Benutzt i.

Wird benutzt von valid_read() und valid_write().

00127 {
00128   int i;
00129 
00130   i = sizeof(p_arr) - 2;
00131 
00132   while ( i >= 0 &&
00133           file_size( implode(p_arr[0..i], "/") + "/access_rights.c" ) < 0 )
00134       i--;
00135 
00136   if ( i < 0 )
00137       return 0;
00138 
00139   if ( !catch(i = (int)call_other( 
00140           implode(p_arr[0..i], "/") + "/access_rights",
00141           "access_rights", euid,
00142           implode(p_arr[i+1..], "/") ); publish) )
00143       return i;
00144 
00145   return 0;
00146 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

string* full_path_array ( string  path,
string  user 
)

Definiert in Zeile 25 der Datei file_access.c.

Benutzt p, P_CURRENTDIR, PATH_ARRAY und TP.

Wird benutzt von _get_path(), valid_read() und valid_write().

00025                                                   {
00026   string *strs;
00027   string cwd;
00028 
00029   if(!path)
00030     return ({"",""}); // additional "" to yield "/" later.
00031 
00032   // remove multiple '/'
00033   path = regreplace(path, "/+", "/", 1);
00034 
00035   switch(path[0]) {
00036     case '/':
00037       if(!path[1]) return ({"",""}); //additional "" to yield "/" later
00038       strs=PATH_ARRAY(path);
00039       if (!sizeof(strs))
00040           strs = ({"",""});
00041       break;
00042     case '+':
00043       if(!path[1]) return ({"","d"});
00044       strs=({"","d"})+PATH_ARRAY(path[1..<1]);
00045       break;
00046     case '~':
00047       if(user && !path[1])
00048         return ({"","players",user});
00049       if(user && path[1]=='/')
00050         strs=({"","players",user})+PATH_ARRAY(path[2..<1]);
00051       else
00052         strs=({"","players"})+PATH_ARRAY(path[1..<1]);
00053       break;
00054     default:
00055       if(user && TP && getuid(TP) == user
00056           && (cwd=(string)TP->QueryProp(P_CURRENTDIR)))
00057         strs=PATH_ARRAY(cwd + "/" + path);
00058       else
00059         strs=PATH_ARRAY(path);
00060   }
00061   // /../ behandeln. Einschraenkungen der RegExp:
00062   // /a/b/../../d wuerde nur durch Wiederholung aufgeloest.
00063   // /../d wird nicht richtig aufgeloest.
00064   //regreplace("/d/inseln/toeter/room/hoehle/../wald/bla.c","(.*)\/[^/]+/\.\.
00065   //    /(.*)", "\\1\/\\2", RE_GLOBAL)
00066   
00067   // dies sieht schlimmer aus als es ist (member ist O(n)), solange das Array
00068   // nicht gross wird.
00069   int p;
00070   while((p=member(strs, "..")) != -1)
00071       strs = strs[0..p-2]+strs[p+1..];
00072 
00073   return strs;
00074 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

void LoadDeputyFileList (  ) 

Definiert in Zeile 16 der Datei file_access.c.

Benutzt deputy_files.

Wird benutzt von CheckDeputyRights().

00017 {
00018   // Leseberechtigungen fuer /log/ARCH/* setzen
00019   deputy_files = efun::explode( read_file("/log/ARCH/DEPUTY_FILELIST") || "",
00020                                 "\n" ) - ({""});
00021   return;
00022 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

string make_path_absolute ( string  str  ) 

Definiert in Zeile 148 der Datei file_access.c.

Benutzt _get_path() und TP.

00148                                       {
00149   return _get_path(str, getuid(TP));
00150 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

void OutdateProjectCache ( string  project  ) 

Definiert in Zeile 112 der Datei file_access.c.

Benutzt m_delete() und projects.

00113 {
00114   efun::m_delete(projects,project);
00115 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

static int project_access ( string  user,
string  project 
) [static]

Definiert in Zeile 86 der Datei file_access.c.

Benutzt lines, PROJECTDIR und projects.

Wird benutzt von valid_read() und valid_write().

00087 {
00088   mixed *lines;
00089   string s;
00090   mapping tmp;
00091 
00092   if (!member(projects,project))
00093   {
00094     s=read_file(PROJECTDIR+"/"+project+"/ACCESS_RIGHTS");
00095     if(!s||s=="")
00096       return 0;
00097     tmp=([]);
00098     for (lines=explode(s,"\n")-({""});sizeof(lines);lines=lines[1..])
00099     {
00100       if (lines[0][0]=='*')
00101         tmp[lines[0][1..]]=2;
00102       else
00103         tmp[lines[0]]=1;
00104     }
00105     projects[project]=({tmp,time()});
00106     return tmp[user];
00107   }
00108   projects[project][1]=time();
00109   return projects[project][0][user];
00110 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int ReloadInsecureFile (  ) 

Definiert in Zeile 8 der Datei file_access.c.

Benutzt insecure.

Wird benutzt von epilog().

00009 {
00010     insecure = efun::explode( read_file("/secure/INSECURE") || "", "\n" );
00011     insecure -= ({""});
00012     insecure = map( insecure, #'lower_case/*'*/ );
00013     return(1);
00014 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

mixed valid_read ( string  path,
string  euid,
string  fun,
object  obj 
)

Definiert in Zeile 348 der Datei file_access.c.

Benutzt access_rights(), ARCH_LVL, ctime(), deputy_files, DOCDIR, domain_master(), DOMAINDIR, ELDER_LVL, ETCDIR, FTPDIR, full_path_array(), GUILDDIR, insecure, IS_DEPUTY, LIBLOGDIR, LIBOBJDIR, LIBROOMDIR, LIBSAVEDIR, LORD_LVL, MAILDIR, MAILID, NEWSDIR, project_access(), PROJECTDIR, query_wiz_level(), READ_FILE, ROOTID, SECUREDIR, SPELLBOOKDIR, STDDIR, SYSDIR, TO, WIZARD_LVL und WIZARDDIR.

Wird benutzt von FtpAccess().

00349 {
00350   int s, lev;
00351   string *strs, suf;
00352 
00353   // einige Funktionen im Driver sind crash-anfaellig bei grossen Strings als
00354   // Dateinamen. Als Work-Around alle Strings als Pfad ablehnen, die laenger
00355   // als 2kb sind.
00356   // TODO: nach Driverreparatur entfernen.
00357   if (strlen(path) > 2048) return 0;
00358 
00359   if (member(path,' ')!=-1) return 0;
00360 
00361   if (!euid) euid="-";
00362 
00363   strs=full_path_array(path, euid);
00364   // Pfad soll ab jetzt auf jeden Fall absolut sein.
00365   if (strs[0] != "")
00366       path = "/" + implode(strs, "/");
00367   else
00368       path=implode(strs, "/");
00369 
00370   // fuer die Rechtebestimmung "/" an Anfang und Ende entfernen
00371   strs -= ({""});
00372 
00373   if (!sizeof(strs) || !strlen(path) || euid == ROOTID || obj==TO) return path;
00374 
00375   if ((s=sizeof(strs)) <= 1) return path;
00376 
00377   lev=query_wiz_level(euid);
00378 
00379   switch(strs[0]) {
00380     case "core":
00381     case "wahl":
00382     case NEWSDIR:
00383       return 0;
00384 
00385 //    case "pub":
00386 //        if ( lev < WIZARD_LVL )
00387 //            return 0;
00388 
00389     case "maps":
00390       if (lev<=WIZARD_LVL) return 0;
00391 
00392     case "":
00393     case ETCDIR:
00394     case STDDIR:
00395     case SYSDIR:
00396     case DOCDIR:
00397     case LIBOBJDIR:
00398     case LIBROOMDIR:
00399     case FTPDIR:
00400       return path;
00401 
00402     case MAILDIR:
00403       return (euid==MAILID);
00404 
00405     case SECUREDIR:
00406       if (strs[1]=="save" || strs[1]=="save_inactive") return 0;
00407       if (path[<2..]==".o" || path[<5..]==".dump") return 0;
00408       if (strs[1]!="ARCH" || lev>=ARCH_LVL) return path;
00409 
00410     case LIBLOGDIR:
00411       if ( strs[1] == "ARCH" && !IS_DEPUTY(euid) )
00412           return 0;
00413 
00414       if ( strs[1] == "ARCH" && lev < ARCH_LVL && s == 3 &&
00415            strs[2] != "*" && strs[2][0..2] != "bb." &&
00416            member( deputy_files, strs[2] ) < 0 )
00417           return 0;
00418 
00419       if ( lev > WIZARD_LVL )
00420           return path;
00421 
00422       if ( s == 2 && (strs[1] == "report" || strs[1] == "error") )
00423           return path; // fuer 'cd'
00424 
00425       // /log sollte jeder auflisten koennen
00426       if ( s == 2 && strs[1]=="*" && fun=="get_dir")
00427           return path;
00428 
00429       // unter /log/report/, /log/error und /log/warning/ duerfen alle lesen
00430       if ( s==3 && 
00431           (strs[1] == "report" || strs[1] == "error"  
00432            || strs[1] =="warning"))
00433           return path;
00434 
00435       // /log/<Magiername> darf von <Magiername> natuerlich auch
00436       // gelesen werden
00437       if ( s >= 2 && strs[1] == euid )
00438           return path;
00439 
00440       return 0;
00441 
00442     case "backup":
00443     case LIBSAVEDIR:
00444       if (lev>WIZARD_LVL) return path;
00445 
00446       /* Objekte in /p/* haben bisher leider wizlevel 0 */
00447       //if (lev==0) return path;
00448 
00449       if (fun=="file_size") return path;
00450 
00451       // das eigene Savefile darf man natuerlich immer. ;-)
00452       if (s==3 && (strs[2]==euid+".o" || strs[2]==euid))
00453         return path;
00454       return 0;
00455 
00456     case PROJECTDIR:
00457       /* Pruefen ob ein File existiert darf jeder... */
00458       if (fun=="file_size") return path;
00459 
00460       /* Die Service-Verzeichnisse darf jeder lesen */
00461       if (s>3 && strs[1]=="service") return path;
00462 
00463       //Weise duerfen in /p/ schreiben, also auch lesen. (Zesstra, 04.11.06)
00464       if (lev>=ELDER_LVL) return path;
00465 
00466       /* wer hier schreiben darf, darf natuerlich auf jeden Fall lesen */
00467       //Anmerkung v. Zesstra: das prueft nur, ob jemand in ACCESS_RIGHTS
00468       //steht, nicht ob jemand (ggf. aus anderen Gruenden schreiben darf)
00469       if (project_access(euid,strs[1])) return path;
00470       //Alternativ kann man explizite Schreibrechte auch via access_rights.c
00471       //vergeben. (und damit natuerlich auch Leserechte)
00472       if (access_rights(strs,euid)>0) return path;
00473 
00474       /* Objekte eines Projektes haben Lesezugriff auf ihr Projekt */
00475       if (s>3 && (implode(strs[0..1], ".") == euid
00476                   || implode(strs[0..2], ".") == euid) ) return path;
00477 
00478       /* Fall-Through */
00479 
00480     case GUILDDIR:
00481       /* "secure"-Verzeichnisse darf nur lesen, wer da auch schreiben darf */
00482       if ( s > 3 && strs[<2] == "secure" && member( insecure, strs[1] ) < 0
00483            && lev < ARCH_LVL && !access_rights(strs, euid) )
00484           return 0;
00485 
00486       /* Pruefen ob ein File existiert darf jeder... */
00487       if (fun=="file_size") return path;
00488 
00489       /* Fall-Through */
00490 
00491     case SPELLBOOKDIR:
00492       // Gildenpbjekte koennen hier lesen
00493       if (lev==0 && euid[0..4]=="GUILD") return path;
00494 
00495       // Mit Level <= 20 darf man hier nichts lesen
00496       if ( lev<=WIZARD_LVL && sizeof(regexp( ({strs[<1]}), "\\.[och]" )) )
00497         return 0;
00498 
00499       return path;
00500 
00501     case WIZARDDIR:
00502       if (s==2) return path;
00503       /* das eigene Verzeichniss darf man natuerlich immer lesen... */
00504       if (strs[1]==euid && lev>=WIZARD_LVL) return path;
00505 
00506       /* Pruefen ob ein File existiert darf jeder... */
00507       if (fun=="file_size") return path;
00508 
00509       /* fremde Verzeichnisse mit <= Level 20 noch nicht */
00510       if (lev<=WIZARD_LVL) return 0;
00511 
00512       /* wo man schreiben darf, darf man natuerlich auch lesen... */
00513       if (lev>=ELDER_LVL) return path;
00514 
00515       // kein Zugriff auf archivierten Code (wo z.B. secure/ drin sein
00516       // koennen)
00517       if (member(({"bz2","gz","zip"}), explode(strs[<1],".")[<1]) > -1)
00518         return 0;
00519 
00520       /* Files ohne Code sind nicht weiter interessant... */
00521       if ( !sizeof(regexp( ({strs[<1]}), "\\.[och]" )) )
00522           return path;
00523 
00524       /* folgende Funktionen sind natuerlich voellig uninteressant */
00525       if (member(({"get_dir", "restore_object"}), fun)!=-1)
00526           return path;
00527 
00528       /* Zugriff erlaubt, aber mitloggen */
00529       write_file( READ_FILE, sprintf("%O %s %s: %s\n", fun, ctime()[4..],
00530                                      euid, path) );
00531       return path;
00532 
00533     case DOMAINDIR:
00534       /* Mit Level 15 darf man hier _nichts_ lesen */
00535       if ( fun!="file_size" && lev<WIZARD_LVL &&
00536            sizeof(regexp( ({strs[<1]}), "\\.[och]" )) ) return 0;
00537 
00538       /* den Verzeichnisbaum von /d/ darf man natuerlich sonst lesen */
00539       if (s<=2) return path;
00540 
00541       /* eigenen Code darf man natuerlich auch lesen */
00542       if (euid==strs[2] || euid==sprintf("d.%s.%s", strs[1], strs[2]))
00543          return path;
00544 
00545       /* Deputies haben ein gemeinsames Verzeichnis unter /d/erzmagier */
00546       if (strs[1]=="erzmagier" && strs[2]=="polizei" && IS_DEPUTY(euid))
00547           return path;
00548 
00549       /* d/erzmagier darf man nur als Erzmagier lesen */
00550       if (strs[1]=="erzmagier" && lev<ARCH_LVL) return 0;
00551 
00552       /* einige Regionen haben std-verzeichnisse, die darf man natuerlich
00553          auch mit Level 20 bereits komplett lesen! */
00554       if (strs[2]=="std") return path;
00555 
00556       /* "secure"-Verzeichnisse darf nur lesen, wer da auch schreiben darf */
00557       if ( s > 4 && strs[<2] == "secure" && member( insecure, strs[2] ) < 0 ){
00558           if ( lev < ELDER_LVL && !domain_master(euid, strs[1])
00559                && !access_rights(strs, euid) )
00560               return 0;
00561           else
00562               return path;
00563       }
00564 
00565       /* Dokus, Infos und .readme darf man immer lesen... */
00566       if ( fun=="file_size" || !sizeof(regexp( ({strs[<1]}), "\\.[och]" )) )
00567           return path;
00568 
00569       /* Mit Level 20 darf man noch keinen fremden Code lesen! */
00570       if (lev<=WIZARD_LVL) return 0;
00571 
00572       /* Weise duerfen natuerlich alles weitere lesen */
00573       if (lev>=ELDER_LVL) return path;
00574 
00575       /* Regionsmagier in ihren Regionen natuerlich auch */
00576       if (lev>=LORD_LVL && domain_master(euid, strs[1])) return path;
00577 
00578       /* folgende Funktionen sind natuerlich voellig uninteressant */
00579       if (member(({"get_dir", "restore_object"}), fun)!=-1)
00580           return path;
00581 
00582       /* Zugriff erlaubt, aber mitloggen */
00583       write_file( READ_FILE, sprintf("%O %s %s: %s\n", fun, ctime()[4..],
00584                                      euid, path) );
00585       return path;
00586   }
00587   if (lev<ARCH_LVL) return 0;
00588   return path;
00589 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

mixed valid_write ( string  path,
string  euid,
string  fun,
object  obj 
)

Definiert in Zeile 153 der Datei file_access.c.

Benutzt access_rights(), ARCH_LVL, creator_file(), DOCDIR, domain_master(), domain_member(), DOMAINDIR, ELDER_LVL, ETCDIR, FTPDIR, full_path_array(), get_wiz_level(), GUILDDIR, IS_WIZARD, LIBLOGDIR, LIBOBJDIR, LIBROOMDIR, LIBSAVEDIR, MAILDIR, MAILID, project_access(), PROJECTDIR, query_wiz_level(), ROOTID, SPECIAL_LVL, SPELLBOOKDIR, STDDIR, SYSDIR, TMPDIR, TO, WIZARD_LVL und WIZARDDIR.

Wird benutzt von FtpAccess().

00154 {
00155   int s,lvl;
00156   string *strs;
00157   int *date;
00158 
00159   // einige Funktionen im Driver sind crash-anfaellig bei grossen Strings als
00160   // Dateinamen. Als Work-Around alle Strings als Pfad ablehnen, die laenger
00161   // als 2kb sind.
00162   // TODO: nach Driverreparatur entfernen.
00163   if (strlen(path) > 2048) return 0;
00164 
00165   if (member(path,' ')!=-1) return 0;
00166 
00167   switch(fun) {
00168     case "log_file":
00169       strs=full_path_array("/"+path, 0);
00170       path = implode(strs, "/");
00171       strs -= ({""}); // remove trailing and leading "/".
00172       if (sizeof(strs)>1 && strs[0]=="log") return path;
00173       return 0;
00174     case "save_object":
00175       if (!path) return 0;
00176       strs=full_path_array("/"+path, 0);
00177       break;
00178     case "ed_start":
00179       if (path && path[0])
00180         strs=full_path_array(path, euid);
00181       else strs=({"players",euid,".err"});
00182       break;
00183     default:
00184       strs=full_path_array(path, euid);
00185   }
00186 
00187   if (!euid || euid=="NOBODY" || euid=="ftp" || euid=="anonymous") return 0;
00188 
00189   // Pfad soll ab jetzt auf jeden Fall absolut sein.
00190   if (strs[0] != "")
00191       path = "/" + implode(strs, "/");
00192   else
00193       path=implode(strs, "/");
00194 
00195   // fuer die Rechtebestimmung "/" an Anfang und Ende entfernen
00196   strs -= ({""});
00197 
00198   //Root-Objekte und Master duerfen immer.
00199   if (euid == ROOTID || obj==TO) return path;
00200 
00201   lvl=query_wiz_level(euid);
00202 
00203   //Toplevel: nur EM+
00204   if ((s=sizeof(strs))<=1) return lvl>=ARCH_LVL;
00205 
00206   switch(strs[0]) {
00207     case TMPDIR:
00208       return 1;
00209 
00210 //    case "pub":
00211 //      return lvl>=WIZARD_LVL;
00212 
00213     case STDDIR:
00214     case SYSDIR:
00215     case LIBOBJDIR:
00216     case ETCDIR:
00217     case LIBROOMDIR:
00218       return lvl>=ARCH_LVL;
00219 
00220     case SPELLBOOKDIR:
00221     case GUILDDIR:
00222       return ((lvl>=ARCH_LVL) || access_rights(strs,euid));
00223 
00224     case DOCDIR:
00225       if ( s > 1 && (strs[1] == "balance") )
00226         return ((lvl>=ARCH_LVL) || access_rights(strs,euid));
00227       else
00228         return ((lvl>=SPECIAL_LVL) || access_rights(strs,euid));
00229 
00230     case FTPDIR:
00231         if ( s > 1 && (strs[1] == "incoming" || strs[1] == "tmp" ||
00232                        s == 3 && strs[1] == "News" && strs[2] == euid+".news") )
00233             return 1;
00234 
00235         if (lvl>=ELDER_LVL)
00236             return 1;
00237 
00238         return 0;
00239 
00240     case MAILDIR:
00241       if (euid==MAILID || strs[1]=="spool") break;
00242       return 0;
00243 
00244     case LIBSAVEDIR:
00245       if (lvl>=ARCH_LVL) return 1;
00246       if (s==3 && strs[1] == euid[0..0] &&
00247           (strs[2]==euid+".o" || strs[2]==euid)) break;
00248       return 0;
00249 
00250     case LIBLOGDIR:
00251       /* auf /log/ARCH/ haben wirklich nur EMs Zugriff */
00252       if (strs[1]=="ARCH" && lvl<ARCH_LVL) return 0;
00253 
00254       /* alles andere duerfen auch Weise... */
00255       if (lvl>=ELDER_LVL) return 1;
00256 
00257       /* Allgemeine logfiles in /log duerfen wirklich nur geschrieben werden */
00258       if (s==2 && strs[1][0]>='A' && strs[1][0]<='Z' && fun != "write_file")
00259          return 0;
00260 
00261       /* Unterhalb von /log/syslog darf nur geschrieben werden */
00262       if (s>1 && strs[1]=="syslog" && fun != "write_file")
00263          return 0;
00264 
00265       /* loggen ins eigene repfile immer erlauben */
00266       if (s==3 && strs[1]=="report" &&
00267           strs[2]==explode(euid, ".")[<1]+".rep") break;
00268 
00269       /* in fremden Verzeichnissen hat niemand was zu loggen */
00270       if (get_wiz_level(strs[1]) >= WIZARD_LVL &&
00271           strs[1] != efun::explode(euid, ".")[<1])
00272          return 0;
00273       break;
00274 
00275     case WIZARDDIR:
00276       /* kein Zugriff auf Objekte mit hoeheren Rechten */
00277       if (query_wiz_level(strs[1]) > lvl) return 0;
00278 
00279       /* Magier selbst oder Weise duerfen hier schreiben */
00280       if ((IS_WIZARD(euid) && euid==strs[1])||(lvl>=ELDER_LVL)) break;
00281 
00282       /* Es steht jedoch frei, auch anderen Schreibrechte zu geben... */
00283       return access_rights(strs,euid);
00284       
00285     case DOMAINDIR:
00286       /* neue Regionen duerfen nur Erzmagier anlegen */
00287       if (s<2 && lvl<ARCH_LVL) return 0;
00288 
00289       /* kein Zugriff auf Objekte mit hoeheren Rechten */
00290       if (s>2 && query_wiz_level(creator_file(path)) > lvl)
00291          return 0;
00292 
00293       /* Auf Regionfiles von erzmagier haben nur EMs Zugriff */
00294       if (creator_file(path)=="erzmagier" && lvl<ARCH_LVL) return 0;
00295 
00296       /* innerhalb der Region haben RMs und Weise volle Schreibrechte */
00297       if (lvl>=ELDER_LVL || domain_master(euid,strs[1])) break;
00298 
00299       /* neue Verzeichnisse in der Region kann nur RM+ anlegen */
00300       if (s<=3 && (fun=="mkdir" || fun=="rmdir")) return 0;
00301 
00302       /* Magier auf ihre eigenen Files... */
00303       if (s>2 && strs[2]==euid) break;
00304 
00305       /* Files der Magier in der Region in ihre eigenen Verzeichnisse... */
00306       if (s>2 && euid==sprintf("d.%s.%s", strs[1], strs[2])) break;
00307 
00308       /* Files mit Regionsuid */
00309       if (euid==strs[1]) break;
00310 
00311       /* Es ist moeglich anderen Magiern Rechte bei sich einzuraeumen. */
00312       if (access_rights(strs,euid)>0) break;
00313 
00314       /* Auf das Verzeichniss 'alle' haben alle Regionsmitglieder Zugriff.
00315          Ausser, wenn sie ueber access_rights.c explizit ausgeschlossen
00316          werden (Returncode < 0). */
00317       if (s>2 && strs[2]=="alle" && domain_member(euid, strs[1]) &&
00318           access_rights(strs,euid)>=0) break;
00319       return 0;
00320 
00321     case PROJECTDIR:
00322       /* Nur Erzmagier duerfen neue Projektverzeichnisse anlegen... */
00323       if (s<3 && lvl<ARCH_LVL) return 0;
00324 
00325       /* alles weitere duerfen auch Weise tun */
00326       if (lvl>=ELDER_LVL) break;
00327 
00328       /* in den Serviceverzeichnissen muss lediglich der Name stimmen */
00329       if (s>3 && strs[1]=="service" && euid==strs[2]) break;
00330 
00331       /* Objekte eines Projektes haben Schreibzugriffe auf ihr Projekt */
00332       if (s>3 && (implode(strs[0..1], ".") == euid
00333                   || implode(strs[0..2], ".") == euid) ) return 1;
00334 
00335       /* Schreibrechte koennen natuerlich auch vergeben werden... */
00336       if (project_access(euid,strs[1])) break;
00337       // Alternativ besteht neben dem ACCESS_RIGHTS auch noch die
00338       // Moeglichkeit, per access_rights.c Rechte einzuraeumen.
00339       if (access_rights(strs,euid)>0) break;
00340 
00341      return 0;
00342 
00343     default: return 0;
00344   }
00345   return path;
00346 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:


Variablen-Dokumentation

string * deputy_files [static]

Definiert in Zeile 6 der Datei file_access.c.

Wird benutzt von LoadDeputyFileList() und valid_read().

string* insecure [static]

Definiert in Zeile 6 der Datei file_access.c.

Wird benutzt von ReloadInsecureFile() und valid_read().

mapping projects = ([]) [static]

Definiert in Zeile 5 der Datei file_access.c.

Wird benutzt von _cleanup_projects(), OutdateProjectCache() und project_access().

Erzeugt am Thu Jun 3 14:41:31 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3