X-Git-Url: http://www.privoxy.org/gitweb/show-status?a=blobdiff_plain;f=cgisimple.c;h=961510f2273ad2620a231d198af81063a0293661;hb=35cea5679be6cc1201bfc79e58a8388259e3c4a2;hp=2a1ab8fb11b6147d595f29494586f8a4245a3c85;hpb=5ca53f92bc634c20fed90f338ac41561f87b834c;p=privoxy.git
diff --git a/cgisimple.c b/cgisimple.c
index 2a1ab8fb..961510f2 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-2022 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
@@ -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.");
@@ -1031,43 +1092,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),
+ "%s | %llu | \n",
+ encoded_block_reason, count);
+ freez(encoded_block_reason);
+
+ if (!err) err = string_append(&statistics, buf);
+ }
+ last_action = b->action;
+ }
}
- return template_fill_for_cgi(csp, "show-version", exports, rsp);
+ return statistics;
+
}
+/*********************************************************************
+ *
+ * Function : get_filter_statistics_table
+ *
+ * Description : Produces the filter statistic table content.
+ *
+ * Parameters :
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns : Pointer to the HTML statistic table content or
+ * NULL on out of memory
+ *
+ *********************************************************************/
+static char *get_filter_statistics_table(const struct client_state *csp)
+{
+ char buf[BUFFER_SIZE];
+ char *statistics;
+ int i;
+ struct file_list *fl;
+ struct re_filterfile_spec *b;
+ jb_err err = JB_ERR_OK;
+
+ statistics = strdup_or_die("");
+
+ for (i = 0; i < MAX_AF_FILES; i++)
+ {
+ fl = csp->rlist[i];
+ if ((NULL == fl) || (NULL == fl->f))
+ {
+ /*
+ * Either there are no filter files left or this
+ * filter file just contains no valid filters.
+ *
+ * Continue to be sure we don't miss valid filter
+ * files that are chained after empty or invalid ones.
+ */
+ continue;
+ }
+
+ for (b = fl->f; b != NULL; b = b->next)
+ {
+ if (b->type == FT_CONTENT_FILTER)
+ {
+ unsigned long long executions;
+ unsigned long long response_bodies_modified;
+ unsigned long long hits;
+
+ get_filter_statistics(b->name, &executions, &response_bodies_modified, &hits);
+ snprintf(buf, sizeof(buf),
+ "
%s | %llu | "
+ "%llu | "
+ "%llu |
\n",
+ b->name, executions, response_bodies_modified, hits);
+
+ if (!err) err = string_append(&statistics, buf);
+ }
+ }
+ }
+
+ return statistics;
+
+}
+#endif /* def FEATURE_EXTENDED_STATISTICS */
+
+
/*********************************************************************
*
* Function : cgi_show_status
@@ -1102,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;
@@ -1142,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.
@@ -1155,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");
}
@@ -1163,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;
@@ -1174,12 +1363,42 @@ 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 */
if (!err) err = map_block_killer(exports, "statistics");
#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)
+ {
+ err = map(exports, "block-reason-statistics", 1, block_reason_statistics, 0);
+ }
+ else
+ {
+ err = map_block_killer(exports, "extended-statistics");
+ }
+ }
+ if (!err)
+ {
+ char *filter_statistics = get_filter_statistics_table(csp);
+ if (filter_statistics != NULL)
+ {
+ err = map(exports, "filter-statistics", 1, filter_statistics, 0);
+ }
+ else
+ {
+ err = map_block_killer(exports, "extended-statistics");
+ }
+ }
+#else /* ndef FEATURE_EXTENDED_STATISTICS */
+ if (!err) err = map_block_killer(exports, "extended-statistics");
+#endif /* def FEATURE_EXTENDED_STATISTICS */
+
/*
* List all action files in use, together with view and edit links,
* except for standard.action, which should only be viewable. (Not
@@ -1220,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);
}
/*
@@ -1246,14 +1466,15 @@ 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
{
if (!err) err = map(exports, "re-filter-filenames", 1, "None specified |
", 1);
if (!err) err = map_block_killer(exports, "have-filterfile");
+ freez(s);
}
#ifdef FEATURE_TRUST
@@ -1402,7 +1623,7 @@ jb_err cgi_show_url_info(struct client_state *csp,
if (url_param[0] == '\0')
{
- /* URL paramater not specified, display query form only. */
+ /* URL parameter not specified, display query form only. */
free(url_param);
if (map_block_killer(exports, "url-given")
|| map(exports, "url", 1, "", 1))
@@ -1475,11 +1696,14 @@ jb_err cgi_show_url_info(struct client_state *csp,
}
/*
- * We have a warning about SSL paths. Hide it for unencrypted sites.
+ * We have a warning about SSL paths. Hide it for unencrypted sites
+ * and unconditionally if https inspection is enabled.
*/
+#ifndef FEATURE_HTTPS_INSPECTION
if (!url_to_query->ssl)
+#endif
{
- if (map_block_killer(exports, "https"))
+ if (map_block_killer(exports, "https-and-no-https-inspection"))
{
free_current_action(action);
free_map(exports);
@@ -1751,7 +1975,7 @@ jb_err cgi_robots_txt(struct client_state *csp,
*
* Function : show_defines
*
- * Description : Add to a map the state od all conditional #defines
+ * Description : Add to a map the state of all conditional #defines
* used when building
*
* Parameters :
@@ -1793,6 +2017,14 @@ static jb_err show_defines(struct map *exports)
1,
#else
0,
+#endif
+ },
+ {
+ "FEATURE_BROTLI",
+#ifdef FEATURE_BROTLI
+ 1,
+#else
+ 0,
#endif
},
{
@@ -1865,6 +2097,14 @@ static jb_err show_defines(struct map *exports)
1,
#else
0,
+#endif
+ },
+ {
+ "FEATURE_HTTPS_INSPECTION",
+#ifdef FEATURE_HTTPS_INSPECTION
+ 1,
+#else
+ 0,
#endif
},
{
@@ -1945,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
}
};