blob: 7f27d3de75e1afd651f36268c9c74c033dd3d0f7 [file] [log] [blame]
/***************************************************************************
Forward-Server
Teil des MG-Mailsystems
(C) 1996 Loco@Morgengrauen
Es gilt dasselbe Copyright wie fuer mailer.c, bitte dort nachlesen.
***************************************************************************/
/* 24.03.2008, Arathorn
- Auch Erzmagier duerfen jetzt Eintraege aendern (Aenderung an Security())
*/
#include <properties.h>
#include "/secure/config.h"
#include "/mail/post.h"
#include <wizlevels.h>
#define LOG "/p/service/loco/save/FWLOG"
static int Security(string name);
static mixed forwarddata;
mixed properties;
create() {
seteuid(getuid());
forwarddata=([]);
}
LoadFile(s) {
if (!forwarddata[s])
forwarddata[s]=FWSAVESERV->LoadData(s);
if (!forwarddata[s])
forwarddata[s]=([]);
}
string QueryForward(string adr) {
/* Setze eine Adresse um. Rueckgabe: Forwardadresse oder Name, wenn keine
gesetzt ist. Externe Adressen werden nicht umgesetzt. */
string s, res;
object player;
int i;
if (member(adr, '@')>=0) return adr; /* Externe Adresse */
for (i=sizeof(adr)-1;i>=1;i--) {
if (adr[i]>'z'||adr[i]<'a')
return "*UNGUELTIGER NAME: "+adr+" *";
}
if (adr[0]=='\\')
return adr;
if (adr[0]>'z'||adr[0]<'a')
return "*UNGUELTIGER NAME: "+adr+" *";
s=adr[0..0];
LoadFile(s);
if (!member(forwarddata[s],adr)) return adr;
/* Achtung, ab hier wechselt Variable s z.T. ihre Bedeutung */
if (player=find_player(adr))
s=player->QueryProp(P_MAILADDR);
else {
/* Gibts den Spieler? */
if (!master()->find_userinfo(adr))
return 0;
/* hol die Daten */
restore_object(SAVEPATH+s+"/"+adr);
s=properties[P_MAILADDR];
properties=0;
}
s=lower_case(s);
if (!s || !sizeof(s) ||
s=="none")
return adr; /* keine sinnvolle Zieladresse: nicht umsetzen */
// jetzt noch pruefen, ob s eine fuer den MAILDEMON gueltige adresse ist.
if (MAILDEMON->query_recipient_ok(s))
return s;
return adr; // offenbar keine gueltige Adresse.
}
string AddForward(string name) {
string s;
name=lower_case(name);
s=name[0..0];
if (!Security(name))
return "Nachsendeauftrag abgelehnt, bitte EM oder Loco benachrichtigen.";
LoadFile(s);
if (member(forwarddata[s],name))
return "Nachsendeauftrag war bereits gestellt worden.";
forwarddata[s]+=([name]);
FWSAVESERV->SaveData(s,forwarddata[s]);
write_file(LOG,ctime()+": ADD "+name+"\n");
return "Nachsendeauftrag angenommen. Die Adresse lautet:\n "+
QueryForward(name)+
"\nFalls diese falsch ist, bitte augenblicklich die email aendern!\n";
}
string DeleteForward(string name) {
string s;
name=lower_case(name);
s=name[0..0];
if (!Security(name))
return "Loeschen des Nachsendeauftrags ist nicht erlaubt,\n bitte EM oder Loco benachrichtigen.";
LoadFile(s);
if (!member(forwarddata[s],name))
return "Es war kein Nachsendeauftrag gestellt worden.";
forwarddata[s]-=([name]);
FWSAVESERV->SaveData(s,forwarddata[s]);
write_file(LOG,ctime()+": DEL "+name+"\n");
return "Nachsendeauftrag geloescht, Post wird wieder direkt ausgeliefert.\n";
}
static int Security(string name) {
if (geteuid(this_interactive())==name) return 1;
if (geteuid()==geteuid(previous_object())) return 2;
if (member( ({ROOTID,MAILID}), geteuid(previous_object())) >=0 ) return 3;
if ( this_interactive() && IS_ARCH(this_interactive()) ) return 4;
return 0;
}
QueryForwards() { if (Security(" N I X ")) return forwarddata; }