Filled in a function comment.
[privoxy.git] / parsers.c
index f56c0b7..ff58e7d 100644 (file)
--- a/parsers.c
+++ b/parsers.c
@@ -1,7 +1,7 @@
-const char parsers_rcs[] = "$Id: parsers.c,v 1.1 2001/05/13 21:57:06 administrator Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.5 2001/05/26 00:28:36 jongfoster Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /home/administrator/cvs/ijb/parsers.c,v $
+ * File        :  $Source: /cvsroot/ijbswa/current/parsers.c,v $
  *
  * Purpose     :  Declares functions to parse/crunch headers and pages.
  *                Functions declared include:
@@ -41,6 +41,76 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.1 2001/05/13 21:57:06 administrat
  *
  * Revisions   :
  *    $Log: parsers.c,v $
+ *    Revision 1.5  2001/05/26 00:28:36  jongfoster
+ *    Automatic reloading of config file.
+ *    Removed obsolete SIGHUP support (Unix) and Reload menu option (Win32).
+ *    Most of the global variables have been moved to a new
+ *    struct configuration_spec, accessed through csp->config->globalname
+ *    Most of the globals remaining are used by the Win32 GUI.
+ *
+ *    Revision 1.4  2001/05/22 18:46:04  oes
+ *
+ *    - Enabled filtering banners by size rather than URL
+ *      by adding patterns that replace all standard banner
+ *      sizes with the "Junkbuster" gif to the re_filterfile
+ *
+ *    - Enabled filtering WebBugs by providing a pattern
+ *      which kills all 1x1 images
+ *
+ *    - Added support for PCRE_UNGREEDY behaviour to pcrs,
+ *      which is selected by the (nonstandard and therefore
+ *      capital) letter 'U' in the option string.
+ *      It causes the quantifiers to be ungreedy by default.
+ *      Appending a ? turns back to greedy (!).
+ *
+ *    - Added a new interceptor ijb-send-banner, which
+ *      sends back the "Junkbuster" gif. Without imagelist or
+ *      MSIE detection support, or if tinygif = 1, or the
+ *      URL isn't recognized as an imageurl, a lame HTML
+ *      explanation is sent instead.
+ *
+ *    - Added new feature, which permits blocking remote
+ *      script redirects and firing back a local redirect
+ *      to the browser.
+ *      The feature is conditionally compiled, i.e. it
+ *      can be disabled with --disable-fast-redirects,
+ *      plus it must be activated by a "fast-redirects"
+ *      line in the config file, has its own log level
+ *      and of course wants to be displayed by show-proxy-args
+ *      Note: Boy, all the #ifdefs in 1001 locations and
+ *      all the fumbling with configure.in and acconfig.h
+ *      were *way* more work than the feature itself :-(
+ *
+ *    - Because a generic redirect template was needed for
+ *      this, tinygif = 3 now uses the same.
+ *
+ *    - Moved GIFs, and other static HTTP response templates
+ *      to project.h
+ *
+ *    - Some minor fixes
+ *
+ *    - Removed some >400 CRs again (Jon, you really worked
+ *      a lot! ;-)
+ *
+ *    Revision 1.3  2001/05/20 01:21:20  jongfoster
+ *    Version 2.9.4 checkin.
+ *    - Merged popupfile and cookiefile, and added control over PCRS
+ *      filtering, in new "permissionsfile".
+ *    - Implemented LOG_LEVEL_FATAL, so that if there is a configuration
+ *      file error you now get a message box (in the Win32 GUI) rather
+ *      than the program exiting with no explanation.
+ *    - Made killpopup use the PCRS MIME-type checking and HTTP-header
+ *      skipping.
+ *    - Removed tabs from "config"
+ *    - Moved duplicated url parsing code in "loaders.c" to a new funcition.
+ *    - Bumped up version number.
+ *
+ *    Revision 1.2  2001/05/17 23:02:36  oes
+ *     - Made referrer option accept 'L' as a substitute for '§'
+ *
+ *    Revision 1.1.1.1  2001/05/15 13:59:01  oes
+ *    Initial import of version 2.9.3 source tree
+ *
  *
  *********************************************************************/
 \f
@@ -108,8 +178,9 @@ const struct parsers client_patterns[] = {
 
 const struct interceptors intercept_patterns[] = {
    { "show-proxy-args",    14, show_proxy_args },
+   { "ijb-send-banner",    14, ijb_send_banner },
 #ifdef TRUST_FILES
-   { "ij-untrusted-url",   14, ij_untrusted_url },
+   { "ij-untrusted-url",   15, ij_untrusted_url },
 #endif /* def TRUST_FILES */
    { NULL, 0, NULL }
 };
@@ -117,9 +188,11 @@ const struct interceptors intercept_patterns[] = {
 const struct parsers server_patterns[] = {
    { "set-cookie:",        11, server_set_cookie },
    { "connection:",        11, crumble },
-#ifdef PCRS
+#if defined(PCRS) || defined(KILLPOPUPS)
    { "Content-Type:",      13, content_type },
-   { "Content-Length:",    15, crumble },
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+#ifdef PCRS
+   { "Content-Length:",    15, content_length },
 #endif /* def PCRS */
    { NULL, 0, NULL }
 };
@@ -704,7 +777,7 @@ char *crumble(const struct parsers *v, char *s, struct client_state *csp)
 }
 
 
-#ifdef PCRS
+#if defined(PCRS) || defined(KILLPOPUPS)
 
 /*********************************************************************
  *
@@ -730,6 +803,36 @@ char *content_type(const struct parsers *v, char *s, struct client_state *csp)
    return(strdup(s));
 
 }
+#endif /* defined(PCRS) || defined(KILLPOPUPS) */
+
+#ifdef PCRS
+/*********************************************************************
+ *
+ * Function    :  content_length
+ *
+ * Description :  Crunch Content-Length header if & only if we are
+ *                filtering this page through PCRS.
+ *
+ * Parameters  :
+ *          1  :  v = ignored
+ *          2  :  s = header string we are "considering"
+ *          3  :  csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns     :  A duplicate string pointer to this header (ie. pass thru)
+ *
+ *********************************************************************/
+char *content_length(const struct parsers *v, char *s, struct client_state *csp)
+{
+   if ((csp->permissions & PERMIT_RE_FILTER) != 0)
+   {
+      log_error(LOG_LEVEL_HEADER, "crunch!");
+      return(NULL);
+   }
+   else
+   {
+      return(strdup(s));
+   }
+}
 
 #endif /* def PCRS */
 
@@ -762,20 +865,20 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp
 
    csp->referrer = strdup(s);
 
-   if (referrer == NULL)
+   if (csp->config->referrer == NULL)
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
       return(NULL);
    }
 
-   if (*referrer == '.')
+   if (*csp->config->referrer == '.')
    {
       return(strdup(s));
    }
 
-   if (*referrer == '@')
+   if (*csp->config->referrer == '@')
    {
-      if (csp->send_user_cookie)
+      if (csp->permissions & PERMIT_COOKIE_READ)
       {
          return(strdup(s));
       }
@@ -787,13 +890,13 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp
    }
 
    /*
-    * New option §: Forge a referer as http://[hostname:port of REQUEST]/
+    * New option § or L: Forge a referer as http://[hostname:port of REQUEST]/
     * to fool stupid checks for in-site links
     */
 
-   if (*referrer == '§')
+   if (*csp->config->referrer == '§' || *csp->config->referrer == 'L')
    {
-      if (csp->send_user_cookie)
+      if (csp->permissions & PERMIT_COOKIE_READ)
       {
          return(strdup(s));
       }
@@ -811,7 +914,7 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp
    log_error(LOG_LEVEL_HEADER, "modified");
 
    s = strsav( NULL, "Referer: " );
-   s = strsav( s, referrer );
+   s = strsav( s, csp->config->referrer );
    return(s);
 
 }
@@ -845,20 +948,20 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp)
    }
 #endif /* def DETECT_MSIE_IMAGES */
 
-   if (uagent == NULL)
+   if (csp->config->uagent == NULL)
    {
       log_error(LOG_LEVEL_HEADER, "default");
       return(strdup(DEFAULT_USER_AGENT));
    }
 
-   if (*uagent == '.')
+   if (*csp->config->uagent == '.')
    {
       return(strdup(s));
    }
 
-   if (*uagent == '@')
+   if (*csp->config->uagent == '@')
    {
-      if (csp->send_user_cookie)
+      if (csp->permissions & PERMIT_COOKIE_READ)
       {
          return(strdup(s));
       }
@@ -872,7 +975,7 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp)
    log_error(LOG_LEVEL_HEADER, "modified");
 
    s = strsav( NULL, "User-Agent: " );
-   s = strsav( s, uagent );
+   s = strsav( s, csp->config->uagent );
    return(s);
 
 }
@@ -894,20 +997,20 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp)
  *********************************************************************/
 char *client_ua(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if (uagent == NULL)
+   if (csp->config->uagent == NULL)
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
       return(NULL);
    }
 
-   if (*uagent == '.')
+   if (*csp->config->uagent == '.')
    {
       return(strdup(s));
    }
 
-   if (*uagent == '@')
+   if (*csp->config->uagent == '@')
    {
-      if (csp->send_user_cookie)
+      if (csp->permissions & PERMIT_COOKIE_READ)
       {
          return(strdup(s));
       }
@@ -943,13 +1046,13 @@ char *client_ua(const struct parsers *v, char *s, struct client_state *csp)
 char *client_from(const struct parsers *v, char *s, struct client_state *csp)
 {
    /* if not set, zap it */
-   if (from == NULL)
+   if (csp->config->from == NULL)
    {
       log_error(LOG_LEVEL_HEADER, "crunch!");
       return(NULL);
    }
 
-   if (*from == '.')
+   if (*csp->config->from == '.')
    {
       return(strdup(s));
    }
@@ -957,7 +1060,7 @@ char *client_from(const struct parsers *v, char *s, struct client_state *csp)
    log_error(LOG_LEVEL_HEADER, " modified");
 
    s = strsav( NULL, "From: " );
-   s = strsav( s, from );
+   s = strsav( s, csp->config->from );
    return(s);
 
 }
@@ -981,7 +1084,7 @@ char *client_from(const struct parsers *v, char *s, struct client_state *csp)
  *********************************************************************/
 char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if (csp->send_user_cookie)
+   if (csp->permissions & PERMIT_COOKIE_READ)
    {
       enlist(csp->cookie_list, s + v->len + 1);
    }
@@ -1016,7 +1119,7 @@ char *client_send_cookie(const struct parsers *v, char *s, struct client_state *
  *********************************************************************/
 char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp)
 {
-   if (add_forwarded)
+   if (csp->config->add_forwarded)
    {
       csp->x_forwarded = strdup(s);
    }
@@ -1101,7 +1204,7 @@ void client_cookie_adder(struct client_state *csp)
       tmp = strsav(tmp, l->str);
    }
 
-   for (l = wafer_list->next;  l ; l = l->next)
+   for (l = csp->config->wafer_list->next;  l ; l = l->next)
    {
       if (tmp)
       {
@@ -1146,7 +1249,7 @@ void client_xtra_adder(struct client_state *csp)
 {
    struct list *l;
 
-   for (l = xtra_list->next; l ; l = l->next)
+   for (l = csp->config->xtra_list->next; l ; l = l->next)
    {
       log_error(LOG_LEVEL_HEADER, "addh: %s", l->str);
       enlist(csp->headers, l->str);
@@ -1171,7 +1274,10 @@ void client_x_forwarded_adder(struct client_state *csp)
 {
    char *p = NULL;
 
-   if (add_forwarded == 0) return;
+   if (csp->config->add_forwarded == 0)
+   {
+      return;
+   }
 
    if (csp->x_forwarded)
    {
@@ -1210,13 +1316,13 @@ void client_x_forwarded_adder(struct client_state *csp)
 char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp)
 {
 #ifdef JAR_FILES
-   if (jar)
+   if (csp->config->jar)
    {
-      fprintf(jar, "%s\t%s\n", csp->http->host, (s + v->len + 1));
+      fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1));
    }
 #endif /* def JAR_FILES */
 
-   if (csp->accept_server_cookie == 0)
+   if (!(csp->permissions & PERMIT_COOKIE_SET))
    {
       return(crumble(v, s, csp));
    }