X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=parsers.c;h=ca65df34e306d78b5dfc2d5710a8b240c214c16a;hp=3b5d233b20c973b855cb403ae0f9b9a8d9a62740;hb=1a14f999c1e810ffdf5c29fdbacb31161afd1b36;hpb=34d10921b08f7df2539f4fd318a72c7e755ef5f6 diff --git a/parsers.c b/parsers.c index 3b5d233b..ca65df34 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.8 2001/05/27 22:17:04 oes Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.15 2001/06/03 11:03:48 oes Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -41,6 +41,104 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.8 2001/05/27 22:17:04 oes Exp $"; * * Revisions : * $Log: parsers.c,v $ + * Revision 1.15 2001/06/03 11:03:48 oes + * Makefile/in + * + * introduced cgi.c + * + * actions.c: + * + * adapted to new enlist_unique arg format + * + * conf loadcfg.c + * + * introduced confdir option + * + * filters.c filtrers.h + * + * extracted-CGI relevant stuff + * + * jbsockets.c + * + * filled comment + * + * jcc.c + * + * support for new cgi mechansim + * + * list.c list.h + * + * functions for new list type: "map" + * extended enlist_unique + * + * miscutil.c .h + * introduced bindup() + * + * parsers.c parsers.h + * + * deleted const struct interceptors + * + * pcrs.c + * added FIXME + * + * project.h + * + * added struct map + * added struct http_response + * changes struct interceptors to struct cgi_dispatcher + * moved HTML stuff to cgi.h + * + * re_filterfile: + * + * changed + * + * showargs.c + * NO TIME LEFT + * + * Revision 1.14 2001/06/01 18:49:17 jongfoster + * Replaced "list_share" with "list" - the tiny memory gain was not + * worth the extra complexity. + * + * Revision 1.13 2001/05/31 21:30:33 jongfoster + * Removed list code - it's now in list.[ch] + * Renamed "permission" to "action", and changed many features + * to use the actions file rather than the global config. + * + * Revision 1.12 2001/05/31 17:33:13 oes + * + * CRLF -> LF + * + * 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 @@ -148,6 +246,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.8 2001/05/27 22:17:04 oes Exp $"; #endif #include "project.h" +#include "list.h" #include "parsers.h" #include "encode.h" #include "filters.h" @@ -158,6 +257,7 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.8 2001/05/27 22:17:04 oes Exp $"; #include "errlog.h" #include "jbsockets.h" #include "miscutil.h" +#include "cgi.h" const char parsers_h_rcs[] = PARSERS_H_VERSION; @@ -196,14 +296,6 @@ const struct parsers client_patterns[] = { { NULL, 0, NULL } }; -const struct interceptors intercept_patterns[] = { - { "show-proxy-args", 14, show_proxy_args }, - { "ijb-send-banner", 14, ijb_send_banner }, -#ifdef TRUST_FILES - { "ij-untrusted-url", 15, ij_untrusted_url }, -#endif /* def TRUST_FILES */ - { NULL, 0, NULL } -}; const struct parsers server_patterns[] = { { "set-cookie:", 11, server_set_cookie }, @@ -387,125 +479,6 @@ char *get_header(struct client_state *csp) } -/********************************************************************* - * - * Function : enlist - * - * Description : Append a string into a specified string list. - * - * Parameters : - * 1 : h = pointer to list 'dummy' header - * 2 : s = string to add to the list - * - * Returns : N/A - * - *********************************************************************/ -void enlist(struct list *h, const char *s) -{ - struct list *n = (struct list *)malloc(sizeof(*n)); - struct list *l; - - if (n) - { - n->str = strdup(s); - n->next = NULL; - - if ((l = h->last)) - { - l->next = n; - } - else - { - h->next = n; - } - - h->last = n; - } - -} - - -/********************************************************************* - * - * Function : destroy_list - * - * Description : Destroy a string list (opposite of enlist) - * - * Parameters : - * 1 : h = pointer to list 'dummy' header - * - * Returns : N/A - * - *********************************************************************/ -void destroy_list(struct list *h) -{ - struct list *p, *n; - - for (p = h->next; p ; p = n) - { - n = p->next; - freez(p->str); - freez(p); - } - - memset(h, '\0', sizeof(*h)); - -} - - -/********************************************************************* - * - * Function : list_to_text - * - * Description : "Flaten" a string list into 1 long \r\n delimited string. - * - * Parameters : - * 1 : h = pointer to list 'dummy' header - * - * Returns : NULL on malloc error, else new long string. - * - *********************************************************************/ -static char *list_to_text(struct list *h) -{ - struct list *p; - char *ret = NULL; - char *s; - int size; - - size = 0; - - for (p = h->next; p ; p = p->next) - { - if (p->str) - { - size += strlen(p->str) + 2; - } - } - - if ((ret = (char *)malloc(size + 1)) == NULL) - { - return(NULL); - } - - ret[size] = '\0'; - - s = ret; - - for (p = h->next; p ; p = p->next) - { - if (p->str) - { - strcpy(s, p->str); - s += strlen(s); - *s++ = '\r'; *s++ = '\n'; - } - } - - return(ret); - -} - - /********************************************************************* * * Function : sed @@ -776,7 +749,7 @@ char *crumble(const struct parsers *v, char *s, struct client_state *csp) * * 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 @@ -851,6 +824,7 @@ char *content_length(const struct parsers *v, char *s, struct client_state *csp) *********************************************************************/ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp) { + const char * newval; #ifdef FORCE_LOAD /* Since the referrer can include the prefix even * even if the request itself is non-forced, we must @@ -859,60 +833,77 @@ 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 */ - if (csp->config->referrer == NULL) + /* + * Are we sending referer? + */ + if ((csp->action->flags & ACTION_HIDE_REFERER) == 0) { - log_error(LOG_LEVEL_HEADER, "crunch!"); - return(NULL); + return(strdup(s)); } - if (*csp->config->referrer == '.') + newval = csp->action->string[ACTION_STRING_REFERER]; + + /* + * Are we blocking referer? + */ + if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { - return(strdup(s)); + log_error(LOG_LEVEL_HEADER, "crunch!"); + return(NULL); } - if (*csp->config->referrer == '@') + /* + * Are we forging referer? + */ + if (0 == strcmpic(newval, "forge")) { - if (csp->permissions & PERMIT_COOKIE_READ) - { - return(strdup(s)); - } - else - { - log_error(LOG_LEVEL_HEADER, "crunch!"); - return(NULL); - } + /* + * Forge a referer as http://[hostname:port of REQUEST]/ + * to fool stupid checks for in-site links + */ + 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); } /* - * New option § or L: Forge a referer as http://[hostname:port of REQUEST]/ - * to fool stupid checks for in-site links + * Have we got a fixed referer? */ - - if (*csp->config->referrer == '§' || *csp->config->referrer == 'L') + if (0 == strncmpic(newval, "http://", 7)) { - 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); - } + /* + * We have a specific (fixed) referer we want to send. + */ + + log_error(LOG_LEVEL_HEADER, "modified"); + + s = strsav( NULL, "Referer: " ); + s = strsav( s, newval ); + return(s); } - log_error(LOG_LEVEL_HEADER, "modified"); + /* Should never get here! */ + log_error(LOG_LEVEL_ERROR, "Bad parameter: +referer{%s}", newval); - s = strsav( NULL, "Referer: " ); - s = strsav( s, csp->config->referrer ); + /* + * Forge is probably the best default. + * + * Forge a referer as http://[hostname:port of REQUEST]/ + * to fool stupid checks for in-site links + */ + 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); - } @@ -934,6 +925,8 @@ char *client_referrer(const struct parsers *v, char *s, struct client_state *csp *********************************************************************/ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) { + const char * newval; + #ifdef DETECT_MSIE_IMAGES if (strstr (s, "MSIE ")) { @@ -944,34 +937,21 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) } #endif /* def DETECT_MSIE_IMAGES */ - if (csp->config->uagent == NULL) - { - log_error(LOG_LEVEL_HEADER, "default"); - return(strdup(DEFAULT_USER_AGENT)); - } - - if (*csp->config->uagent == '.') + if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) { return(strdup(s)); } - if (*csp->config->uagent == '@') + newval = csp->action->string[ACTION_STRING_USER_AGENT]; + if (newval == NULL) { - if (csp->permissions & PERMIT_COOKIE_READ) - { - return(strdup(s)); - } - else - { - log_error(LOG_LEVEL_HEADER, "default"); - return(strdup(DEFAULT_USER_AGENT)); - } + return(strdup(s)); } log_error(LOG_LEVEL_HEADER, "modified"); s = strsav( NULL, "User-Agent: " ); - s = strsav( s, csp->config->uagent ); + s = strsav( s, newval ); return(s); } @@ -993,33 +973,15 @@ char *client_uagent(const struct parsers *v, char *s, struct client_state *csp) *********************************************************************/ char *client_ua(const struct parsers *v, char *s, struct client_state *csp) { - if (csp->config->uagent == NULL) - { - log_error(LOG_LEVEL_HEADER, "crunch!"); - return(NULL); - } - - if (*csp->config->uagent == '.') + if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0) { return(strdup(s)); } - - if (*csp->config->uagent == '@') + else { - if (csp->permissions & PERMIT_COOKIE_READ) - { - return(strdup(s)); - } - else - { - log_error(LOG_LEVEL_HEADER, "crunch!"); - return(NULL); - } + log_error(LOG_LEVEL_HEADER, "crunch!"); + return(NULL); } - - log_error(LOG_LEVEL_HEADER, "crunch!"); - return(NULL); - } @@ -1041,22 +1003,28 @@ char *client_ua(const struct parsers *v, char *s, struct client_state *csp) *********************************************************************/ char *client_from(const struct parsers *v, char *s, struct client_state *csp) { - /* if not set, zap it */ - if (csp->config->from == NULL) + const char * newval; + + if ((csp->action->flags & ACTION_HIDE_FROM) == 0) { - log_error(LOG_LEVEL_HEADER, "crunch!"); - return(NULL); + return(strdup(s)); } - if (*csp->config->from == '.') + newval = csp->action->string[ACTION_STRING_FROM]; + + /* + * Are we blocking referer? + */ + if ((newval == NULL) || (0 == strcmpic(newval, "block")) ) { - return(strdup(s)); + log_error(LOG_LEVEL_HEADER, "crunch!"); + return(NULL); } log_error(LOG_LEVEL_HEADER, " modified"); s = strsav( NULL, "From: " ); - s = strsav( s, csp->config->from ); + s = strsav( s, newval ); return(s); } @@ -1080,7 +1048,7 @@ char *client_from(const struct parsers *v, char *s, struct client_state *csp) *********************************************************************/ char *client_send_cookie(const struct parsers *v, char *s, struct client_state *csp) { - if (csp->permissions & PERMIT_COOKIE_READ) + if ((csp->action->flags & ACTION_NO_COOKIE_READ) == 0) { enlist(csp->cookie_list, s + v->len + 1); } @@ -1115,8 +1083,9 @@ char *client_send_cookie(const struct parsers *v, char *s, struct client_state * *********************************************************************/ char *client_x_forwarded(const struct parsers *v, char *s, struct client_state *csp) { - if (csp->config->add_forwarded) + if ((csp->action->flags & ACTION_HIDE_FORWARDED) == 0) { + /* Save it so we can re-add it later */ csp->x_forwarded = strdup(s); } @@ -1187,27 +1156,27 @@ char *client_accept(const struct parsers *v, char *s, struct client_state *csp) *********************************************************************/ void client_cookie_adder(struct client_state *csp) { - struct list *l; + struct list *lst; char *tmp = NULL; char *e; - for (l = csp->cookie_list->next; l ; l = l->next) + for (lst = csp->cookie_list->next; lst ; lst = lst->next) { if (tmp) { tmp = strsav(tmp, "; "); } - tmp = strsav(tmp, l->str); + tmp = strsav(tmp, lst->str); } - for (l = csp->config->wafer_list->next; l ; l = l->next) + for (lst = csp->action->multi[ACTION_MULTI_WAFER]->next; lst ; lst = lst->next) { if (tmp) { tmp = strsav(tmp, "; "); } - if ((e = cookie_encode(l->str))) + if ((e = cookie_encode(lst->str))) { tmp = strsav(tmp, e); freez(e); @@ -1243,12 +1212,12 @@ void client_cookie_adder(struct client_state *csp) *********************************************************************/ void client_xtra_adder(struct client_state *csp) { - struct list *l; + struct list *lst = csp->action->multi[ACTION_MULTI_ADD_HEADER]; - for (l = csp->config->xtra_list->next; l ; l = l->next) + for (lst = lst->next; lst ; lst = lst->next) { - log_error(LOG_LEVEL_HEADER, "addh: %s", l->str); - enlist(csp->headers, l->str); + log_error(LOG_LEVEL_HEADER, "addh: %s", lst->str); + enlist(csp->headers, lst->str); } } @@ -1270,7 +1239,7 @@ void client_x_forwarded_adder(struct client_state *csp) { char *p = NULL; - if (csp->config->add_forwarded == 0) + if ((csp->action->flags & ACTION_HIDE_FORWARDED) != 0) { return; } @@ -1318,7 +1287,7 @@ char *server_set_cookie(const struct parsers *v, char *s, struct client_state *c } #endif /* def JAR_FILES */ - if (!(csp->permissions & PERMIT_COOKIE_SET)) + if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0) { return(crumble(v, s, csp)); }