X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=actions.c;h=775350af91275171fcc444fe012f9442ff829060;hb=14b9c9c8d4cb6f06d38b54655ffc96ab778fdba7;hp=81a2f7a878e66b2ba5b60ac4d609b4408cde61af;hpb=9e48812c17c8eed95b5dc4ea56ab0ff201edf790;p=privoxy.git
diff --git a/actions.c b/actions.c
index 81a2f7a8..775350af 100644
--- a/actions.c
+++ b/actions.c
@@ -1,12 +1,11 @@
-const char actions_rcs[] = "$Id: actions.c,v 1.89 2013/11/24 14:24:17 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/actions.c,v $
*
* Purpose : Declares functions to work with actions files
*
- * Copyright : Written by and Copyright (C) 2001-2011 the
- * Privoxy team. http://www.privoxy.org/
+ * Copyright : Written by and Copyright (C) 2001-2016 the
+ * Privoxy team. https://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
* by and Copyright (C) 1997 Anonymous Coders and
@@ -55,9 +54,7 @@ const char actions_rcs[] = "$Id: actions.c,v 1.89 2013/11/24 14:24:17 fabiankeil
#include "urlmatch.h"
#include "cgi.h"
#include "ssplit.h"
-
-const char actions_h_rcs[] = ACTIONS_H_VERSION;
-
+#include "filters.h"
/*
* We need the main list of options.
@@ -123,7 +120,10 @@ static const struct action_name action_names[] =
};
-static int load_one_actions_file(struct client_state *csp, int fileid);
+#ifndef FUZZ
+static
+#endif
+int load_one_actions_file(struct client_state *csp, int fileid);
/*********************************************************************
@@ -517,7 +517,13 @@ jb_err get_actions(char *line,
switch (action->value_type)
{
case AV_NONE:
- /* ignore any option. */
+ if (value != NULL)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "Action %s does not take parameters but %s was given.",
+ action->name, value);
+ return JB_ERR_PARSE;
+ }
break;
case AV_ADD_STRING:
{
@@ -541,6 +547,12 @@ jb_err get_actions(char *line,
return JB_ERR_PARSE;
}
}
+#ifdef FEATURE_EXTENDED_STATISTICS
+ if (0 == strcmpic(action->name, "+block"))
+ {
+ register_block_reason_for_statistics(value);
+ }
+#endif
/* FIXME: should validate option string here */
freez (cur_action->string[action->index]);
cur_action->string[action->index] = strdup(value);
@@ -1073,6 +1085,44 @@ int load_action_files(struct client_state *csp)
}
+/*********************************************************************
+ *
+ * Function : filter_type_to_string
+ *
+ * Description : Converts a filter type enum into a string.
+ *
+ * Parameters :
+ * 1 : filter_type = filter_type as enum
+ *
+ * Returns : Pointer to static string.
+ *
+ *********************************************************************/
+static const char *filter_type_to_string(enum filter_type filter_type)
+{
+ switch (filter_type)
+ {
+ case FT_CONTENT_FILTER:
+ return "content filter";
+ case FT_CLIENT_HEADER_FILTER:
+ return "client-header filter";
+ case FT_SERVER_HEADER_FILTER:
+ return "server-header filter";
+ case FT_CLIENT_HEADER_TAGGER:
+ return "client-header tagger";
+ case FT_SERVER_HEADER_TAGGER:
+ return "server-header tagger";
+#ifdef FEATURE_EXTERNAL_FILTERS
+ case FT_EXTERNAL_CONTENT_FILTER:
+ return "external content filter";
+#endif
+ case FT_INVALID_FILTER:
+ return "invalid filter type";
+ }
+
+ return "unknown filter type";
+
+}
+
/*********************************************************************
*
* Function : referenced_filters_are_missing
@@ -1086,44 +1136,21 @@ int load_action_files(struct client_state *csp)
* 3 : multi_index = The index where to look for the filter.
* 4 : filter_type = The filter type the caller is interested in.
*
- * Returns : 0 => All referenced filters exists, everything else is an error.
+ * Returns : 0 => All referenced filters exist, everything else is an error.
*
*********************************************************************/
static int referenced_filters_are_missing(const struct client_state *csp,
const struct action_spec *cur_action, int multi_index, enum filter_type filter_type)
{
- int i;
- struct file_list *fl;
- struct re_filterfile_spec *b;
struct list_entry *filtername;
for (filtername = cur_action->multi_add[multi_index]->first;
filtername; filtername = filtername->next)
{
- int filter_found = 0;
- for (i = 0; i < MAX_AF_FILES; i++)
- {
- fl = csp->rlist[i];
- if ((NULL == fl) || (NULL == fl->f))
- {
- continue;
- }
-
- for (b = fl->f; b; b = b->next)
- {
- if (b->type != filter_type)
- {
- continue;
- }
- if (strcmp(b->name, filtername->str) == 0)
- {
- filter_found = 1;
- }
- }
- }
- if (!filter_found)
+ if (NULL == get_filter(csp, filtername->str, filter_type))
{
- log_error(LOG_LEVEL_ERROR, "Missing filter '%s'", filtername->str);
+ log_error(LOG_LEVEL_ERROR, "Missing %s '%s'",
+ filter_type_to_string(filter_type), filtername->str);
return 1;
}
}
@@ -1188,7 +1215,10 @@ static int action_spec_is_valid(struct client_state *csp, const struct action_sp
* Returns : 0 => Ok, everything else is an error.
*
*********************************************************************/
-static int load_one_actions_file(struct client_state *csp, int fileid)
+#ifndef FUZZ
+static
+#endif
+int load_one_actions_file(struct client_state *csp, int fileid)
{
/*
@@ -1229,13 +1259,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
return 1; /* never get here */
}
- fs->f = last_perm = (struct url_actions *)zalloc(sizeof(*last_perm));
- if (last_perm == NULL)
- {
- log_error(LOG_LEVEL_FATAL, "can't load actions file '%s': out of memory!",
- csp->config->actions_file[fileid]);
- return 1; /* never get here */
- }
+ fs->f = last_perm = zalloc_or_die(sizeof(*last_perm));
if ((fp = fopen(csp->config->actions_file[fileid], "r")) == NULL)
{
@@ -1379,15 +1403,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
cur_action = NULL;
}
cur_action_used = 0;
- cur_action = (struct action_spec *)zalloc(sizeof(*cur_action));
- if (cur_action == NULL)
- {
- fclose(fp);
- log_error(LOG_LEVEL_FATAL,
- "can't load actions file '%s': out of memory",
- csp->config->actions_file[fileid]);
- return 1; /* never get here */
- }
+ cur_action = zalloc_or_die(sizeof(*cur_action));
init_action(cur_action);
/*
@@ -1398,10 +1414,13 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
*
* buf + 1 to skip the leading '{'
*/
- actions_buf = strdup_or_die(buf + 1);
+ actions_buf = end = strdup_or_die(buf + 1);
/* check we have a trailing } and then trim it */
- end = actions_buf + strlen(actions_buf) - 1;
+ if (strlen(actions_buf))
+ {
+ end += strlen(actions_buf) - 1;
+ }
if (*end != '}')
{
/* No closing } */
@@ -1500,14 +1519,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
return 1; /* never get here */
}
- if ((new_alias = zalloc(sizeof(*new_alias))) == NULL)
- {
- fclose(fp);
- log_error(LOG_LEVEL_FATAL,
- "can't load actions file '%s': out of memory!",
- csp->config->actions_file[fileid]);
- return 1; /* never get here */
- }
+ new_alias = zalloc_or_die(sizeof(*new_alias));
/* Eat any the whitespace before the '=' */
end--;
@@ -1558,14 +1570,7 @@ static int load_one_actions_file(struct client_state *csp, int fileid)
/* it's an URL pattern */
/* allocate a new node */
- if ((perm = zalloc(sizeof(*perm))) == NULL)
- {
- fclose(fp);
- log_error(LOG_LEVEL_FATAL,
- "can't load actions file '%s': out of memory!",
- csp->config->actions_file[fileid]);
- return 1; /* never get here */
- }
+ perm = zalloc_or_die(sizeof(*perm));
perm->action = cur_action;
cur_action_used = 1;
@@ -1827,7 +1832,7 @@ char * actions_to_html(const struct client_state *csp,
*
* Function : current_actions_to_html
*
- * Description : Converts a curren action spec to a
separated HTML
+ * Description : Converts a current action spec to a
separated HTML
* text in which each action is linked to its chapter in
* the user manual.
*