]> git.ipfire.org Git - thirdparty/sarg.git/blob - report.c
Protection against buffer overflows in getword and friends and report the origin...
[thirdparty/sarg.git] / report.c
1 /*
2 * AUTHOR: Pedro Lineu Orso pedro.orso@gmail.com
3 * 1998, 2008
4 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
5 *
6 * SARG donations:
7 * please look at http://sarg.sourceforge.net/donations.php
8 * ---------------------------------------------------------------------
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
23 *
24 */
25
26 #include "include/conf.h"
27 #include "include/defs.h"
28
29 void gerarel()
30 {
31
32 FILE *fp_in;
33
34 char accdia[11], acchora[9], accuser[MAXLEN], accip[MAXLEN], accurl[MAXLEN], accbytes[12], accelap[10];
35 char oldaccdia[11], oldacchora[9], oldaccip[MAXLEN], wdir[MAXLEN], per1[MAXLEN];
36 char wdirname[MAXLEN], oldurl[MAXLEN], oldaccuser[MAXLEN];
37 char olduser[MAXLEN], oldmsg[50], acccode[50], oldaccelap[10], oldacccode[50], user[MAXLEN];
38 char ipantes[MAXLEN], nameantes[MAXLEN], wdname[MAXLEN], wname2[MAXLEN];
39 char accsmart[MAXLEN];
40 char wcrc[50];
41 char crc2[50];
42 long long int nbytes=0;
43 long long int nelap=0;
44 long long int nacc=0;
45 long long int rtotal=0;
46 long long int incache=0;
47 long long int oucache=0;
48 char *s;
49 DIR *dirp;
50 struct dirent *direntp;
51
52 ipantes[0]='\0';
53 nameantes[0]='\0';
54 smartfilter=0;
55
56 sprintf(dirname, "%s%s", outdir, period);
57 sprintf(wdir, "%s%s", outdir, period);
58 strcpy(per1,period);
59 vrfydir(wdir, per1, addr, site, us, email);
60
61 if(debugz){
62 debugaz("dirname",dirname);
63 debugaz("wdir",wdir);
64 }
65
66 strcpy(wdirname,dirname);
67 gperiod();
68
69 if(strlen(UserAgentLog) > 0 && email[0] == '\0') useragent();
70
71 olduser[0]='\0';
72 strncat(tmp,"/sarg",5);
73
74 dirp = opendir(tmp);
75 while ((direntp = readdir( dirp )) != NULL ) {
76 if((strstr(direntp->d_name,".log") == 0) ||
77 (strncmp(direntp->d_name,"download.log",12) == 0) ||
78 (strncmp(direntp->d_name,"denied.log",10) == 0) ||
79 (strncmp(direntp->d_name,"authfail.log.unsort",19) == 0))
80 continue;
81 sprintf(tmp3,"%s/%s",tmp,direntp->d_name);
82 if((fp_in=fopen(tmp3,"r"))==NULL){
83 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],tmp);
84 exit(1);
85 }
86
87 strcpy(wdname,direntp->d_name);
88 strip_prefix:
89 if (getword(wname2,sizeof(wname2),wdname,'.')<0) {
90 printf("SARG: Maybe you have a broken record or garbage in your %s directory.\n",tmp);
91 exit(1);
92 }
93 strcat(user,wname2);
94
95 if(strcmp(wdname,"log") !=0) {
96 strcat(user,".");
97 goto strip_prefix;
98 }
99
100 strcpy(wdirname,dirname);
101 maketmp(user,tmp,debug,indexonly);
102 maketmp_hour(user,tmp,indexonly);
103
104 ttopen=0;
105 bzero(html_old, MAXLEN);
106
107 while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
108 if (getword(accdia,sizeof(accdia),buf,' ')<0 || getword(acchora,sizeof(acchora),buf,' ')<0 ||
109 getword(accuser,sizeof(accuser),buf,' ')<0 || getword(accip,sizeof(accip),buf,' ')<0 ||
110 getword(accurl,sizeof(accurl),buf,' ')<0 || getword(accbytes,sizeof(accbytes),buf,' ')<0 ||
111 getword(acccode,sizeof(acccode),buf,' ')<0) {
112 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp3);
113 exit(1);
114 }
115 if(strncmp(acccode,"TCP_DENIED/407",14) == 0) continue;
116 if (getword(accelap,sizeof(accelap),buf,' ')<0 || getword(accsmart,sizeof(accsmart),buf,' ')<0 ||
117 getword(accsmart,sizeof(accsmart),buf,'"')<0) {
118 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp3);
119 exit(1);
120 }
121
122 if(strlen(accsmart) > 0) {
123 smartfilter++;
124 strcpy(wdirname,dirname);
125 grava_SmartFilter(wdirname,accuser,accip,accdia,acchora,accurl,accsmart);
126 }
127
128 if(strcmp(Ip2Name,"yes") == 0) {
129 if(strcmp(accip,ipantes) != 0) {
130 strcpy(ipantes,accip);
131 ip2name(accip);
132 strcpy(nameantes,accip);
133 } else strcpy(accip,nameantes);
134 }
135
136 strcpy(wdirname,dirname);
137 gravatmp_hora(wdirname,accuser,accdia,acchora,accelap,accbytes,indexonly);
138
139 if(iprel){
140 strcpy(wdirname,dirname);
141 gravaporuser(accuser,wdirname,accurl,accip,accdia,acchora,accbytes,accelap,indexonly);
142 }
143
144 if(!rtotal){
145 strcpy(oldurl,accurl);
146 strcpy(oldacccode,acccode);
147 strcpy(oldaccelap,accelap);
148 strcpy(oldaccuser,accuser);
149 strcpy(oldaccip,accip);
150 strcpy(oldaccdia,accdia);
151 strcpy(oldacchora,acchora);
152 rtotal++;
153 }
154
155 if(site[0] != '\0') {
156 if(strcmp(oldaccuser,accuser) != 0){
157 strcpy(oldmsg,"OK");
158 if(strstr(oldacccode,"DENIED") != 0)
159 sprintf(oldmsg,"%s",text[46]);
160 gravatmp(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
161 gravager(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,
162 incache,oucache);
163 nacc=0;
164 nbytes=0;
165 nelap=0;
166 incache=0;
167 oucache=0;
168 }
169 } else {
170 if(strcmp(oldurl,accurl) != 0 || strcmp(oldaccuser,accuser) != 0){
171 strcpy(oldmsg,"OK");
172 if(strstr(oldacccode,"DENIED") != 0)
173 sprintf(oldmsg,"%s",text[46]);
174 strcpy(wdirname,dirname);
175 gravatmp(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
176 strcpy(wdirname,dirname);
177 gravager(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
178 nacc=0;
179 nbytes=0;
180 nelap=0;
181 incache=0;
182 oucache=0;
183 if(strcmp(oldaccuser,accuser) != 0)
184 ind2=0;
185 }
186 }
187 nacc++;
188 nbytes+=my_atoll(accbytes);
189 nelap+=my_atoll(accelap);
190
191 if(strstr(ReportType,"site_user_time_date") != 0) {
192 if(!ttopen) {
193 ind2++;
194 strcpy(siteind,accurl);
195 str=siteind;
196 for(z1=0; z1<strlen(str); z1++) {
197 if(str[z1]=='?' || str[z1]=='-' || str[z1]=='.' || str[z1]==':' || str[z1]=='/' || str[z1]=='\\')
198 str[z1]='_';
199 }
200 sprintf(arqtt,"%s/%s",dirname,accuser);
201 if(access(arqtt, R_OK) != 0)
202 my_mkdir(arqtt);
203 sprintf(arqtt,"%s/%s/tt%s-%s.html",dirname,accuser,accuser,siteind);
204 if(strlen(arqtt) > 255) {
205 strncpy(val7,arqtt,255);
206 bzero(arqtt,MAXLEN);
207 strcpy(arqtt,val7);
208 }
209 if ((fp_tt = fopen(arqtt, "w")) == 0) {
210 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],arqtt);
211 exit(1);
212 }
213 ttopen=1;
214
215 if(strcmp(Privacy,"yes") == 0)
216 sprintf(httplink,"<font size=%s color=%s><href=http://%s>%s", \
217 FontSize,PrivacyStringColor,PrivacyString,PrivacyString);
218 else
219 sprintf(httplink,"<font size=%s><a href=http://%s>%s</A>",FontSize,accurl,accurl);
220
221 sprintf(ltext110,"%s",text[110]);
222 if(ltext110){
223 for(s=ltext110; *s; ++s)
224 *s=tolower(*s);
225 }
226
227 fprintf(fp_tt, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
228 css(fp_tt);
229 fputs("</head>\n",fp_tt);
230 fprintf(fp_tt,"<body bgcolor=%s text=%s background='%s'>\n",BgColor,TxColor,BgImage);
231 if(strlen(LogoImage) > 0) fprintf(fp_tt, "<center><table cellpadding=\"0\" cellspacing=\"0\">\n<tr><th class=\"logo\"><img src='%s' border=0 align=absmiddle width=%s height=%s>&nbsp;%s</th></tr>\n<tr><td height=\"5\"></td></tr>\n</table>\n",LogoImage,Width,Height,LogoText);
232
233 if(strcmp(IndexTree,"date") == 0)
234 show_sarg(fp_tt, "../../../..");
235 else
236 show_sarg(fp_tt, "../..");
237
238 fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_tt);
239 fprintf(fp_tt,"<tr><th class=\"title\" colspan=\"2\">%s</th></tr>\n",Title);
240
241 strcpy(u2,user);
242 if(strcmp(Ip2Name,"yes") == 0)
243 ip2name(u2);
244 if(UserTabFile[0] != '\0') {
245 sprintf(warea,":%s:",u2);
246 if((str=(char *) strstr(userfile,warea)) != (char *) NULL ) {
247 z1=0;
248 str2=(char *) strstr(str+1,":");
249 str2++;
250 bzero(name, MAXLEN);
251 while(str2[z1] != ':') {
252 name[z1]=str2[z1];
253 z1++;
254 }
255 } else strcpy(name,u2);
256 } else strcpy(name,u2);
257
258 if(dotinuser && strstr(name,"_")) {
259 str2=(char *)subs(name,"_",".");
260 strcpy(name,str2);
261 }
262
263 fprintf(fp_tt,"<tr><td class=\"header\" colspan=\"2\">%s:&nbsp;%s</td></tr>\n",text[89],period);
264 fprintf(fp_tt,"<tr><td class=\"header\" colspan=\"2\">%s:&nbsp;%s</td></tr>\n",text[90],name);
265 fprintf(fp_tt,"<tr><td class=\"header\" colspan=\"2\">%s:&nbsp;%s, %s</td></tr>\n",text[104],UserSortField,UserSortOrder);
266 fprintf(fp_tt,"<tr><th class=\"header3\" colspan=2>%s</th></tr>\n",text[32]);
267
268 fputs("</table></center>\n",fp_tt);
269 fputs("<center><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_tt);
270 fputs("<tr><td></td><td></td></tr>",fp_tt);
271 bzero(tmp4, MAXLEN);
272 strncpy(tmp4,text[110],4);
273 fprintf(fp_tt,"<tr><th class=\"header\">%s</th><th class=\"header\">%s</th><th class=\"header\">%s</th></tr>\n",text[91],tmp4,text[110]+5);
274 }
275
276 sprintf(html,"<tr><td class=\"data\">%s</td><td class=\"data\">%s</td><td class=\"data\">%s</td></tr>\n",accurl,accdia,acchora);
277
278 if(strcmp(html,html_old) != 0)
279 fputs(html,fp_tt);
280 strcpy(html_old, html);
281 } else bzero(ltext110, 50);
282
283 strcpy(wcrc,acccode);
284 if (getword(crc2,sizeof(crc2),wcrc,'/')<0) {
285 printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp3);
286 exit(1);
287 }
288
289 if(strstr(crc2,"MISS") != 0)
290 oucache+=my_atoll(accbytes);
291 else incache+=my_atoll(accbytes);
292
293 strcpy(oldurl,accurl);
294
295 if(strcmp(accuser,oldaccuser) != 0) {
296 strcpy(wdirname,dirname);
297 day_totalize(tmp,oldaccuser,indexonly);
298 }
299
300 strcpy(oldaccuser,accuser);
301 strcpy(oldacccode,acccode);
302 strcpy(oldaccelap,accelap);
303 strcpy(oldaccip,accip);
304 strcpy(oldaccdia,accdia);
305 strcpy(oldacchora,acchora);
306
307 }
308 bzero(user,MAXLEN);
309 fclose(fp_in);
310 unlink(tmp3);
311 }
312
313 strcpy(oldmsg,"OK");
314 if(strstr(oldacccode,"DENIED") != 0)
315 sprintf(oldmsg,"%s",text[46]);
316 strcpy(wdirname,dirname);
317 if(strlen(oldaccuser) == 0)
318 strcpy(oldaccuser,accuser);
319 gravatmpf(oldaccuser,wdirname,oldurl,nacc,nbytes,oldmsg,nelap,indexonly,incache,oucache);
320 strcpy(wdirname,dirname);
321 gravager(wdirname,oldaccuser,nacc,oldurl,nbytes,oldaccip,oldacchora,oldaccdia,nelap,incache,oucache);
322 strcpy(wdirname,dirname);
323 day_totalize(tmp,oldaccuser,indexonly);
324
325 tmpsort();
326
327 strcpy(wdirname,dirname);
328 totalger(wdirname, debug, outdir);
329
330 if(strlen(email) == 0) {
331 if(strstr(ReportType,"downloads") != 0) download_report();
332
333 if(strlen(DansGuardianConf) > 0) {
334 strcpy(wdirname,dirname);
335 dansguardian_log();
336 }
337
338 strcpy(wdirname,dirname);
339 squidguard_log();
340
341 strcpy(wdirname,dirname);
342 topuser();
343
344 if(strstr(ReportType,"topsites") != 0) topsites();
345
346 if(strstr(ReportType,"sites_users") != 0) siteuser();
347 gen_denied_report();
348
349 strcpy(wdirname,dirname);
350 authfail_report();
351
352 if(smartfilter) smartfilter_report();
353
354 if(strlen(DansGuardianConf) > 0) dansguardian_report();
355
356 squidguard_report();
357
358 if(strstr(ReportType,"users_sites") != 0) htmlrel();
359
360 make_index();
361
362 if(strncmp(SuccessfulMsg,"yes",3) == 0) fprintf(stderr, "SARG: %s %s\n",text[47],dirname);
363 } else {
364 strcpy(wdirname,dirname);
365 geramail(wdirname, debug, outdir, userip, email, TempDir);
366
367 if((strcmp(email,"stdout") != 0) && (strncmp(SuccessfulMsg,"yes",3) == 0))
368 fprintf(stderr, "SARG: %s %s\n",text[48],email);
369 }
370
371 if(indexonly) {
372 strcpy(wdirname,dirname);
373 index_only(wdirname, debug);
374 }
375
376 if(strlen(email) < 0)
377 removetmp(dirname);
378
379 return;
380 }
381
382
383 void maketmp(char *user, char *dirname, int debug, int indexonly)
384 {
385
386 FILE *fp_ou;
387
388 char wdirname[MAXLEN];
389
390 if(indexonly) return;
391 if(strstr(ReportType,"users_sites") == 0) return;
392
393 strcpy(wdirname,tmp);
394 strcat(wdirname,"/");
395 strcat(wdirname,user);
396
397 if(debug){
398 sprintf(msg,"%s: %s",text[49],wdirname);
399 debuga(msg);
400 }
401
402 strcat(wdirname,".utmp");
403 if((fp_ou=fopen(wdirname,"w"))==NULL){
404 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname);
405 exit(1);
406 }
407
408 fclose(fp_ou);
409 return;
410 }
411
412
413 void maketmp_hour(char *user, char *dirname, int indexonly)
414 {
415
416 FILE *fp_ou;
417
418 char wdirname[MAXLEN];
419
420 if(indexonly) return;
421 if(strstr(ReportType,"users_sites") == 0) return;
422
423 strcpy(wdirname,tmp);
424 strcat(wdirname,"/");
425 strcat(wdirname,user);
426
427 strcat(wdirname,".htmp");
428 if((fp_ou=fopen(wdirname,"w"))==NULL){
429 fprintf(stderr, "SARG: (report-1) %s: %s - %s\n",text[45],wdirname,strerror(errno));
430 exit(1);
431 }
432
433 fclose(fp_ou);
434 return;
435 }
436
437
438 void gravatmp(char *oldaccuser, char *dirname, char *oldurl, long long int nacc, long long int nbytes, char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache)
439 {
440
441 FILE *fp_ou;
442
443 char wdirname[MAXLEN];
444
445 if(indexonly) return;
446 if(strstr(ReportType,"users_sites") == 0) return;
447
448 strcpy(wdirname,tmp);
449 strcat(wdirname,"/");
450 strcat(wdirname,oldaccuser);
451 strcat(wdirname,".utmp");
452
453 if((fp_ou=fopen(wdirname,"a"))==NULL){
454 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname);
455 exit(1);
456 }
457
458 my_lltoa(nacc,val1,15);
459 my_lltoa(nbytes,val2,15);
460 my_lltoa(nelap,val3,15);
461 my_lltoa(incache,val4,15);
462 my_lltoa(oucache,val5,15);
463 fprintf(fp_ou,"%s %s %s %s %s %s %s\n",val1,val2,oldurl,oldmsg,val3,val4,val5);
464
465 fclose(fp_ou);
466 ttopen=0;
467
468 if(fp_tt) {
469 fputs("</table>\n",fp_tt);
470 fputs("</body>\n</html>\n",fp_tt);
471 fclose(fp_tt);
472 }
473
474 return;
475
476 }
477
478
479 void gravatmp_hora(char *dirname, char *user, char *data, char *hora, char *elap, char *bytes, int indexonly)
480 {
481
482 FILE *fp_ou;
483
484 char wdirname[MAXLEN];
485
486 if(indexonly || (strstr(ReportType,"users_sites") == 0)) return;
487
488 strcpy(wdirname,tmp);
489 strcat(wdirname,"/");
490 strcat(wdirname,user);
491 strcat(wdirname,".htmp");
492
493 if((fp_ou=fopen(wdirname,"a"))==NULL){
494 fprintf(stderr, "SARG: (report-2) %s: %s - %s\n",text[45],wdirname,strerror(errno));
495 exit(1);
496 }
497
498 if(strcmp(datetimeby,"bytes") == 0) fprintf(fp_ou,"%s %s %s\n",data,hora,bytes);
499 else fprintf(fp_ou,"%s %s %s\n",data,hora,elap);
500
501 fclose(fp_ou);
502
503 return;
504 }
505
506
507 void gravaporuser(char *user, char *dirname, char *url, char *ip, char *data, char *hora, char *tam, char *elap, int indexonly)
508 {
509
510 FILE *fp_ou;
511
512 char wdirname[MAXLEN];
513
514 if(indexonly || (strstr(ReportType,"users_sites") == 0)) return;
515
516 strcpy(wdirname,tmp);
517 strcat(wdirname,"/");
518 strcat(wdirname,user);
519 strcat(wdirname,".ip");
520
521 if((fp_ou=fopen(wdirname,"a"))==NULL){
522 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname);
523 exit(1);
524 }
525
526 fprintf(fp_ou,"%s %s %s %s %s %s\n",ip,url,data,hora,tam,elap);
527
528 fclose(fp_ou);
529
530 return;
531
532 }
533
534
535 void gravatmpf(char *oldaccuser, char *dirname, char *oldurl, long long int nacc, long long int nbytes, char *oldmsg, long long int nelap, int indexonly, long long int incache, long long int oucache)
536 {
537
538 FILE *fp_ou;
539
540 char wdirname[MAXLEN];
541
542 if(indexonly || (strstr(ReportType,"users_sites") == 0)) return;
543
544 strcpy(wdirname,tmp);
545 strcat(wdirname,"/");
546 strcat(wdirname,oldaccuser);
547 strcat(wdirname,".utmp");
548
549 if((fp_ou=fopen(wdirname,"a"))==NULL){
550 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname);
551 exit(1);
552 }
553
554 my_lltoa(nacc,val1,15);
555 my_lltoa(nbytes,val2,15);
556 my_lltoa(nelap,val3,15);
557 my_lltoa(incache,val4,15);
558 my_lltoa(oucache,val5,15);
559 fprintf(fp_ou,"%s %s %s %s %s %s %s\n",val1,val2,oldurl,oldmsg,val3,val4,val5);
560
561 fclose(fp_ou);
562 ttopen=0;
563 ind2=0;
564
565 if(fp_tt) {
566 fputs("</table>\n",fp_tt);
567 fputs("</html>\n",fp_tt);
568 fclose(fp_tt);
569 }
570
571 return;
572
573 }
574
575
576 void gravager(char *dirname, char *user, long long int nacc, char *url, long long int nbytes, char *ip, char *hora, char *dia, long long int nelap, long long int incache, long long int oucache)
577 {
578
579 FILE *fp_ou;
580
581 strcat(dirname,"/");
582 strcat(dirname,"sarg-general");
583
584 if((fp_ou=fopen(dirname,"a"))==NULL){
585 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],dirname);
586 exit(1);
587 }
588
589 my_lltoa(nacc,val1,15);
590 my_lltoa(nbytes,val2,15);
591 my_lltoa(nelap,val3,15);
592 my_lltoa(incache,val4,15);
593 my_lltoa(oucache,val5,15);
594 fprintf(fp_ou,"%s %s %s %s %s %s %s %s %s %s\n",user,val1,val2,url,ip,hora,dia,val3,val4,val5);
595
596 fclose(fp_ou);
597 return;
598
599 }
600
601 void grava_SmartFilter(char *dirname, char *user, char *ip, char *data, char *hora, char *url, char *smart)
602 {
603
604 FILE *fp_ou;
605
606 char wdirname[MAXLEN];
607
608 sprintf(wdirname,"%s/smartfilter.unsort",dirname);
609
610 if((fp_ou=fopen(wdirname,"a"))==NULL){
611 fprintf(stderr, "SARG: (report) %s: %s\n",text[45],wdirname);
612 exit(1);
613 }
614
615 fprintf(fp_ou,"%s %s %s %s %s %s\n",user,data,hora,ip,url,smart);
616 fputs("</body>\n</html>\n",fp_tt);
617
618 fclose(fp_ou);
619
620 return;
621
622 }