]> git.ipfire.org Git - thirdparty/sarg.git/blobdiff - useragent.c
All the sprintf/fputs have been replaced by fprintf to avoid an intermediary buffer...
[thirdparty/sarg.git] / useragent.c
index bbb7a53782fa56da5788414622b43ff415375e7e..90260a633529758b33431e88199b1e6dc446bc0a 100644 (file)
 
 #include "include/conf.h"
 
-void useragent()
+void useragent(void)
 {
 
    FILE *fp_in = NULL, *fp_ou = NULL, *fp_ht = NULL;
-   char tmp[MAXLEN], tmp2[MAXLEN];
-   char ip[MAXLEN], data[255], agent[255], user[255];
-   char ipantes[MAXLEN], nameantes[MAXLEN];
-   char tagent[7];
-   char csort[120];
-   char msg[255];
-   char ftime[128];
-   char user_old[255]="$#%0a3bc6";
-   char agent_old[255]="$#%0a3bc6";
-   char html[255];
+   char ip[MAXLEN], data[MAXLEN], agent[MAXLEN], user[MAXLEN];
+   char ipbefore[MAXLEN], namebefore[MAXLEN];
+   char tagent[MAXLEN];
+   char user_old[MAXLEN]="$#%0a3bc6";
+   char agent_old[MAXLEN]="$#%0a3bc6";
    char hfile[MAXLEN];
    char idate[MAXLEN], fdate[MAXLEN];
    int  agentot=0, agentot2=0, agentdif=0, cont=0;
-   float perc=0;
    unsigned long totregsl=0;
+   int cstatus;
 
    ip[0]='\0';
    data[0]='\0';
@@ -51,12 +46,12 @@ void useragent()
    user[0]='\0';
    user_old[0]='\0';
    agent_old[0]='\0';
-   ipantes[0]='\0';
-   nameantes[0]='\0';
+   ipbefore[0]='\0';
+   namebefore[0]='\0';
 
-   sprintf(hfile,"%s/%s/useragent.html", outdir,periodo);
+   sprintf(hfile,"%s/%s/useragent.html", outdir,period);
 
-   sprintf(tmp,"%s/squagent.unsort",TempDir);
+   sprintf(tmp3,"%s/squagent.unsort",TempDir);
    sprintf(tmp2,"%s/squagent.log",TempDir);
 
    if((fp_in=fopen(UserAgentLog,"r"))==NULL) {
@@ -64,8 +59,8 @@ void useragent()
       exit(1);
    }
 
-   if((fp_ou=fopen(tmp,"w"))==NULL) {
-      fprintf(stderr, "SARG: (email) %s: %s\n",text[45],tmp);
+   if((fp_ou=fopen(tmp3,"w"))==NULL) {
+      fprintf(stderr, "SARG: (email) %s: %s\n",text[45],tmp3);
       exit(1);
    }
 
@@ -76,17 +71,27 @@ void useragent()
 
    while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
       totregsl++;
-      getword(ip,buf,' ');
-      getword(data,buf,'[');
-      getword(data,buf,' ');
+      if (getword(ip,sizeof(ip),buf,' ')<0 || getword(data,sizeof(data),buf,'[')<0 ||
+          getword(data,sizeof(data),buf,' ')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",UserAgentLog);
+         exit(1);
+      }
       if(totregsl == 1)
          strcpy(idate,data);
-      getword(agent,buf,'"');
-      getword(agent,buf,'"');
+      if (getword(agent,sizeof(agent),buf,'"')<0 || getword(agent,sizeof(agent),buf,'"')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",UserAgentLog);
+         exit(1);
+      }
+      strcpy(warea,agent);
+      strup(warea);
+      if(strstr(warea,"SCRIPT") != 0 || strstr(warea,"ONLOAD") != 0)
+         baddata();
 
       if(strlen(buf)) {
-         getword(user,buf,' ');
-         getword(user,buf,'\n');
+         if (getword(user,sizeof(user),buf,' ')<0 || getword(user,sizeof(user),buf,'\n')<0) {
+            printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",UserAgentLog);
+            exit(1);
+         }
       }
 
       if(user[0] == '-')
@@ -94,8 +99,7 @@ void useragent()
       if(strlen(user) == 0)
          strcpy(user,ip);
 
-      sprintf(buf,"%s\\%s\\%s\\%s\\\n",ip,data,agent,user);
-      fputs(buf,fp_ou);
+      fprintf(fp_ou,"%s\\%s\\%s\\%s\\\n",ip,data,agent,user);
       user[0]='\0';
    }
 
@@ -118,16 +122,21 @@ void useragent()
       debuga(msg);
    }
 
-   sprintf(csort,"sort -n -t '\\' -k 4,4 -k 3,3 -k 2,2 -k 1,1 -o '%s' '%s'",tmp2,tmp);
-   system(csort);
-
-   unlink(tmp);
-
+   sprintf(csort,"sort -n -t '\\' -k 4,4 -k 3,3 -k 2,2 -k 1,1 -o '%s' '%s'",tmp2,tmp3);
+   cstatus=system(csort);
+   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+      fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus));
+      fprintf(stderr, "SARG: sort command: %s\n",csort);
+      exit(1);
+   }
    if((fp_in=fopen(tmp2,"r"))==NULL) {
       fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp2);
+      fprintf(stderr, "SARG: sort command: %s\n",csort);
       exit(1);
    }
 
+   unlink(tmp3);
+
    if((fp_ht=fopen(hfile,"w"))==NULL) {
       fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],hfile);
       exit(1);
@@ -136,77 +145,59 @@ void useragent()
    if(debug)
       debuga(text[72]);
 
-   fputs("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"",fp_ht);
-   fputs(" \"http://www.w3.org/TR/html4/loose.dtd\">\n",fp_ht);
-   fputs("<html>\n",fp_ht);
-   fputs("<head>\n",fp_ht);
-   sprintf(html,"  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n",CharSet);
-   fputs(html,fp_ht);
+   fprintf(fp_ht, "<!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);
    fputs("</head>\n",fp_ht);
-
-   if(strlen(FontFace) > 0) {
-      sprintf(html,"<font face=%s>\n",FontFace);
-      fputs(html,fp_ht);
-   }
-
-   sprintf(html,"<body bgcolor=%s text=%s background='%s'>\n",BgColor,TxColor,BgImage);
-   fputs(html,fp_ht);
-
-   if(strlen(LogoImage) > 0) {
-      fputs("<center><table cellpadding=\"0\" cellspacing=\"0\">\n",fp_ht);
-      sprintf(html,"<tr><th class=\"logo\"><img src='%s' border=0 align=absmiddle width=%s height=%s>&nbsp;%s</th></tr>\n",LogoImage,Width,Height,LogoText);
-      fputs(html,fp_ht);
-      fputs("<tr><td height=\"5\"></td></tr>\n",fp_ht);
-      fputs("</table>\n",fp_ht);
-   }
+   if(strlen(FontFace) > 0) fprintf(fp_ht,"<font face=%s>\n",FontFace);
+   fprintf(fp_ht,"<body bgcolor=%s text=%s background='%s'>\n",BgColor,TxColor,BgImage);
+   if(strlen(LogoImage) > 0) fprintf(fp_ht, "<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);
 
    if(strcmp(IndexTree,"date") == 0)
       show_sarg(fp_ht, "../../..");
    else
       show_sarg(fp_ht,"..");
    fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_ht);
-   sprintf(html,"<tr><th align=center colspan=2><b><font color=%s size=+1>%s</font></b></th></tr>\n",TiColor,text[105]);
-   fputs(html,fp_ht);
+   fprintf(fp_ht,"<tr><th align=center colspan=2><b><font color=%s size=+1>%s</font></b></th></tr>\n",TiColor,text[105]);
 
    fputs("<tr><td></td></tr><tr><td></td></tr>",fp_ht);
    fputs("</table></center>\n",fp_ht);
 
    fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_ht);
 
-   sprintf(html,"<tr><td align=right bgcolor=%s><font size=%s>%s:</font><td align=left bgcolor=%s><font size=%s>%s - %s</font></td></td></tr>\n",HeaderBgColor,FontSize,text[89],TxBgColor,FontSize,idate,fdate);
-   fputs(html,fp_ht);
+   fprintf(fp_ht,"<tr><td align=right bgcolor=%s><font size=%s>%s:</font><td align=left bgcolor=%s><font size=%s>%s - %s</font></td></td></tr>\n",HeaderBgColor,FontSize,text[89],TxBgColor,FontSize,idate,fdate);
 
    fputs("</table></center>\n",fp_ht);
    fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_ht);
    fputs("<tr><td></td><td></td></tr>",fp_ht);
 
-   sprintf(html,"<tr><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s align=left><font size=%s color=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[98],HeaderBgColor,FontSize,HeaderColor,text[106]);
-   fputs(html,fp_ou);
+   fprintf(fp_ou,"<tr><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s align=left><font size=%s color=%s>%s</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[98],HeaderBgColor,FontSize,HeaderColor,text[106]);
 
    while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      getword(ip,buf,'\\');
+      if (getword(ip,sizeof(ip),buf,'\\')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp2);
+         exit(1);
+      }
 
       if(strcmp(Ip2Name,"yes") == 0) {
-         if(strcmp(ip,ipantes) != 0) {
-            strcpy(ipantes,ip);
-            ip2name(ip);
-            strcpy(nameantes,ip);
-         } else strcpy(ip,nameantes);
+         if(strcmp(ip,ipbefore) != 0) {
+            strcpy(ipbefore,ip);
+            ip2name(ip,sizeof(ip));
+            strcpy(namebefore,ip);
+         } else strcpy(ip,namebefore);
       }
 
-      getword(data,buf,'\\');
-      getword(agent,buf,'\\');
-      getword(user,buf,'\\');
+      if (getword(data,sizeof(data),buf,'\\')<0 || getword(agent,sizeof(agent),buf,'\\')<0 ||
+          getword(user,sizeof(user),buf,'\\')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp2);
+         exit(1);
+      }
 
       if(strcmp(user,user_old) != 0) {
-         sprintf(html,"<tr><td align=left bgcolor=%s><font size=%s>%s</td><td align=left bgcolor=%s><font size=%s>%s</td></tr>\n",TxBgColor,FontSize,user,TxBgColor,FontSize,agent);
-         fputs(html,fp_ht);
+         fprintf(fp_ht,"<tr><td align=left bgcolor=%s><font size=%s>%s</td><td align=left bgcolor=%s><font size=%s>%s</td></tr>\n",TxBgColor,FontSize,user,TxBgColor,FontSize,agent);
          strcpy(user_old,user);
          strcpy(agent_old,agent);
       } else {
          if(strcmp(agent,agent_old) != 0) {
-            sprintf(html,"<tr><td></td><td align=left bgcolor=%s><font size=%s>%s</td></tr>\n",TxBgColor,FontSize,agent);
-            fputs(html,fp_ht);
+            fprintf(fp_ht,"<tr><td></td><td align=left bgcolor=%s><font size=%s>%s</td></tr>\n",TxBgColor,FontSize,agent);
             strcpy(agent_old,agent);
          }
       }
@@ -216,16 +207,21 @@ void useragent()
    fclose(fp_in);
    fclose(fp_ou);
 
-   sprintf(csort,"sort -n -t '\\' -k 3,3 -o '%s' '%s'",tmp,tmp2);
-   system(csort);
-
-   unlink(tmp2);
-
-   if((fp_in=fopen(tmp,"r"))==NULL) {
-      fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp);
+   sprintf(csort,"sort -n -t '\\' -k 3,3 -o '%s' '%s'",tmp3,tmp2);
+   cstatus=system(csort);
+   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+      fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus));
+      fprintf(stderr, "SARG: sort command: %s\n",csort);
+      exit(1);
+   }
+   if((fp_in=fopen(tmp3,"r"))==NULL) {
+      fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp3);
+      fprintf(stderr, "SARG: sort command: %s\n",csort);
       exit(1);
    }
 
+   unlink(tmp2);
+
    if((fp_ou=fopen(tmp2,"w"))==NULL) {
       fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp2);
       exit(1);
@@ -234,9 +230,11 @@ void useragent()
    agent_old[0]='\0';
 
    while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
-      getword(ip,buf,'\\');
-      getword(data,buf,'\\');
-      getword(agent,buf,'\\');
+      if (getword(ip,sizeof(ip),buf,'\\')<0 || getword(data,sizeof(data),buf,'\\')<0 ||
+          getword(agent,sizeof(agent),buf,'\\')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp);
+         exit(1);
+      }
 
       if(!cont) {
          cont++;
@@ -247,33 +245,36 @@ void useragent()
 
       if(strcmp(agent,agent_old) != 0) {
          agentdif++;
-         sprintf(html,"%06d %s\n",agentot,agent_old);
-         fputs(html,fp_ou);
+         fprintf(fp_ou,"%06d %s\n",agentot,agent_old);
          strcpy(agent_old,agent);
          agentot2+=agentot;
          agentot=1;
       }
    }
    agentdif++;
-   sprintf(html,"%06d %s\n",agentot,agent);
-   fputs(html,fp_ou);
+   fprintf(fp_ou,"%06d %s\n",agentot,agent);
    agentot2+=agentot;
 
    fclose(fp_in);
    fclose(fp_ou);
 
-   unlink(tmp);
-
-   sprintf(csort,"sort -n -r -k 1,1 -o '%s' '%s'",tmp,tmp2);
-   system(csort);
+   unlink(tmp3);
 
-   unlink(tmp2);
-
-   if((fp_in=fopen(tmp,"r"))==NULL) {
-      fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp);
+   sprintf(csort,"sort -n -r -k 1,1 -o '%s' '%s'",tmp3,tmp2);
+   cstatus=system(csort);
+   if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
+      fprintf(stderr, "SARG: sort command return status %d\n",WEXITSTATUS(cstatus));
+      fprintf(stderr, "SARG: sort command: %s\n",csort);
+      exit(1);
+   }
+   if((fp_in=fopen(tmp3,"r"))==NULL) {
+      fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],tmp3);
+      fprintf(stderr, "SARG: sort command: %s\n",csort);
       exit(1);
    }
 
+   unlink(tmp2);
+
    if((fp_ht=fopen(hfile,"a"))==NULL) {
       fprintf(stderr, "SARG: (useragent) %s: %s\n",text[45],hfile);
       exit(1);
@@ -282,31 +283,31 @@ void useragent()
    fputs("<br><br>\n",fp_ht);
 
    fputs("<center><table cellpadding=0 cellspacing=0>\n",fp_ht);
-   sprintf(html,"<tr><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s align=left><font size=%s color=%s>%s</font></th><th align=center bgcolor=%s><font size=%s color=%s>%%</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[106],HeaderBgColor,FontSize,HeaderColor,text[107],HeaderBgColor,FontSize,HeaderColor);
-   fputs(html,fp_ht);
+   fprintf(fp_ht,"<tr><th align=left bgcolor=%s><font size=%s color=%s>%s</font></th><th bgcolor=%s align=left><font size=%s color=%s>%s</font></th><th align=center bgcolor=%s><font size=%s color=%s>%%</font></th></tr>\n",HeaderBgColor,FontSize,HeaderColor,text[106],HeaderBgColor,FontSize,HeaderColor,text[107],HeaderBgColor,FontSize,HeaderColor);
 
    while(fgets(buf,sizeof(buf),fp_in)!=NULL) {
       buf[strlen(buf)-1]='\0';
-      getword(tagent,buf,' ');
+      if (getword(tagent,sizeof(tagent),buf,' ')<0) {
+         printf("SARG: Maybe you have a broken record or garbage in your %s file.\n",tmp);
+         exit(1);
+      }
       perc=atoi(tagent) * 100;
       perc=perc / agentot2;
 
-      sprintf(html,"<tr><td align=left bgcolor=%s><font size=%s>%s</td><td align=right bgcolor=%s><font size=%s>%d</td><td align=right bgcolor=%s><font size=%s>%3.2f</td></tr>\n",TxBgColor,FontSize,buf,TxBgColor,FontSize,atoi(tagent),TxBgColor,FontSize,perc);
-      fputs(html,fp_ht);
+      fprintf(fp_ht,"<tr><td align=left bgcolor=%s><font size=%s>%s</td><td align=right bgcolor=%s><font size=%s>%d</td><td align=right bgcolor=%s><font size=%s>%3.2f</td></tr>\n",TxBgColor,FontSize,buf,TxBgColor,FontSize,atoi(tagent),TxBgColor,FontSize,perc);
    }
 
    fputs("</table></html>\n",fp_ht);
    if(strcmp(ShowSargInfo,"yes") == 0) {
       zdate(ftime, DateFormat);
-      sprintf(html,"<br><br><center><font size=-2>%s <a href='%s'>%s-%s</a> %s %s</font></center>\n",text[108],URL,PGM,VERSION,text[109],ftime);
-      fputs(html,fp_ht);
+      fprintf(fp_ht,"<br><br><center><font size=-2>%s <a href='%s'>%s-%s</a> %s %s</font></center>\n",text[108],URL,PGM,VERSION,text[109],ftime);
    }
 
    fputs("</table>\n</body>\n</html>\n",fp_ht);
    fclose(fp_in);
    fclose(fp_ht);
 
-   unlink(tmp); 
+   unlink(tmp3); 
 
    return;