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