-const char parsers_rcs[] = "$Id: parsers.c,v 1.6 2001/05/26 13:39:32 jongfoster Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.11 2001/05/29 20:11:19 joergs Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
*
* Revisions :
* $Log: parsers.c,v $
+ * Revision 1.11 2001/05/29 20:11:19 joergs
+ * '/* inside comment' warning removed.
+ *
+ * Revision 1.10 2001/05/29 09:50:24 jongfoster
+ * Unified blocklist/imagelist/permissionslist.
+ * File format is still under discussion, but the internal changes
+ * are (mostly) done.
+ *
+ * Also modified interceptor behaviour:
+ * - We now intercept all URLs beginning with one of the following
+ * prefixes (and *only* these prefixes):
+ * * http://i.j.b/
+ * * http://ijbswa.sf.net/config/
+ * * http://ijbswa.sourceforge.net/config/
+ * - New interceptors "home page" - go to http://i.j.b/ to see it.
+ * - Internal changes so that intercepted and fast redirect pages
+ * are not replaced with an image.
+ * - Interceptors now have the option to send a binary page direct
+ * to the client. (i.e. ijb-send-banner uses this)
+ * - Implemented show-url-info interceptor. (Which is why I needed
+ * the above interceptors changes - a typical URL is
+ * "http://i.j.b/show-url-info?url=www.somesite.com/banner.gif".
+ * The previous mechanism would not have intercepted that, and
+ * if it had been intercepted then it then it would have replaced
+ * it with an image.)
+ *
+ * Revision 1.9 2001/05/28 17:26:33 jongfoster
+ * Fixing segfault if last header was crunched.
+ * Fixing Windows build (snprintf() is _snprintf() under Win32, but we
+ * can use the cross-platform sprintf() instead.)
+ *
+ * Revision 1.8 2001/05/27 22:17:04 oes
+ *
+ * - re_process_buffer no longer writes the modified buffer
+ * to the client, which was very ugly. It now returns the
+ * buffer, which it is then written by chat.
+ *
+ * - content_length now adjusts the Content-Length: header
+ * for modified documents rather than crunch()ing it.
+ * (Length info in csp->content_length, which is 0 for
+ * unmodified documents)
+ *
+ * - For this to work, sed() is called twice when filtering.
+ *
+ * Revision 1.7 2001/05/27 13:19:06 oes
+ * Patched Joergs solution for the content-length in.
+ *
* Revision 1.6 2001/05/26 13:39:32 jongfoster
* Only crunches Content-Length header if applying RE filtering.
* Without this fix, Microsoft Windows Update wouldn't work.
#ifdef TRUST_FILES
{ "ij-untrusted-url", 15, ij_untrusted_url },
#endif /* def TRUST_FILES */
+ { "show-url-info", 13, ijb_show_url_info },
{ NULL, 0, NULL }
};
{
for (p = csp->headers->next; p ; p = p->next)
{
+ /* Header crunch()ed in previous run? -> ignore */
+ if (p->str == NULL) continue;
+
if (v == pats) log_error(LOG_LEVEL_HEADER, "scan: %s", p->str);
- if (p->str == NULL)
- {
- /* hit me */
- log_error(LOG_LEVEL_ERROR, "NULL header");
- }
- else if (strncmpic(p->str, v->str, v->len) == 0)
+ if (strncmpic(p->str, v->str, v->len) == 0)
{
hdr = v->parser(v, p->str, csp);
freez(p->str);
(*f)(csp);
}
- /* add the blank line at the end of the header */
- enlist(csp->headers, "");
+ /* add the blank line at the end of the header, if necessary */
+ if ( (csp->headers->last == NULL)
+ || (csp->headers->last->str == NULL)
+ || (*csp->headers->last->str != '\0') )
+ {
+ enlist(csp->headers, "");
+ }
hdr = list_to_text(csp->headers);
*
* Function : content_type
*
- * Description : Is this a text/* or javascript MIME Type?
+ * Description : Is this a text/.* or javascript MIME Type?
*
* Parameters :
* 1 : v = ignored
*********************************************************************/
char *content_length(const struct parsers *v, char *s, struct client_state *csp)
{
- if (((csp->permissions & PERMIT_RE_FILTER) != 0) && csp->is_text)
- {
- log_error(LOG_LEVEL_HEADER, "crunch!");
- return(NULL);
- }
+ if (csp->content_length != 0) /* Content has been modified */
+ {
+ s = (char *) zalloc(100);
+ sprintf(s, "Content-Length: %d", csp->content_length);
+ log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length);
+ return(s);
+ }
else
{
return(strdup(s));
strclean(s, FORCE_PREFIX);
#endif /* def FORCE_LOAD */
+#ifdef TRUST_FILES
csp->referrer = strdup(s);
+#endif /* def TRUST_FILES */
- if (csp->config->referrer == NULL)
+ /*
+ * Check permissionsfile. If we have allowed this site to get the
+ * referer, then send it and we're done.
+ */
+ if (csp->permissions & PERMIT_REFERER)
+ {
+ return(strdup(s));
+ }
+
+ /*
+ * Check configfile. Are we blocking referer?
+ */
+ if ( (csp->config->referrer == NULL)
+ || (*csp->config->referrer == '@') )
{
log_error(LOG_LEVEL_HEADER, "crunch!");
return(NULL);
}
+ /*
+ * Check configfile. Are we always sending referer?
+ */
if (*csp->config->referrer == '.')
{
return(strdup(s));
}
- if (*csp->config->referrer == '@')
- {
- if (csp->permissions & PERMIT_COOKIE_READ)
- {
- return(strdup(s));
- }
- else
- {
- log_error(LOG_LEVEL_HEADER, "crunch!");
- return(NULL);
- }
- }
-
/*
* New option § or L: Forge a referer as http://[hostname:port of REQUEST]/
* to fool stupid checks for in-site links
*/
-
if (*csp->config->referrer == '§' || *csp->config->referrer == 'L')
{
- if (csp->permissions & PERMIT_COOKIE_READ)
- {
- return(strdup(s));
- }
- else
- {
- log_error(LOG_LEVEL_HEADER, "crunch+forge!");
- s = strsav(NULL, "Referer: ");
- s = strsav(s, "http://");
- s = strsav(s, csp->http->hostport);
- s = strsav(s, "/");
- return(s);
- }
+ log_error(LOG_LEVEL_HEADER, "crunch+forge!");
+ s = strsav(NULL, "Referer: ");
+ s = strsav(s, "http://");
+ s = strsav(s, csp->http->hostport);
+ s = strsav(s, "/");
+ return(s);
}
+ /*
+ * We have a specific (fixed) referer we want to send.
+ */
+
log_error(LOG_LEVEL_HEADER, "modified");
s = strsav( NULL, "Referer: " );
if (*csp->config->uagent == '@')
{
- if (csp->permissions & PERMIT_COOKIE_READ)
+ if (csp->permissions & PERMIT_USER_AGENT)
{
return(strdup(s));
}
if (*csp->config->uagent == '@')
{
- if (csp->permissions & PERMIT_COOKIE_READ)
+ if (csp->permissions & PERMIT_USER_AGENT)
{
return(strdup(s));
}