1 /*!\file
2 \brief Declaration of the structures and functions.
3 */
4 
5 #ifdef __MINGW32__
6 #define __attribute__(a)
7 #endif
8 
9 #include "include/fileobject.h"
10 
11 //! \brief Constants to compare the log level to display messages
12 enum DebugLogLevel
13 {
14 	//! Process informational messages.
15 	LogLevel_Process=1,
16 	//! Debug level messages.
17 	LogLevel_Debug,
18 	//! Display the source file name and line number along with the message.
19 	LogLevel_Source,
20 	//! Display data about what is processed
21 	LogLevel_Data
22 };
23 
24 struct ReadLogStruct;//forward declaration
25 
26 struct getwordstruct
27 {
28    const char *current;
29    const char *beginning;
30    int modified;
31 };
32 
33 typedef struct longlinestruct *longline;
34 
35 struct generalitemstruct
36 {
37    //! \c True if the entry is for the total of the file or \c false if it is a single line.
38    int total;
39    //! The user to which the entry apply. The length is limited to ::MAX_USER_LEN.
40    char *user;
41    //! The number of accesses performed by the user.
42    long long nacc;
43    //! The number of bytes transfered.
44    long long nbytes;
45    //! The URL accessed by the user. The length is not limited.
46    char *url;
47    //! The source IP address of the user. The length is limited to ::MAX_IP_LEN.
48    char *ip;
49    //! The time of the access. The length is limited to ::MAX_DATETIME_LEN.
50    char *time;
51    //! The date of the access. The length is limited to ::MAX_DATETIME_LEN.
52    char *date;
53    //! The number of milliseconds spend processing the request.
54    long long nelap;
55    //! The number of bytes fetched from the cache of the proxy (cache hit).
56    long long incache;
57    //! The number of bytes fetched from the site (cache miss).
58    long long oucache;
59 };
60 
61 /*!
62  * \brief Error codes returned by process_user.
63  */
64 enum UserProcessError
65 {
66 	USERERR_NoError,
67 	USERERR_NameTooLong,
68 	USERERR_Excluded,
69 	USERERR_InvalidChar,
70 	USERERR_EmptyUser,
71 	USERERR_SysUser,
72 	USERERR_Ignored,
73 	USERERR_Untracked,
74 };
75 
76 /*! \brief What is known about a user.
77 */
78 struct userinfostruct
79 {
80 	//! The ID of the user as found in the input file.
81 	const char *id;
82 	//! The user's IP address.
83 	const char *ip;
84 	//! \c True if the ID is in fact the IP address from which the user connected.
85 	bool id_is_ip;
86 	//! \c True if the user doesn't have a report file.
87 	bool no_report;
88 	//! The name of the user to display in the report.
89 	const char *label;
90 	//! The mangled name to use in file names of that user.
91 	const char *filename;
92 	//! \c True if this user is in the topuser list.
93 	int topuser;
94 	//! A general purpose flag that can be set when scanning the user's list.
95 	int flag;
96 #ifdef ENABLE_DOUBLE_CHECK_DATA
97 	//! Total number of bytes.
98 	long long int nbytes;
99 	//! Total time spent processing the requests.
100 	long long int elap;
101 #endif
102 };
103 
104 //! Scan through the known users.
105 typedef struct userscanstruct *userscan;
106 
107 /*! \brief Global statistics
108 */
109 struct globalstatstruct
110 {
111 	//! Total number of accesses.
112 	long long int nacc;
113 	//! Total number of bytes.
114 	long long int nbytes;
115 	//! Total time spent processing the requests.
116 	long long int elap;
117 	//! Amount of data fetched from the cache.
118 	long long int incache;
119 	//! Amount of data not fetched from the cache.
120 	long long int oucache;
121 	//! The number of users in the topuser list.
122 	int totuser;
123 };
124 
125 //! The object to store the daily statistics.
126 typedef struct DayStruct *DayObject;
127 
128 /*!
129 \brief Log filtering criterion.
130 */
131 struct ReadLogDataStruct
132 {
133 	//! The filtering date range.
134 	char DateRange[255];
135 	//! First date to include in the report. The format is year*10000+month+100+day.
136 	int StartDate;
137 	//! Last date to include in the report. The format is year*10000+month+100+day.
138 	int EndDate;
139 	//! \c True to filter on hosts.
140 	bool HostFilter;
141 	//! \c True to filter on users.
142 	bool UserFilter;
143 	//! Maximum elpased time allowed. Any time greater than this value is set to zero.
144 	long int max_elapsed;
145 	//! \c True to restrict the log to the system users.
146 	bool SysUsers;
147 	//! The start time to include in the report(H*100+M). Set to -1 to disable.
148 	int StartTime;
149 	//! The end time to include in the report(H*100+M). Set to -1 to disable.
150 	int EndTime;
151 };
152 
153 /*!
154 \brief How to handle the per_user_limit file creation.
155 */
156 enum PerUserFileCreationEnum
157 {
158 	//! Purge the file if it exists or create an empty file.
159 	PUFC_Always,
160 	//! Delete old files and don't create a new file unless necessary.
161 	PUFC_AsRequired
162 };
163 
164 /*!
165 \brief What to write into the per_user_limit file.
166 */
167 enum PerUserOutputEnum
168 {
169 	PUOE_UserId,
170 	PUOE_UserIp
171 };
172 
173 /*!
174 \brief How to log every user crossing the download limit.
175 */
176 struct PerUserLimitStruct
177 {
178 	//! File to save the user's IP or ID to.
179 	char File[255];
180 	//! Limit above which the user is reported.
181 	int Limit;
182 	//! What to write into the file.
183 	enum PerUserOutputEnum Output;
184 };
185 
186 // auth.c
187 void htaccess(const struct userinfostruct *uinfo);
188 
189 // authfail.c
190 void authfail_open(void);
191 void authfail_write(const struct ReadLogStruct *log_entry);
192 void authfail_close(void);
193 bool is_authfail(void);
194 void authfail_report(void);
195 void authfail_cleanup(void);
196 
197 // convlog.c
198 void convlog(const char* arq, char df, const struct ReadLogDataStruct *ReadFilter);
199 
200 // css.c
201 void css_content(FILE *fp_css);
202 void css(FILE *fp_css);
203 
204 // dansguardian_log.c
205 void dansguardian_log(const struct ReadLogDataStruct *ReadFilter);
206 
207 // dansguardian_report.c
208 void dansguardian_report(void);
209 
210 // datafile.c
211 void data_file(char *tmp);
212 
213 // decomp.c
214 FileObject *decomp(const char *arq);
215 
216 // denied.c
217 void denied_open(void);
218 void denied_write(const struct ReadLogStruct *log_entry);
219 void denied_close(void);
220 bool is_denied(void);
221 void gen_denied_report(void);
222 void denied_cleanup(void);
223 
224 // download.c
225 void download_open(void);
226 void download_write(const struct ReadLogStruct *log_entry,const char *url);
227 void download_close(void);
228 bool is_download(void);
229 void download_report(void);
230 void free_download(void);
231 void set_download_suffix(const char *list);
232 bool is_download_suffix(const char *url);
233 void download_cleanup(void);
234 
235 // email.c
236 FILE *Email_OutputFile(const char *Module);
237 void Email_Send(FILE *fp,const char *Subject);
238 
239 // exclude.c
240 void gethexclude(const char *hexfile, int debug);
241 void getuexclude(const char *uexfile, int debug);
242 int vhexclude(const char *url);
243 int vuexclude(const char *user);
244 bool is_indexonly(void);
245 void free_exclude(void);
246 
247 #ifndef HAVE_FNMATCH
248 // fnmtach.c
249 int fnmatch(const char *pattern,const char *string,int flags);
250 #endif
251 
252 // getconf.c
253 void getconf(const char *File);
254 
255 // grepday.c
256 void greport_prepare(void);
257 void greport_day(const struct userinfostruct *user);
258 void greport_cleanup(void);
259 
260 // html.c
261 void htmlrel(void);
262 
263 // indexonly.c
264 void index_only(const char *dirname,int debug);
265 
266 // ip2name.c
267 int ip2name_config(const char *param);
268 void ip2name_forcedns(void);
269 void ip2name(char *ip,int ip_len);
270 void ip2name_cleanup(void);
271 void name2ip(char *name,int name_size);
272 
273 // lastlog.c
274 void mklastlog(const char *outdir);
275 
276 // longline.c
277 __attribute__((warn_unused_result)) /*@null@*//*@only@*/longline longline_create(void);
278 void longline_reset(longline line);
279 /*@null@*/char *longline_read(FileObject *fp_in,/*@null@*/longline line);
280 void longline_destroy(/*@out@*//*@only@*//*@null@*/longline *line_ptr);
281 
282 // index.c
283 void make_index(void);
284 
285 // readlog.c
286 int ReadLogFile(struct ReadLogDataStruct *Filter);
287 bool GetLogPeriod(struct tm *Start,struct tm *End);
288 
289 // realtime.c
290 void realtime(void);
291 
292 // redirector.c
293 void redirector_log(const struct ReadLogDataStruct *ReadFilter);
294 void redirector_report(void);
295 
296 // repday.c
297 void report_day(const struct userinfostruct *user);
298 
299 // report.c
300 void gerarel(const struct ReadLogDataStruct *ReadFilter);
301 int ger_read(char *buffer,struct generalitemstruct *item,const char *filename);
302 void totalger(FILE *fp_gen,const char *filename);
303 
304 // siteuser.c
305 void siteuser(void);
306 
307 // smartfilter.c
308 void smartfilter_report(void);
309 
310 // sort.c
311 void sort_users_log(const char *tmp, int debug,struct userinfostruct *uinfo);
312 void tmpsort(const struct userinfostruct *uinfo);
313 void sort_labels(const char **label,const char **order);
314 
315 // splitlog.c
316 void splitlog(const char *arq, char df, const struct ReadLogDataStruct *ReadFilter, int convert, const char *splitprefix);
317 
318 // topsites.c
319 void topsites(void);
320 
321 // topuser.c
322 void topuser(void);
323 
324 // totday.c
325 DayObject day_prepare(void);
326 void day_cleanup(DayObject ddata);
327 void day_newuser(DayObject ddata);
328 void day_addpoint(DayObject ddata,const char *date, const char *time, long long int elap, long long int bytes);
329 void day_totalize(DayObject ddata,const char *tmp, const struct userinfostruct *uinfo);
330 void day_deletefile(const struct userinfostruct *uinfo);
331 
332 // url.c
333 void read_hostalias(const char *Filename);
334 void free_hostalias(void);
335 const char *skip_scheme(const char *url);
336 const char *process_url(const char *url,bool full_url);
337 void url_hostname(const char *url,char *hostname,int hostsize);
338 
339 // usage.c
340 void usage(const char *prog);
341 
342 // useragent.c
343 FILE *UserAgent_Open(void);
344 void UserAgent_Write(FILE *fp,const struct tm *Time,const char *Ip,const char *User,const char *Agent);
345 void UserAgent_Readlog(const struct ReadLogDataStruct *ReadFilter);
346 void UserAgent(void);
347 
348 // userinfo.c
349 /*@shared@*/struct userinfostruct *userinfo_create(const char *userid, const char *ip);
350 void userinfo_free(void);
351 void userinfo_label(struct userinfostruct *uinfo,const char *label);
352 /*@shared@*/struct userinfostruct *userinfo_find_from_file(const char *filename);
353 /*@shared@*/struct userinfostruct *userinfo_find_from_id(const char *id);
354 /*@shared@*/struct userinfostruct *userinfo_find_from_ip(const char *ip);
355 userscan userinfo_startscan(void);
356 void userinfo_stopscan(userscan uscan);
357 struct userinfostruct *userinfo_advancescan(userscan uscan);
358 void userinfo_clearflag(void);
359 void read_useralias(const char *Filename);
360 void free_useralias(void);
361 enum UserProcessError process_user(const char **UserPtr,const char *IpAddress,bool *IsIp);
362 
363 // usertab.c
364 void init_usertab(const char *UserTabFile);
365 void user_find(char *mappedname, int namelen, const char *userlogin);
366 void close_usertab(void);
367 
368 // util.c
369 void getword_start(/*@out@*/struct getwordstruct *gwarea, const char *line);
370 void getword_restart(struct getwordstruct *gwarea);
371 __attribute__((warn_unused_result)) int getword(/*@out@*/char *word, int limit, struct getwordstruct *gwarea, char stop);
372 __attribute__((warn_unused_result)) int getword_limit(/*@out@*/char *word, int limit, struct getwordstruct *gwarea, char stop);
373 __attribute__((warn_unused_result)) int getword_multisep(/*@out@*/char *word, int limit, struct getwordstruct *gwarea, char stop);
374 __attribute__((warn_unused_result)) int getword_skip(int limit, struct getwordstruct *gwarea, char stop);
375 __attribute__((warn_unused_result)) int getword_atoll(/*@out@*/long long int *number, struct getwordstruct *gwarea, char stop);
376 __attribute__((warn_unused_result)) int getword_atoi(/*@out@*/int *number, struct getwordstruct *gwarea, char stop);
377 __attribute__((warn_unused_result)) int getword_atol(long int *number, struct getwordstruct *gwarea, char stop);
378 __attribute__((warn_unused_result)) int getword_atolu(unsigned long int *number, struct getwordstruct *gwarea, char stop);
379 __attribute__((warn_unused_result)) int getword_ptr(char *orig_line,/*@out@*/char **word, struct getwordstruct *gwarea, char stop);
380 long long int my_atoll (const char *nptr);
381 int is_absolute(const char *path);
382 void getnumlist(const char *paramname, const char *buffer, int *list, int maxvalue);
383 bool numlistcontains(const int *list, int maxvalue, int value);
384 int conv_month(const char *month);
385 const char *conv_month_name(int month);
386 void buildymd(const char *dia, const char *mes, const char *ano, char *wdata,int wdata_size);
387 void date_from(struct ReadLogDataStruct *ReadFilter);
388 char *fixnum(long long int value, int n);
389 char *fixnum2(long long int value, int n);
390 void fixnone(char *str);
391 char *fixtime(long long int elap);
392 void fixendofline(char *str);
393 void show_info(FILE *fp_ou);
394 void show_sarg(FILE *fp_ou, int depth);
395 void write_logo_image(FILE *fp_ou);
396 void write_html_head(FILE *fp_ou, int depth, const char *page_title,int javascript);
397 void write_html_header(FILE *fp_ou, int depth, const char *title,int javascript);
398 void close_html_header(FILE *fp_ou);
399 void write_html_trailer(FILE *fp_ou);
400 void output_html_string(FILE *fp_ou,const char *str,int maxlen);
401 void output_html_url(FILE *fp_ou,const char *url);
402 void output_html_link(FILE *fp_ou,const char *url,int maxlen);
403 void debuga(const char *File, int Line, const char *msg,...) __attribute__((format(printf,3,4)));
404 void debuga_more(const char *msg,...) __attribute__((format(printf,1,2)));
405 void debugaz(const char *File,int Line,const char *msg,...) __attribute__((format(printf,3,4)));
406 void my_lltoa(unsigned long long int n, char *s, int ssize, int len);
407 void url_module(const char *url, char *w2);
408 void url_to_anchor(const char *url,char *anchor,int size);
409 void safe_strcpy(char *dest,const char *src,int length);
410 void strip_latin(char *line);
411 char *buildtime(long long int elap);
412 int obtdate(const char *dirname, const char *name, char *data);
413 void formatdate(char *date,int date_size,int year,int month,int day,int hour,int minute,int second,int dst);
414 void computedate(int year,int month,int day,struct tm *t);
415 int obtuser(const char *dirname, const char *name);
416 void obttotal(const char *dirname, const char *name, int nuser, long long int *tbytes, long long int *media);
417 void version(void);
418 int vercode(const char *code);
419 void load_excludecodes(const char *ExcludeCodes);
420 void free_excludecodes(void);
421 int PortableMkDir(const char *path,int mode);
422 bool my_mkdir(const char *name);
423 void makeTmpDir(const char *tmp);
424 int testvaliduserchar(const char *user);
425 char *strlow(char *string);
426 char *strup(char *string);
427 int month2num(const char *month);
428 int builddia(int day, int month, int year);
429 int compare_date(const struct tm *date1,const struct tm *date2);
430 bool IsTreeFileDirName(const char *Name);
431 bool IsTreeYearFileName(const char *Name);
432 bool IsTreeMonthFileName(const char *Name);
433 bool IsTreeDayFileName(const char *Name);
434 int vrfydir(const struct periodstruct *per1, const char *addr, const char *site, const char *us);
435 int getperiod_fromsarglog(const char *arqtt,struct periodstruct *period);
436 void getperiod_fromrange(struct periodstruct *period,const struct ReadLogDataStruct *ReadFilter);
437 void getperiod_torange(const struct periodstruct *period,int *dfrom,int *duntil);
438 void getperiod_merge(struct periodstruct *main,struct periodstruct *candidate);
439 int getperiod_buildtext(struct periodstruct *period);
440 void removetmp(const char *outdir);
441 void zdate(char *ftime,int ftimesize, char DateFormat);
442 char *get_param_value(const char *param,char *line);
443 int compar( const void *, const void * );
444 void unlinkdir(const char *dir,bool contentonly);
445 void emptytmpdir(const char *dir);
446 int extract_address_mask(const char *buf,const char **text,unsigned char *ipv4,unsigned short int *ipv6,int *nbits,const char **next);
447 int format_path(const char *file, int line, char *output_buffer, int buffer_size, const char *format,...);
448 void append_to_path(char *base_path, int base_path_size, const char *append);
449