-const char parsers_rcs[] = "$Id: parsers.c,v 1.7 2001/05/27 13:19:06 oes Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.9 2001/05/28 17:26:33 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
*
* Revisions :
* $Log: parsers.c,v $
+ * 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.
*
#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 }
};
}
/* add the blank line at the end of the header, if necessary */
- if(strlen(csp->headers->last->str) != 0)
+ if ( (csp->headers->last == NULL)
+ || (csp->headers->last->str == NULL)
+ || (*csp->headers->last->str != '\0') )
{
enlist(csp->headers, "");
}
if (csp->content_length != 0) /* Content has been modified */
{
s = (char *) zalloc(100);
- snprintf(s, 100, "Content-Length: %d", csp->content_length);
+ sprintf(s, "Content-Length: %d", csp->content_length);
log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length);
return(s);
}
strclean(s, FORCE_PREFIX);
#endif /* def FORCE_LOAD */
+#ifdef TRUST_FILES\r
csp->referrer = strdup(s);
+#endif /* def TRUST_FILES */\r
+
+ /*
+ * 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));
+ }
- if (csp->config->referrer == NULL)
+ /*
+ * 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));
}