X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=cgisimple.c;h=866ac263be91258582eb9737c6e751c91fb0c895;hb=97ece6ccd519d55dd9e480c7d23c5befe975c450;hp=2a1ab8fb11b6147d595f29494586f8a4245a3c85;hpb=5ca53f92bc634c20fed90f338ac41561f87b834c;p=privoxy.git diff --git a/cgisimple.c b/cgisimple.c index 2a1ab8fb..866ac263 100644 --- a/cgisimple.c +++ b/cgisimple.c @@ -5,8 +5,8 @@ * Purpose : Simple CGIs to get information about Privoxy's * status. * - * Copyright : Written by and Copyright (C) 2001-2017 the - * Privoxy team. http://www.privoxy.org/ + * Copyright : Written by and Copyright (C) 2001-2020 the + * Privoxy team. https://www.privoxy.org/ * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -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; @@ -308,7 +314,7 @@ static void cgi_create_client_tag_form(char *form, size_t size, snprintf(form, size, "
", tag, toggle_state, !expires, button_name); @@ -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 { @@ -401,9 +407,10 @@ jb_err cgi_show_client_tags(struct client_state *csp, refresh_delay = get_next_tag_timeout_for_client(csp->client_address); if (refresh_delay != 0) { - snprintf(buf, sizeof(buf), "%d", csp->config->client_tag_lifetime); + 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 @@ -972,7 +988,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."); @@ -1031,43 +1048,142 @@ jb_err cgi_send_user_manual(struct client_state *csp, } +#ifdef FEATURE_EXTENDED_STATISTICS /********************************************************************* * - * Function : cgi_show_version + * Function : get_block_reason_statistics_table * - * Description : CGI function that returns a a web page describing the - * file versions of Privoxy. + * Description : Produces the block reason statistic table content. * * 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. + * Returns : Pointer to the HTML statistic table content or + * NULL on out of memory * *********************************************************************/ -jb_err cgi_show_version(struct client_state *csp, - struct http_response *rsp, - const struct map *parameters) +static char *get_block_reason_statistics_table(const struct client_state *csp) { - struct map *exports; + char buf[BUFFER_SIZE]; + char *statistics; + int i; + struct file_list *fl; + jb_err err = JB_ERR_OK; - assert(csp); - assert(rsp); - assert(parameters); + statistics = strdup_or_die(""); - if (NULL == (exports = default_exports(csp, "show-version"))) + /* Run through all action files. */ + for (i = 0; i < MAX_AF_FILES; i++) { - return JB_ERR_MEMORY; + struct url_actions *b; + struct action_spec *last_action = NULL; + + if (((fl = csp->actions_list[i]) == NULL) || ((b = fl->f) == NULL)) + { + /* Skip empty files */ + continue; + } + + /* Go through all the actions. */ + for (b = b->next; NULL != b; b = b->next) + { + if (last_action == b->action) + { + continue; + } + if ((b->action->add & ACTION_BLOCK)) + { + unsigned long long count; + const char *block_reason = b->action->string[ACTION_STRING_BLOCK]; + const char *encoded_block_reason = html_encode(block_reason); + + if (encoded_block_reason == NULL) + { + freez(statistics); + return NULL; + } + get_block_reason_count(block_reason, &count); + snprintf(buf, sizeof(buf), + "