Incorporate modified version of Roland Rosenfeld's patch to
[privoxy.git] / loadcfg.c
index 1d6a10e..04ead0a 100644 (file)
--- a/loadcfg.c
+++ b/loadcfg.c
@@ -1,4 +1,4 @@
-const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.47 2002/05/12 21:36:29 jongfoster Exp $";
+const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.52 2006/09/06 10:43:32 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/loadcfg.c,v $
@@ -35,6 +35,48 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.47 2002/05/12 21:36:29 jongfoster
  *
  * Revisions   :
  *    $Log: loadcfg.c,v $
+ *    Revision 1.52  2006/09/06 10:43:32  fabiankeil
+ *    Added config option enable-remote-http-toggle
+ *    to specify if Privoxy should recognize special
+ *    headers (currently only X-Filter) to change its
+ *    behaviour. Disabled by default.
+ *
+ *    Revision 1.51  2006/09/06 09:23:37  fabiankeil
+ *    Make number of retries in case of forwarded-connect problems
+ *    a config file option (forwarded-connect-retries) and use 0 as
+ *    default.
+ *
+ *    Revision 1.50  2006/07/18 14:48:46  david__schmidt
+ *    Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
+ *    with what was really the latest development (the v_3_0_branch branch)
+ *
+ *    Revision 1.48.2.7  2006/02/02 17:29:16  david__schmidt
+ *    Don't forget to malloc space for the null terminator...
+ *
+ *    Revision 1.48.2.6  2006/01/29 23:10:56  david__schmidt
+ *    Multiple filter file support
+ *
+ *    Revision 1.48.2.5  2003/05/08 15:17:25  oes
+ *    Closed two memory leaks; hopefully the last remaining ones
+ *    (in the main execution paths, anyway).
+ *
+ *    Revision 1.48.2.4  2003/04/11 12:06:14  oes
+ *    Addressed bug #719435
+ *     - Extraneous filterfile directives now logged as errors
+ *     - This and unrecnonised directives now really obvious on status page
+ *
+ *    Revision 1.48.2.3  2003/03/11 11:53:59  oes
+ *    Cosmetic: Renamed cryptic variable
+ *
+ *    Revision 1.48.2.2  2002/11/12 16:28:20  oes
+ *    Move unrelated variable declaration out of #ifdef FEATURE_ACL; fixes bug #636655
+ *
+ *    Revision 1.48.2.1  2002/08/21 17:58:05  oes
+ *    Temp kludge to let user and default action file be edited through win32 GUI (FR 592080)
+ *
+ *    Revision 1.48  2002/05/14 21:30:38  oes
+ *    savearg now uses own linking code instead of (now special-cased) add_help_link
+ *
  *    Revision 1.47  2002/05/12 21:36:29  jongfoster
  *    Correcting function comments
  *
@@ -44,7 +86,7 @@ const char loadcfg_rcs[] = "$Id: loadcfg.c,v 1.47 2002/05/12 21:36:29 jongfoster
  *     - savearg now embeds option names in help links
  *
  *    Revision 1.45  2002/04/24 02:11:54  oes
- *    Jon's multiple AF patch: Allow up to MAX_ACTION_FILES actionsfile options
+ *    Jon's multiple AF patch: Allow up to MAX_AF_FILES actionsfile options
  *
  *    Revision 1.44  2002/04/08 20:37:13  swa
  *    fixed JB spelling
@@ -366,8 +408,8 @@ const char loadcfg_h_rcs[] = LOADCFG_H_VERSION;
 #define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
 
 #ifdef FEATURE_TOGGLE
-/* by haroon - indicates if ijb is enabled */
-int g_bToggleIJB        = 1;   /* Privoxy is enabled by default. */
+/* Privoxy is enabled by default. */
+int global_toggle_state = 1;
 #endif /* def FEATURE_TOGGLE */
 
 /* The filename of the configfile */
@@ -403,10 +445,12 @@ static struct file_list *current_configfile = NULL;
 #define hash_deny_access               1227333715ul /* "deny-access" */
 #define hash_enable_edit_actions       2517097536ul /* "enable-edit-actions" */
 #define hash_enable_remote_toggle      2979744683ul /* "enable-remote-toggle" */
+#define hash_enable_remote_http_toggle 110543988ul  /* "enable-remote-http-toggle" */
 #define hash_filterfile                 250887266ul /* "filterfile" */
 #define hash_forward                      2029845ul /* "forward" */
 #define hash_forward_socks4            3963965521ul /* "forward-socks4" */
 #define hash_forward_socks4a           2639958518ul /* "forward-socks4a" */
+#define hash_forwarded_connect_retries  101465292ul /* "forwarded-connect-retries" */
 #define hash_jarfile                      2046641ul /* "jarfile" */
 #define hash_listen_address            1255650842ul /* "listen-address" */
 #define hash_logdir                        422889ul /* "logdir" */
@@ -449,9 +493,10 @@ void unload_configfile (void * data)
 {
    struct configuration_spec * config = (struct configuration_spec *)data;
    struct forward_spec *cur_fwd = config->forward;
+   int i;
+
 #ifdef FEATURE_ACL
    struct access_control_list *cur_acl = config->acl;
-   int i;
 
    while (cur_acl != NULL)
    {
@@ -488,7 +533,7 @@ void unload_configfile (void * data)
    freez(config->haddr);
    freez(config->logfile);
 
-   for (i = 0; i < MAX_ACTION_FILES; i++)
+   for (i = 0; i < MAX_AF_FILES; i++)
    {
       freez(config->actions_file_short[i]);
       freez(config->actions_file[i]);
@@ -503,8 +548,17 @@ void unload_configfile (void * data)
    freez(config->jarfile);
 #endif /* def FEATURE_COOKIE_JAR */
 
-   freez(config->re_filterfile);
+#ifdef FEATURE_TRUST
+   freez(config->trustfile);
+   list_remove_all(config->trust_info);
+#endif /* def FEATURE_TRUST */
+
+   for (i = 0; i < MAX_AF_FILES; i++)
+   {
+      freez(config->re_filterfile[i]);
+   }
 
+   freez(config);
 }
 
 
@@ -568,7 +622,7 @@ struct configuration_spec * load_config(void)
    log_error(LOG_LEVEL_INFO, "loading configuration file '%s':", configfile);
 
 #ifdef FEATURE_TOGGLE
-   g_bToggleIJB      = 1;
+   global_toggle_state      = 1;
 #endif /* def FEATURE_TOGGLE */
 
    fs->f = config = (struct configuration_spec *)zalloc(sizeof(*config));
@@ -595,11 +649,13 @@ struct configuration_spec * load_config(void)
    /*
     * Set to defaults
     */
-   config->multi_threaded    = 1;
-   config->hport             = HADDR_PORT;
-   config->buffer_limit      = 4096 * 1024;
-   config->usermanual        = strdup(USER_MANUAL_URL);
-   config->proxy_args        = strdup("");
+   config->multi_threaded            = 1;
+   config->hport                     = HADDR_PORT;
+   config->buffer_limit              = 4096 * 1024;
+   config->usermanual                = strdup(USER_MANUAL_URL);
+   config->proxy_args                = strdup("");
+   config->forwarded_connect_retries = 0;
+   config->feature_flags            &= ~RUNTIME_FEATURE_CGI_TOGGLE;
 
    if ((configfp = fopen(configfile, "r")) == NULL)
    {
@@ -667,16 +723,16 @@ struct configuration_spec * load_config(void)
  * *************************************************************************/
          case hash_actions_file :
             i = 0;
-            while ((i < MAX_ACTION_FILES) && (NULL != config->actions_file[i]))
+            while ((i < MAX_AF_FILES) && (NULL != config->actions_file[i]))
             {
                i++;
             }
 
-            if (i >= MAX_ACTION_FILES)
+            if (i >= MAX_AF_FILES)
             {
                log_error(LOG_LEVEL_FATAL, "Too many 'actionsfile' directives in config file - limit is %d.\n"
-                  "(You can increase this limit by changing MAX_ACTION_FILES in project.h and recompiling).",
-                  MAX_ACTION_FILES);
+                  "(You can increase this limit by changing MAX_AF_FILES in project.h and recompiling).",
+                  MAX_AF_FILES);
             }
             config->actions_file_short[i] = strdup(arg);
             p = malloc(strlen(arg) + sizeof(".action"));
@@ -828,6 +884,48 @@ struct configuration_spec * load_config(void)
             continue;
 #endif /* def FEATURE_CGI_EDIT_ACTIONS */
 
+/* *************************************************************************
+ * enable-remote-http-toggle 0|1
+ * *************************************************************************/
+         case hash_enable_remote_http_toggle:
+            if ((*arg != '\0') && (0 != atoi(arg)))
+            {
+               config->feature_flags |= RUNTIME_FEATURE_HTTP_TOGGLE;
+            }
+            else
+            {
+               config->feature_flags &= ~RUNTIME_FEATURE_HTTP_TOGGLE;
+            }
+            continue;
+
+/* *************************************************************************
+ * filterfile file-name
+ * In confdir by default.
+ * *************************************************************************/
+         case hash_filterfile :
+            i = 0;
+            while ((i < MAX_AF_FILES) && (NULL != config->re_filterfile[i]))
+            {
+               i++;
+            }
+
+            if (i >= MAX_AF_FILES)
+            {
+               log_error(LOG_LEVEL_FATAL, "Too many 'filterfile' directives in config file - limit is %d.\n"
+                  "(You can increase this limit by changing MAX_AF_FILES in project.h and recompiling).",
+                  MAX_AF_FILES);
+            }
+            config->re_filterfile_short[i] = strdup(arg);
+            p = malloc(strlen(arg) + 1);
+            if (p == NULL)
+            {
+               log_error(LOG_LEVEL_FATAL, "Out of memory");
+            }
+            strcpy(p, arg);
+            config->re_filterfile[i] = make_path(config->confdir, p);
+            free(p);
+            continue;
+
 /* *************************************************************************
  * forward url-pattern (.|http-proxy-host[:port])
  * *************************************************************************/
@@ -1050,6 +1148,13 @@ struct configuration_spec * load_config(void)
 
             continue;
 
+/* *************************************************************************
+ * forwarded-connect-retries n
+ * *************************************************************************/
+         case hash_forwarded_connect_retries :
+            config->forwarded_connect_retries = atoi(arg);
+            continue;
+
 /* *************************************************************************
  * jarfile jar-file-name
  * In logdir by default
@@ -1171,15 +1276,6 @@ struct configuration_spec * load_config(void)
             config->proxy_info_url = strdup(arg);
             continue;
 
-/* *************************************************************************
- * re_filterfile file-name
- * In confdir by default.
- * *************************************************************************/
-         case hash_filterfile :
-            freez(config->re_filterfile);
-            config->re_filterfile = make_path(config->confdir, arg);
-            continue;
-
 /* *************************************************************************
  * single-threaded
  * *************************************************************************/
@@ -1192,7 +1288,7 @@ struct configuration_spec * load_config(void)
  * *************************************************************************/
 #ifdef FEATURE_TOGGLE
          case hash_toggle :
-            g_bToggleIJB = atoi(arg);
+            global_toggle_state = atoi(arg);
             continue;
 #endif /* def FEATURE_TOGGLE */
 
@@ -1360,11 +1456,10 @@ struct configuration_spec * load_config(void)
              * error.  To change back to an error, just change log level
              * to LOG_LEVEL_FATAL.
              */
-            log_error(LOG_LEVEL_ERROR, "Unrecognized directive '%s' (%luul) in line %lu in "
-                  "configuration file (%s).",  buf, hash_string(cmd), linenum, configfile);
-            string_append(&config->proxy_args, "<br>\nWARNING: unrecognized directive : ");
-            string_append(&config->proxy_args, buf);
-            string_append(&config->proxy_args, "<br><br>\n");
+            log_error(LOG_LEVEL_ERROR, "Ignoring unrecognized directive '%s' (%luul) in line %lu "
+                  "in configuration file (%s).",  buf, hash_string(cmd), linenum, configfile);
+            string_append(&config->proxy_args,
+               " <b><font color=\"red\">WARNING: unrecognized directive, ignored</font></b>");
             continue;
 
 /* *************************************************************************/
@@ -1456,7 +1551,8 @@ struct configuration_spec * load_config(void)
 /* FIXME: this is a kludge for win32 */
 #if defined(_WIN32) && !defined (_WIN_CONSOLE)
 
-   g_actions_file     = config->actions_file[0]; /* FIXME only works for first action file */
+   g_default_actions_file  = config->actions_file[1]; /* FIXME Hope this is default.action */
+   g_user_actions_file = config->actions_file[2]; /* FIXME Hope this is user.action */
    g_re_filterfile    = config->re_filterfile;
 
 #ifdef FEATURE_TRUST
@@ -1544,8 +1640,18 @@ static void savearg(char *command, char *argument, struct configuration_spec * c
     * Add config option name embedded in
     * link to it's section in the user-manual
     */
-   buf = strdup("<a href=\"");
-   string_append(&buf, config->usermanual);
+   buf = strdup("\n<br><a href=\"");
+   if (!strncmpic(config->usermanual, "file://", 7) ||
+       !strncmpic(config->usermanual, "http", 4))
+   {
+      string_append(&buf, config->usermanual);
+   }
+   else
+   {
+      string_append(&buf, "http://");
+      string_append(&buf, CGI_SITE_2_HOST);
+      string_append(&buf, "/user-manual/");
+   }
    string_append(&buf, CONFIG_HELP_PREFIX);
    string_join  (&buf, string_toupper(command));
    string_append(&buf, "\">");
@@ -1582,8 +1688,6 @@ static void savearg(char *command, char *argument, struct configuration_spec * c
       }
    }
 
-   string_append(&buf, "<br>\n");
-
    string_join(&config->proxy_args, buf);
 }