1 /**
2  *  Naken Chat
3  *  Author: Michael Kohn
4  *   Email: mike@mikekohn.net
5  *     Web: http://www.mikekohn.net/
6  * License: GPL
7  *
8  * Copyright 1998-2013 by Michael Kohn
9  *
10  */
11 
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <unistd.h>
16 #include <fcntl.h>
17 #ifndef WINDOWS
18 #include <pthread.h>
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <arpa/inet.h>
23 #include <signal.h>
24 #include <netdb.h>
25 #endif
26 #include <errno.h>
27 #include <time.h>
28 #include <ctype.h>
29 #ifdef WINDOWS
30 #include <windows.h>
31 #endif
32 
33 #include "language.h"
34 #include "nakenchat.h"
35 
send_message(int ID,char * text,int len)36 static inline int send_message(int ID, char *text, int len)
37 {
38 #ifdef ENABLE_SSL
39   if (users[ID]->flags.ssl_connected==1)
40   {
41     return SSL_write(users[ID]->ssl, text, len);
42   }
43     else
44   {
45     return send(users[ID]->socketid, text, len, 0);
46   }
47 #else
48   return send(users[ID]->socketid, text, len, 0);
49 #endif
50 }
51 
message(int ID,char * text,int hb_flag)52 void message(int ID, char *text, int hb_flag) /* hb_flag = highlight/beep */
53 {
54 char new_text[MAX_MESSAGE_SIZE+64];
55 // char temp_text[MAX_MESSAGE_SIZE+64];
56 char temp_text[64];
57 char *out_text;
58 time_t ti;
59 #ifdef PLUGIN
60 struct naken_plugins_t *naken_plugin=naken_plugins;
61 #endif
62 
63   if (users[ID]->inuse!=1 && users[ID]->inuse!=100) return;
64 
65 #ifdef PLUGIN
66   while(naken_plugin!=0)
67   {
68     if (naken_plugin->output_filter!=0)
69     {
70       naken_plugin->naken_output_filter(text);
71     }
72     naken_plugin=naken_plugin->next_plugin;
73   }
74 #endif
75 
76   if (hb_flag==1)
77   {
78     if (users[ID]->flags.beeps)
79     {
80       out_text=new_text;
81       if (users[ID]->flags.hilites)
82       { sprintf(out_text,"%c%c[1m%s%c[0m",7,27,text,27); }
83         else
84       { sprintf(out_text,"%c%s",7,text); }
85     }
86       else
87     {
88       // strcpy(new_text,text);
89       if (users[ID]->flags.hilites)
90       {
91         out_text=new_text;
92         sprintf(out_text,"%c[1m%s%c[0m",27,text,27);
93       }
94         else
95       { out_text=text; }
96     }
97 
98     if (users[ID]->flags.time_stamps && time(NULL)-users[ID]->stamptime>600)
99     {
100       ti=time(NULL);
101       sprintf(temp_text,">> %s\r\n",ctime((time_t*)&ti));
102       strcat(out_text,temp_text);
103       users[ID]->stamptime=time(NULL);
104     }
105 
106 #ifdef LEET
107     if (SERVER_ISSET(SERVER_ELITE_MODE))
108     { leet(out_text); }
109 #endif
110 
111     if (send_message(ID, out_text, strlen(out_text))<=0)
112     {
113       users[ID]->inuse=2;
114       kill_user(ID);
115     }
116   }
117     else
118   {
119     if (users[ID]->flags.time_stamps && time(NULL)-users[ID]->stamptime>600)
120     {
121       ti=time(NULL);
122       sprintf(new_text,"%s>> %s\r",text,ctime((time_t*)&ti));
123 
124 #ifdef LEET
125       if (SERVER_ISSET(SERVER_ELITE_MODE))
126       { leet(new_text); }
127 #endif
128 
129       users[ID]->stamptime=time(NULL);
130       if (send_message(ID, new_text, strlen(new_text))<=0)
131       {
132         users[ID]->inuse=2;
133         kill_user(ID);
134       }
135     }
136       else
137     {
138 #ifdef LEET
139       if (SERVER_ISSET(SERVER_ELITE_MODE))
140       { leet(text); }
141 #endif
142 
143       if (send_message(ID, text, strlen(text))<=0)
144       {
145         users[ID]->inuse=2;
146         kill_user(ID);
147       }
148     }
149   }
150 }
151 
sendpriv(int ID_TO,int ID_FROM,char * text)152 void sendpriv(int ID_TO, int ID_FROM, char *text)
153 {
154 char tempString[MAX_MESSAGE_SIZE+128];
155 
156 #ifdef DEBUG
157   if (server_info->debug==1) printf("TO: %d FROM: %d  MESSAGE: %s\n",ID_TO,ID_FROM,text);
158 #endif
159   if (server_info->logfp!=NULL)
160   {
161 #ifdef LOG_TIMESTAMPS
162     time_t t=time(NULL);
163     char stamp[32];
164     ctime_r(&t,stamp);
165     stamp[strlen(stamp)-1]=0;
166     fprintf(server_info->logfp,"%s> TO: %d %s FROM: %d %s  MESSAGE: %s",
167             stamp,
168             ID_TO,users[ID_TO]->username,
169             ID_FROM,users[ID_FROM]->username,text);
170 #else
171     fprintf(server_info->logfp,"TO: %d %s FROM: %d %s  MESSAGE: %s",
172             ID_TO,users[ID_TO]->username,
173             ID_FROM,users[ID_FROM]->username,text);
174 #endif
175     fflush(server_info->logfp);
176   }
177 
178   if (ID_TO<server_info->max_conn)
179   {
180     if (users[ID_TO]->inuse==1)
181     {
182       message(ID_TO,text,1);
183 
184       if (!users[ID_FROM]->flags.echos)
185       {
186         sprintf(tempString,PRIVATE,ID_TO,users[ID_TO]->username);
187       }
188 	else
189       {
190         sprintf(tempString,PRIVATE_ECHO,ID_TO,users[ID_TO]->username,text);
191       }
192 
193       message(ID_FROM,tempString,0);
194     }
195       else
196     { message(ID_FROM,NOT_HERE,0); }
197   }
198     else
199   { message(ID_FROM,NOT_HERE,0); }
200 }
201 
sendchan(int ID,int channel,char * text)202 void sendchan(int ID, int channel, char *text)
203 {
204 int r;
205 
206   if (server_info->logfp!=NULL)
207   {
208 #ifdef LOG_TIMESTAMPS
209     time_t t=time(NULL);
210     char stamp[32];
211     ctime_r(&t,stamp);
212     stamp[strlen(stamp)-1]=0;
213     fprintf(server_info->logfp,"%s> [%s] %s",stamp,server_info->channels[channel],text);
214 #else
215     fprintf(server_info->logfp,"[%s] %s",server_info->channels[channel],text);
216 #endif
217     fflush(server_info->logfp);
218   }
219 
220   for (r=0; r<server_info->max_conn; r++)
221   {
222     if (users[r]->inuse==1 && users[r]->channel==channel)
223     {
224       if (ID==-1) message(r,text,0);
225 	else
226       // if ((users[r]->gags[ID/8]&(1<<(ID%8)))==0)
227       if (NOT_GAGGED(r,ID))
228       {
229         if (users[r]->user_level<10 &&
230              (users[ID]->user_level==10 &&
231              (users[ID]->flags.hidden_sysop)))
232         { continue; }
233 
234         message(r,text,0);
235       }
236     }
237   }
238 }
239 
yell(int ID,char * text)240 void yell(int ID, char *text)
241 {
242 int r;
243 
244   if (server_info->logfp!=NULL)
245   {
246 #ifdef LOG_TIMESTAMPS
247     time_t t=time(NULL);
248     char stamp[32];
249     ctime_r(&t,stamp);
250     stamp[strlen(stamp)-1]=0;
251     fprintf(server_info->logfp,"%s> %s",stamp,text);
252 #else
253     fprintf(server_info->logfp,"%s",text);
254 #endif
255     fflush(server_info->logfp);
256   }
257 
258   for(r=0; r<server_info->max_conn; r++)
259   {
260     if(users[r]->inuse==1)
261     {
262       // if ((users[r]->gags[ID/8]&(1<<(ID%8)))==0)
263       if (NOT_GAGGED(r,ID))
264       {
265 	if (!users[r]->flags.hush_yells) message(r,text,0);
266       }
267     }
268   }
269 }
270 
sendchanbut(int ID,int channel,char * text)271 void sendchanbut(int ID, int channel, char *text)
272 {
273 int r;
274 
275   if (server_info->logfp!=NULL)
276   {
277 #ifdef LOG_TIMESTAMPS
278     time_t t=time(NULL);
279     char stamp[32];
280     ctime_r(&t,stamp);
281     stamp[strlen(stamp)-1]=0;
282     fprintf(server_info->logfp,"%s> [%s] %s",stamp,server_info->channels[channel],text);
283 #else
284     fprintf(server_info->logfp,"[%s] %s",server_info->channels[channel],text);
285 #endif
286     fflush(server_info->logfp);
287   }
288 
289   for (r=0; r<server_info->max_conn; r++)
290   {
291     if ((users[r]->inuse==1 && users[r]->channel==channel) &&
292         (r!=ID && (!users[r]->flags.system_messages)))
293     {
294       if (users[r]->user_level<10 && (users[ID]->user_level==10 && (users[ID]->flags.hidden_sysop)))
295       { continue; }
296       message(r,text,0);
297     }
298   }
299 }
300 
sendall(int ID,char * text)301 void sendall(int ID, char *text)
302 {
303 int r;
304 
305   if (server_info->logfp!=NULL)
306   {
307 #ifdef LOG_TIMESTAMPS
308     time_t t=time(NULL);
309     char stamp[32];
310     ctime_r(&t,stamp);
311     stamp[strlen(stamp)-1]=0;
312     fprintf(server_info->logfp,"%s> %s",stamp,text);
313 #else
314     fprintf(server_info->logfp,"%s",text);
315 #endif
316     fflush(server_info->logfp);
317   }
318 
319   for (r=0; r<server_info->max_conn; r++)
320   {
321     if (users[r]->inuse==1)
322     {
323       if (ID==-1) message(r,text,0);
324 	else
325       if (NOT_GAGGED(r,ID) && !users[r]->flags.system_messages)
326       {
327         if (users[r]->user_level<10 && (users[ID]->user_level==10 &&
328             users[ID]->flags.hidden_sysop))
329         { continue; }
330 
331         message(r,text,0);
332       }
333     }
334   }
335 }
336 
sendallbut(int ID,char * text)337 void sendallbut(int ID, char *text)
338 {
339 int r;
340 
341   if (server_info->logfp!=NULL)
342   {
343 #ifdef LOG_TIMESTAMPS
344     time_t t=time(NULL);
345     char stamp[32];
346     ctime_r(&t,stamp);
347     stamp[strlen(stamp)-1]=0;
348     fprintf(server_info->logfp,"%s> %s",stamp,text);
349 #else
350     fprintf(server_info->logfp,"%s",text);
351 #endif
352     fflush(server_info->logfp);
353   }
354 
355   for (r=0; r<server_info->max_conn; r++)
356   {
357     if (users[r]->inuse==1 && r!=ID)
358     {
359       if (ID==-1) message(r,text,0);
360 	else
361       if (NOT_GAGGED(r,ID) && !users[r]->flags.system_messages)
362       {
363         if (users[r]->user_level<10 && (users[ID]->user_level==10 && users[ID]->flags.hidden_sysop))
364         { continue; }
365         message(r,text,0);
366       }
367     }
368   }
369 }
370 
371 
372