X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgisimple.c;h=961510f2273ad2620a231d198af81063a0293661;hp=a8fd82681822f01827662c771a04234ddc453616;hb=4cedd5b95a23a92715dcc666bc46f84981f8788f;hpb=1b1370f7a8a9cc5434d3e0e54dd620df1e70c873 diff --git a/cgisimple.c b/cgisimple.c index a8fd8268..961510f2 100644 --- a/cgisimple.c +++ b/cgisimple.c @@ -5,7 +5,7 @@ * Purpose : Simple CGIs to get information about Privoxy's * status. * - * Copyright : Written by and Copyright (C) 2001-2020 the + * Copyright : Written by and Copyright (C) 2001-2022 the * Privoxy team. https://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -260,7 +260,13 @@ jb_err cgi_show_request(struct client_state *csp, } if (map(exports, "processed-request", 1, - html_encode_and_free_original(list_to_text(csp->headers)), 0)) + html_encode_and_free_original( +#ifdef FEATURE_HTTPS_INSPECTION + csp->http->ssl ? + list_to_text(csp->https_headers) : +#endif + list_to_text(csp->headers) + ), 0)) { free_map(exports); return JB_ERR_MEMORY; @@ -356,7 +362,7 @@ jb_err cgi_show_client_tags(struct client_state *csp, this_tag = csp->config->client_tags; if (this_tag->name == NULL) { - client_tag_status = strdup_or_die("

No tags available.

\n"); + client_tag_status = strdup_or_die("

No tags have been configured.

\n"); } else { @@ -404,6 +410,7 @@ jb_err cgi_show_client_tags(struct client_state *csp, snprintf(buf, sizeof(buf), "%u", csp->config->client_tag_lifetime); if (map(exports, "refresh-delay", 1, buf, 1)) { + freez(client_tag_status); free_map(exports); return JB_ERR_MEMORY; } @@ -413,6 +420,7 @@ jb_err cgi_show_client_tags(struct client_state *csp, err = map_block_killer(exports, "tags-expire"); if (err != JB_ERR_OK) { + freez(client_tag_status); return err; } } @@ -518,8 +526,8 @@ jb_err cgi_toggle_client_tag(struct client_state *csp, * 3 : parameters = map of cgi parameters * * CGI Parameters : - * type : Selects the type of banner between "trans", "logo", - * and "auto". Defaults to "logo" if absent or invalid. + * type : Selects the type of banner between "trans", "pattern", + * and "auto". Defaults to "pattern" if absent or invalid. * "auto" means to select as if we were image-blocking. * (Only the first character really counts; b and t are * equivalent). @@ -534,6 +542,14 @@ jb_err cgi_send_banner(struct client_state *csp, { char imagetype = lookup(parameters, "type")[0]; + if (imagetype != 'a' && imagetype != 'b' && + imagetype != 'p' && imagetype != 't') + { + log_error(LOG_LEVEL_ERROR, "Overruling invalid image type '%c'.", + imagetype); + imagetype = 'p'; + } + /* * If type is auto, then determine the right thing * to do from the set-image-blocker action @@ -854,6 +870,50 @@ jb_err cgi_send_stylesheet(struct client_state *csp, } +/********************************************************************* + * + * Function : cgi_send_wpad + * + * Description : CGI function that sends a Proxy Auto-Configuration + * (PAC) file. + * + * Parameters : + * 1 : csp = Current client state (buffers, headers, etc...) + * 2 : rsp = http_response data structure for output + * 3 : parameters = map of cgi parameters + * + * CGI Parameters : None + * + * Returns : JB_ERR_OK on success + * JB_ERR_MEMORY on out-of-memory error. + * + *********************************************************************/ +jb_err cgi_send_wpad(struct client_state *csp, + struct http_response *rsp, + const struct map *parameters) +{ + struct map *exports; + + assert(csp); + assert(rsp); + assert(parameters); + + if (NULL == (exports = default_exports(csp, NULL))) + { + return JB_ERR_MEMORY; + } + + if (enlist(rsp->headers, "Content-Type: application/x-ns-proxy-autoconfig")) + { + free_map(exports); + return JB_ERR_MEMORY; + } + + return template_fill_for_cgi(csp, "wpad.dat", exports, rsp); + +} + + /********************************************************************* * * Function : cgi_send_url_info_osd @@ -972,7 +1032,8 @@ jb_err cgi_send_user_manual(struct client_state *csp, assert(rsp); assert(parameters); - if (0 == strncmpic(csp->config->usermanual, "http://", 7)) + if (0 == strncmpic(csp->config->usermanual, "http://", 7) || + 0 == strncmpic(csp->config->usermanual, "https://", 8)) { log_error(LOG_LEVEL_CGI, "Request for local user-manual " "received while user-manual delivery is disabled."); @@ -1146,15 +1207,15 @@ static char *get_filter_statistics_table(const struct client_state *csp) if (b->type == FT_CONTENT_FILTER) { unsigned long long executions; - unsigned long long pages_modified; + unsigned long long response_bodies_modified; unsigned long long hits; - get_filter_statistics(b->name, &executions, &pages_modified, &hits); + get_filter_statistics(b->name, &executions, &response_bodies_modified, &hits); snprintf(buf, sizeof(buf), "%s%llu" "%llu" "%llu\n", - b->name, executions, pages_modified, hits); + b->name, executions, response_bodies_modified, hits); if (!err) err = string_append(&statistics, buf); } @@ -1201,9 +1262,15 @@ jb_err cgi_show_status(struct client_state *csp, char buf[BUFFER_SIZE]; #ifdef FEATURE_STATISTICS +#ifdef MUTEX_LOCKS_AVAILABLE + float percentage_blocked; + unsigned long long local_number_of_requests_received; + unsigned long long local_number_of_requests_blocked; +#else float perc_rej; /* Percentage of http requests rejected */ int local_urls_read; int local_urls_rejected; +#endif #endif /* ndef FEATURE_STATISTICS */ jb_err err = JB_ERR_OK; @@ -1241,9 +1308,15 @@ jb_err cgi_show_status(struct client_state *csp, } #ifdef FEATURE_STATISTICS +#ifdef MUTEX_LOCKS_AVAILABLE + privoxy_mutex_lock(&block_statistics_mutex); + local_number_of_requests_received = number_of_requests_received; + local_number_of_requests_blocked = number_of_requests_blocked; + privoxy_mutex_unlock(&block_statistics_mutex); +#else local_urls_read = urls_read; local_urls_rejected = urls_rejected; - +#endif /* * Need to alter the stats not to include the fetch of this * page. @@ -1254,7 +1327,11 @@ jb_err cgi_show_status(struct client_state *csp, * urls_rejected--; * This will be incremented subsequently * */ +#ifdef MUTEX_LOCKS_AVAILABLE + if (local_number_of_requests_received == 0) +#else if (local_urls_read == 0) +#endif { if (!err) err = map_block_killer(exports, "have-stats"); } @@ -1262,6 +1339,19 @@ jb_err cgi_show_status(struct client_state *csp, { if (!err) err = map_block_killer(exports, "have-no-stats"); +#ifdef MUTEX_LOCKS_AVAILABLE + percentage_blocked = (float)local_number_of_requests_blocked * 100.0F / + (float)local_number_of_requests_received; + + snprintf(buf, sizeof(buf), "%llu", local_number_of_requests_received); + if (!err) err = map(exports, "requests-received", 1, buf, 1); + + snprintf(buf, sizeof(buf), "%llu", local_number_of_requests_blocked); + if (!err) err = map(exports, "requests-blocked", 1, buf, 1); + + snprintf(buf, sizeof(buf), "%6.2f", percentage_blocked); + if (!err) err = map(exports, "percent-blocked", 1, buf, 1); +#else perc_rej = (float)local_urls_rejected * 100.0F / (float)local_urls_read; @@ -1273,6 +1363,7 @@ jb_err cgi_show_status(struct client_state *csp, snprintf(buf, sizeof(buf), "%6.2f", perc_rej); if (!err) err = map(exports, "percent-blocked", 1, buf, 1); +#endif } #else /* ndef FEATURE_STATISTICS */ @@ -1280,26 +1371,28 @@ jb_err cgi_show_status(struct client_state *csp, #endif /* ndef FEATURE_STATISTICS */ #ifdef FEATURE_EXTENDED_STATISTICS + if (!err) { char *block_reason_statistics = get_block_reason_statistics_table(csp); if (block_reason_statistics != NULL) { - if (!err) err = map(exports, "block-reason-statistics", 1, block_reason_statistics, 0); + err = map(exports, "block-reason-statistics", 1, block_reason_statistics, 0); } else { - if (!err) err = map_block_killer(exports, "extended-statistics"); + err = map_block_killer(exports, "extended-statistics"); } } + if (!err) { char *filter_statistics = get_filter_statistics_table(csp); if (filter_statistics != NULL) { - if (!err) err = map(exports, "filter-statistics", 1, filter_statistics, 0); + err = map(exports, "filter-statistics", 1, filter_statistics, 0); } else { - if (!err) err = map_block_killer(exports, "extended-statistics"); + err = map_block_killer(exports, "extended-statistics"); } } #else /* ndef FEATURE_EXTENDED_STATISTICS */ @@ -1346,13 +1439,14 @@ jb_err cgi_show_status(struct client_state *csp, if (!err) err = string_append(&s, "\n"); } } - if (*s != '\0') + if (!err && *s != '\0') { - if (!err) err = map(exports, "actions-filenames", 1, s, 0); + err = map(exports, "actions-filenames", 1, s, 0); } else { if (!err) err = map(exports, "actions-filenames", 1, "None specified", 1); + freez(s); } /* @@ -1372,9 +1466,9 @@ jb_err cgi_show_status(struct client_state *csp, if (!err) err = string_append(&s, "\n"); } } - if (*s != '\0') + if (!err && *s != '\0') { - if (!err) err = map(exports, "re-filter-filenames", 1, s, 0); + err = map(exports, "re-filter-filenames", 1, s, 0); } else { @@ -2091,6 +2185,22 @@ static jb_err show_defines(struct map *exports) 1, #else 0, +#endif + }, + { + "FEATURE_EXTENDED_STATISTICS", +#ifdef FEATURE_EXTENDED_STATISTICS + 1, +#else + 0, +#endif + }, + { + "FEATURE_PCRE_HOST_PATTERNS", +#ifdef FEATURE_PCRE_HOST_PATTERNS + 1, +#else + 0, #endif } };