X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=parsers.c;h=9f85bd5ad2de3e44cb033b1e88a357ac54d276db;hp=cd03beba3f86a7f5f639d423c280e2b156da698c;hb=52b6b7992d4e47858963f871667e9842210fbd9e;hpb=ffc1ab733579543abf77003e7d4b1a373d81c7a3 diff --git a/parsers.c b/parsers.c index cd03beba..9f85bd5a 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -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 $ @@ -41,6 +41,24 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.7 2001/05/27 13:19:06 oes Exp $"; * * 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. * @@ -189,6 +207,7 @@ const struct interceptors intercept_patterns[] = { #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 } }; @@ -546,7 +565,9 @@ char *sed(const struct parsers pats[], void (* const more_headers[])(struct clie } /* 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, ""); } @@ -805,7 +826,7 @@ char *content_length(const struct parsers *v, char *s, struct client_state *csp) 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); } @@ -844,54 +865,55 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp strclean(s, FORCE_PREFIX); #endif /* def FORCE_LOAD */ +#ifdef TRUST_FILES csp->referrer = strdup(s); +#endif /* def TRUST_FILES */ + + /* + * 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: " ); @@ -942,7 +964,7 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) if (*csp->config->uagent == '@') { - if (csp->permissions & PERMIT_COOKIE_READ) + if (csp->permissions & PERMIT_USER_AGENT) { return(strdup(s)); } @@ -991,7 +1013,7 @@ char *client_ua(const struct parsers *v, char *s, struct client_state *csp) if (*csp->config->uagent == '@') { - if (csp->permissions & PERMIT_COOKIE_READ) + if (csp->permissions & PERMIT_USER_AGENT) { return(strdup(s)); }