--- parsers.c.orig Fri Jul 11 15:21:25 2003 +++ parsers.c Thu Apr 6 13:00:22 2006 @@ -820,7 +820,7 @@ *********************************************************************/ jb_err crumble(struct client_state *csp, char **header) { - log_error(LOG_LEVEL_HEADER, "crunch!"); + log_error(LOG_LEVEL_HEADER, "crumble crunched: %s!", *header); freez(*header); return JB_ERR_OK; } @@ -853,6 +853,7 @@ if (csp->content_type != CT_TABOO) { if ((strstr(*header, " text/") && !strstr(*header, "plain")) + || strstr(*header, "xml") || strstr(*header, "application/x-javascript")) csp->content_type = CT_TEXT; else if (strstr(*header, " image/gif")) @@ -1114,7 +1115,10 @@ jb_err client_referrer(struct client_state *csp, char **header) { const char *newval; - + const char * host; + char * referer; + int hostlenght; + #ifdef FEATURE_FORCE_LOAD /* Since the referrer can include the prefix even * even if the request itself is non-forced, we must @@ -1130,28 +1134,75 @@ { return JB_ERR_OK; } - - freez(*header); - newval = csp->action->string[ACTION_STRING_REFERER]; + if ( (0 != strcmpic(newval, "conditional-block"))) + { + freez(*header); + } + if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { /* * Blocking referer */ - log_error(LOG_LEVEL_HEADER, "crunch!"); + log_error(LOG_LEVEL_HEADER, "Referer crunched!"); return JB_ERR_OK; } - else if (0 == strncmpic(newval, "http://", 7)) + else if ( (0 == strcmpic(newval, "conditional-block"))) { /* - * We have a specific (fixed) referer we want to send. + * Block referer if host has changed + * or if host header isn't set. */ - log_error(LOG_LEVEL_HEADER, "modified"); + if ( NULL == (host = strdup(csp->http->hostport)) ) + { + freez(*header); + log_error(LOG_LEVEL_HEADER, "Referer crunched! Couldn't allocate memory for temporary host copy."); + return JB_ERR_MEMORY; + } + if ( NULL == (referer = strdup(*header)) ) + { + freez(*header); + freez(host); + log_error(LOG_LEVEL_HEADER, "Referer crunched! Couldn't allocate memory for temporary referer copy."); + return JB_ERR_MEMORY; + } + hostlenght = strlen(host); + if ( hostlenght < (strlen(referer)-17) ) /*referer begins with 'Referer: http[s]://'*/ + { + /*Shorten referer to make sure the referer is blocked + *if www.example.org/www.example.com-shall-see-the-referer/ + *links to www.example.com/ + */ + referer[hostlenght+17] = '\n'; + } + if ( 0 == strstr(referer, host)) /*Host has changed*/ + { + log_error(LOG_LEVEL_HEADER, "New host is: %s. Crunching %s!", host, *header); + freez(*header); + } + else + { + log_error(LOG_LEVEL_HEADER, "%s (not modified, still on %s)", *header, host); + } + freez(referer); + freez(host); + return JB_ERR_OK; + } + else if (0 != strcmpic(newval, "forge")) + { + /* + * We have a specific (fixed) referer we want to send. + */ + if ((0 != strncmpic(newval, "http://", 7)) && (0 != strncmpic(newval, "https://", 8))) + { + log_error(LOG_LEVEL_HEADER, "Parameter: +referrer{%s} is a bad idea, but I don't care.", newval); + } *header = strdup("Referer: "); string_append(header, newval); + log_error(LOG_LEVEL_HEADER, "Referer overwritten with: %s", *header); return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1161,18 +1212,11 @@ * Forge a referer as http://[hostname:port of REQUEST]/ * to fool stupid checks for in-site links */ - if (0 != strcmpic(newval, "forge")) - { - /* - * Invalid choice - but forge is probably the best default. - */ - log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval); - } *header = strdup("Referer: http://"); string_append(header, csp->http->hostport); string_append(header, "/"); - log_error(LOG_LEVEL_HEADER, "crunch+forge to %s", *header); + log_error(LOG_LEVEL_HEADER, "Referer forged to: %s", *header); return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1213,12 +1257,12 @@ return JB_ERR_OK; } - log_error(LOG_LEVEL_HEADER, "modified"); - freez(*header); *header = strdup("User-Agent: "); string_append(header, newval); + log_error(LOG_LEVEL_HEADER, "Modified: %s", *header); + return (*header == NULL) ? JB_ERR_MEMORY : JB_ERR_OK; } @@ -1244,7 +1288,7 @@ { if ((csp->action->flags & ACTION_HIDE_USER_AGENT) != 0) { - log_error(LOG_LEVEL_HEADER, "crunch!"); + log_error(LOG_LEVEL_HEADER, "crunched User-Agent!"); freez(*header); } @@ -1288,7 +1332,7 @@ */ if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { - log_error(LOG_LEVEL_HEADER, "crunch!"); + log_error(LOG_LEVEL_HEADER, "crunched From-header!"); return JB_ERR_OK; } @@ -1379,7 +1423,7 @@ else { freez(*header); - log_error(LOG_LEVEL_HEADER, " crunch!"); + log_error(LOG_LEVEL_HEADER, "crunched x-forwarded-for!"); } return JB_ERR_OK;