#ifndef PROJECT_H_INCLUDED
#define PROJECT_H_INCLUDED
/** Version string. */
-#define PROJECT_H_VERSION "$Id: project.h,v 1.85 2006/12/31 15:03:31 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.99 2007/07/21 11:51:36 fabiankeil Exp $"
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/project.h,v $
* project. Does not define any variables or functions
* (though it does declare some macros).
*
- * Copyright : Written by and Copyright (C) 2001 - 2004 the SourceForge
+ * Copyright : Written by and Copyright (C) 2001 - 2007 the SourceForge
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
*
* Revisions :
* $Log: project.h,v $
+ * Revision 1.99 2007/07/21 11:51:36 fabiankeil
+ * As Hal noticed, checking dispatch_cgi() as the last cruncher
+ * looks like a bug if CGI requests are blocked unintentionally,
+ * so don't do it unless the user enabled the new config option
+ * "allow-cgi-request-crunching".
+ *
+ * Revision 1.98 2007/07/14 07:31:26 fabiankeil
+ * Add new csp->content_type flag (CT_DECLARED).
+ *
+ * Revision 1.97 2007/05/27 12:38:08 fabiankeil
+ * - Remove some left-overs from the switch to dedicated header filters.
+ * - Adjust "X-Filter: No" to disable dedicated header filters.
+ * - Prepare for forward-override{}
+ *
+ * Revision 1.96 2007/05/14 10:41:15 fabiankeil
+ * Ditch the csp member cookie_list[] which isn't used anymore.
+ *
+ * Revision 1.95 2007/04/30 15:02:19 fabiankeil
+ * Introduce dynamic pcrs jobs that can resolve variables.
+ *
+ * Revision 1.94 2007/04/15 16:39:21 fabiankeil
+ * Introduce tags as alternative way to specify which
+ * actions apply to a request. At the moment tags can be
+ * created based on client and server headers.
+ *
+ * Revision 1.93 2007/03/20 15:16:34 fabiankeil
+ * Use dedicated header filter actions instead of abusing "filter".
+ * Replace "filter-client-headers" and "filter-client-headers"
+ * with "server-header-filter" and "client-header-filter".
+ *
+ * Revision 1.92 2007/03/17 15:20:05 fabiankeil
+ * New config option: enforce-blocks.
+ *
+ * Revision 1.91 2007/03/05 13:28:03 fabiankeil
+ * Add some CSP_FLAGs for the header parsers.
+ *
+ * Revision 1.90 2007/02/07 10:36:16 fabiankeil
+ * Add new http_response member to save
+ * the reason why the response was generated.
+ *
+ * Revision 1.89 2007/01/27 13:09:16 fabiankeil
+ * Add new config option "templdir" to
+ * change the templates directory.
+ *
+ * Revision 1.88 2007/01/25 13:36:59 fabiankeil
+ * Add csp->error_message for failure reasons
+ * that should be embedded into the CGI pages.
+ *
+ * Revision 1.87 2007/01/01 19:36:37 fabiankeil
+ * Integrate a modified version of Wil Mahan's
+ * zlib patch (PR #895531).
+ *
+ * Revision 1.86 2006/12/31 17:56:37 fabiankeil
+ * Added config option accept-intercepted-requests
+ * and disabled it by default.
+ *
* Revision 1.85 2006/12/31 15:03:31 fabiankeil
* Fix gcc43 compiler warnings and a comment.
*
#define JB_ERR_PARSE 4 /**< Error parsing file */
#define JB_ERR_MODIFIED 5 /**< File has been modified outside of the
CGI actions editor. */
-
+#define JB_ERR_COMPRESS 6 /**< Error on decompression */
/**
* This macro is used to free a pointer that may be NULL.
int dcount; /**< How many parts to this domain? (length of dvec) */
};
+/**
+ * Reasons for generating a http_response instead of delivering
+ * the requested resource. Mostly ordered the way they are checked
+ * for in chat().
+ */
+#define RSP_REASON_UNSUPPORTED 1
+#define RSP_REASON_BLOCKED 2
+#define RSP_REASON_UNTRUSTED 3
+#define RSP_REASON_REDIRECTED 4
+#define RSP_REASON_CGI_CALL 5
+#define RSP_REASON_NO_SUCH_DOMAIN 6
+#define RSP_REASON_FORWARDING_FAILED 7
+#define RSP_REASON_CONNECT_FAILED 8
+#define RSP_REASON_OUT_OF_MEMORY 9
+#define RSP_REASON_INTERNAL_ERROR 10
/**
* Response generated by CGI, blocker, or error handler
size_t content_length; /**< Length of body, REQUIRED if binary body. */
int is_static; /**< Nonzero if the content will never change and
should be cached by the browser (e.g. images). */
+ int reason; /**< Why the response was generated in the first place. */
};
/**
- * A URL pattern.
+ * A URL or a tag pattern.
*/
struct url_spec
{
int dcount; /**< How many parts to this domain? (length of dvec) */
int unanchored; /**< Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT. */
- int port; /**< The port number, or 0 to match all ports. */
+ char *port_list; /**< List of acceptable ports, or NULL to match all ports */
- char *path; /**< The source for the regex. */
- size_t pathlen; /**< ==strlen(path). Needed for prefix matching. FIXME: Now obsolete? */
+ char *path; /**< The source for the regex. */
regex_t *preg; /**< Regex for matching path part */
+ regex_t *tag_regex; /**< Regex for matching tags */
};
/**
* If you declare a static url_spec, this is the value to initialize it to zero.
*/
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, 0, NULL, 0, NULL }
+#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL }
/**
* Constant for host part matching in URLs. If set, indicates that the start of
*/
#define IOB_RESET(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob));
-/* Bits for csp->content_type */
-#define CT_TEXT 1U /**< csp->content_type bitmask:
- Suitable for pcrs filtering. */
-#define CT_GIF 2U /**< csp->content_type bitmask:
- Suitable for GIF filtering. */
-#define CT_TABOO 4U /**< csp->content_type bitmask:
- DO NOT filter, irrespective of other flags. */
-#define CT_JPEG 8U /**< csp->content_type bitmask:
- Suitable for JPEG filtering. */
+/* Bits for csp->content_type bitmask: */
+#define CT_TEXT 0x0001U /**< Suitable for pcrs filtering. */
+#define CT_GIF 0x0002U /**< Suitable for GIF filtering. */
+#define CT_TABOO 0x0004U /**< DO NOT filter, irrespective of other flags. */
+#define CT_JPEG 0x0008U /**< Suitable for JPEG filtering. */
+
+/* Although these are not, strictly speaking, content types
+ * (they are content encodings), it is simple to handle them
+ * as such.
+ */
+#define CT_GZIP 0x0010U /**< gzip-compressed data. */
+#define CT_DEFLATE 0x0020U /**< zlib-compressed data. */
+
+/**
+ * Flag to signal that the server declared the content type,
+ * so we can differentiate between unknown and undeclared
+ * content types.
+ */
+#define CT_DECLARED 0x0040U
/**
* The mask which includes all actions.
#define ACTION_REDIRECT 0x10000000UL
/** Action bitmap: Answer blocked Connects verbosely */
#define ACTION_TREAT_FORBIDDEN_CONNECTS_LIKE_BLOCKS 0x20000000UL
-/** Action bitmap: Filter server headers with pcre */
-#define ACTION_FILTER_SERVER_HEADERS 0x40000000UL
-/** Action bitmap: Filter client headers with pcre */
-#define ACTION_FILTER_CLIENT_HEADERS 0x80000000UL
+/** Action bitmap: Override the forward settings in the config file */
+#define ACTION_FORWARD_OVERRIDE 0x40000000UL
/** Action string index: How to deanimate GIFs */
#define ACTION_STRING_REDIRECT 13
/** Action string index: Decode before redirect? */
#define ACTION_STRING_FAST_REDIRECTS 14
+/** Action string index: Overriding forward rule. */
+#define ACTION_STRING_FORWARD_OVERRIDE 15
/** Number of string actions. */
-#define ACTION_STRING_COUNT 15
+#define ACTION_STRING_COUNT 16
-/*To make the ugly hack in sed easier to understand*/
+/* To make the ugly hack in sed easier to understand */
#define CHECK_EVERY_HEADER_REMAINING 0
/** Index into current_action_spec::multi[] for headers to add. */
-#define ACTION_MULTI_ADD_HEADER 0
+#define ACTION_MULTI_ADD_HEADER 0
/** Index into current_action_spec::multi[] for headers to add. */
-#define ACTION_MULTI_WAFER 1
-/** Index into current_action_spec::multi[] for filters to apply. */
-#define ACTION_MULTI_FILTER 2
+#define ACTION_MULTI_WAFER 1
+/** Index into current_action_spec::multi[] for content filters to apply. */
+#define ACTION_MULTI_FILTER 2
+/** Index into current_action_spec::multi[] for server-header filters to apply. */
+#define ACTION_MULTI_SERVER_HEADER_FILTER 3
+/** Index into current_action_spec::multi[] for client-header filters to apply. */
+#define ACTION_MULTI_CLIENT_HEADER_FILTER 4
+/** Index into current_action_spec::multi[] for client-header tags to apply. */
+#define ACTION_MULTI_CLIENT_HEADER_TAGGER 5
+/** Index into current_action_spec::multi[] for server-header tags to apply. */
+#define ACTION_MULTI_SERVER_HEADER_TAGGER 6
/** Number of multi-string actions. */
-#define ACTION_MULTI_COUNT 3
+#define ACTION_MULTI_COUNT 7
/**
*/
#define CSP_FLAG_TOGGLED_ON 0x20
+/**
+ * Flag for csp->flags: Set if adding the 'Connection: close' header
+ * for the client isn't necessary.
+ */
+#define CSP_FLAG_CLIENT_CONNECTION_CLOSE_SET 0x00000040UL
+
+/**
+ * Flag for csp->flags: Set if adding the 'Connection: close' header
+ * for the server isn't necessary.
+ */
+#define CSP_FLAG_SERVER_CONNECTION_CLOSE_SET 0x00000080UL
+
+/**
+ * Flag for csp->flags: Signals header parsers whether they
+ * are parsing server or client headers.
+ */
+#define CSP_FLAG_CLIENT_HEADER_PARSING_DONE 0x00000100UL
+
+/**
+ * Flag for csp->flags: Set if adding the Host: header
+ * isn't necessary.
+ */
+#define CSP_FLAG_HOST_HEADER_IS_SET 0x00000200UL
+
+/**
+ * Flag for csp->flags: Set if filtering is disabled by X-Filter: No
+ * XXX: As we now have tags we might as well ditch this.
+ */
+#define CSP_FLAG_NO_FILTERING 0x00000400UL
+
/*
* Flags for use in return codes of child processes
/** The URL that was requested */
struct http_request http[1];
+ /*
+ * The final forwarding settings.
+ * XXX: Currently this is only used for forward-override,
+ * so we can free the space in sweep.
+ */
+ struct forward_spec * fwd;
+
/** An I/O buffer used for buffering data read from the network */
struct iob iob[1];
/** List of all headers for this request */
struct list headers[1];
- /** List of all cookies for this request */
- struct list cookie_list[1];
+ /** List of all tags that apply to this request */
+ struct list tags[1];
/** MIME-Type key, see CT_* above */
unsigned int content_type;
#endif /* def FEATURE_TRUST */
+ /**
+ * Failure reason to embedded in the CGI error page,
+ * or NULL. Currently only used for socks errors.
+ */
+ char *error_message;
+
/** Next thread in linked list. Only read or modify from the main thread! */
struct client_state *next;
};
*/
#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL }
+/* Supported filter types */
+#define FT_CONTENT_FILTER 0
+#define FT_CLIENT_HEADER_FILTER 1
+#define FT_SERVER_HEADER_FILTER 2
+#define FT_CLIENT_HEADER_TAGGER 3
+#define FT_SERVER_HEADER_TAGGER 4
+
+#define MAX_FILTER_TYPES 5
/**
* This struct represents one filter (one block) from
char *description; /**< Description from FILTER: statement in re_filterfile. */
struct list patterns[1]; /**< The patterns from the re_filterfile. */
pcrs_job *joblist; /**< The resulting compiled pcrs_jobs. */
+ int type; /**< Filter type (content, client-header, server-header). */
+ int dynamic; /**< Set to one if the pattern might contain variables
+ and has to be recompiled for every request. */
struct re_filterfile_spec *next; /**< The pointer for chaining. */
};
/** configuration_spec::feature_flags: Check the host header for requests with host-less request lines. */
#define RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS 16
+/** configuration_spec::feature_flags: Don't allow to circumvent blocks with the force prefix. */
+#define RUNTIME_FEATURE_ENFORCE_BLOCKS 32
+
+/** configuration_spec::feature_flags: Allow to block or redirect CGI requests. */
+#define RUNTIME_FEATURE_CGI_CRUNCHING 64
+
/**
* Data loaded from the configuration file.
/** The config file directory. */
const char *confdir;
+ /** The directory for customized CGI templates. */
+ const char *templdir;
+
/** The log file directory. */
const char *logdir;