-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.7 2001/05/26 15:26:15 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
* 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
*
* Revisions :
* $Log: filters.c,v $
+ * Revision 1.7 2001/05/26 15:26:15 jongfoster
+ * ACL feature now provides more security by immediately dropping
+ * connections from untrusted hosts.
+ *
+ * Revision 1.6 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.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
*
"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";
* Decide yes or no based on ACL file.
*
* Parameters :
- * 1 : src = Address the browser/user agent is requesting.
- * 2 : dst = The proxy or gateway address this is going to.
- * 3 : csp = Current client state (buffers, headers, etc...)
+ * 1 : dst = The proxy or gateway address this is going to.
+ * Or NULL to check all possible targets.
+ * 2 : csp = Current client state (buffers, headers, etc...)
+ * Also includes the client IP address.
*
* Returns : 0 = FALSE (don't block) and 1 = TRUE (do block)
*
*********************************************************************/
-int block_acl(struct access_control_addr *src, struct access_control_addr *dst, struct client_state *csp)
+int block_acl(struct access_control_addr *dst,
+ struct client_state *csp)
{
struct file_list *fl;
struct access_control_list *a, *acl;
- struct access_control_addr s[1], d[1];
/* if not using an access control list, then permit the connection */
- if (((fl = csp->alist) == NULL) || ((acl = fl->f) == NULL))
+ if (((fl = csp->alist) == NULL) ||
+ ((acl = (struct access_control_list *) fl->f) == NULL))
{
return(0);
}
/* search the list */
for (a = acl->next ; a ; a = a->next)
{
- *s = *src;
- *d = *dst;
-
- s->addr &= a->src->mask;
- d->addr &= a->dst->mask;
-
- if ((s->addr == a->src->addr)
- && (d->addr == a->dst->addr)
- && ((s->port == a->src->port)
- || (s->port == 0)
- || (a->src->port == 0))
- && ((d->port == a->dst->port)
- || (d->port == 0)
- || (a->dst->port == 0)))
+ if ((csp->ip_addr_long & a->src->mask) == a->src->addr)
{
- if (a->action == ACL_PERMIT)
+ if (dst == NULL)
{
- return(0);
+ /* Just want to check if they have any access */
+ if (a->action == ACL_PERMIT)
+ {
+ return(0);
+ }
}
- else
+ else if ( ((dst->addr & a->dst->mask) == a->dst->addr)
+ && ((dst->port == a->dst->port) || (a->dst->port == 0)))
{
- return(1);
+ if (a->action == ACL_PERMIT)
+ {
+ return(0);
+ }
+ else
+ {
+ return(1);
+ }
}
}
}
*
* Function : acl_addr
*
- * Description : Called from `load_aclfile'. FIXME: I can't say more.
+ * Description : Called from `load_aclfile' to parse an ACL address.
*
* Parameters :
- * 1 : aspec = (what?)
- * 2 : aca = (what?)
+ * 1 : aspec = String specifying ACL address.
+ * 2 : aca = struct access_control_addr to fill in.
*
* Returns : 0 => Ok, everything else is an error.
*
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) ) )
/* 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))
{
freez(url->dbuf);
freez(url->dvec);
- if ((fp = fopen(trustfile, "a")))
+ if ((fp = fopen(csp->config->trustfile, "a")))
{
h = NULL;
}
+#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 */
/*********************************************************************
*
* 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.
*
*********************************************************************/
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)
freez(url->dbuf);
freez(url->dvec);
- return(default_permissions);
+ return(csp->config->default_permissions);
}
"<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>© 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,
s = strsav(s, "</code></a></li>\n");
}
#endif /* def USE_IMAGE_LIST */
-\r
+
#ifdef PCRS
if (csp->rlist)
{
#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
/*********************************************************************
*
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;
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",
* 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");