Change in porting tactics: OS/2's EMX porting layer doesn't allow multiple
[privoxy.git] / project.h
1 #ifndef PROJECT_H_INCLUDED
2 #define PROJECT_H_INCLUDED
3 #define PROJECT_H_VERSION "$Id: project.h,v 1.37 2001/10/14 22:14:01 jongfoster Exp $"
4 /*********************************************************************
5  *
6  * File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
7  *
8  * Purpose     :  Defines data structures which are widely used in the
9  *                project.  Does not define any variables or functions
10  *                (though it does declare some macros).
11  *
12  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
13  *                IJBSWA team.  http://ijbswa.sourceforge.net
14  *
15  *                Based on the Internet Junkbuster originally written
16  *                by and Copyright (C) 1997 Anonymous Coders and 
17  *                Junkbusters Corporation.  http://www.junkbusters.com
18  *
19  *                This program is free software; you can redistribute it 
20  *                and/or modify it under the terms of the GNU General
21  *                Public License as published by the Free Software
22  *                Foundation; either version 2 of the License, or (at
23  *                your option) any later version.
24  *
25  *                This program is distributed in the hope that it will
26  *                be useful, but WITHOUT ANY WARRANTY; without even the
27  *                implied warranty of MERCHANTABILITY or FITNESS FOR A
28  *                PARTICULAR PURPOSE.  See the GNU General Public
29  *                License for more details.
30  *
31  *                The GNU General Public License should be included with
32  *                this file.  If not, you can view it at
33  *                http://www.gnu.org/copyleft/gpl.html
34  *                or write to the Free Software Foundation, Inc., 59
35  *                Temple Place - Suite 330, Boston, MA  02111-1307, USA.
36  *
37  * Revisions   :
38  *    $Log: project.h,v $
39  *    Revision 1.37  2001/10/14 22:14:01  jongfoster
40  *    Removing name_length field from struct cgi_dispatcher, as this is
41  *    now calculated at runtime from the "name" field.
42  *
43  *    Revision 1.36  2001/10/10 16:45:15  oes
44  *    Added LIMIT_CONNECT action and string
45  *    Fixed HTTP message line termination
46  *    Added CFORBIDDEN HTTP message
47  *
48  *    Revision 1.35  2001/10/07 18:06:43  oes
49  *    Added status member to struct http_request
50  *
51  *    Revision 1.34  2001/10/07 15:45:25  oes
52  *    Added url member to struct http_request and commented all
53  *      members
54  *
55  *    Added CT_TABOO
56  *
57  *    Added ACTION_DOWNGRADE and ACTION_NO_COMPRESSION
58  *
59  *    Replaced struct client_state members rejected,
60  *      force, active and toggled_on with "flags" bitmap.
61  *
62  *    Added CSP_FLAG_MODIFIED and CSP_FLAG_CHUNKED
63  *
64  *    Added buffer_limit to struct configuration_spec
65  *
66  *    Revision 1.33  2001/09/20 13:30:08  steudten
67  *
68  *    Make freez() more secure in case of: if (exp) { free(z) ; a=*z }
69  *    Last case will set z to NULL in free(z) and thats bad..
70  *
71  *    Revision 1.32  2001/09/16 23:02:51  jongfoster
72  *    Fixing warning
73  *
74  *    Revision 1.31  2001/09/16 13:20:29  jongfoster
75  *    Rewrite of list library.  Now has seperate header and list_entry
76  *    structures.  Also added a large sprinking of assert()s to the list
77  *    code.
78  *
79  *    Revision 1.30  2001/09/13 23:52:00  jongfoster
80  *    Support for both static and dynamically generated CGI pages
81  *
82  *    Revision 1.29  2001/09/13 23:29:43  jongfoster
83  *    Defining FORWARD_SPEC_INITIALIZER
84  *
85  *    Revision 1.28  2001/09/13 23:05:50  jongfoster
86  *    Changing the string paramater to the header parsers a "const".
87  *
88  *    Revision 1.27  2001/08/05 16:06:20  jongfoster
89  *    Modifiying "struct map" so that there are now separate header and
90  *    "map_entry" structures.  This means that functions which modify a
91  *    map no longer need to return a pointer to the modified map.
92  *    Also, it no longer reverses the order of the entries (which may be
93  *    important with some advanced template substitutions).
94  *
95  *    Revision 1.26  2001/07/30 22:08:36  jongfoster
96  *    Tidying up #defines:
97  *    - All feature #defines are now of the form FEATURE_xxx
98  *    - Permanently turned off WIN_GUI_EDIT
99  *    - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
100  *
101  *    Revision 1.25  2001/07/29 18:43:08  jongfoster
102  *    Changing #ifdef _FILENAME_H to FILENAME_H_INCLUDED, to conform to
103  *    ANSI C rules.
104  *
105  *    Revision 1.24  2001/07/25 17:20:27  oes
106  *    Introduced http->user_agent
107  *
108  *    Revision 1.23  2001/07/18 12:32:23  oes
109  *    - Added ACTION_STRING_DEANIMATE
110  *    - moved #define freez from jcc.h to project.h
111  *
112  *    Revision 1.22  2001/07/15 17:51:41  jongfoster
113  *    Renaming #define STATIC to STATIC_PCRE
114  *
115  *    Revision 1.21  2001/07/13 14:03:19  oes
116  *     - Reorganized regex header inclusion and #defines to
117  *       comply to the scheme in configure.in
118  *     - Added csp->content_type and its CT_* keys
119  *     - Added ACTION_DEANIMATE
120  *     - Removed all #ifdef PCRS
121  *
122  *    Revision 1.20  2001/06/29 21:45:41  oes
123  *    Indentation, CRLF->LF, Tab-> Space
124  *
125  *    Revision 1.19  2001/06/29 13:33:36  oes
126  *    - Improved comments
127  *    - Introduced http_request.host_ip_addr_str
128  *    - Introduced http_response.head_length
129  *    - Introduced config.my_ip_addr_str, config.my_hostname,
130  *      config.admin_address and config.proxy_info_url
131  *    - Removed config.proxy_args_header and config.proxy_args_trailer,
132  *      renamed config.proxy_args_invocation to config.proxy_args
133  *    - Removed HTML snipplets and GIFs
134  *    - Removed logentry from cancelled commit
135  *
136  *    Revision 1.18  2001/06/09 10:57:39  jongfoster
137  *    Adding definition of BUFFER_SIZE.
138  *    Changing struct cgi_dispatcher to use "const" strings.
139  *
140  *    Revision 1.17  2001/06/07 23:15:09  jongfoster
141  *    Merging ACL and forward files into config file.
142  *    Moving struct gateway members into struct forward_spec
143  *    Removing config->proxy_args_gateways
144  *    Cosmetic: Adding a few comments
145  *
146  *    Revision 1.16  2001/06/04 18:31:58  swa
147  *    files are now prefixed with either `confdir' or `logdir'.
148  *    `make redhat-dist' replaces both entries confdir and logdir
149  *    with redhat values
150  *
151  *    Revision 1.15  2001/06/04 11:28:53  swa
152  *    redirect did not work due to missing /
153  *
154  *    Revision 1.14  2001/06/03 11:03:48  oes
155  *    Added struct map,
156  *    added struct http_response,
157  *    changed struct interceptors to struct cgi_dispatcher,
158  *    moved HTML stuff to cgi.h
159  *
160  *    Revision 1.13  2001/06/01 20:05:36  jongfoster
161  *    Support for +image-blocker{}: added ACTION_IMAGE_BLOCKER
162  *    constant, and removed csp->tinygif.
163  *
164  *    Revision 1.12  2001/06/01 18:49:17  jongfoster
165  *    Replaced "list_share" with "list" - the tiny memory gain was not
166  *    worth the extra complexity.
167  *
168  *    Revision 1.11  2001/06/01 10:32:47  oes
169  *    Added constants for anchoring selection bitmap
170  *
171  *    Revision 1.10  2001/05/31 21:33:53  jongfoster
172  *    Changes for new actions file, replacing permissionsfile
173  *    and parts of the config file.  Also added support for
174  *    list_shared.
175  *
176  *    Revision 1.9  2001/05/31 17:32:31  oes
177  *
178  *     - Enhanced domain part globbing with infix and prefix asterisk
179  *       matching and optional unanchored operation
180  *
181  *    Revision 1.8  2001/05/29 20:09:15  joergs
182  *    HTTP_REDIRECT_TEMPLATE fixed.
183  *
184  *    Revision 1.7  2001/05/29 09:50:24  jongfoster
185  *    Unified blocklist/imagelist/actionslist.
186  *    File format is still under discussion, but the internal changes
187  *    are (mostly) done.
188  *
189  *    Also modified interceptor behaviour:
190  *    - We now intercept all URLs beginning with one of the following
191  *      prefixes (and *only* these prefixes):
192  *        * http://i.j.b/
193  *        * http://ijbswa.sf.net/config/
194  *        * http://ijbswa.sourceforge.net/config/
195  *    - New interceptors "home page" - go to http://i.j.b/ to see it.
196  *    - Internal changes so that intercepted and fast redirect pages
197  *      are not replaced with an image.
198  *    - Interceptors now have the option to send a binary page direct
199  *      to the client. (i.e. ijb-send-banner uses this)
200  *    - Implemented show-url-info interceptor.  (Which is why I needed
201  *      the above interceptors changes - a typical URL is
202  *      "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
203  *      The previous mechanism would not have intercepted that, and
204  *      if it had been intercepted then it then it would have replaced
205  *      it with an image.)
206  *
207  *    Revision 1.6  2001/05/27 22:17:04  oes
208  *
209  *    - re_process_buffer no longer writes the modified buffer
210  *      to the client, which was very ugly. It now returns the
211  *      buffer, which it is then written by chat.
212  *
213  *    - content_length now adjusts the Content-Length: header
214  *      for modified documents rather than crunch()ing it.
215  *      (Length info in csp->content_length, which is 0 for
216  *      unmodified documents)
217  *
218  *    - For this to work, sed() is called twice when filtering.
219  *
220  *    Revision 1.5  2001/05/26 00:28:36  jongfoster
221  *    Automatic reloading of config file.
222  *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
223  *    Most of the global variables have been moved to a new
224  *    struct configuration_spec, accessed through csp->config->globalname
225  *    Most of the globals remaining are used by the Win32 GUI.
226  *
227  *    Revision 1.4  2001/05/22 18:46:04  oes
228  *
229  *    - Enabled filtering banners by size rather than URL
230  *      by adding patterns that replace all standard banner
231  *      sizes with the "Junkbuster" gif to the re_filterfile
232  *
233  *    - Enabled filtering WebBugs by providing a pattern
234  *      which kills all 1x1 images
235  *
236  *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
237  *      which is selected by the (nonstandard and therefore
238  *      capital) letter 'U' in the option string.
239  *      It causes the quantifiers to be ungreedy by default.
240  *      Appending a ? turns back to greedy (!).
241  *
242  *    - Added a new interceptor ijb-send-banner, which
243  *      sends back the "Junkbuster" gif. Without imagelist or
244  *      MSIE detection support, or if tinygif = 1, or the
245  *      URL isn't recognized as an imageurl, a lame HTML
246  *      explanation is sent instead.
247  *
248  *    - Added new feature, which permits blocking remote
249  *      script redirects and firing back a local redirect
250  *      to the browser.
251  *      The feature is conditionally compiled, i.e. it
252  *      can be disabled with --disable-fast-redirects,
253  *      plus it must be activated by a "fast-redirects"
254  *      line in the config file, has its own log level
255  *      and of course wants to be displayed by show-proxy-args
256  *      Note: Boy, all the #ifdefs in 1001 locations and
257  *      all the fumbling with configure.in and acconfig.h
258  *      were *way* more work than the feature itself :-(
259  *
260  *    - Because a generic redirect template was needed for
261  *      this, tinygif = 3 now uses the same.
262  *
263  *    - Moved GIFs, and other static HTTP response templates
264  *      to project.h
265  *
266  *    - Some minor fixes
267  *
268  *    - Removed some >400 CRs again (Jon, you really worked
269  *      a lot! ;-)
270  *
271  *    Revision 1.3  2001/05/20 01:21:20  jongfoster
272  *    Version 2.9.4 checkin.
273  *    - Merged popupfile and cookiefile, and added control over PCRS
274  *      filtering, in new "actionsfile".
275  *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
276  *      file error you now get a message box (in the Win32 GUI) rather
277  *      than the program exiting with no explanation.
278  *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
279  *      skipping.
280  *    - Removed tabs from "config"
281  *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
282  *    - Bumped up version number.
283  *
284  *    Revision 1.2  2001/05/17 23:01:01  oes
285  *     - Cleaned CRLF's from the sources and related files
286  *
287  *    Revision 1.1.1.1  2001/05/15 13:59:03  oes
288  *    Initial import of version 2.9.3 source tree
289  *
290  *
291  *********************************************************************/
292 \f
293
294 /* Declare struct FILE for vars and funcs. */
295 #include <stdio.h>
296
297 /* Need time_t for file_list */
298 #include <time.h>
299
300 /*
301  * Include appropriate regular expression libraries.
302  * Note that pcrs and pcre (native) are needed for cgi
303  * and are included anyway.
304  */
305
306 #if defined(REGEX_PCRE) || defined (REGEX_GNU)
307 # define REGEX
308 #endif /* defined(REGEX_PCRE) || defined (REGEX_GNU) */
309
310 #ifdef STATIC_PCRE
311 #  include "pcre.h"
312 #else
313 #  include <pcre.h>
314 #endif
315
316 #ifdef STATIC_PCRS
317 #  include "pcrs.h" 
318 #else
319 #  include <pcrs.h> 
320 #endif
321
322 #if defined(REGEX_PCRE)
323 #  ifdef STATIC_PCRE
324 #    include "pcreposix.h"
325 #  else
326 #    include <pcreposix.h>
327 #  endif
328 #endif /* defined(REGEX_PCRE) */
329
330 #if defined(REGEX_GNU)
331 #  include "gnu_regex.h"
332 #endif
333
334 #ifdef AMIGA 
335 #include "amiga.h" 
336 #endif /* def AMIGA */
337
338 #ifdef __cplusplus
339 extern "C" {
340 #endif
341
342
343 /*
344  * Error codes.  Functions returning these should return a jb_err
345  */
346 #define JB_ERR_OK         0 /* Success, no error                        */
347 #define JB_ERR_MEMORY     1 /* Out of memory                            */
348 #define JB_ERR_CGI_PARAMS 2 /* Missing or corrupt CGI parameters        */
349 #define JB_ERR_FILE       3 /* Error opening, reading or writing a file */
350 #define JB_ERR_PARSE      4 /* Error parsing file                       */
351 #define JB_ERR_MODIFIED   5 /* File has been modified outside of the    */
352                             /* CGI actions editor.                      */
353 typedef int jb_err;
354
355
356 /*
357  * This macro is used to free a pointer that may be NULL
358  */
359 #define freez(X)  { if(X) { free(X); X = NULL ; } }
360
361 /*
362  * Use for statically allocated buffers if you have no other choice.
363  * Remember to check the length of what you write into the buffer
364  * - we don't want any buffer overflows!
365  */
366 #define BUFFER_SIZE 5000
367
368 /*
369  * So you can say "while (FOREVER) { ...do something... }"
370  */
371 #define FOREVER 1
372
373 /* Default IP and port to listen on */
374 #define HADDR_DEFAULT   "127.0.0.1"
375 #define HADDR_PORT      8000
376
377
378 /* Forward defs for various structures */
379
380 /* Need this for struct client_state */
381 struct configuration_spec;
382
383
384 /* Generic linked list of strings */
385
386 struct list_entry
387 {
388    const char *str;
389    struct list_entry *next;
390 };
391
392 struct list
393 {
394    struct list_entry *first;
395    struct list_entry *last;
396 };
397
398
399 /* A map from a string to another string */
400
401 struct map_entry
402 {
403    const char *name;
404    const char *value;
405    struct map_entry *next;
406 };
407
408 struct map
409 {
410    struct map_entry *first;
411    struct map_entry *last;
412 };
413
414
415 struct http_request
416 {
417    char *cmd;      /* Whole command line: method, URL, Version */
418    char *gpc;      /* HTTP method: GET, POST, .. */
419    char *url;      /* The URL */
420    char *ver;      /* Protocol version */
421    int status;     /* HTTP Status */
422
423    char *host;     /* Host part of URL */
424    int   port;     /* Port of URL or 80 (default) */
425    char *path;     /* Path of URL */
426    char *hostport; /* host[:port] */
427    int   ssl;      /* Flag if protocol is https */
428
429    char *host_ip_addr_str; /* String with dotted decimal representation
430                             * of host's IP. NULL before connect_to() */
431    char *user_agent;       /* Client's User-Agent: header value */
432 };
433
434 /* Response generated by CGI, blocker, or error handler */
435 struct http_response
436 {
437   char *status;           /* HTTP status (string)*/
438   struct list headers[1]; /* List of header lines */
439   char *head;             /* Formatted http response head */
440   int   head_length;      /* Length of http response head */
441   char *body;             /* HTTP document body */
442   int   content_length;   /* Length of body, REQUIRED if binary body */
443   int   is_static;        /* Nonzero if the content will never change and
444                            * should be cached by the broser (e.g. images) */
445 };
446
447 /* A URL pattern */
448 struct url_spec
449 {
450    char  *spec;        /* The string which was parsed to produce this       */
451                        /* url_spec.  Used for debugging or display only.    */
452
453    /* Hostname matching: */
454    char  *domain;      /* Fully qalified domain name (FQDN) pattern.        */
455                        /* May contain "*".                                  */
456    char  *dbuf;        /* Buffer with '\0'-delimited fqdn                   */
457    char **dvec;        /* Domain ptr vector into dbuf                       */
458    int    dcnt;        /* How many domains in fqdn?                         */
459    int    unanchored;  /* Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT   */
460
461    /* Port matching: */
462    int   port;         /* The port number, or 0 to match all ports.         */
463
464    /* Path matching: */
465    char *path;         /* The path prefix (if not using regex), or source   */
466                        /* for the regex.                                    */
467    int   pathlen;      /* ==strlen(path).  Needed for prefix matching.      */
468 #ifdef REGEX
469    regex_t *preg;      /* Regex for matching path part                      */
470 #endif
471 };
472 #ifdef REGEX
473 #define URL_SPEC_INITIALIZER { NULL, NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL }
474 #else /* ifndef REGEX */
475 #define URL_SPEC_INITIALIZER { NULL, NULL, NULL, NULL, 0, 0, 0, NULL, 0 }
476 #endif /* ndef REGEX */
477
478 /* Constants for host part matching in URLs */
479 #define ANCHOR_LEFT  1
480 #define ANCHOR_RIGHT 2
481
482
483 /* An I/O buffer */
484 struct iob
485 {
486    char *buf;
487    char *cur;
488    char *eod;
489 };
490
491
492 #define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0)
493 #define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob));
494
495 /* Keys for csp->content_type */
496 #define CT_TEXT   1 /* Suitable for pcrs filtering */
497 #define CT_GIF    2 /* Suitable for GIF filtering */
498 #define CT_TABOO  3 /* DONT filter */
499
500 #define ACTION_MASK_ALL        (~0U)
501
502 #define ACTION_MOST_COMPATIBLE 0x0000U
503
504 #define ACTION_BLOCK           0x0001U
505 #define ACTION_DEANIMATE       0x0002U
506 #define ACTION_DOWNGRADE       0x0004U
507 #define ACTION_FAST_REDIRECTS  0x0008U
508 #define ACTION_FILTER          0x0010U
509 #define ACTION_HIDE_FORWARDED  0x0020U
510 #define ACTION_HIDE_FROM       0x0040U
511 #define ACTION_HIDE_REFERER    0x0080U /* sic - follow HTTP, not English */
512 #define ACTION_HIDE_USER_AGENT 0x0100U
513 #define ACTION_IMAGE           0x0200U
514 #define ACTION_IMAGE_BLOCKER   0x0400U
515 #define ACTION_NO_COMPRESSION  0x0800U
516 #define ACTION_NO_COOKIE_READ  0x1000U
517 #define ACTION_NO_COOKIE_SET   0x2000U
518 #define ACTION_NO_POPUPS       0x4000U
519 #define ACTION_VANILLA_WAFER   0x8000U
520 #define ACTION_LIMIT_CONNECT   0x010000U
521
522 #define ACTION_STRING_DEANIMATE     0
523 #define ACTION_STRING_FROM          1
524 #define ACTION_STRING_IMAGE_BLOCKER 2
525 #define ACTION_STRING_REFERER       3
526 #define ACTION_STRING_USER_AGENT    4
527 #define ACTION_STRING_LIMIT_CONNECT 5
528 #define ACTION_STRING_COUNT         6
529
530 #define ACTION_MULTI_ADD_HEADER     0
531 #define ACTION_MULTI_WAFER          1
532 #define ACTION_MULTI_COUNT          2
533
534 /*
535  * This structure contains a list of actions to apply to a URL.
536  * It only contains positive instructions - no "-" options.
537  * It is not used to store the actions list itself, only for
538  * url_actions() to return the current values.
539  */
540 struct current_action_spec
541 {
542    unsigned flags;    /* a bit set to "1" = add action    */
543
544    /* For those actions that require parameters: */
545
546    /* each entry is valid if & only if corresponding entry in "add" set. */
547    char * string[ACTION_STRING_COUNT];
548
549    /* Strings to add */
550    struct list multi[ACTION_MULTI_COUNT][1];
551 };
552
553
554 /*
555  * This structure contains a set of changes to actions.
556  * It can contain both positive and negative instructions.
557  * It is used to store an entry in the actions list.
558  */
559 struct action_spec
560 {
561    unsigned mask;   /* a bit set to "0" = remove action */
562    unsigned add;    /* a bit set to "1" = add action    */
563
564    /* For those actions that require parameters: */
565
566    /* each entry is valid if & only if corresponding entry in "add" set. */
567    char * string[ACTION_STRING_COUNT];
568
569    /* Strings to remove. */
570    struct list multi_remove[ACTION_MULTI_COUNT][1];
571
572    /* If nonzero, remove *all* strings. */
573    int         multi_remove_all[ACTION_MULTI_COUNT];
574
575    /* Strings to add */
576    struct list multi_add[ACTION_MULTI_COUNT][1];
577 };
578
579 /*
580  * This structure is used to store the actions list.
581  *
582  * It contains a URL pattern, and the chages to the actions.
583  * It is a linked list.
584  */
585 struct url_actions
586 {
587    struct url_spec url[1];
588
589    struct action_spec action[1];
590
591    struct url_actions * next;
592 };
593
594
595 /* Constants defining bitmask for csp->accept_types */
596
597 #ifdef FEATURE_IMAGE_DETECT_MSIE
598
599 /* MSIE detected by user-agent string */
600 #define ACCEPT_TYPE_IS_MSIE     0x0001
601
602 /*
603  * *If* this is MSIE, it wants an image.  (Or this is a shift-reload, or
604  * it's got an image from this URL before...  yuck!)
605  * Only meaningful if ACCEPT_TYPE_IS_MSIE set 
606  */
607 #define ACCEPT_TYPE_MSIE_IMAGE  0x0002
608
609 /*
610  * *If* this is MSIE, it wants a HTML document.
611  * Only meaningful if ACCEPT_TYPE_IS_MSIE set
612  */
613 #define ACCEPT_TYPE_MSIE_HTML   0x0004
614
615 #endif /* def FEATURE_IMAGE_DETECT_MSIE */
616
617 /*
618  * Flags for use in csp->flags
619  */
620 #define CSP_FLAG_ACTIVE     0x01 /* Set if this client is processing data.
621                                   * Cleared when the thread associated with
622                                   * this structure dies. */
623 #define CSP_FLAG_CHUNKED    0x02 /* Set if the server's reply is in "chunked"
624                                   * transfer encoding */
625 #define CSP_FLAG_FORCED     0x04 /* Set if this request was enforced, although
626                                   * it would normally have been blocked. */
627 #define CSP_FLAG_MODIFIED   0x08 /* Set if any modification to the body was done */
628 #define CSP_FLAG_REJECTED   0x10 /* Set if request was blocked.  */
629 #define CSP_FLAG_TOGGLED_ON 0x20 /* Set if we are toggled on (FEATURE_TOGGLE) */
630
631 /*
632  * The state of a JunkBuster processing thread.
633  */
634 struct client_state
635 {
636    /* The proxy's configuration */
637    struct configuration_spec * config;
638
639    /* The actions to perform on the current request */
640    struct current_action_spec  action[1];
641
642    /* socket to talk to client (web browser) */
643    int  cfd;
644
645    /* socket to talk to server (web server or proxy) */
646    int  sfd;
647
648    /* Multi-purpose flag container, see CSP_FLAG_* above */
649    unsigned short int flags;
650
651    /*
652     * Client PC's IP address, as reported by the accept()_ function.
653     * Both as string and number
654     */
655    char *ip_addr_str;
656    long  ip_addr_long;
657
658
659    /* Our IP address and hostname, i.e. the IP address that
660       the client used to reach us, and the associated hostname,
661       both as strings
662     */
663    char *my_ip_addr_str;
664    char *my_hostname;
665
666 #ifdef FEATURE_TRUST
667    /* The referer in this request, if one was specified. */
668    char *referrer;
669 #endif /* def FEATURE_TRUST */
670
671 #if defined(FEATURE_IMAGE_DETECT_MSIE)
672    /* Types the client will accept.
673     * Bitmask - see ACCEPT_TYPE_XXX constants.
674     */
675    int accept_types;
676 #endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */
677
678    /* The URL that was requested */
679    struct http_request http[1];
680
681    /* An I/O buffer used for buffering data read from the client */
682    struct iob iob[1];
683
684    /* List of all headers for this request */
685    struct list headers[1];
686
687    /* List of all cookies for this request */
688    struct list cookie_list[1];
689
690    /* MIME-Type key, see CT_* above */
691    unsigned short int content_type;
692
693    /* The "X-Forwarded-For:" header sent by the client */
694    char   *x_forwarded;
695
696    /* files associated with this client */
697    struct file_list *actions_list;
698
699    struct file_list *rlist;   /* pcrs job file */
700    size_t content_length;     /* Length after content modification */ 
701
702 #ifdef FEATURE_TRUST
703    struct file_list *tlist;   /* trustfile */
704 #endif /* def FEATURE_TRUST */
705
706    struct client_state *next;
707 };
708
709
710 /*
711  * List of functions to run on a list of headers
712  */
713 struct parsers
714 {
715    char *str;
716    char  len;
717    char *(*parser)(const struct parsers *, const char *, struct client_state *);
718 };
719
720
721 /*
722  * List of available CGI functions.
723  */
724 struct cgi_dispatcher
725 {
726    const char * const name;
727    jb_err    (* const handler)(struct client_state *csp, struct http_response *rsp, const struct map *parameters);
728    const char * const description;
729 };
730
731
732 /*
733  * A data file used by JunkBuster.  Kept in a linked list.
734  */
735 struct file_list
736 {
737    /*
738     * this is a pointer to the data structures associated with the file.
739     * Read-only once the structure has been created.
740     */
741    void *f;
742    
743    /* Normally NULL.  When we are finished with file (i.e. when we have
744     * loaded a new one), set to a pointer to an unloader function.
745     * Unloader will be called by sweep() (called from main loop) when
746     * all clients using this file are done.  This prevents threading 
747     * problems.
748     */
749    void (*unloader)(void *);
750
751    /* Used internally by sweep().  Do not access from elsewhere. */
752    int active;
753
754    /* Following variables allow us to check if file has been changed.
755     * Read-only once the structure has been created.
756     */
757    time_t lastmodified;
758    char * filename;
759
760    /* Pointer to next entry in the linked list of all "file_list"s.
761     * This linked list is so that sweep() can navigate it.
762     * Since sweep() can remove items from the list, we must be careful
763     * to only access this value from main thread (when we know sweep
764     * won't be running).
765     */
766    struct file_list *next;
767 };
768
769
770 #ifdef FEATURE_TRUST
771 struct block_spec
772 {
773    struct url_spec url[1];
774    int    reject;
775    struct block_spec *next;
776 };
777 #endif /* def FEATURE_TRUST */
778
779
780 #define SOCKS_NONE    0    /* Don't use a SOCKS server */
781 #define SOCKS_4      40    /* original SOCKS 4 protocol */
782 #define SOCKS_4A     41    /* as modified for hosts w/o external DNS */
783
784 struct forward_spec
785 {
786    struct url_spec url[1];
787
788    /* Connection type - must be a SOCKS_xxx constant */
789    int   type;
790
791    /* SOCKS server */
792    char *gateway_host;
793    int   gateway_port;
794
795    /* Parent HTTP proxy */
796    char *forward_host;
797    int   forward_port;
798
799    /* For the linked list */
800    struct forward_spec *next;
801 };
802 #define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL }
803
804
805 struct re_filterfile_spec
806 {
807    char *username;
808    char *filtername;
809    struct list patterns[1];
810    pcrs_job *joblist;
811 };
812
813 #ifdef FEATURE_ACL
814 #define ACL_PERMIT   1  /* accept connection request */
815 #define ACL_DENY     2  /* reject connection request */
816
817 struct access_control_addr
818 {
819    unsigned long addr;
820    unsigned long mask;
821    unsigned long port;
822 };
823
824 struct access_control_list
825 {
826    struct access_control_addr src[1];
827    struct access_control_addr dst[1];
828
829    short action;
830    struct access_control_list *next;
831 };
832 #endif /* def FEATURE_ACL */
833
834
835 /* Maximum number of loaders (actions, re_filter, ...) */
836 #define NLOADERS 8
837
838
839 #define RUNTIME_FEATURE_CGI_EDIT_ACTIONS  1
840 #define RUNTIME_FEATURE_CGI_TOGGLE        2
841
842
843 /*
844  * Data loaded from the configuration file.
845  *
846  * (Anomaly: toggle is still handled through a global, not this structure)
847  */
848 struct configuration_spec
849 {
850    int debug;
851    int multi_threaded;
852
853    /* Features that can be enabled/disabled throuigh the config file */
854    unsigned feature_flags;
855
856    const char *logfile;
857
858    const char *confdir;
859    const char *logdir;
860    const char *actions_file;
861
862    /* The administrator's email address */
863    char *admin_address;
864
865    /* A URL with info on this proxy */
866    char *proxy_info_url;
867
868    const char *re_filterfile;
869
870 #ifdef FEATURE_COOKIE_JAR
871    const char * jarfile;
872    FILE * jar;
873 #endif /* def FEATURE_COOKIE_JAR */
874
875    /*
876     * Port and IP to bind to.
877     * Defaults to HADDR_DEFAULT:HADDR_PORT == 127.0.0.1:8000
878     */
879    const char *haddr;
880    int         hport;
881
882    /* Size limit for IOB */
883    size_t buffer_limit;
884
885 #ifdef FEATURE_TRUST
886    const char * trustfile;
887
888    struct list trust_info[1];
889    struct url_spec *trust_list[64];
890 #endif /* def FEATURE_TRUST */
891
892 #ifdef FEATURE_ACL
893    struct access_control_list *acl;
894 #endif /* def FEATURE_ACL */
895
896    struct forward_spec *forward;
897
898    /* All options from the config file, HTML-formatted */
899    char *proxy_args;
900
901    /* the configuration file object. */
902    struct file_list *config_file_list;
903
904    /* List of loaders */
905    int (*loaders[NLOADERS])(struct client_state *);
906
907    /* bool, nonzero if we need to bind() to the new port */
908    int need_bind;
909 };
910
911
912 #define SZ(X)  (sizeof(X) / sizeof(*X))
913
914 #ifdef FEATURE_FORCE_LOAD
915 #define FORCE_PREFIX "/IJB-FORCE-LOAD"
916 #endif /* def FEATURE_FORCE_LOAD */
917
918 /* Hardwired URLs */
919 #define HOME_PAGE_URL  "http://ijbswa.sourceforge.net"
920 #define REDIRECT_URL HOME_PAGE_URL "/redirect.php?v=" VERSION "&to="
921 #define CGI_PREFIX_HOST "i.j.b"
922
923 /* HTTP snipplets */
924 static const char CSUCCEED[] =
925    "HTTP/1.0 200 Connection established\n"
926    "Proxy-Agent: IJ/" VERSION "\r\n\r\n";
927
928 static const char CHEADER[] =
929    "HTTP/1.0 400 Invalid header received from browser\r\n\r\n";
930
931 static const char CFORBIDDEN[] =
932    "HTTP/1.0 403 Connection not allowable\r\nX-Hint: If you read this message interactively, then you know why this happens ,-)\r\n\r\n";
933
934 #ifdef __cplusplus
935 } /* extern "C" */
936 #endif
937
938 #endif /* ndef PROJECT_H_INCLUDED */
939
940 /*
941   Local Variables:
942   tab-width: 3
943   end:
944 */