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