#include <config.h>#include <mail.h>#include <wizlevels.h>
gehe zum Quellcode dieser Datei
Makrodefinitionen | |
| #define | DEBUG(msg) |
| #define | DEBUG(x) |
| #define | NOTIFY_RECIPIENT |
| #define | BOUNCE_ADDR "mud@mg.mud.de" |
| #define | SECURITY(x) (geteuid(x) == ROOTID || geteuid(x) == MAILID) |
| #define | MAIL_DELAYED 4096 |
| #define | MG_NAMES ({ MUDNAME, "mg", "morgengrauen", "mud", "mg.mud.de" }) |
Funktionen | |
| protected void | create () |
| static int | GetFolders (string user) |
| static string | _unify (string str) |
| static string * | unify (string *str) |
| static string * | expand (string *addr, int expa) |
| static string | _filter_addr (string addr) |
| public string * | DeliverMail (mixed msg, int expa) |
| public int | FingerMail (string user) |
| static void | save_msg (mixed msg, string user) |
| public int | RemoveMsg (int msg, int folder, string user) |
| public int | MoveMsg (int msg, int folder, string newfolder, string user) |
| public int | DeleteUnreadFolder (string user) |
| public int | RemoveFolder (string folder, string user) |
| public int | MakeFolder (string folder, string user) |
| public int | query_recipient_ok (string name) |
| public void | deliver_mail (string recipient, string from, string subject, string mail_body) |
| string | expandSystemRecursive (string addr, int maxrec) |
Variablen | |
| mixed * | folders |
| static mapping | alias |
| static string | cachedname |
| #define BOUNCE_ADDR "mud@mg.mud.de" |
Definiert in Zeile 79 der Datei mailer.c.
Wird benutzt von DeliverMail().
| #define DEBUG | ( | msg | ) |
if ( find_player("zesstra") ) \ tell_object( find_player("zesstra"), "MAILER: "+msg )
| #define MAIL_DELAYED 4096 |
Definiert in Zeile 82 der Datei mailer.c.
Wird benutzt von DeliverMail().
| #define MG_NAMES ({ MUDNAME, "mg", "morgengrauen", "mud", "mg.mud.de" }) |
Definiert in Zeile 80 der Datei mailer.c.
Wird benutzt von DeleteUnreadFolder(), MakeFolder(), MoveMsg(), RemoveFolder() und RemoveMsg().
| static string _filter_addr | ( | string | addr | ) | [static] |
| static string _unify | ( | string | str | ) | [static] |
| protected void create | ( | ) |
Definiert in Zeile 109 der Datei mailer.c.
00110 { 00111 mixed tmp; 00112 int i; 00113 string s1, s2; 00114 00115 seteuid(ROOTID); 00116 alias=([]); 00117 00118 if ( tmp = read_file("/mail/system.mailrc") ){ 00119 tmp = explode( tmp, "\n" ); 00120 00121 for ( i = sizeof(tmp); i--; ) 00122 if ( sscanf( tmp[i], "%s %s", s1, s2 ) == 2 ) 00123 alias[s1] = s2; 00124 } 00125 }
| public int DeleteUnreadFolder | ( | string | user | ) |
Definiert in Zeile 512 der Datei mailer.c.
Benutzt folders, GetFolders(), MAILPATH, member_array(), save_object() und SECURITY.
00513 { 00514 int unread, newmail; 00515 00516 if ( !SECURITY(previous_object()) ) 00517 return -2; 00518 00519 if ( !GetFolders(user) ) 00520 return -1; /* Source folder not found */ 00521 00522 if ( (unread = member_array( "unread", folders[0] )) == -1 ) 00523 return 0; 00524 00525 if ( (newmail = member_array( "newmail", folders[0] )) == -1 ){ 00526 folders[0] += ({ "newmail" }); 00527 folders[1] += ({({})}); 00528 newmail = sizeof(folders[1]) - 1; 00529 } 00530 00531 if ( !pointerp(folders[1][newmail]) ) 00532 folders[1][newmail] = ({}); 00533 00534 if ( pointerp(folders[1][unread]) ) 00535 folders[1][newmail] += folders[1][unread]; 00536 00537 folders[0][unread..unread] = ({}); 00538 folders[1][unread..unread] = ({}); 00539 00540 save_object( MAILPATH + user[0..0] + "/" + user ); 00541 return 0; 00542 }

| public void deliver_mail | ( | string | recipient, | |
| string | from, | |||
| string | subject, | |||
| string | mail_body | |||
| ) |
Definiert in Zeile 609 der Datei mailer.c.
Benutzt ctime(), DEBUG und DeliverMail().
Wird benutzt von retry_send().
00614 { 00615 DEBUG( sprintf("DELIVER %O\n", 00616 ({ from, from, recipient, ({}), ({}), subject, time() })) ); 00617 00618 // Geloggt wird, wenn ein aufrufendes Objekt nicht sicher ist. 00619 if (object_name(previous_object())[0..7]!="/secure/") 00620 write_file("/secure/ARCH/DELIVER_MAIL", 00621 sprintf("%s : Aufruf von /secure/mailer->deliver_mail()\n" 00622 " Sender: %O Empfaenger: %O\n PO: %O TI: %O TP:%O\n\n", 00623 ctime(time()),from, recipient, 00624 previous_object(), this_interactive(), this_player())); 00625 00626 DeliverMail( ({ from, from, recipient, ({}), ({}), subject, time(), 00627 "EXTERNAL", mail_body }), 0 ); 00628 }


| public string * DeliverMail | ( | mixed | msg, | |
| int | expa | |||
| ) |
Definiert in Zeile 259 der Datei mailer.c.
Benutzt BOUNCE_ADDR, ctime(), DEBUG, dtime(), expand(), i, log_file, MAIL_DELAYED, MSG_BCC, MSG_BODY, MSG_CC, MSG_FROM, MSG_RECIPIENT, MSG_SENDER, MSG_SUBJECT, MUDNAME, NO_CARBON_COPIES, rec(), save_msg(), SAVEPATH, sender, UDPSERV und unify().
Wird benutzt von deliver_mail() und versende_mail().
00260 { 00261 string sender, *recipients, *recok, t, *tmp; 00262 mixed *newmsg; 00263 int i; 00264 #ifdef INTERNET_MAIL_ENABLED 00265 int ext; 00266 #endif 00267 00268 if ( !pointerp(msg) || sizeof(msg) != 9 ) 00269 return 0; 00270 00271 DEBUG( sprintf( "DeliverMail: %O %O\n", msg[0..4] +({0})+ msg[6..7], expa ) ); 00272 t = ctime(time()); 00273 00274 if ( !(expa & MAIL_DELAYED) ){ 00275 /* determine the real sender */ 00276 if ( extern_call() && object_name(previous_object())[0..7] != "/secure/" ) 00277 sender = getuid( this_interactive() || previous_object() ); 00278 else 00279 sender = msg[MSG_SENDER]; 00280 00281 /* make a list of all recipients */ 00282 recipients = ({ msg[MSG_RECIPIENT] }); 00283 00284 if ( !(expa & NO_CARBON_COPIES) ){ 00285 if ( pointerp(msg[MSG_CC]) ) 00286 recipients += msg[MSG_CC]; 00287 00288 if ( pointerp(msg[MSG_BCC]) ) 00289 recipients += msg[MSG_BCC]; 00290 } 00291 00292 // Mail-Aliase ersetzen 00293 recipients = expand( recipients, expa ); 00294 00295 // doppelte Adressen loeschen (nebenbei: auf Kleinschreibung wandeln) 00296 recipients = unify( recipients ); 00297 00298 // Realnamen und Kommentare entfernen 00299 recipients = map( recipients, "_filter_addr", this_object() ); 00300 00301 // auf ungueltige Zeichen checken 00302 if ( sizeof(tmp = regexp( recipients, "^[-_.@a-z0-9]*$" )) 00303 != sizeof(recipients) ){ 00304 tmp = recipients - tmp; 00305 00306 for ( i = sizeof(tmp); i--; ) 00307 log_file( "MAIL_INVALID", sprintf( "%s: Mail von %O (%O) an " 00308 "'%O'.\n", dtime(time()), 00309 msg[MSG_FROM], 00310 sender, tmp[i] ) ); 00311 00312 recipients -= tmp; 00313 } 00314 00315 // check for valid Subject and Body 00316 if (!stringp(msg[MSG_SUBJECT])) 00317 msg[MSG_SUBJECT] = "(no subject given)"; 00318 if (!stringp(msg[MSG_BODY])) 00319 msg[MSG_BODY] = 00320 "\n\nSorry - This mail was delivered without a mail body\n\n"; 00321 00322 DEBUG( sprintf( "NEED TO DELIVER TO %O\n", recipients ) ); 00323 00324 /* build the new message */ 00325 newmsg = ({ msg[MSG_FROM], sender, msg[MSG_RECIPIENT], 00326 msg[MSG_CC], "", msg[MSG_SUBJECT], 00327 dtime(time()), MUDNAME + ":" + time(), 00328 msg[MSG_BODY] }); 00329 } 00330 00331 /* Send it off ... */ 00332 recok = ({ }); 00333 00334 // ACHTUNG: durch expand() geaenderte Adressen werden zugestellt, 00335 // aber durch /mail/mailer.c zusaetzlich als unzustellbar genannt! 00336 00337 for ( i = sizeof(recipients); i-- /*&& get_eval_cost() > 500000*/; ){ 00338 DEBUG( sprintf( "Begin delivering to %s. Evalcosts left: %d.\n", 00339 recipients[i], get_eval_cost() ) ); 00340 if ( member( recipients[i], '@' ) > 0 && 00341 strstr( recipients[i], "daemon" ) < 0 ) { 00342 string rec, mud; 00343 00344 tmp = explode( recipients[i], "@" ); 00345 mud = tmp[1]; 00346 rec = tmp[0]; 00347 sender = regreplace( sender, "@", "%", 1 ); 00348 // Zustellung via Intermud-Mail an andere Muds. 00349 if ( member( mud, '.' ) == -1 ) { 00350 "/secure/udp_mail"->deliver_mail( rec, mud, sender, 00351 msg[MSG_SUBJECT], 00352 msg[MSG_BODY] ); 00353 recok += ({ recipients[i] }); 00354 } 00355 #ifdef INTERNET_MAIL_ENABLED 00356 // Zustellung in den Rest des Internets. 00357 else { 00358 ext = 1; 00359 sender = explode( sender, "%" )[0]; 00360 rec = explode( regreplace( rec, "@", "%", 1 ), "%" )[0]; 00361 mud = explode( regreplace( mud, "@", "%", 1 ), "%" )[0]; 00362 00363 write_file( sprintf( "/mail/outbound/%s.%d-%d-%d", 00364 sender, time(), i, random(123456) ), 00365 sprintf( "%s\n%s@%s\n" 00366 "Subject: %s\n" 00367 "X-MUD-From: %s\n" 00368 "X-MUD-To: %s\n" 00369 "X-MUD-Cc: %s\n" 00370 "X-MU-Subject: %s\n\n", 00371 sender, rec, mud, 00372 msg[MSG_SUBJECT], 00373 sender, recipients[0], 00374 pointerp(msg[MSG_CC]) ? 00375 implode( msg[MSG_CC], "," ) : "", 00376 msg[MSG_SUBJECT] ) + msg[MSG_BODY] + 00377 sprintf( FOOTER, t[4..10] + t[20..], t[11..18] ) 00378 + "\n" ); 00379 recok += ({ recipients[i] }); 00380 } 00381 #endif // INTERNET_MAIL_ENABLED 00382 00383 } 00384 else 00385 if ( file_size( SAVEPATH + recipients[i][0..0] + "/" + 00386 recipients[i] + ".o" ) >=0 ){ 00387 save_msg( newmsg, recipients[i] ); 00388 recok += ({ recipients[i] }); 00389 } 00390 else { 00391 string *tmpmsg = copy(newmsg); 00392 tmpmsg[MSG_BODY] = "--- Text der Mail geloescht. ---\n"; 00393 write_file( sprintf( "/mail/outbound/postmaster.%d-%d", 00394 time(), random(time()) ), 00395 sprintf( "postmaster\n" + BOUNCE_ADDR + 00396 "\nSubject: Undeliverable Mail\n%O\n", 00397 tmpmsg) ); 00398 } 00399 DEBUG( sprintf( "End delivering to %s. Evalcosts left: %d.\n", 00400 recipients[i], get_eval_cost() ) ); 00401 } 00402 #ifdef INTERNET_MAIL_ENABLED 00403 if ( ext ) 00404 send_udp( UDPSERV, 4123, "DELIVERMAIL" ); 00405 #endif 00406 return recok; 00407 }


| static string * expand | ( | string * | addr, | |
| int | expa | |||
| ) | [static] |
Definiert in Zeile 209 der Datei mailer.c.
Benutzt expandSystemRecursive(), FWSERV, i, MG_NAMES, NO_SYSTEM_ALIASES und NO_USER_ALIASES.
Wird benutzt von DeliverMail().
00210 { 00211 string tmp, *new, *ret; 00212 int i; 00213 closure qf; 00214 00215 ret = ({}); 00216 addr -= ({""}); 00217 qf = symbol_function( "QueryForward", FWSERV ); 00218 00219 for ( i = sizeof(addr); i--; ){ 00220 addr[i] = lower_case( addr[i] ); 00221 // @morgengrauen-namen werden lokal zugestellt. 00222 if ( sizeof(new = explode( addr[i], "@" )) == 2 && 00223 member( MG_NAMES, new[1] ) != -1 ) 00224 addr[i] = new[0]; 00225 00226 if ( !(expa & NO_SYSTEM_ALIASES) && tmp = expandSystemRecursive(addr[i],0) ){ 00227 ret += explode( tmp, "," ); 00228 } 00229 else 00230 ret += ({ addr[i] }); 00231 } 00232 00233 for ( i = sizeof(ret); i--; ){ 00234 if ( ret[i][0] == '\\' ) 00235 ret[i] = ret[i][1..]; 00236 else if ( !(expa & NO_USER_ALIASES) ) 00237 ret = ret - ({ ret[i] }) + 00238 explode( funcall( qf, ret[i] ), "," ); 00239 } 00240 00241 return ret; 00242 }


| string expandSystemRecursive | ( | string | addr, | |
| int | maxrec | |||
| ) |
Definiert in Zeile 173 der Datei mailer.c.
Wird benutzt von expand().
00173 { 00174 string *list,*tlist; 00175 string ret,tmp; 00176 int i,size; 00177 00178 if(maxrec>8 || !addr){ 00179 return addr; 00180 } 00181 maxrec++; 00182 00183 tlist=({}); 00184 ret=""; 00185 00186 list=explode(addr,","); 00187 list-=({""}); 00188 size=sizeof(list); 00189 for(i=0;i<size;i++){ 00190 if(tmp=alias[list[i]]){ 00191 tlist+=explode(tmp,","); 00192 } 00193 else{ 00194 tlist+=({list[i]}); 00195 } 00196 } 00197 tlist-=({""}); 00198 ret=implode(tlist,","); 00199 00200 if((ret!=addr)!=0){ 00201 ret=expandSystemRecursive(ret,maxrec); 00202 } 00203 return ret; 00204 }

| public int FingerMail | ( | string | user | ) |
Definiert in Zeile 410 der Datei mailer.c.
Benutzt ARCH_SECURITY, folders, GetFolders(), i, member_array() und process_call().
00411 { 00412 int newfolder, i; 00413 00414 //Zugriff beschraenken, Zahl der gelesenen Mails ist Privatsphaere 00415 if (!objectp(this_interactive()) || !stringp(user) || !strlen(user)) 00416 return(-1); 00417 if ((getuid(this_interactive())!=user) && 00418 (process_call() || !ARCH_SECURITY)) return(-1); 00419 00420 if ( !GetFolders(user) ) 00421 return 0; 00422 00423 if ( (newfolder = member_array( "unread", folders[0] )) != -1 ) 00424 return sizeof(folders[1][newfolder]); 00425 00426 return 0; 00427 }

| static int GetFolders | ( | string | user | ) | [static] |
Definiert in Zeile 133 der Datei mailer.c.
Benutzt cachedname, DEBUG, folders, MAILPATH und restore_object().
Wird benutzt von DeleteUnreadFolder(), FingerMail(), MakeFolder(), MoveMsg(), RemoveFolder(), RemoveMsg() und save_msg().
00134 { 00135 if ( user == cachedname ){ 00136 DEBUG( "Using cached folder for " + user + "\n" ); 00137 return sizeof(folders[1]); 00138 } 00139 00140 cachedname = user; 00141 00142 if ( !restore_object( MAILPATH + "/" + user[0..0] + "/" + user ) ){ 00143 DEBUG( "Loading folder: " + user + " (empty)\n" ); 00144 folders = ({ ({}), ({}) }); 00145 return 0; 00146 } 00147 00148 DEBUG( "Loading folder:" + user + "\n" ); 00149 return 1; 00150 }


| public int MakeFolder | ( | string | folder, | |
| string | user | |||
| ) |
Definiert in Zeile 569 der Datei mailer.c.
Benutzt folders, GetFolders(), MAILPATH, member_array(), save_object() und SECURITY.
00570 { 00571 if ( !SECURITY(previous_object()) ) 00572 return -2; 00573 00574 if ( !folder || !stringp(folder) ) 00575 return -1; /* Huh ? */ 00576 00577 if ( folder == "unread" ) 00578 return 0; /* Folder exists virtually :) */ 00579 00580 GetFolders( user ); 00581 00582 if ( member_array( folder, folders[0] ) != -1 ) 00583 return 0; /* Folder exists */ 00584 00585 folders[0] = folders[0] + ({ folder }); 00586 folders[1] = folders[1] + ({ ({}) }); 00587 00588 save_object( MAILPATH + user[0..0] + "/" + user ); 00589 return 1; 00590 }

| public int MoveMsg | ( | int | msg, | |
| int | folder, | |||
| string | newfolder, | |||
| string | user | |||
| ) |
Definiert in Zeile 480 der Datei mailer.c.
Benutzt folders, GetFolders(), member_array(), RemoveMsg() und SECURITY.
00481 { 00482 int target; 00483 00484 if ( !SECURITY(previous_object()) ) 00485 return -2; 00486 00487 if ( !GetFolders(user) ) 00488 return -1; /* Source folder not found */ 00489 00490 if ( !pointerp(folders) || !pointerp(folders[0]) || 00491 folder >= sizeof(folders[0]) ) 00492 return -1; 00493 00494 if ( msg < 0 || sizeof(folders[1][folder]) <= msg ) 00495 return 0; /* No such msg */ 00496 00497 if ( (target = member_array( newfolder, folders[0] )) == -1 ) 00498 return -3; 00499 00500 if ( target == folder ) 00501 return 1; 00502 00503 if ( !pointerp(folders[1][target]) ) 00504 folders[1][target] = ({ folders[1][folder][msg] }); 00505 else 00506 folders[1][target] += ({ folders[1][folder][msg] }); 00507 00508 return RemoveMsg( msg, folder, user ); 00509 }

| public int query_recipient_ok | ( | string | name | ) |
Definiert in Zeile 593 der Datei mailer.c.
00594 { 00595 #if INTERNET_MAIL_ENABLED 00596 return (file_size( "secure/save/" + name[0..0] + "/" + name + ".o" ) > 0 00597 || member( name, '%' ) > 0 || member( name, '@' ) > 0 ); 00598 #else 00599 // es darf zwar ein @ in der Adresse vorkommen, dahinter aber kein . mehr 00600 // (dann ist es ne Mail via Intermud-Mail, nicht ins Internet). 00601 string *tmp; 00602 return (file_size( "secure/save/" + name[0..0] + "/" + name + ".o" ) > 0 00603 || member( name, '%' ) > 0 00604 || (sizeof(tmp=explode(name,"@")) == 2 && strstr(tmp[1],".") == -1)); 00605 #endif 00606 }
| public int RemoveFolder | ( | string | folder, | |
| string | user | |||
| ) |
Definiert in Zeile 545 der Datei mailer.c.
Benutzt folders, GetFolders(), i, MAILPATH, member_array(), save_object() und SECURITY.
00546 { 00547 int i; 00548 00549 if ( !SECURITY(previous_object()) ) 00550 return -2; 00551 00552 if ( !GetFolders(user) ) 00553 return -1; /* No such folder */ 00554 00555 if ( (i = member_array( folder, folders[0] )) == -1 ) 00556 return -1; /* No such folder */ 00557 00558 if ( sizeof(folders[1][i]) > 0 ) 00559 return 0; /* Folder not empty */ 00560 00561 folders[0][i..i] = ({}); 00562 folders[1][i..i] = ({}); 00563 00564 save_object( MAILPATH + user[0..0] + "/" + user ); 00565 return 1; 00566 }

| public int RemoveMsg | ( | int | msg, | |
| int | folder, | |||
| string | user | |||
| ) |
Definiert in Zeile 457 der Datei mailer.c.
Benutzt folders, GetFolders(), MAILPATH, save_object() und SECURITY.
Wird benutzt von MoveMsg().
00458 { 00459 if ( !SECURITY(previous_object()) ) 00460 return -2; 00461 00462 if ( !GetFolders(user) ) 00463 return -1; /* No such folder */ 00464 00465 if ( !pointerp(folders) || !pointerp(folders[0]) || 00466 folder >= sizeof(folders[0]) ) 00467 return -1; 00468 00469 if ( msg < 0 || sizeof(folders[1][folder]) <= msg ) 00470 return 0; /* No such msg */ 00471 00472 folders[1][folder][msg..msg] = ({}); 00473 00474 save_object( MAILPATH + user[0..0] + "/" + user ); 00475 return 1; /* Success */ 00476 }


| static void save_msg | ( | mixed | msg, | |
| string | user | |||
| ) | [static] |
Definiert in Zeile 430 der Datei mailer.c.
Benutzt find_player(), folders, GetFolders(), MAILPATH, member_array(), p und save_object().
Wird benutzt von DeliverMail().
00431 { 00432 int newfolder; 00433 object p; 00434 00435 GetFolders( user ); 00436 00437 /* if folder 'unread' doesn't exist, create it */ 00438 newfolder = member_array( "unread", folders[0] ); 00439 00440 if ( newfolder == -1 ){ 00441 folders[0] += ({ "unread" }); 00442 folders[1] += ({ ({ }) }); 00443 newfolder = member_array( "unread", folders[0] ); 00444 } 00445 00446 folders[1][newfolder] += ({ msg }); 00447 save_object( MAILPATH + user[0..0] + "/" + user ); 00448 #ifdef NOTIFY_RECIPIENT 00449 if ( p = find_player(user) ) 00450 tell_object( p, "Ein Postreiter ruft Dir aus einiger Entfernung zu, " 00451 "dass Du neue Post hast!\n" ); 00452 #endif 00453 }


| static string * unify | ( | string * | str | ) | [static] |
Definiert in Zeile 159 der Datei mailer.c.
Wird benutzt von DeliverMail().
00160 { 00161 if ( !pointerp(str) ) 00162 return ({}); 00163 00164 str = map( filter( str, #'stringp/*'*/ ), #'lower_case/*'*/ ); 00165 str = map( str, "_unify", this_object() ); 00166 00167 return m_indices( mkmapping(str) ); 00168 }

mapping alias [static] |
Definiert in Zeile 105 der Datei mailer.c.
Wird benutzt von create() und expandSystemRecursive().
string cachedname [static] |
Definiert in Zeile 106 der Datei mailer.c.
Wird benutzt von GetFolders().
1.6.3