Fehlende Files fuer Mailsystem ergaenzt.
Change-Id: Ia51a607d71ac86a12e957ae0f2c604f190581314
diff --git a/p/service/loco/obj/fwserv.c b/p/service/loco/obj/fwserv.c
new file mode 100644
index 0000000..7f27d3d
--- /dev/null
+++ b/p/service/loco/obj/fwserv.c
@@ -0,0 +1,152 @@
+/***************************************************************************
+
+ 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; }