New #define, WIN_GUI_EDIT, enables the (embryonic) Win32 GUI editor.
[privoxy.git] / filters.c
index d126218..cab956f 100644 (file)
--- a/filters.c
+++ b/filters.c
@@ -1,4 +1,4 @@
-const char filters_rcs[] = "$Id: filters.c,v 1.1.1.1 2001/05/15 13:58:52 oes Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.5 2001/05/25 22:34:30 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/filters.c,v $
@@ -7,9 +7,9 @@ const char filters_rcs[] = "$Id: filters.c,v 1.1.1.1 2001/05/15 13:58:52 oes Exp
  *                Functions declared include:
  *                   `acl_addr', `add_stats', `block_acl', `block_imageurl',
  *                   `block_url', `url_permissions', `domaincmp', `dsplit',
- *                   `filter_popups', `forward_url',
+ *                   `filter_popups', `forward_url', 'redirect_url',
  *                   `ij_untrusted_url', `intercept_url', `re_process_buffer',
- *                   `show_proxy_args', and `trust_url'
+ *                   `show_proxy_args', 'ijb_send_banner', and `trust_url'
  *
  * Copyright   :  Written by and Copyright (C) 2001 the SourceForge
  *                IJBSWA team.  http://ijbswa.sourceforge.net
@@ -38,6 +38,69 @@ const char filters_rcs[] = "$Id: filters.c,v 1.1.1.1 2001/05/15 13:58:52 oes Exp
  *
  * Revisions   :
  *    $Log: filters.c,v $
+ *    Revision 1.5  2001/05/25 22:34:30  jongfoster
+ *    Hard tabs->Spaces
+ *
+ *    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 16:44:47  jongfoster
+ *    Removing last hardcoded JunkBusters.com URLs.
+ *
+ *    Revision 1.2  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.1.1.1  2001/05/15 13:58:52  oes
  *    Initial import of version 2.9.3 source tree
  *
@@ -110,8 +173,8 @@ static const char CBLOCK[] =
       "was blocked because it matches the following pattern "
       "in the blockfile: <b>%s</b>\n</p>"
 #ifdef FORCE_LOAD
-       "<p align=center><a href=\"http://" FORCE_PREFIX
-        "%s%s\">Go there anyway.</a></p>"
+       "<p align=center><a href=\"http://%s" FORCE_PREFIX
+        "%s\">Go there anyway.</a></p>"
 #endif /* def FORCE_LOAD */
       "</body>\n"
       "</html>\n";
@@ -497,9 +560,9 @@ void re_process_buffer(struct client_state *csp)
    struct re_filterfile_spec *b;
 
    /* Sanity first ;-) */
-   if (size <= 0)\r
-   {\r
-      return;\r
+   if (size <= 0)
+   {
+      return;
    }
 
    if ( ( NULL == (fl = csp->rlist) ) || ( NULL == (b = fl->f) ) )
@@ -657,7 +720,7 @@ char *trust_url(struct http_request *http, struct client_state *csp)
    /* if splitting the domain fails, punt */
    if (url->dbuf == NULL) goto trust_url_not_trusted;
 
-   for (tl = trust_list; (t = *tl) ; tl++)
+   for (tl = csp->config->trust_list; (t = *tl) ; tl++)
    {
       if ((t->port == 0) || (t->port == rhttp->port))
       {
@@ -681,7 +744,7 @@ char *trust_url(struct http_request *http, struct client_state *csp)
                freez(url->dbuf);
                freez(url->dvec);
 
-               if ((fp = fopen(trustfile, "a")))
+               if ((fp = fopen(csp->config->trustfile, "a")))
                {
                   h = NULL;
 
@@ -792,6 +855,50 @@ char *intercept_url(struct http_request *http, struct client_state *csp)
 
 }
 
+#ifdef FAST_REDIRECTS
+/*********************************************************************
+ *
+ * Function    :  redirect_url
+ *
+ * Description :  Checks for redirection URLs and returns a HTTP redirect
+ *                to the destination URL.
+ *
+ * Parameters  :
+ *          1  :  http = http_request request, check `basename's of blocklist
+ *          2  :  csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns     :  NULL if URL was clean, HTTP redirect otherwise.
+ *
+ *********************************************************************/
+char *redirect_url(struct http_request *http, struct client_state *csp)
+{
+   char *p, *q;
+
+   p = q = csp->http->path;
+   log_error(LOG_LEVEL_REDIRECTS, "checking path: %s", p);
+
+   /* find the last URL encoded in the request */
+   while (p = strstr(p, "http://"))
+   {
+      q = p++;
+   }
+
+   /* if there was any, generate and return a HTTP redirect */
+   if (q != csp->http->path)
+   {
+      log_error(LOG_LEVEL_REDIRECTS, "redirecting to: %s", q);
+
+      p = (char *)malloc(strlen(HTTP_REDIRECT_TEMPLATE) + strlen(q));
+      sprintf(p, HTTP_REDIRECT_TEMPLATE, q);
+      return(p);
+   }
+   else
+   {
+      return(NULL);
+   }
+
+}
+#endif /* def FAST_REDIRECTS */
 
 /*********************************************************************
  *
@@ -803,7 +910,7 @@ char *intercept_url(struct http_request *http, struct client_state *csp)
  *          1  :  http = http_request request for blocked URLs
  *          2  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  permissions bitmask specifiying what this URL can do.\r
+ * Returns     :  permissions bitmask specifiying what this URL can do.
  *                If not on list, will be default_permissions.
  *
  *********************************************************************/
@@ -815,15 +922,15 @@ int url_permissions(struct http_request *http, struct client_state *csp)
 
    if (((fl = csp->permissions_list) == NULL) || ((b = fl->f) == NULL))
    {
-      return(default_permissions);
+      return(csp->config->default_permissions);
    }
 
    *url = dsplit(http->host);
 
    /* if splitting the domain fails, punt */
-   if (url->dbuf == NULL)\r
-   {\r
-      return(default_permissions);\r
+   if (url->dbuf == NULL)
+   {
+      return(csp->config->default_permissions);
    }
 
    for (b = b->next; NULL != b; b = b->next)
@@ -850,7 +957,7 @@ int url_permissions(struct http_request *http, struct client_state *csp)
 
    freez(url->dbuf);
    freez(url->dvec);
-   return(default_permissions);
+   return(csp->config->default_permissions);
 
 }
 
@@ -1186,28 +1293,20 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
          "<p><a href=\"show-proxy-args\">Back to proxy status</a></p>\n"
          "<br>\n"
          "<small><small><p>\n"
-         "Code and documentation of the " BANNER " Proxy"
-         "<sup><small>TM</small></sup>\n"
-         "<a href=\"http://www.junkbusters.com/ht/en/legal.html#copy\">\n" "Copyright</a>&#169; 1997 Junkbusters Corporation\n"
-         "<a href=\"http://www.junkbusters.com/ht/en/legal.html#marks\"><sup><small>TM</small></sup></a><br>\n"
-         "Copying and distribution permitted under the"
-         "<a href=\"http://www.gnu.org/copyleft/gpl.html\">\n"
-         "<small>GNU</small></a> "
-         "General Public License.\n"
-         "</small>"
-         "<address><kbd>webmaster@junkbusters.com</kbd></address>"
-         "</small>"
+         "The " BANNER " Proxy - \n"
+         "<a href=\"" HOME_PAGE_URL "\">" HOME_PAGE_URL "</a>\n"
+         "</small></small>"
          "</body></html>\n");
       return(s);
    }
 #endif /* def SPLIT_PROXY_ARGS */
    
-   s = strsav(s, proxy_args->header);
-   s = strsav(s, proxy_args->invocation);
+   s = strsav(s, csp->config->proxy_args->header);
+   s = strsav(s, csp->config->proxy_args->invocation);
 #ifdef STATISTICS
    s = add_stats(s);
 #endif /* def STATISTICS */
-   s = strsav(s, proxy_args->gateways);
+   s = strsav(s, csp->config->proxy_args->gateways);
 
 #ifdef SPLIT_PROXY_ARGS
    s = strsav(s, 
@@ -1253,7 +1352,7 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
       s = strsav(s, "</code></a></li>\n");
    }
 #endif /* def USE_IMAGE_LIST */
-\r
+
 #ifdef PCRS
    if (csp->rlist)
    {
@@ -1320,13 +1419,35 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
 
 #endif /* ndef SPLIT_PROXY_ARGS */
 
-   s = strsav(s, proxy_args->trailer);
+   s = strsav(s, csp->config->proxy_args->trailer);
 
    return(s);
 
 }
 
 
+/*********************************************************************
+ *
+ * Function    :  ijb_send_banner
+ *
+ * Description :  This "crunch"es "http:/any.thing/ijb-send-banner and
+ *                thus triggers sending the image in jcc.c:chat.
+ *                For the unlikely case, that the imagefile/MSIE
+ *                mechanism is not used, or tinygif = 0, a page
+ *                describing the reson of the interception is generated.
+ *
+ * Parameters  :
+ *          1  :  http = http_request request for crunched URL
+ *          2  :  csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns     :  A string that contains why this was intercepted.
+ *
+ *********************************************************************/
+char *ijb_send_banner(struct http_request *http, struct client_state *csp)
+{
+   return(strdup(CNOBANNER));
+}
+
 #ifdef TRUST_FILES
 /*********************************************************************
  *
@@ -1403,13 +1524,13 @@ char *ij_untrusted_url(struct http_request *http, struct client_state *csp)
 
    p = strsav(p, "<h3>The following referrers are trusted</h3>\n");
 
-   for (tl = trust_list; (t = *tl) ; tl++)
+   for (tl = csp->config->trust_list; (t = *tl) ; tl++)
    {
       sprintf(buf, "%s<br>\n", t->spec);
       p = strsav(p, buf);
    }
 
-   if (trust_info->next)
+   if (csp->config->trust_info->next)
    {
       struct list *l;
 
@@ -1423,7 +1544,7 @@ char *ij_untrusted_url(struct http_request *http, struct client_state *csp)
 
       p = strsav(p, buf);
 
-      for (l = trust_info->next; l ; l = l->next)
+      for (l = csp->config->trust_info->next; l ; l = l->next)
       {
          sprintf(buf,
             "<li> <a href=%s>%s</a><br>\n",
@@ -1472,11 +1593,11 @@ char *add_stats(char *s)
     * Need to alter the stats not to include the fetch of this
     * page.
     *
-        * Can't do following thread safely! doh!
-        *
+    * Can't do following thread safely! doh!
+    *
     * urls_read--;
     * urls_rejected--; * This will be incremented subsequently *
-        */
+    */
 
    s = strsav(s,"<h2>Statistics for this " BANNER ":</h2>\n");