"Fossies" - the Fresh Open Source Software Archive 
Member "sarg-2.4.0/denied.c" (24 Dec 2019, 9878 Bytes) of package /linux/privat/sarg-2.4.0.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "denied.c" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
2.3.11_vs_2.4.0.
1 /*
2 * SARG Squid Analysis Report Generator http://sarg.sourceforge.net
3 * 1998, 2015
4 *
5 * SARG donations:
6 * please look at http://sarg.sourceforge.net/donations.php
7 * Support:
8 * http://sourceforge.net/projects/sarg/forums/forum/363374
9 * ---------------------------------------------------------------------
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
24 *
25 */
26
27 #include "include/conf.h"
28 #include "include/defs.h"
29 #include "include/readlog.h"
30
31 //! Name of the file containing the unsorted denied entries.
32 static char denied_unsort[MAXLEN]="";
33 //! The file handle to write the entries.
34 static FILE *fp_denied=NULL;
35 //! \c True if at least one denied entry exists.
36 static bool denied_exists=false;
37
38 /*!
39 Open a file to store the denied accesses.
40
41 \return The file handle or NULL if no file is necessary.
42 */
43 void denied_open(void)
44 {
45 if ((ReportType & REPORT_TYPE_DENIED) == 0) {
46 if (debugz>=LogLevel_Process) debugaz(__FILE__,__LINE__,_("Denied report not produced as it is not requested\n"));
47 return;
48 }
49 if (Privacy) {
50 if (debugz>=LogLevel_Process) debugaz(__FILE__,__LINE__,_("Denied report not produced because privacy option is active\n"));
51 return;
52 }
53
54 format_path(__FILE__, __LINE__, denied_unsort, sizeof(denied_unsort), "%s/denied.int_unsort", tmp);
55 if ((fp_denied=MY_FOPEN(denied_unsort,"w"))==NULL) {
56 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),denied_unsort,strerror(errno));
57 exit(EXIT_FAILURE);
58 }
59 return;
60 }
61
62 /*!
63 Write one entry in the unsorted denied file provided that it is required.
64
65 \param log_entry The entry to write into the log file.
66 */
67 void denied_write(const struct ReadLogStruct *log_entry)
68 {
69 char date[80];
70
71 if (fp_denied && strstr(log_entry->HttpCode,"DENIED/403") != 0) {
72 strftime(date,sizeof(date),"%d/%m/%Y\t%H:%M:%S",&log_entry->EntryTime);
73 fprintf(fp_denied, "%s\t%s\t%s\t%s\n",date,log_entry->User,log_entry->Ip,log_entry->Url);
74 denied_exists=true;
75 }
76 }
77
78 /*!
79 Close the file opened by denied_open().
80 */
81 void denied_close(void)
82 {
83 if (fp_denied) {
84 if (fclose(fp_denied)==EOF) {
85 debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),denied_unsort,strerror(errno));
86 exit(EXIT_FAILURE);
87 }
88 fp_denied=NULL;
89 }
90 }
91
92 /*!
93 Tell the caller if a denied report exists.
94
95 \return \c True if the report is available or \c false if no report
96 was generated.
97 */
98 bool is_denied(void)
99 {
100 return(denied_exists);
101 }
102
103 static void show_ignored_denied(FILE *fp_ou,int count)
104 {
105 char ignored[80];
106
107 snprintf(ignored,sizeof(ignored),ngettext("%d more denied access not shown here…","%d more denied accesses not shown here…",count),count);
108 fprintf(fp_ou,"<tr><td class=\"data\"></td><td class=\"data\"></td><td class=\"data\"></td><td class=\"data2 more\">%s</td></tr>\n",ignored);
109 }
110
111 /*!
112 Generate a report containing the denied accesses.
113 */
114 void gen_denied_report(void)
115 {
116 FileObject *fp_in = NULL;
117 FILE *fp_ou = NULL;
118
119 char *buf;
120 char *url;
121 char denied_sort[MAXLEN];
122 char report[MAXLEN];
123 char ip[MAXLEN];
124 char oip[MAXLEN];
125 char user[MAXLEN];
126 char ouser[MAXLEN]="";
127 char ouser2[MAXLEN]="";
128 char data[15];
129 char hora[15];
130 char csort[4098];
131 bool z=false;
132 int count=0;
133 int day,month,year;
134 int cstatus;
135 bool new_user;
136 struct getwordstruct gwarea;
137 longline line;
138 struct userinfostruct *uinfo;
139 struct tm t;
140
141 if (!denied_exists) {
142 if (!KeepTempLog && denied_unsort[0]!='\0' && unlink(denied_unsort))
143 debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),denied_unsort,strerror(errno));
144 denied_unsort[0]='\0';
145 if (debugz>=LogLevel_Process) debugaz(__FILE__,__LINE__,_("Denied report not produced because it is empty\n"));
146 return;
147 }
148 if (debugz>=LogLevel_Process)
149 debuga(__FILE__,__LINE__,_("Creating denied accesses report...\n"));
150
151 if (snprintf(denied_sort,sizeof(denied_sort),"%s/denied.int_log",tmp)>=sizeof(denied_sort)) {
152 debuga(__FILE__,__LINE__,_("Temporary directory path too long to sort the denied accesses\n"));
153 exit(EXIT_FAILURE);
154 }
155 if (snprintf(csort,sizeof(csort),"sort -T \"%s\" -t \"\t\" -k 3,3 -k 5,5 -o \"%s\" \"%s\"",tmp,denied_sort,denied_unsort)>=sizeof(csort)) {
156 debuga(__FILE__,__LINE__,_("Sort command too long when sorting file \"%s\" to \"%s\"\n"),denied_unsort,denied_sort);
157 exit(EXIT_FAILURE);
158 }
159 cstatus=system(csort);
160 if (!WIFEXITED(cstatus) || WEXITSTATUS(cstatus)) {
161 debuga(__FILE__,__LINE__,_("sort command return status %d\n"),WEXITSTATUS(cstatus));
162 debuga(__FILE__,__LINE__,_("sort command: %s\n"),csort);
163 exit(EXIT_FAILURE);
164 }
165 if (unlink(denied_unsort)) {
166 debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),denied_unsort,strerror(errno));
167 exit(EXIT_FAILURE);
168 }
169 denied_unsort[0]='\0';
170
171 format_path(__FILE__, __LINE__, report, sizeof(report), "%s/denied.html", outdirname);
172
173 if ((fp_in=FileObject_Open(denied_sort))==NULL) {
174 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),denied_sort,FileObject_GetLastOpenError());
175 exit(EXIT_FAILURE);
176 }
177
178 if ((fp_ou=MY_FOPEN(report,"w"))==NULL) {
179 debuga(__FILE__,__LINE__,_("Cannot open file \"%s\": %s\n"),report,strerror(errno));
180 exit(EXIT_FAILURE);
181 }
182
183 write_html_header(fp_ou,(IndexTree == INDEX_TREE_DATE) ? 3 : 1,_("Denied"),HTML_JS_NONE);
184 fputs("<tr><td class=\"header_c\">",fp_ou);
185 fprintf(fp_ou,_("Period: %s"),period.html);
186 fputs("</td></tr>\n",fp_ou);
187 fprintf(fp_ou,"<tr><th class=\"header_c\">%s</th></tr>\n",_("Denied"));
188 close_html_header(fp_ou);
189
190 fputs("<div class=\"report\"><table cellpadding=\"0\" cellspacing=\"2\">\n",fp_ou);
191 fprintf(fp_ou,"<tr><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th><th class=\"header_l\">%s</th></tr>\n",_("USERID"),_("IP/NAME"),_("DATE/TIME"),_("ACCESSED SITE"));
192
193 if ((line=longline_create())==NULL) {
194 debuga(__FILE__,__LINE__,_("Not enough memory to read file \"%s\"\n"),denied_sort);
195 exit(EXIT_FAILURE);
196 }
197
198 while((buf=longline_read(fp_in,line))!=NULL) {
199 getword_start(&gwarea,buf);
200 if (getword(data,sizeof(data),&gwarea,'\t')<0 || getword(hora,sizeof(hora),&gwarea,'\t')<0 ||
201 getword(user,sizeof(user),&gwarea,'\t')<0 || getword(ip,sizeof(ip),&gwarea,'\t')<0) {
202 debuga(__FILE__,__LINE__,_("Invalid record in file \"%s\"\n"),denied_sort);
203 exit(EXIT_FAILURE);
204 }
205 if (getword_ptr(buf,&url,&gwarea,'\t')<0) {
206 debuga(__FILE__,__LINE__,_("Invalid url in file \"%s\"\n"),denied_sort);
207 exit(EXIT_FAILURE);
208 }
209 if (sscanf(data,"%d/%d/%d",&day,&month,&year)!=3) continue;
210 computedate(year,month,day,&t);
211 strftime(data,sizeof(data),"%x",&t);
212
213 uinfo=userinfo_find_from_id(user);
214 if (!uinfo) {
215 debuga(__FILE__,__LINE__,_("Unknown user ID %s in file \"%s\"\n"),user,denied_sort);
216 exit(EXIT_FAILURE);
217 }
218
219 new_user=false;
220 if (!z) {
221 strcpy(ouser,user);
222 strcpy(oip,ip);
223 z=true;
224 new_user=true;
225 } else {
226 if (strcmp(ouser,user) != 0) {
227 strcpy(ouser,user);
228 new_user=true;
229 }
230 if (strcmp(oip,ip) != 0) {
231 strcpy(oip,ip);
232 new_user=true;
233 }
234 }
235
236 if (DeniedReportLimit) {
237 if (strcmp(ouser2,uinfo->label) == 0) {
238 count++;
239 } else {
240 if (count>DeniedReportLimit && DeniedReportLimit>0)
241 show_ignored_denied(fp_ou,count-DeniedReportLimit);
242 count=1;
243 strcpy(ouser2,uinfo->label);
244 }
245 if (count > DeniedReportLimit)
246 continue;
247 }
248
249 fputs("<tr>",fp_ou);
250 if (new_user) {
251 if (uinfo->topuser)
252 fprintf(fp_ou,"<td class=\"data\"><a href=\"%s/%s.html\">%s</a></td><td class=\"data\">%s</td>",uinfo->filename,uinfo->filename,uinfo->label,ip);
253 else
254 fprintf(fp_ou,"<td class=\"data\">%s</td><td class=\"data\">%s</td>",uinfo->label,ip);
255 } else
256 fputs("<td class=\"data\"></td><td class=\"data\"></td>",fp_ou);
257 fprintf(fp_ou,"<td class=\"data\">%s-%s</td><td class=\"data2\">",data,hora);
258 if (BlockIt[0] != '\0' && url[0]!=ALIAS_PREFIX) {
259 fprintf(fp_ou,"<a href=\"%s%s?url=",wwwDocumentRoot,BlockIt);
260 output_html_url(fp_ou,url);
261 fprintf(fp_ou,"\"><img src=\"%s/sarg-squidguard-block.png\"></a> ",ImageFile);
262 }
263 output_html_link(fp_ou,url,100);
264 fputs("</td></tr>\n",fp_ou);
265 }
266 if (FileObject_Close(fp_in)) {
267 debuga(__FILE__,__LINE__,_("Read error in \"%s\": %s\n"),denied_sort,FileObject_GetLastCloseError());
268 exit(EXIT_FAILURE);
269 }
270 longline_destroy(&line);
271
272 if (count>DeniedReportLimit && DeniedReportLimit>0)
273 show_ignored_denied(fp_ou,count-DeniedReportLimit);
274
275 fputs("</table></div>\n",fp_ou);
276 write_html_trailer(fp_ou);
277 if (fclose(fp_ou)==EOF) {
278 debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),report,strerror(errno));
279 exit(EXIT_FAILURE);
280 }
281
282 if (!KeepTempLog && unlink(denied_sort)==-1)
283 debuga(__FILE__,__LINE__,_("Cannot delete \"%s\": %s\n"),denied_sort,strerror(errno));
284
285 return;
286 }
287
288 /*!
289 Remove any temporary file left by the denied module.
290 */
291 void denied_cleanup(void)
292 {
293 if (fp_denied){
294 if (fclose(fp_denied)==EOF) {
295 debuga(__FILE__,__LINE__,_("Write error in \"%s\": %s\n"),denied_unsort,strerror(errno));
296 exit(EXIT_FAILURE);
297 }
298 fp_denied=NULL;
299 }
300 if (!KeepTempLog && denied_unsort[0]) {
301 if (unlink(denied_unsort)==-1)
302 debuga(__FILE__,__LINE__,_("Failed to delete \"%s\": %s\n"),denied_unsort,strerror(errno));
303 }
304 }