-const char filters_rcs[] = "$Id: filters.c,v 1.4 2001/05/22 18:46:04 oes Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.8 2001/05/26 17:13:28 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
*
* Revisions :
* $Log: filters.c,v $
+ * Revision 1.8 2001/05/26 17:13:28 jongfoster
+ * Filled in a function comment.
+ *
+ * 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
* 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.
*
* Function : re_process_buffer
*
* Description : Apply all jobs from the joblist (aka. Perl regexp's) to
- * the text buffer that's been accumulated in csp->iob->buf.
- * Then, write the modified buffer out to the client
- * (Maybe this should happen from jcc.c via flush_socket
- * for better readability).
+ * the text buffer that's been accumulated in csp->iob->buf
+ * and set csp->content_length to the modified size.
*
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
*
- * Returns : N/A
+ * Returns : a pointer to the (newly allocated) modified buffer.
+ *
*
*********************************************************************/
-void re_process_buffer(struct client_state *csp)
+char *re_process_buffer(struct client_state *csp)
{
int hits=0;
int size = csp->iob->eod - csp->iob->cur;
log_error(LOG_LEVEL_RE_FILTER, " produced %d hits (new size %d).", hits, size);
- if (write_socket(csp->cfd, old, size) != size)
- {
- log_error(LOG_LEVEL_ERROR, "write to client failed.");
- }
+ csp->content_length = size;
/* fwiw, reset the iob */
IOB_RESET(csp);
- freez(new);
- return;
+ return(new);
}
#endif /* def PCRS */
/* 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;
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)
{
- return(default_permissions);
+ 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);
}
}
#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,
#endif /* ndef SPLIT_PROXY_ARGS */
- s = strsav(s, proxy_args->trailer);
+ s = strsav(s, csp->config->proxy_args->trailer);
return(s);
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",