#include "/secure/master.h"
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 |
Definiert in Zeile 24 der Datei file_access.c.
Wird benutzt von full_path_array().
| 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 }

| 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 }


| 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 }

| 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 }

| 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 }

| string make_path_absolute | ( | string | str | ) |
Definiert in Zeile 148 der Datei file_access.c.
Benutzt _get_path() und TP.

| 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 }

| 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 }

| 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 }

| 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 }


| 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 }


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().
1.6.3