news.c-Dateireferenz

#include "/secure/wizlevels.h"
#include <defines.h>
#include <config.h>
#include <news.h>
Include-Abhängigkeitsdiagramm für news.c:

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

Makro-Dokumentation

#define DEBUG ( x   )     tell_object(find_player("jof"),x)

Definiert in Zeile 101 der Datei news.c.

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

#define gl ( x   )     grouplist[name,x]

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


Dokumentation der Funktionen

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 }

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

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

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 }

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

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 }

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

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 }

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

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 }

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

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 }

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

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

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 }

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

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 }

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

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 }

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

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 }

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

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

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 }

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

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 }

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

int query_prevent_shadow (  ) 

Definiert in Zeile 507 der Datei news.c.

00508 {
00509   return 1;
00510 }

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 }

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

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

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 }

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

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 }

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

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 }

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

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 }

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

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 }

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

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.

00258 {
00259     if ( grouplist[name,G_DLEVEL] >= ARCH_LVL
00260          || grouplist[name,G_WLEVEL] >= ARCH_LVL
00261          || grouplist[name,G_RLEVEL] >= ARCH_LVL )
00262         return ARCH_SECURITY;
00263     else
00264         return ELDER_SECURITY;
00265 }

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 }

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

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

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 }

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

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

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 }

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

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


Variablen-Dokumentation

nosave mapping grouplist
nosave int lasttime

Definiert in Zeile 109 der Datei news.c.

Wird benutzt von rubriken() und WriteNote().

mixed saveload

Definiert in Zeile 105 der Datei news.c.

Wird benutzt von create().

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