Deleted config.h and pcrs/chartables.h because they are auto
[privoxy.git] / filters.c
index 29cee47..42f46af 100644 (file)
--- a/filters.c
+++ b/filters.c
@@ -1,15 +1,15 @@
-const char filters_rcs[] = "$Id: filters.c,v 1.1 2001/05/13 21:57:06 administrator Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.3 2001/05/20 16:44:47 jongfoster Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /home/administrator/cvs/ijb/filters.c,v $
+ * File        :  $Source: /cvsroot/ijbswa/current/filters.c,v $
  *
  * Purpose     :  Declares functions to parse/crunch headers and pages.
  *                Functions declared include:
  *                   `acl_addr', `add_stats', `block_acl', `block_imageurl',
- *                   `block_url', `cookie_url', `domaincmp', `dsplit',
- *                   `filter_popups', `forward_url',
+ *                   `block_url', `url_permissions', `domaincmp', `dsplit',
+ *                   `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,25 @@ const char filters_rcs[] = "$Id: filters.c,v 1.1 2001/05/13 21:57:06 administrat
  *
  * Revisions   :
  *    $Log: filters.c,v $
+ *    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
+ *
  *
  *********************************************************************/
 \f
@@ -107,8 +126,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";
@@ -494,7 +513,10 @@ void re_process_buffer(struct client_state *csp)
    struct re_filterfile_spec *b;
 
    /* Sanity first ;-) */
-   if (size <= 0) return;
+   if (size <= 0)
+   {
+      return;
+   }
 
    if ( ( NULL == (fl = csp->rlist) ) || ( NULL == (b = fl->f) ) )
    {
@@ -505,7 +527,7 @@ void re_process_buffer(struct client_state *csp)
    joblist = b->joblist;
 
 
-   log_error(LOG_LEVEL_REF, "re_filtering %s%s (size %d) ...",
+   log_error(LOG_LEVEL_RE_FILTER, "re_filtering %s%s (size %d) ...",
               csp->http->hostport, csp->http->path, size);
 
    /* Apply all jobs from the joblist */
@@ -516,7 +538,7 @@ void re_process_buffer(struct client_state *csp)
       old=new;
    }
 
-   log_error(LOG_LEVEL_REF, " produced %d hits (new size %d).", hits, size);
+   log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size);
 
    if (write_socket(csp->cfd, old, size) != size)
    {
@@ -786,35 +808,83 @@ 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 */
 
 /*********************************************************************
  *
- * Function    :  cookie_url
+ * Function    :  url_permissions
  *
- * Description :  Accept this cookie, or no?  See "cookiefile" setting.
+ * Description :  Gets the permissions for this URL.
  *
  * Parameters  :
  *          1  :  http = http_request request for blocked URLs
  *          2  :  csp = Current client state (buffers, headers, etc...)
  *
- * Returns     :  NULL => accept, cookie_spec pointer to crunch.
+ * Returns     :  permissions bitmask specifiying what this URL can do.
+ *                If not on list, will be default_permissions.
  *
  *********************************************************************/
-struct cookie_spec *cookie_url(struct http_request *http, struct client_state *csp)
+int url_permissions(struct http_request *http, struct client_state *csp)
 {
    struct file_list *fl;
-   struct cookie_spec *b;
+   struct permissions_spec *b;
    struct url_spec url[1];
 
-   if (((fl = csp->clist) == NULL) || ((b = fl->f) == NULL))
+   if (((fl = csp->permissions_list) == NULL) || ((b = fl->f) == NULL))
    {
-      return(NULL);
+      return(default_permissions);
    }
 
    *url = dsplit(http->host);
 
    /* if splitting the domain fails, punt */
-   if (url->dbuf == NULL) return(NULL);
+   if (url->dbuf == NULL)
+   {
+      return(default_permissions);
+   }
 
    for (b = b->next; NULL != b; b = b->next)
    {
@@ -832,7 +902,7 @@ struct cookie_spec *cookie_url(struct http_request *http, struct client_state *c
             {
                freez(url->dbuf);
                freez(url->dvec);
-               return(b);
+               return(b->permissions);
             }
          }
       }
@@ -840,7 +910,7 @@ struct cookie_spec *cookie_url(struct http_request *http, struct client_state *c
 
    freez(url->dbuf);
    freez(url->dvec);
-   return(NULL);
+   return(default_permissions);
 
 }
 
@@ -1055,11 +1125,11 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
          file_description = "Block List";
       }
       break;
-   case 'c':
-      if (csp->clist)
+   case 'p':
+      if (csp->permissions_list)
       {
-         filename = csp->clist->filename;
-         file_description = "Cookie List";
+         filename = csp->permissions_list->filename;
+         file_description = "Permissions List";
       }
       break;
    case 'f':
@@ -1090,16 +1160,6 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
       break;
 #endif /* def USE_IMAGE_LIST */
 
-#ifdef KILLPOPUPS
-   case 'p':
-      if (csp->plist)
-      {
-         filename = csp->plist->filename;
-         file_description = "Popup list";
-      }
-      break;
-#endif /* def KILLPOPUPS */
-
 #ifdef PCRS
    case 'r':
       if (csp->rlist)
@@ -1186,17 +1246,9 @@ 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);
    }
@@ -1222,10 +1274,10 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
       s = strsav(s, "</code></a></li>\n");
    }
 
-   if (csp->clist)
+   if (csp->permissions_list)
    {
-      s = strsav(s, "<li>Cookie List: <a href=\"show-proxy-args?cookie\"><code>");
-      s = strsav(s, csp->clist->filename);
+      s = strsav(s, "<li>Permissions List: <a href=\"show-proxy-args?permit\"><code>");
+      s = strsav(s, csp->permissions_list->filename);
       s = strsav(s, "</code></a></li>\n");
    }
 
@@ -1254,15 +1306,6 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
    }
 #endif /* def USE_IMAGE_LIST */
 
-#ifdef KILLPOPUPS
-   if (csp->plist)
-   {
-      s = strsav(s, "<li>Popup List: <a href=\"show-proxy-args?popup\"><code>");
-      s = strsav(s, csp->plist->filename);
-      s = strsav(s, "</code></a></li>\n");
-   }
-#endif /* def KILLPOPUPS */
-
 #ifdef PCRS
    if (csp->rlist)
    {
@@ -1313,13 +1356,6 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
    }
 #endif /* def USE_IMAGE_LIST */
 
-#ifdef KILLPOPUPS
-   if (csp->plist)
-   {
-      s = strsav(s, csp->plist->proxy_args);
-   }
-#endif /* def KILLPOPUPS */
-
 #ifdef PCRS
    if (csp->rlist)
    {
@@ -1343,6 +1379,28 @@ char *show_proxy_args(struct http_request *http, struct client_state *csp)
 }
 
 
+/*********************************************************************
+ *
+ * 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
 /*********************************************************************
  *