1 #ifndef IS_OLDGCC
2 #include <iostream>
3 #else
4 #include <iostream.h>
5 #endif
6 #ifdef __GNUC__
7 #include <cstdio>
8 #else
9 #include <stdio.h>
10 #endif
11 #include <string>
12 using namespace std;
13 #include <time.h>
14 extern "C"
15 {
16 #include "../smapi/msgapi.h"
17 }
18 #include "ftnaddr.h"
19 #include "mask.h"
20 #include "area.h"
21 #include "action.h"
22 #include "msg.h"
23 #include "version.h"
24 #include "pkt.h"
25 #include "global.h"
26
CAction()27 CAction::CAction()
28 {
29 }
30
CAction(const CAction & act)31 CAction::CAction(const CAction & act)
32 {
33 param=act.param;
34 }
35
~CAction()36 CAction::~CAction()
37 {
38 }
39
run()40 int CFileAction::run()
41 {
42 CMsg Message;
43 Message.Open(msgnum, Area);
44 f_txtFile=fopen(s_Filename.c_str(), "w");
45 fputs("From: ",f_txtFile);
46 fputs(Message.s_From.c_str(),f_txtFile);
47 fprintf(f_txtFile, ", %i:%i/%i.%i", Message.F_From.zone, Message.F_From.net, Message.F_From.node, Message.F_From.point);
48 fputs("\n",f_txtFile);
49 fputs("To : ",f_txtFile);
50 fputs(Message.s_To.c_str(),f_txtFile);
51 fprintf(f_txtFile, ", %i:%i/%i.%i", Message.F_To.zone, Message.F_To.net, Message.F_To.node, Message.F_To.point);
52 fputs("\n",f_txtFile);
53 fputs("Subject: ",f_txtFile);
54 fputs(Message.s_Subject.c_str(),f_txtFile);
55 fputs("\n",f_txtFile);
56 fputs("---------------------\n",f_txtFile);
57 for (unsigned int i=0;i<Message.s_MsgText.length();i++)
58 {
59 if (Message.s_MsgText[i]=='\r') Message.s_MsgText[i]='\n';
60 }
61 fputs(Message.s_MsgText.c_str(),f_txtFile);
62 fputs("\n",f_txtFile);
63 Message.Close();
64 string logstr="Writing Message to File " + s_Filename;
65 log->add(2,logstr);
66 fclose(f_txtFile);
67 return 0;
68 }
69
run()70 int CHdrFileAction::run()
71 {
72 CMsg Message;
73 Message.Open(msgnum, Area);
74 f_txtFile=fopen(s_Filename.c_str(), "w");
75 fputs("From: ",f_txtFile);
76 fputs(Message.s_From.c_str(),f_txtFile);
77 fprintf(f_txtFile, ", %i:%i/%i.%i", Message.F_From.zone, Message.F_From.net, Message.F_From.node, Message.F_From.point);
78 fputs("\n",f_txtFile);
79 fputs("To : ",f_txtFile);
80 fputs(Message.s_To.c_str(),f_txtFile);
81 fprintf(f_txtFile, ", %i:%i/%i.%i", Message.F_To.zone, Message.F_To.net, Message.F_To.node, Message.F_To.point);
82 fputs("\n",f_txtFile);
83 fputs("Subject: ",f_txtFile);
84 fputs(Message.s_Subject.c_str(),f_txtFile);
85 fputs("----------------------\n", f_txtFile);
86 Message.Close();
87 fclose(f_txtFile);
88 return 0;
89 }
90
run()91 int CBounceAction::run()
92 {
93 CMsg SrcMessage;
94 CMsg TgtMessage;
95 /* open messages */
96 SrcMessage.Open(msgnum, Area);
97 TgtMessage.New(Area);
98 cout << "created message" << endl;
99 /* Write Headers */
100 TgtMessage.F_From=SrcMessage.F_To;
101 TgtMessage.s_From=SrcMessage.s_To;
102 TgtMessage.F_To=SrcMessage.F_From;
103 TgtMessage.s_To=SrcMessage.s_From;
104
105 /* Write Subject */
106 TgtMessage.s_Subject="[bounce]";
107 TgtMessage.s_Subject+=SrcMessage.s_Subject;
108
109 /* write attributes */
110 TgtMessage.d_Attr=MSGPRIVATE;
111
112 string s_Text;
113 string s_Kludges;
114 cout << "writing kludges" << endl;
115 /* write fmpt, topt, intl info */
116 char buf[25];
117 if (TgtMessage.F_From.point!=0)
118 {
119 sprintf(buf, "\001FMPT %i", TgtMessage.F_From.point);
120 s_Kludges+=buf;
121 }
122 if (TgtMessage.F_To.point!=0)
123 {
124 sprintf(buf, "\001TOPT %i", TgtMessage.F_To.point);
125 s_Kludges+=buf;
126 }
127 sprintf(buf, "\001INTL %i:%i/%i %i:%i/%i",
128 TgtMessage.F_To.zone, TgtMessage.F_To.net, TgtMessage.F_To.node,
129 TgtMessage.F_From.zone, TgtMessage.F_From.net, TgtMessage.F_From.node);
130 s_Kludges+=buf;
131 cout << "wrote kludges!" << endl;
132 string s_Temp;
133 cout << "writing messageText" << endl;
134 TgtMessage.s_Ctrl+=s_Kludges;
135
136 TgtMessage.Write();
137 TgtMessage.Close();
138 SrcMessage.Close();
139 return 0;
140 }
141
run()142 int CCopyAction::run()
143 {
144 CArea AArea;
145 CMsg SrcMsg;
146 CMsg DestMsg;
147 destarea=param;
148 AArea.Open(destarea);
149 SrcMsg.Open(msgnum, Area);
150 DestMsg.New(AArea.GetArea());
151 DestMsg.F_From=SrcMsg.F_From;
152 DestMsg.F_To=SrcMsg.F_To;
153 DestMsg.s_From=SrcMsg.s_From;
154 DestMsg.s_To=SrcMsg.s_To;
155 DestMsg.s_Subject=SrcMsg.s_Subject;
156 DestMsg.s_MsgText=SrcMsg.s_MsgText;
157 DestMsg.s_Ctrl=SrcMsg.s_Ctrl;
158 DestMsg.d_Attr=SrcMsg.d_Attr;
159 DestMsg.sent=true;
160 DestMsg.Write();
161 string logstr="Copied Message to Area " + destarea;
162 log->add(2,logstr);
163 DestMsg.Close();
164 SrcMsg.Close();
165 AArea.Close();
166 return 0;
167 }
168
run()169 int CMoveAction::run()
170 {
171 CArea AArea;
172 CMsg SrcMsg;
173 CMsg DestMsg;
174 destarea=param;
175 AArea.Open(destarea);
176 SrcMsg.Open(msgnum, Area);
177 DestMsg.New(AArea.GetArea());
178 DestMsg.F_From=SrcMsg.F_From;
179 DestMsg.F_To=SrcMsg.F_To;
180 DestMsg.s_From=SrcMsg.s_From;
181 DestMsg.s_To=SrcMsg.s_To;
182 DestMsg.s_Subject=SrcMsg.s_Subject;
183 DestMsg.s_MsgText=SrcMsg.s_MsgText;
184 DestMsg.s_Ctrl=SrcMsg.s_Ctrl;
185 DestMsg.d_Attr=SrcMsg.d_Attr;
186 DestMsg.sent=true;
187 DestMsg.Write();
188 string logstr="Moved message to Area " + destarea;
189 log->add(2, logstr);
190 SrcMsg.Delete(Area);
191 SrcMsg.deleted=true;
192 DestMsg.Close();
193 AArea.Close();
194 return 0;
195 }
196
run()197 int CPackmailAction::run()
198 {
199 CPkt pkt;
200 string fromnode, tonode, passwd;
201 string temp=param;
202 while (temp[0]==' ') temp.erase(0,1);
203 do
204 {
205 /* if (temp[0]==(*temp.end()))
206 {
207 string logstr="Invalid packmail statement while processing from-address!";
208 log->add(5, logstr);
209 cerr << logstr << endl;
210 exit(0);
211 }*/
212 fromnode+=temp[0];
213 temp.erase(0,1);
214 } while (temp[0]!=' ');
215 while (temp[0]==' ') temp.erase(0,1);
216 do
217 {
218 /* if (temp[0]==(*temp.end()))
219 {
220 string logstr="Invalid packmail statement while processing uplink!";
221 log->add(5, logstr);
222 cerr << logstr << endl;
223 exit(0);
224 }*/
225 tonode+=temp[0];
226 temp.erase(0,1);
227 } while (temp[0]!=' ');
228 while(temp[0]==' ') temp.erase(0,1);
229 passwd=temp;
230
231 pkt.fromNode=const_cast<char*>(fromnode.c_str());
232 pkt.toNode=const_cast<char*>(tonode.c_str());
233 pkt.password=passwd;
234 pkt.Message.Open(msgnum, Area);
235 char taddr[20];
236 char faddr[20];
237 char viaaddr[20];
238 sprintf(faddr, "%i:%i/%i.%i",
239 pkt.Message.F_From.zone, pkt.Message.F_From.net, pkt.Message.F_From.node, pkt.Message.F_From.point);
240 sprintf(taddr, "%i:%i/%i.%i",
241 pkt.Message.F_To.zone, pkt.Message.F_To.net, pkt.Message.F_To.node, pkt.Message.F_To.point);
242 sprintf(viaaddr, "%i:%i/%i.%i",
243 pkt.toNode.zone, pkt.toNode.net, pkt.toNode.node, pkt.toNode.point);
244 string logstr="Packed Message from ";
245 logstr+=faddr;
246 logstr+=" to ";
247 logstr+= taddr;
248 logstr+=" via ";
249 logstr+=viaaddr;
250 log->add(2, logstr);
251 pkt.create();
252 pkt.Message.d_Attr |= MSGSENT;
253 pkt.Message.Write();
254 pkt.Message.Close();
255 return 0;
256 }
257
run()258 int CMovemailAction::run()
259 {
260 CPkt pkt;
261 string fromnode, tonode, passwd, dir;
262 string temp=param;
263 while (temp[0]==' ') temp.erase(0,1);
264 do
265 {
266 if (temp[0]==(*temp.end()))
267 {
268 string logstr="Invalid movemail statement! ToNode not specified";
269 log->add(5, logstr);
270 cerr << logstr << endl;
271 exit(0);
272 }
273
274 fromnode+=temp[0];
275 temp.erase(0,1);
276 } while (temp[0]!=' ');
277 while (temp[0]==' ') temp.erase(0,1);
278 do
279 {
280 if (temp[0]==(*temp.end()))
281 {
282 string logstr="Invalid movemail statement! FromNode not specified";
283 log->add(5, logstr);
284 cerr << logstr << endl;
285 exit(0);
286 }
287
288 tonode+=temp[0];
289 temp.erase(0,1);
290 } while (temp[0]!=' ');
291 while(temp[0]==' ') temp.erase(0,1);
292 do
293 {
294 if (temp[0]==(*temp.end()))
295 {
296 string logstr="Invalid movemail statement! wrong directory";
297 log->add(5, logstr);
298 cerr << logstr << endl;
299 exit(0);
300 }
301
302 dir+=temp[0];
303 temp.erase(0,1);
304 } while (temp[0]!=' ');
305
306 passwd=temp;
307
308 pkt.fromNode=const_cast<char*>(fromnode.c_str());
309 pkt.toNode=const_cast<char*>(tonode.c_str());
310 pkt.password=passwd;
311 pkt.dir=dir;
312 pkt.Message.Open(msgnum, Area);
313 char taddr[20];
314 char faddr[20];
315 char viaaddr[20];
316 sprintf(faddr, "%i:%i/%i.%i",
317 pkt.Message.F_From.zone, pkt.Message.F_From.net, pkt.Message.F_From.node, pkt.Message.F_From.point); sprintf(taddr, "%i:%i/%i.%i",
318 pkt.Message.F_To.zone, pkt.Message.F_To.net, pkt.Message.F_To.node, pkt.Message.F_To.point); sprintf(viaaddr, "%i:%i/%i.%i",
319 pkt.toNode.zone, pkt.toNode.net, pkt.toNode.node, pkt.toNode.point);
320 string logstr="Packed Message from ";
321 logstr+=faddr;
322 logstr+=" to ";
323 logstr+= taddr;
324 logstr+=" via ";
325 logstr+=viaaddr;
326 log->add(2, logstr);
327 pkt.create();
328 pkt.Message.d_Attr |= MSGSENT;
329 pkt.Message.Write();
330 pkt.Message.Close();
331 return 0;
332 }
333
run()334 int CRewriteAction::run()
335 {
336 CMask newMask;
337 newMask=param;
338 CMsg Message;
339 Message.Open(msgnum, Area);
340 /* change sender */
341 if (newMask.s_Sender[0]!='*')
342 Message.s_From=newMask.s_Sender;
343 /* change recipient */
344 if (newMask.s_Recipient[0]!='*')
345 Message.s_To=newMask.s_Recipient;
346 /* change fromA */
347 char *eaddr=new char[24];
348 strcpy(eaddr,"65535:65535/65535.65535");
349 if (newMask.F_From==eaddr) {}
350 else
351 Message.F_From=newMask.F_From;
352 /* change toA */
353 if (newMask.F_To==eaddr) {}
354 else
355 Message.F_To=newMask.F_To;
356
357 /* change subject */
358 if (newMask.s_Subject[0]!='*')
359 Message.s_Subject=newMask.s_Subject;
360 Message.Write();
361 Message.Close();
362 delete eaddr;
363 return 0;
364 }
365
run()366 int CDisplayAction::run()
367 {
368 log->add(2, param);
369 return 0;
370 }
371
run()372 int CSemaphoreAction::run()
373 {
374 f_semFile=fopen(param.c_str(), "w");
375 fclose(f_semFile);
376 return 0;
377 }
378
379 /*int CEchoCopyAction::run()
380 {
381 CArea AArea;
382 CMsg SrcMsg;
383 CMsg DestMsg;
384 destarea=param;
385 AArea.Open(destarea);
386 SrcMsg.Open(msgnum, Area);
387 DestMsg.New(AArea.GetArea());
388 DestMsg.F_From=SrcMsg.F_From;
389 DestMsg.F_To=SrcMsg.F_To;
390 DestMsg.s_From=SrcMsg.s_From;
391 DestMsg.s_To=SrcMsg.s_To;
392 DestMsg.s_Subject=SrcMsg.s_Subject;
393 DestMsg.s_MsgText=SrcMsg.s_MsgText;
394 DestMsg.s_Ctrl=SrcMsg.s_Ctrl;
395 DestMsg.d_Attr=SrcMsg.d_Attr;
396 DestMsg.sent=true;
397 DestMsg.Write();
398 string logstr="Copied Message to Area " + destarea;
399 log->add(2,logstr);
400 DestMsg.Close();
401 SrcMsg.Close();
402 AArea.Close();
403 return 0;
404 }
405
406 int CEchoMoveAction::run()
407 {
408 CArea AArea;
409 CMsg SrcMsg;
410 CMsg DestMsg;
411 destarea=param;
412 AArea.Open(destarea);
413 SrcMsg.Open(msgnum, Area);
414 DestMsg.New(AArea.GetArea());
415 DestMsg.F_From=SrcMsg.F_From;
416 DestMsg.F_To=SrcMsg.F_To;
417 DestMsg.s_From=SrcMsg.s_From;
418 DestMsg.s_To=SrcMsg.s_To;
419 DestMsg.s_Subject=SrcMsg.s_Subject;
420 DestMsg.s_MsgText=SrcMsg.s_MsgText;
421 DestMsg.s_Ctrl=SrcMsg.s_Ctrl;
422 DestMsg.d_Attr=SrcMsg.d_Attr;
423 DestMsg.sent=true;
424 DestMsg.Write();
425 string logstr="Moved message to Area " + destarea;
426 log->add(2, logstr);
427 SrcMsg.Delete(Area);
428 SrcMsg.deleted=true;
429 DestMsg.Close();
430 AArea.Close();
431 return 0;
432 }*/
433
run()434 int CDeleteAction::run()
435 {
436 CMsg SrcMsg;
437 char logstr[64];
438 SrcMsg.Open(msgnum, Area);
439 SrcMsg.Delete(Area);
440 SrcMsg.deleted=true;
441 sprintf(logstr,"Deleted message #%d",msgnum);
442 log->add(2, logstr);
443 return 0;
444 }
445
446