blob: 7f27d3de75e1afd651f36268c9c74c033dd3d0f7 [file] [log] [blame]
Zesstra25387d92017-02-03 20:20:56 +01001/***************************************************************************
2
3 Forward-Server
4 Teil des MG-Mailsystems
5 (C) 1996 Loco@Morgengrauen
6
7 Es gilt dasselbe Copyright wie fuer mailer.c, bitte dort nachlesen.
8
9***************************************************************************/
10/* 24.03.2008, Arathorn
11 - Auch Erzmagier duerfen jetzt Eintraege aendern (Aenderung an Security())
12 */
13
14#include <properties.h>
15#include "/secure/config.h"
16#include "/mail/post.h"
17#include <wizlevels.h>
18
19#define LOG "/p/service/loco/save/FWLOG"
20
21static int Security(string name);
22
23static mixed forwarddata;
24mixed properties;
25
26
27create() {
28 seteuid(getuid());
29 forwarddata=([]);
30}
31
32
33LoadFile(s) {
34 if (!forwarddata[s])
35 forwarddata[s]=FWSAVESERV->LoadData(s);
36 if (!forwarddata[s])
37 forwarddata[s]=([]);
38}
39
40
41string QueryForward(string adr) {
42/* Setze eine Adresse um. Rueckgabe: Forwardadresse oder Name, wenn keine
43 gesetzt ist. Externe Adressen werden nicht umgesetzt. */
44 string s, res;
45 object player;
46 int i;
47
48 if (member(adr, '@')>=0) return adr; /* Externe Adresse */
49
50 for (i=sizeof(adr)-1;i>=1;i--) {
51 if (adr[i]>'z'||adr[i]<'a')
52 return "*UNGUELTIGER NAME: "+adr+" *";
53 }
54 if (adr[0]=='\\')
55 return adr;
56
57 if (adr[0]>'z'||adr[0]<'a')
58 return "*UNGUELTIGER NAME: "+adr+" *";
59
60
61 s=adr[0..0];
62 LoadFile(s);
63
64 if (!member(forwarddata[s],adr)) return adr;
65
66 /* Achtung, ab hier wechselt Variable s z.T. ihre Bedeutung */
67
68 if (player=find_player(adr))
69 s=player->QueryProp(P_MAILADDR);
70 else {
71 /* Gibts den Spieler? */
72 if (!master()->find_userinfo(adr))
73 return 0;
74 /* hol die Daten */
75 restore_object(SAVEPATH+s+"/"+adr);
76 s=properties[P_MAILADDR];
77 properties=0;
78 }
79
80 s=lower_case(s);
81 if (!s || !sizeof(s) ||
82 s=="none")
83 return adr; /* keine sinnvolle Zieladresse: nicht umsetzen */
84
85 // jetzt noch pruefen, ob s eine fuer den MAILDEMON gueltige adresse ist.
86 if (MAILDEMON->query_recipient_ok(s))
87 return s;
88
89 return adr; // offenbar keine gueltige Adresse.
90}
91
92
93string AddForward(string name) {
94 string s;
95
96 name=lower_case(name);
97 s=name[0..0];
98
99 if (!Security(name))
100 return "Nachsendeauftrag abgelehnt, bitte EM oder Loco benachrichtigen.";
101
102 LoadFile(s);
103
104 if (member(forwarddata[s],name))
105 return "Nachsendeauftrag war bereits gestellt worden.";
106
107 forwarddata[s]+=([name]);
108 FWSAVESERV->SaveData(s,forwarddata[s]);
109
110 write_file(LOG,ctime()+": ADD "+name+"\n");
111
112 return "Nachsendeauftrag angenommen. Die Adresse lautet:\n "+
113 QueryForward(name)+
114 "\nFalls diese falsch ist, bitte augenblicklich die email aendern!\n";
115
116}
117
118
119string DeleteForward(string name) {
120 string s;
121
122 name=lower_case(name);
123 s=name[0..0];
124
125 if (!Security(name))
126 return "Loeschen des Nachsendeauftrags ist nicht erlaubt,\n bitte EM oder Loco benachrichtigen.";
127
128 LoadFile(s);
129
130 if (!member(forwarddata[s],name))
131 return "Es war kein Nachsendeauftrag gestellt worden.";
132
133 forwarddata[s]-=([name]);
134 FWSAVESERV->SaveData(s,forwarddata[s]);
135
136 write_file(LOG,ctime()+": DEL "+name+"\n");
137
138 return "Nachsendeauftrag geloescht, Post wird wieder direkt ausgeliefert.\n";
139}
140
141
142
143static int Security(string name) {
144 if (geteuid(this_interactive())==name) return 1;
145 if (geteuid()==geteuid(previous_object())) return 2;
146 if (member( ({ROOTID,MAILID}), geteuid(previous_object())) >=0 ) return 3;
147 if ( this_interactive() && IS_ARCH(this_interactive()) ) return 4;
148 return 0;
149}
150
151
152QueryForwards() { if (Security(" N I X ")) return forwarddata; }