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; }