X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=filters.c;h=ed5a3736d2feafca69d9e24e5c2a8584692711e0;hb=77d80282748340e4bc770595244835271cf30144;hp=0aae43f7fe7f818dd9288f6e4ae3f1a4a7b60913;hpb=2eba31cc29bb3c30c58571796a787ddec63c818e;p=privoxy.git diff --git a/filters.c b/filters.c index 0aae43f7..ed5a3736 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.121 2009/05/16 13:27:20 fabiankeil Exp $"; +const char filters_rcs[] = "$Id: filters.c,v 1.129 2010/05/01 18:20:50 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ @@ -13,7 +13,7 @@ const char filters_rcs[] = "$Id: filters.c,v 1.121 2009/05/16 13:27:20 fabiankei * `execute_single_pcrs_command', `rewrite_url', * `get_last_url' * - * Copyright : Written by and Copyright (C) 2001, 2004-2008 the SourceForge + * Copyright : Written by and Copyright (C) 2001-2010 the * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -119,8 +119,9 @@ static jb_err prepare_for_filtering(struct client_state *csp); * Returns : 0 = no errror; -1 otherwise. * *********************************************************************/ -int sockaddr_storage_to_ip(const struct sockaddr_storage *addr, uint8_t **ip, - unsigned int *len, in_port_t **port) +static int sockaddr_storage_to_ip(const struct sockaddr_storage *addr, + uint8_t **ip, unsigned int *len, + in_port_t **port) { if (NULL == addr) { @@ -183,9 +184,9 @@ int sockaddr_storage_to_ip(const struct sockaddr_storage *addr, uint8_t **ip, * Returns : 0 = doesn't match; 1 = does match * *********************************************************************/ -int match_sockaddr(const struct sockaddr_storage *network, - const struct sockaddr_storage *netmask, - const struct sockaddr_storage *address) +static int match_sockaddr(const struct sockaddr_storage *network, + const struct sockaddr_storage *netmask, + const struct sockaddr_storage *address) { uint8_t *network_addr, *netmask_addr, *address_addr; unsigned int addr_len; @@ -418,14 +419,15 @@ int acl_addr(const char *aspec, struct access_control_addr *aca) hints.ai_socktype = SOCK_STREAM; i = getaddrinfo(acl_spec, ((p) ? ++p : NULL), &hints, &result); - freez(acl_spec); if (i != 0) { log_error(LOG_LEVEL_ERROR, "Can not resolve [%s]:%s: %s", acl_spec, p, gai_strerror(i)); + freez(acl_spec); return(-1); } + freez(acl_spec); /* TODO: Allow multihomed hostnames */ memcpy(&(aca->addr), result->ai_addr, result->ai_addrlen); @@ -597,7 +599,6 @@ struct http_response *block_url(struct client_state *csp) { log_error(LOG_LEVEL_ERROR, "handle-as-empty-document overruled by handle-as-image."); } -#if 1 /* Two alternative strategies, use this one for now: */ /* and handle accordingly: */ if ((p == NULL) || (0 == strcmpic(p, "pattern"))) @@ -622,7 +623,6 @@ struct http_response *block_url(struct client_state *csp) return cgi_error_memory(); } } - else if (0 == strcmpic(p, "blank")) { rsp->status = strdup("403 Request blocked by Privoxy"); @@ -645,7 +645,6 @@ struct http_response *block_url(struct client_state *csp) return cgi_error_memory(); } } - else { rsp->status = strdup("302 Local Redirect from Privoxy"); @@ -662,32 +661,10 @@ struct http_response *block_url(struct client_state *csp) } } -#else /* Following code is disabled for now */ - - /* and handle accordingly: */ - if ((p == NULL) || (0 == strcmpic(p, "pattern"))) - { - p = CGI_PREFIX "send-banner?type=pattern"; - } - else if (0 == strcmpic(p, "blank")) - { - p = CGI_PREFIX "send-banner?type=blank"; - } - rsp->status = strdup("302 Local Redirect from Privoxy"); - if (rsp->status == NULL) - { - free_http_response(rsp); - return cgi_error_memory(); - } - - if (enlist_unique_header(rsp->headers, "Location", p)) - { - free_http_response(rsp); - return cgi_error_memory(); - } -#endif /* Preceeding code is disabled for now */ } - else if(csp->action->flags & ACTION_HANDLE_AS_EMPTY_DOCUMENT) + else +#endif /* def FEATURE_IMAGE_BLOCKING */ + if(csp->action->flags & ACTION_HANDLE_AS_EMPTY_DOCUMENT) { /* * Send empty document. @@ -698,7 +675,21 @@ struct http_response *block_url(struct client_state *csp) rsp->body = strdup(" "); rsp->content_length = 1; - rsp->status = strdup("403 Request blocked by Privoxy"); + if (csp->config->feature_flags & RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK) + { + /* + * Workaround for firefox bug 492459 + * https://bugzilla.mozilla.org/show_bug.cgi?id=492459 + * Return a 200 OK status for pages blocked with +handle-as-empty-document + * if the "handle-as-empty-doc-returns-ok" runtime config option is set. + */ + rsp->status = strdup("200 Request blocked by Privoxy"); + } + else + { + rsp->status = strdup("403 Request blocked by Privoxy"); + } + if (rsp->status == NULL) { free_http_response(rsp); @@ -715,7 +706,6 @@ struct http_response *block_url(struct client_state *csp) } } else -#endif /* def FEATURE_IMAGE_BLOCKING */ /* * Else, generate an HTML "blocked" message: @@ -805,7 +795,7 @@ struct http_response *block_url(struct client_state *csp) return cgi_error_memory(); } } - rsp->reason = RSP_REASON_BLOCKED; + rsp->crunch_reason = BLOCKED; return finish_http_response(csp, rsp); @@ -965,7 +955,7 @@ struct http_response *trust_url(struct client_state *csp) free_http_response(rsp); return cgi_error_memory(); } - rsp->reason = RSP_REASON_UNTRUSTED; + rsp->crunch_reason = UNTRUSTED; return finish_http_response(csp, rsp); } @@ -1305,7 +1295,7 @@ struct http_response *redirect_url(struct client_state *csp) free_http_response(rsp); return cgi_error_memory(); } - rsp->reason = RSP_REASON_REDIRECTED; + rsp->crunch_reason = REDIRECTED; freez(new_url); return finish_http_response(csp, rsp); @@ -1520,7 +1510,8 @@ int is_untrusted_url(const struct client_state *csp) *********************************************************************/ static char *pcrs_filter_response(struct client_state *csp) { - int hits=0; + int hits = 0; + int i; size_t size, prev_size; char *old = NULL; @@ -1531,8 +1522,6 @@ static char *pcrs_filter_response(struct client_state *csp) struct re_filterfile_spec *b; struct list_entry *filtername; - int i, found_filters = 0; - /* * Sanity first */ @@ -1541,23 +1530,7 @@ static char *pcrs_filter_response(struct client_state *csp) return(NULL); } - /* - * Need to check the set of re_filterfiles... - */ - for (i = 0; i < MAX_AF_FILES; i++) - { - fl = csp->rlist[i]; - if (NULL != fl) - { - if (NULL != fl->f) - { - found_filters = 1; - break; - } - } - } - - if (0 == found_filters) + if (filters_available(csp) == FALSE) { log_error(LOG_LEVEL_ERROR, "Inconsistent configuration: " "content filtering enabled, but no content filters available."); @@ -2317,7 +2290,7 @@ struct http_response *direct_response(struct client_state *csp) } rsp->is_static = 1; - rsp->reason = RSP_REASON_UNSUPPORTED; + rsp->crunch_reason = UNSUPPORTED; return(finish_http_response(csp, rsp)); } @@ -2347,6 +2320,34 @@ int content_filters_enabled(const struct current_action_spec *action) !list_is_empty(action->multi[ACTION_MULTI_FILTER])); } + +/********************************************************************* + * + * Function : filters_available + * + * Description : Checks whether there are any filters available. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * + * Returns : TRUE for yes, FALSE otherwise. + * + *********************************************************************/ +int filters_available(const struct client_state *csp) +{ + int i; + for (i = 0; i < MAX_AF_FILES; i++) + { + const struct file_list *fl = csp->rlist[i]; + if ((NULL != fl) && (NULL != fl->f)) + { + return TRUE; + } + } + return FALSE; +} + + /* Local Variables: tab-width: 3