#include "/secure/wizlevels.h"#include <defines.h>#include <config.h>#include <news.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | WTIME 0 |
| #define | DEBUG(x) tell_object(find_player("jof"),x) |
| #define | TI_PO() (this_interactive()||previous_object()) |
| #define | F_DELETE 0 |
| #define | F_READ 1 |
| #define | F_WRITE 2 |
| #define | F_ADMIN 3 |
| #define | F_KEEPNAME 4 |
| #define | gl(x) grouplist[name,x] |
Funktionen | |
| void | create () |
| int | AddGroup (string name, string owner) |
| int | RemoveGroup (string name) |
| int | SetGroup (string name, int dlevel, int wlevel, int rlevel, int maxmessages, int expire) |
| int | AddAllowed (string name, mixed deleters, mixed writers, mixed readers) |
| int | RemoveAllowed (string name, mixed deleters, mixed writers, mixed readers) |
| static string | user_euid () |
| private int | security (string name) |
| static int | allowed (string name, int mode) |
| int | WriteNote (mixed message, mixed keepname) |
| int | RemoveNote (string name, int note) |
| mixed | GetNotes (string name) |
| static void | dump_file (string filename, mixed news) |
| protected varargs void | expire (string grp, int etime) |
| void | dump_group (string grp) |
| protected void | expire_all (string *keys) |
| void | reset () |
| static void | save_group (string grp, mixed group) |
| static void | save_group_list () |
| static mixed | load_group (string name) |
| mixed | GetGroups () |
| int | AskAllowedWrite (string n) |
| int | query_prevent_shadow () |
| mixed | GetNewsTime (string boardname) |
| mixed * | GetGroup (string name) |
Variablen | |
| mixed | saveload |
| nosave mapping | grouplist |
| nosave int | lasttime |
| #define F_ADMIN 3 |
Definiert in Zeile 254 der Datei news.c.
Wird benutzt von allowed() und GetGroup().
| #define F_DELETE 0 |
Definiert in Zeile 251 der Datei news.c.
Wird benutzt von allowed() und RemoveNote().
| #define F_KEEPNAME 4 |
Definiert in Zeile 255 der Datei news.c.
Wird benutzt von allowed() und WriteNote().
| #define F_READ 1 |
Definiert in Zeile 252 der Datei news.c.
Wird benutzt von allowed() und GetNotes().
| #define F_WRITE 2 |
Definiert in Zeile 253 der Datei news.c.
Wird benutzt von allowed() und WriteNote().
Wird benutzt von GetGroup().
| #define TI_PO | ( | ) | (this_interactive()||previous_object()) |
Definiert in Zeile 103 der Datei news.c.
Wird benutzt von WriteNote().
| #define WTIME 0 |
Definiert in Zeile 99 der Datei news.c.
Wird benutzt von GetNewsTime(), RemoveNote() und WriteNote().
| int AddAllowed | ( | string | name, | |
| mixed | deleters, | |||
| mixed | writers, | |||
| mixed | readers | |||
| ) |
Definiert in Zeile 189 der Datei news.c.
Benutzt G_DELETERS, G_OWNER, G_READERS, G_WRITERS, group, grouplist, process_call(), ROOTID, save_group_list(), security() und user_euid().
Wird benutzt von addd(), addr() und addw().
00190 { 00191 mixed *group; 00192 00193 if (!member(grouplist,name)) return -2; 00194 00195 if ( grouplist[name,G_OWNER]!=user_euid() && 00196 (!security(name) || process_call()) && user_euid() != ROOTID ) 00197 return -1; 00198 00199 if (stringp(deleters)) deleters=({deleters}); 00200 if (stringp(writers)) writers=({writers}); 00201 if (stringp(readers)) readers=({readers}); 00202 00203 if (!deleters) deleters=({}); 00204 if (!writers) writers=({}); 00205 if (!readers) readers=({}); 00206 00207 grouplist[name,G_DELETERS]+=deleters; 00208 grouplist[name,G_WRITERS]+=writers; 00209 grouplist[name,G_READERS]+=readers; 00210 00211 save_group_list(); 00212 return 1; 00213 }


| int AddGroup | ( | string | name, | |
| string | owner | |||
| ) |
Definiert in Zeile 122 der Datei news.c.
Benutzt ARCH_SECURITY, group, grouplist, i, NEWSPATH, old_explode(), process_call(), save_group(), save_group_list() und SAVEPATH.
00123 { 00124 mixed *group; 00125 string savefile, *savefilea; 00126 int i; 00127 00128 if (!name || !owner) return 0; 00129 00130 if (!ARCH_SECURITY || process_call()) return -1; // Darf nicht 00131 00132 if (member(grouplist, name)) return -2; // Gibt es schon 00133 00134 if (file_size("/"+SAVEPATH+owner[0..0]+"/"+owner+".o")<0) return -3; 00135 00136 savefilea = old_explode(name,"."); 00137 savefile = implode(savefilea,"/"); 00138 if (file_size(NEWSPATH+savefile+".o")>=0) return -4; 00139 00140 // Notwendige Directories anlegen 00141 for (i = 0; i < sizeof(savefilea)-1; i++) { 00142 mkdir(NEWSPATH+implode(savefilea[0..i],"/")); 00143 } 00144 00145 group=({}); 00146 grouplist+=([name:0;owner;savefile;-1;({});({});({});20;0;0;80]); 00147 save_group_list(); 00148 save_group(name,group); 00149 return 1; 00150 }

| static int allowed | ( | string | name, | |
| int | mode | |||
| ) | [static] |
Definiert in Zeile 267 der Datei news.c.
Benutzt ARCH_SECURITY, F_ADMIN, F_DELETE, F_KEEPNAME, F_READ, F_WRITE, G_DELETERS, G_DLEVEL, G_OWNER, G_READERS, G_RLEVEL, G_WLEVEL, G_WRITERS, grouplist, member_array(), process_call(), query_wiz_level(), ROOTID, security() und user_euid().
00268 { 00269 string euid; 00270 mixed g_level, g_mode; 00271 00272 if (process_call()) return 0; 00273 00274 euid=user_euid(); 00275 00276 if (euid==ROOTID) return 1; 00277 00278 switch(mode) { 00279 case F_KEEPNAME: return (euid=="p.daemon"); 00280 case F_WRITE: if (euid=="p.daemon") return 1; 00281 g_level=G_WLEVEL; g_mode=G_WRITERS; break; 00282 case F_ADMIN: if (!(security(name)||grouplist[name,G_OWNER]==euid)) 00283 return 0; 00284 g_level=G_DLEVEL; g_mode=G_DELETERS; break; 00285 case F_DELETE: if (euid=="p.daemon") return 1; 00286 g_level=G_DLEVEL; g_mode=G_DELETERS; break; 00287 case F_READ: g_level=G_RLEVEL; g_mode=G_READERS; break; 00288 default: return 0; 00289 } 00290 00291 if (grouplist[name,G_OWNER] != euid && !ARCH_SECURITY && 00292 grouplist[name,g_level] > query_wiz_level(euid) && 00293 member_array(euid, grouplist[name, g_mode])==-1) 00294 return 0; // No such group for the requestor :) 00295 return 1; 00296 }

| int AskAllowedWrite | ( | string | n | ) |
Definiert in Zeile 488 der Datei news.c.
Benutzt ARCH_SECURITY, G_MAX_MSG, G_OWNER, G_WLEVEL, G_WRITERS, group, grouplist, load_group(), member_array(), secure_level() und user_euid().
00489 { 00490 mixed *group; 00491 00492 if (!member(grouplist,n)) return -2; 00493 if (!pointerp(group=load_group(n))) return -2; 00494 00495 if (grouplist[n,G_OWNER] != user_euid() && 00496 !ARCH_SECURITY && 00497 grouplist[n,G_WLEVEL]>secure_level() && 00498 member_array(user_euid(),grouplist[n,G_WRITERS])==-1) 00499 return -1; 00500 00501 if (sizeof(group)>=grouplist[n,G_MAX_MSG]) return -3; 00502 return 1; 00503 }

| void create | ( | ) |
Definiert in Zeile 112 der Datei news.c.
Benutzt G_MESSAGES, grouplist, NEWSPATH, restore_object(), saveload und set_next_reset().
00112 { 00113 seteuid(getuid(this_object())); 00114 if (!restore_object(NEWSPATH+"GroupList")) 00115 grouplist=m_allocate(0,G_MESSAGES); 00116 else 00117 grouplist=saveload; 00118 // ersten reset sobald wie moeglich. ;-) 00119 set_next_reset(1); 00120 }

| static void dump_file | ( | string | filename, | |
| mixed | news | |||
| ) | [static] |
Definiert in Zeile 370 der Datei news.c.
Benutzt dtime(), extract(), i, M_MESSAGE, M_TIME, M_TITLE und M_WRITER.
Wird benutzt von dump_group() und expire().
00371 { 00372 int i; 00373 00374 for (i=0;i<sizeof(news);i++) 00375 write_file(filename,news[i][M_TITLE]+" ("+news[i][M_WRITER]+", "+ 00376 extract(dtime(news[i][M_TIME]),5,26)+"):\n"+ 00377 news[i][M_MESSAGE]+"\n-----------------------------------------------------------------------------\n\n\n\n"); 00378 }


| void dump_group | ( | string | grp | ) |
Definiert in Zeile 405 der Datei news.c.
Benutzt ARCH_SECURITY, dump_file(), group, last, load_group() und process_call().
00406 { 00407 int to_expire,size,last; 00408 mixed *group; 00409 00410 if (!ARCH_SECURITY || process_call()) return; 00411 if (!pointerp(group=load_group(grp))) return; 00412 size=sizeof(group); 00413 last=size; 00414 if (!last) return; 00415 dump_file("news/DUMP."+grp,group[0..last-1]); 00416 }

| protected varargs void expire | ( | string | grp, | |
| int | etime | |||
| ) |
Definiert in Zeile 380 der Datei news.c.
Benutzt dump_file(), G_EXPIRE, group, grouplist, last, load_group(), M_TIME und save_group().
00380 { 00381 int to_expire,size,last; 00382 mixed *group; 00383 00384 if (!pointerp(group=load_group(grp))) return; 00385 if (etime) 00386 { 00387 if (etime>0) 00388 etime=etime*60*60*24; 00389 } 00390 else 00391 etime=grouplist[grp,G_EXPIRE]; 00392 if (etime<=0 && etime!=-4711) return; 00393 to_expire=time()-etime; 00394 size=sizeof(group); 00395 last=size; 00396 if (!last) return; 00397 while ( (etime != -4711) && last && group[last-1][M_TIME]>to_expire) 00398 last--; 00399 if (!last) return; 00400 dump_file("news/OLD."+grp,group[0..last-1]); 00401 group=group[last..size-1]; 00402 save_group(grp,group); 00403 }

| protected void expire_all | ( | string * | keys | ) |
Definiert in Zeile 418 der Datei news.c.
Benutzt call_out().
00418 { 00419 // neuen call_out fuer den Rest setzen 00420 if (sizeof(keys) > 1) 00421 call_out(#'expire_all,15,keys[1..]); 00422 // und erste Gruppe expiren 00423 expire(keys[0]); 00424 }

| mixed* GetGroup | ( | string | name | ) |
Definiert in Zeile 529 der Datei news.c.
Benutzt allowed, F_ADMIN, gl, load_group() und process_call().
Wird benutzt von ginfo(), setexpire() und setmaxmsg().
00530 { 00531 if (process_call()) return 0; 00532 if (extern_call() && !allowed(name, F_ADMIN)) return 0; 00533 #define gl(x) grouplist[name,x] 00534 return ({name,gl(1),gl(2),gl(3),gl(4),gl(5),gl(6),gl(7),gl(8),gl(9),gl(10),load_group(name)}); 00535 }


| mixed GetGroups | ( | ) |
Definiert in Zeile 467 der Datei news.c.
00468 { 00469 mixed *returnlist; 00470 int i,group,slevel; 00471 string seuid; 00472 00473 returnlist=sort_array(m_indices(grouplist),#'>); //'); 00474 if (ARCH_SECURITY && !process_call()) 00475 return returnlist; 00476 00477 seuid = user_euid(); 00478 slevel = secure_level(); 00479 00480 for (i=sizeof(returnlist)-1;i>=0;i--) 00481 if (!(grouplist[returnlist[i],G_RLEVEL]<=slevel || 00482 grouplist[returnlist[i],G_OWNER]==seuid || 00483 member_array(seuid, grouplist[returnlist[i],G_READERS])!=-1)) 00484 returnlist=returnlist[0..i-1]+returnlist[i+1..]; 00485 return returnlist; 00486 }
| mixed GetNewsTime | ( | string | boardname | ) |
Definiert in Zeile 512 der Datei news.c.
Benutzt grouplist, keys, ltime und WTIME.
00514 { 00515 int i, ltime, j; 00516 mixed *keys; 00517 00518 if (!boardname) 00519 { 00520 ltime=-1; 00521 for (i=sizeof(keys=m_indices(grouplist))-1;i>=0;i--) 00522 if (ltime<(j=grouplist[keys[i],WTIME])) ltime=j; 00523 return ltime; 00524 } 00525 if (!member(grouplist,boardname)) return -1; 00526 return grouplist[boardname,WTIME]; 00527 }
| mixed GetNotes | ( | string | name | ) |
Definiert in Zeile 361 der Datei news.c.
Benutzt allowed, F_READ, group und load_group().
00362 { 00363 mixed *group; 00364 00365 if (!pointerp(group=load_group(name))) return -2; 00366 if (!allowed(name, F_READ)) return -2; 00367 return(deep_copy(group)); // COPY it 00368 }

| static mixed load_group | ( | string | name | ) | [static] |
Definiert in Zeile 452 der Datei news.c.
Wird benutzt von AskAllowedWrite(), dump_group(), expire(), GetGroup(), GetNotes(), RemoveNote() und WriteNote().
00453 { 00454 int num; 00455 mixed *ret; 00456 00457 if(!member(grouplist,name)) return -1; 00458 00459 restore_object(NEWSPATH+grouplist[name,G_SAVEFILE]); 00460 if (!pointerp(saveload)) saveload=({}); 00461 //ret=saveload[0..]; 00462 ret=copy(saveload); 00463 saveload=0; 00464 return ret; 00465 }

| int query_prevent_shadow | ( | ) |
| int RemoveAllowed | ( | string | name, | |
| mixed | deleters, | |||
| mixed | writers, | |||
| mixed | readers | |||
| ) |
Definiert in Zeile 215 der Datei news.c.
Benutzt G_DELETERS, G_OWNER, G_READERS, G_WRITERS, group, grouplist, process_call(), ROOTID, save_group_list(), security() und user_euid().
Wird benutzt von removed(), remover() und removew().
00216 { 00217 mixed *group; 00218 00219 if (!member(grouplist,name)) return -2; 00220 00221 if (grouplist[name,G_OWNER]!=user_euid() && 00222 (!security(name) || process_call()) && user_euid() != ROOTID ) 00223 return -1; 00224 00225 if (stringp(deleters)) deleters=({deleters}); 00226 if (stringp(writers)) writers=({writers}); 00227 if (stringp(readers)) readers=({readers}); 00228 00229 if (!deleters) deleters=({}); 00230 if (!writers) writers=({}); 00231 if (!readers) readers=({}); 00232 00233 grouplist[name,G_DELETERS]-=deleters; 00234 grouplist[name,G_WRITERS]-=writers; 00235 grouplist[name,G_READERS]-=readers; 00236 00237 save_group_list(); 00238 return 1; 00239 }


| int RemoveGroup | ( | string | name | ) |
Definiert in Zeile 152 der Datei news.c.
Benutzt G_SAVEFILE, grouplist, m_delete(), NEWSPATH, process_call(), save_group_list() und security().
00153 { 00154 int num; 00155 00156 if (!name) return 0; 00157 00158 if (!security(name) || process_call()) return -1; // Darf nicht 00159 00160 if (!mappingp(grouplist) || !member(grouplist,name)) 00161 return -2; // -2 no such group 00162 00163 catch(rm(NEWSPATH+grouplist[name,G_SAVEFILE]+".o");publish); 00164 efun::m_delete(grouplist,name); 00165 00166 save_group_list(); 00167 00168 return 1; 00169 }

| int RemoveNote | ( | string | name, | |
| int | note | |||
| ) |
Definiert in Zeile 326 der Datei news.c.
Benutzt allowed, F_DELETE, group, grouplist, load_group(), M_TIME, M_WRITER, save_group(), save_group_list(), user_euid() und WTIME.
00327 { 00328 int l,num; 00329 mixed *group; 00330 00331 if ((note<0) && (name=="dwnews")) 00332 { 00333 group=({}); 00334 grouplist[name,WTIME]=0; 00335 save_group(name,group); 00336 save_group_list(); 00337 return 1; 00338 } 00339 00340 if (note<0) return 0; 00341 00342 if (!pointerp(group=load_group(name))) return -2; 00343 00344 l=sizeof(group); 00345 if (l<=note) 00346 return -3; 00347 00348 if (!allowed(name, F_DELETE) && 00349 lower_case(group[note][M_WRITER])!=user_euid()) return -1; 00350 00351 group=group[0..note-1]+group[note+1..]; 00352 if (sizeof(group)) 00353 grouplist[name,WTIME]=group[<1][M_TIME]; 00354 else 00355 grouplist[name,WTIME]=0; 00356 save_group(name,group); 00357 save_group_list(); 00358 return 1; 00359 }

| void reset | ( | void | ) |
Definiert in Zeile 426 der Datei news.c.
Benutzt call_out().
00426 { 00427 // naechstes Expire und damit Reset in einem tag 00428 set_next_reset(86400); 00429 // alte call_outs ggf. entfernen. 00430 while(remove_call_out(#'expire_all)>=0); 00431 // gruppenliste holen und callout auf expire_all starten 00432 if (sizeof(grouplist)) { 00433 call_out(#'expire_all,10,m_indices(grouplist)); 00434 } 00435 }

| static void save_group | ( | string | grp, | |
| mixed | group | |||
| ) | [static] |
Definiert in Zeile 438 der Datei news.c.
Wird benutzt von AddGroup(), expire(), RemoveNote() und WriteNote().
00439 { 00440 saveload=group; // Do NOT save the accessed-Info 00441 save_object(NEWSPATH+grouplist[grp,G_SAVEFILE]); 00442 saveload=0; 00443 }

| static void save_group_list | ( | ) | [static] |
Definiert in Zeile 445 der Datei news.c.
Wird benutzt von AddAllowed(), AddGroup(), RemoveAllowed(), RemoveGroup(), RemoveNote(), SetGroup() und WriteNote().
00446 { 00447 saveload=grouplist; 00448 save_object(NEWSPATH+"GroupList"); 00449 saveload=0; 00450 }

| private int security | ( | string | name | ) |
Definiert in Zeile 257 der Datei news.c.
Benutzt ARCH_LVL, ARCH_SECURITY, ELDER_SECURITY, G_DLEVEL, G_RLEVEL, G_WLEVEL und grouplist.
| int SetGroup | ( | string | name, | |
| int | dlevel, | |||
| int | wlevel, | |||
| int | rlevel, | |||
| int | maxmessages, | |||
| int | expire | |||
| ) |
Definiert in Zeile 171 der Datei news.c.
Benutzt G_DLEVEL, G_EXPIRE, G_MAX_MSG, G_OWNER, G_RLEVEL, G_WLEVEL, group, grouplist, process_call(), save_group_list(), security() und user_euid().
Wird benutzt von setexpire(), setg() und setmaxmsg().
00172 { 00173 mixed *group; 00174 00175 if (!member(grouplist,name)) return -2; 00176 if (grouplist[name,G_OWNER]!=user_euid() && 00177 (!security(name) || process_call())) return -1; 00178 00179 grouplist[name,G_DLEVEL]=dlevel; 00180 grouplist[name,G_WLEVEL]=wlevel; 00181 grouplist[name,G_RLEVEL]=rlevel; 00182 grouplist[name,G_MAX_MSG]=maxmessages; 00183 grouplist[name,G_EXPIRE]=expire; 00184 00185 save_group_list(); 00186 return 1; 00187 }


| static string user_euid | ( | ) | [static] |
Definiert in Zeile 241 der Datei news.c.
Benutzt BLUE_NAME, ROOTID, RPL und secure_euid().
Wird benutzt von AddAllowed(), allowed(), AskAllowedWrite(), RemoveAllowed(), RemoveNote() und SetGroup().
00242 { 00243 if (previous_object()) { 00244 if (geteuid(previous_object())==ROOTID) return ROOTID; 00245 if (geteuid(previous_object())=="p.daemon") return "p.daemon"; 00246 if (BLUE_NAME(previous_object())=="/obj/mpa") return geteuid(RPL); 00247 } 00248 return secure_euid(); 00249 }


| int WriteNote | ( | mixed | message, | |
| mixed | keepname | |||
| ) |
Definiert in Zeile 298 der Datei news.c.
Benutzt allowed, F_KEEPNAME, F_WRITE, G_MAX_MSG, group, grouplist, lasttime, load_group(), M_BOARD, M_ID, M_TIME, M_WRITER, MUDNAME, name, save_group(), save_group_list(), TI_PO und WTIME.
Wird benutzt von checkrcs().
00299 { 00300 mixed *group; 00301 int uidok,tmp; 00302 string name; 00303 00304 if (!pointerp(message) || sizeof(message)!=6) return 0; 00305 00306 if (!pointerp(group=load_group(name=message[M_BOARD]))) return -2; 00307 00308 if (!allowed(name, F_WRITE)) return -1; 00309 00310 if (sizeof(group)>=grouplist[name,G_MAX_MSG]) return -3; 00311 00312 if (!keepname || !allowed(name, F_KEEPNAME)) 00313 message[M_WRITER]=capitalize(geteuid(TI_PO())); 00314 00315 if (lasttime>=time()) lasttime++; 00316 else lasttime=time(); 00317 message[M_TIME]=lasttime; 00318 message[M_ID]=MUDNAME+":"+lasttime; 00319 group+=({message}); 00320 grouplist[name,WTIME]=lasttime; 00321 save_group(name,group); 00322 save_group_list(); 00323 return 1; 00324 }


| nosave mapping grouplist |
Definiert in Zeile 108 der Datei news.c.
Wird benutzt von AddAllowed(), AddGroup(), allowed(), AskAllowedWrite(), create(), expire(), GetNewsTime(), RemoveAllowed(), RemoveGroup(), RemoveNote(), security(), SetGroup() und WriteNote().
| nosave int lasttime |
Definiert in Zeile 109 der Datei news.c.
Wird benutzt von rubriken() und WriteNote().
1.6.3