X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=parsers.c;h=b841ca63f74f02205e68d0103e7550366cb637a8;hb=b7cfc9285d9e3f0e002a1275fdffb0ee67802d14;hp=17e8501929d8033aec0becddb9105c16a5be54dc;hpb=d90684bd0e048383d4b5d4cb5475b69e497b72b7;p=privoxy.git diff --git a/parsers.c b/parsers.c index 17e85019..b841ca63 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.138 2008/08/30 12:03:07 fabiankeil Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.143 2008/09/21 13:36:52 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -44,6 +44,29 @@ const char parsers_rcs[] = "$Id: parsers.c,v 1.138 2008/08/30 12:03:07 fabiankei * * Revisions : * $Log: parsers.c,v $ + * Revision 1.143 2008/09/21 13:36:52 fabiankeil + * If change-x-forwarded-for{add} is used and the client + * sends multiple X-Forwarded-For headers, append the client's + * IP address to each one of them. "Traditionally" we would + * lose all but the last one. + * + * Revision 1.142 2008/09/20 10:04:33 fabiankeil + * Remove hide-forwarded-for-headers action which has + * been obsoleted by change-x-forwarded-for{block}. + * + * Revision 1.141 2008/09/19 15:26:28 fabiankeil + * Add change-x-forwarded-for{} action to block or add + * X-Forwarded-For headers. Mostly based on code removed + * before 3.0.7. + * + * Revision 1.140 2008/09/12 17:51:43 fabiankeil + * - A few style fixes. + * - Remove a pointless cast. + * + * Revision 1.139 2008/09/04 08:13:58 fabiankeil + * Prepare for critical sections on Windows by adding a + * layer of indirection before the pthread mutex functions. + * * Revision 1.138 2008/08/30 12:03:07 fabiankeil * Remove FEATURE_COOKIE_JAR. * @@ -918,6 +941,7 @@ static jb_err server_content_disposition(struct client_state *csp, char **header static jb_err client_host_adder (struct client_state *csp); static jb_err client_xtra_adder (struct client_state *csp); +static jb_err client_x_forwarded_for_adder(struct client_state *csp); static jb_err connection_close_adder (struct client_state *csp); static jb_err create_forged_referrer(char **header, const char *hostport); @@ -979,11 +1003,12 @@ static const struct parsers server_patterns[] = { { "Last-Modified:", 14, server_last_modified }, { "*", 0, crunch_server_header }, { "*", 0, filter_header }, - { NULL, 0, NULL } + { NULL, 0, NULL } }; static const add_header_func_ptr add_client_headers[] = { client_host_adder, + client_x_forwarded_for_adder, client_xtra_adder, /* Temporarily disabled: client_accept_encoding_adder, */ connection_close_adder, @@ -1696,10 +1721,10 @@ static char *get_header_line(struct iob *iob) if (*ret == '\0') { freez(ret); - return(NULL); + return NULL; } - return(ret); + return ret; } @@ -1740,9 +1765,9 @@ char *get_header_value(const struct list *header_list, const char *header_name) /* * Found: return pointer to start of value */ - ret = (char *) (cur_entry->str + length); + ret = cur_entry->str + length; while (*ret && ijb_isspace(*ret)) ret++; - return(ret); + return ret; } } } @@ -1877,7 +1902,7 @@ jb_err update_server_headers(struct client_state *csp) #ifdef FEATURE_ZLIB { "Content-Encoding:", 17, server_content_encoding }, #endif /* def FEATURE_ZLIB */ - { NULL, 0, NULL } + { NULL, 0, NULL } }; if (strncmpic(csp->http->cmd, "HEAD", 4)) @@ -1965,7 +1990,7 @@ static jb_err header_tagger(struct client_state *csp, char *header) { log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: " "tagging enabled, but no taggers available."); - return(JB_ERR_OK); + return JB_ERR_OK; } for (i = 0; i < MAX_AF_FILES; i++) @@ -2183,7 +2208,7 @@ static jb_err filter_header(struct client_state *csp, char **header) { log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: " "header filtering enabled, but no matching filters available."); - return(JB_ERR_OK); + return JB_ERR_OK; } for (i = 0; i < MAX_AF_FILES; i++) @@ -2283,7 +2308,7 @@ static jb_err filter_header(struct client_state *csp, char **header) freez(*header); } - return(JB_ERR_OK); + return JB_ERR_OK; } @@ -3363,10 +3388,33 @@ static jb_err client_send_cookie(struct client_state *csp, char **header) *********************************************************************/ jb_err client_x_forwarded(struct client_state *csp, char **header) { - if ((csp->action->flags & ACTION_HIDE_FORWARDED) != 0) + if (0 != (csp->action->flags & ACTION_CHANGE_X_FORWARDED_FOR)) { - freez(*header); - log_error(LOG_LEVEL_HEADER, "crunched x-forwarded-for!"); + const char *parameter = csp->action->string[ACTION_STRING_CHANGE_X_FORWARDED_FOR]; + + if (0 == strcmpic(parameter, "block")) + { + freez(*header); + log_error(LOG_LEVEL_HEADER, "crunched x-forwarded-for!"); + } + else if (0 == strcmpic(parameter, "add")) + { + string_append(header, ", "); + string_append(header, csp->ip_addr_str); + + if (*header == NULL) + { + return JB_ERR_MEMORY; + } + log_error(LOG_LEVEL_HEADER, + "Appended client IP address to %s", *header); + csp->flags |= CSP_FLAG_X_FORWARDED_FOR_APPENDED; + } + else + { + log_error(LOG_LEVEL_FATAL, + "Invalid change-x-forwarded-for parameter: '%s'", parameter); + } } return JB_ERR_OK; @@ -3850,6 +3898,52 @@ static jb_err client_xtra_adder(struct client_state *csp) } +/********************************************************************* + * + * Function : client_x_forwarded_for_adder + * + * Description : Used in the add_client_headers list. Called from `sed'. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * + * Returns : JB_ERR_OK on success, or + * JB_ERR_MEMORY on out-of-memory error. + * + *********************************************************************/ +static jb_err client_x_forwarded_for_adder(struct client_state *csp) +{ + char *header = NULL; + jb_err err; + + if (!((csp->action->flags & ACTION_CHANGE_X_FORWARDED_FOR) + && (0 == strcmpic(csp->action->string[ACTION_STRING_CHANGE_X_FORWARDED_FOR], "add"))) + || (csp->flags & CSP_FLAG_X_FORWARDED_FOR_APPENDED)) + { + /* + * If we aren't adding X-Forwarded-For headers, + * or we already appended an existing X-Forwarded-For + * header, there's nothing left to do here. + */ + return JB_ERR_OK; + } + + header = strdup("X-Forwarded-For: "); + string_append(&header, csp->ip_addr_str); + + if (header == NULL) + { + return JB_ERR_MEMORY; + } + + log_error(LOG_LEVEL_HEADER, "addh: %s", header); + err = enlist(csp->headers, header); + freez(header); + + return err; +} + + /********************************************************************* * * Function : connection_close_adder