Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch)
[privoxy.git] / cgiedit.c
similarity index 94%
rename from src/cgiedit.c
rename to cgiedit.c
index 3f22c23..49e6cf9 100644 (file)
+++ b/cgiedit.c
@@ -1,7 +1,7 @@
-const char cgiedit_rcs[] = "$Id: cgiedit.c,v 2.1 2002/09/04 15:21:18 oes Exp $";
+const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.41.2.12 2006/01/30 15:16:25 david__schmidt Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa//current/src/cgiedit.c,v $
+ * File        :  $Source: /cvsroot/ijbswa/current/Attic/cgiedit.c,v $
  *
  * Purpose     :  CGI-based actionsfile editor.
  *
@@ -42,16 +42,49 @@ const char cgiedit_rcs[] = "$Id: cgiedit.c,v 2.1 2002/09/04 15:21:18 oes Exp $";
  *
  * Revisions   :
  *    $Log: cgiedit.c,v $
- *    Revision 2.1  2002/09/04 15:21:18  oes
- *    Synced with the stable branch:
- *        Revision 1.41.2.2  2002/08/05 20:02:59  oes
- *        Bugfix: "Insert new section at top" did not work properly if first non-comment line in file was of type FILE_LINE_ACTION
+ *    Revision 1.41.2.12  2006/01/30 15:16:25  david__schmidt
+ *    Remove a little residual debugging info
  *
- *        Revision 1.41.2.1  2002/08/02 12:43:14  oes
- *        Fixed bug #588514: first_time now set on a per-string basis in actions_from_radio; javascriptify now called on copies
+ *    Revision 1.41.2.11  2006/01/29 23:10:56  david__schmidt
+ *    Multiple filter file support
  *
- *    Revision 2.0  2002/06/04 14:34:21  jongfoster
- *    Moving source files to src/
+ *    Revision 1.41.2.10  2005/07/04 03:13:43  david__schmidt
+ *    Undo some damaging memory leak patches
+ *
+ *    Revision 1.41.2.9  2005/07/04 00:31:04  david__schmidt
+ *    Removing a double free
+ *
+ *    Revision 1.41.2.8  2005/05/07 21:50:54  david__schmidt
+ *    A few memory leaks plugged (mostly on error paths)
+ *
+ *    Revision 1.41.2.7  2004/02/17 13:30:23  oes
+ *    Moved cgi_error_disabled() from cgiedit.c to
+ *    cgi.c to re-enable build with --disable-editor.
+ *    Fixes Bug #892744. Thanks to Matthew Fischer
+ *    for spotting.
+ *
+ *    Revision 1.41.2.6  2003/12/18 08:13:48  oes
+ *    One line lost in last commit
+ *
+ *    Revision 1.41.2.5  2003/12/17 16:33:47  oes
+ *     - All edit functions that redirect back to the list page
+ *       now use cgi_redirect
+ *     - All redirects now contain useless parameter "foo", whose
+ *       value are raw seconds since epoch, in order to force
+ *       Opera and Konqueror to properly reload the list. Closes
+ *       bug #859993
+ *
+ *    Revision 1.41.2.4  2003/03/11 11:53:59  oes
+ *    Cosmetic: Renamed cryptic variable
+ *
+ *    Revision 1.41.2.3  2002/11/12 15:01:41  oes
+ *    Fix: Don't free uninitialized struct editable_file
+ *
+ *    Revision 1.41.2.2  2002/08/05 20:02:59  oes
+ *    Bugfix: "Insert new section at top" did not work properly if first non-comment line in file was of type FILE_LINE_ACTION
+ *
+ *    Revision 1.41.2.1  2002/08/02 12:43:14  oes
+ *    Fixed bug #588514: first_time now set on a per-string basis in actions_from_radio; javascriptify now called on copies
  *
  *    Revision 1.41  2002/05/21 19:09:45  oes
  *     - Made Add/Edit/Remove URL Submit and Cancel
@@ -297,7 +330,7 @@ const char cgiedit_rcs[] = "$Id: cgiedit.c,v 2.1 2002/09/04 15:21:18 oes Exp $";
 #include "errlog.h"
 #include "loaders.h"
 #include "loadcfg.h"
-/* loadcfg.h is for g_bToggleIJB only */
+/* loadcfg.h is for global_toggle_state only */
 #include "urlmatch.h"
 
 const char cgiedit_h_rcs[] = CGIEDIT_H_VERSION;
@@ -457,8 +490,6 @@ jb_err cgi_error_file(struct client_state *csp,
 jb_err cgi_error_file_read_only(struct client_state *csp,
                                 struct http_response *rsp,
                                 const char *filename);
-jb_err cgi_error_disabled(struct client_state *csp,
-                          struct http_response *rsp);
 
 /* Internal arbitrary config file support functions */
 static jb_err edit_read_file_lines(FILE *fp, struct file_line ** pfile, int *newline);
@@ -2394,40 +2425,6 @@ jb_err cgi_error_file_read_only(struct client_state *csp,
 }
 
 
-/*********************************************************************
- *
- * Function    :  cgi_error_disabled
- *
- * Description :  CGI function that is called if the actions editor
- *                is called although it's disabled in config
- *
- * Parameters  :
- *          1  :  csp = Current client state (buffers, headers, etc...)
- *          2  :  rsp = http_response data structure for output
- *
- * CGI Parameters : none
- *
- * Returns     :  JB_ERR_OK on success
- *                JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-jb_err cgi_error_disabled(struct client_state *csp,
-                          struct http_response *rsp)
-{
-   struct map *exports;
-
-   assert(csp);
-   assert(rsp);
-
-   if (NULL == (exports = default_exports(csp, NULL)))
-   {
-      return JB_ERR_MEMORY;
-   }
-
-   return template_fill_for_cgi(csp, "cgi-error-disabled", exports, rsp);
-}
-
-
 /*********************************************************************
  *
  * Function    :  cgi_edit_actions
@@ -2457,20 +2454,9 @@ jb_err cgi_edit_actions(struct client_state *csp,
    }
 
    /* FIXME: Incomplete */
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
-   if (enlist_unique_header(rsp->headers, "Location",
-      CGI_PREFIX "edit-actions-list?f=default"))
-   {
-      free(rsp->status);
-      rsp->status = NULL;
-      return JB_ERR_MEMORY;
-   }
 
-   return JB_ERR_OK;
+   return cgi_redirect(rsp, CGI_PREFIX "edit-actions-list?f=default");
+
 }
 
 
@@ -2589,7 +2575,7 @@ jb_err cgi_edit_actions_list(struct client_state *csp,
       }
 
       buttons = strdup("");
-      for (i = 0; i < MAX_ACTION_FILES; i++)
+      for (i = 0; i < MAX_AF_FILES; i++)
       {
          if (((fl = csp->actions_list[i]) != NULL) && ((b = fl->f) != NULL))
          {
@@ -2987,8 +2973,8 @@ jb_err cgi_edit_actions_for_url(struct client_state *csp,
    struct file_line * cur_line;
    unsigned line_number;
    jb_err err;
-   struct file_list *filter_file;
    struct re_filterfile_spec *filter_group;
+   int i, have_filters = 0;
 
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
    {
@@ -3037,10 +3023,15 @@ jb_err cgi_edit_actions_for_url(struct client_state *csp,
 
    if (!err) err = actions_to_radio(exports, cur_line->data.action);
 
-   filter_file = csp->rlist;
-   filter_group = ((filter_file != NULL) ? filter_file->f : NULL);
-
-   if (!err) err = map_conditional(exports, "any-filters-defined", (filter_group != NULL));
+   for (i = 0; i < MAX_AF_FILES; i++)
+   {
+      if ((csp->rlist[i] != NULL) && (csp->rlist[i]->f != NULL))
+      {
+         if (!err) err = map_conditional(exports, "any-filters-defined", 1);
+         have_filters = 1;
+         break;
+      }
+   }
 
    if (err)
    {
@@ -3049,10 +3040,8 @@ jb_err cgi_edit_actions_for_url(struct client_state *csp,
       return err;
    }
 
-   if (filter_group == NULL)
-   {
+   if (0 == have_filters)
       err = map(exports, "filter-params", 1, "", 1);
-   }
    else
    {
       /* We have some entries in the filter list */
@@ -3076,69 +3065,75 @@ jb_err cgi_edit_actions_for_url(struct client_state *csp,
 
       result = strdup("");
 
-      for (;(!err) && (filter_group != NULL); filter_group = filter_group->next)
+      for (i = 0; i < MAX_AF_FILES; i++)
       {
-         char current_mode = 'x';
-         struct list_entry *filter_name;
-         char * this_line;
-         struct map *line_exports;
-         char number[20];
-
-         filter_name = cur_line->data.action->multi_add[ACTION_MULTI_FILTER]->first;
-         while ((filter_name != NULL)
-             && (0 != strcmp(filter_group->name, filter_name->str)))
+         if ((csp->rlist[i] != NULL) && (csp->rlist[i]->f != NULL))
          {
-              filter_name = filter_name->next;
-         }
-
-         if (filter_name != NULL)
-         {
-            current_mode = 'y';
-         }
-         else
-         {
-            filter_name = cur_line->data.action->multi_remove[ACTION_MULTI_FILTER]->first;
-            while ((filter_name != NULL)
-                && (0 != strcmp(filter_group->name, filter_name->str)))
-            {
-                 filter_name = filter_name->next;
-            }
-            if (filter_name != NULL)
+            filter_group = csp->rlist[i]->f;
+            for (;(!err) && (filter_group != NULL); filter_group = filter_group->next)
             {
-               current_mode = 'n';
-            }
-         }
+               char current_mode = 'x';
+               struct list_entry *filter_name;
+               char * this_line;
+               struct map *line_exports;
+               char number[20];
+
+               filter_name = cur_line->data.action->multi_add[ACTION_MULTI_FILTER]->first;
+               while ((filter_name != NULL)
+                   && (0 != strcmp(filter_group->name, filter_name->str)))
+               {
+                    filter_name = filter_name->next;
+               }
 
-         /* Generate a unique serial number */
-         snprintf(number, sizeof(number), "%x", index++);
-         number[sizeof(number) - 1] = '\0';
+               if (filter_name != NULL)
+               {
+                  current_mode = 'y';
+               }
+               else
+               {
+                  filter_name = cur_line->data.action->multi_remove[ACTION_MULTI_FILTER]->first;
+                  while ((filter_name != NULL)
+                      && (0 != strcmp(filter_group->name, filter_name->str)))
+                  {
+                       filter_name = filter_name->next;
+                  }
+                  if (filter_name != NULL)
+                  {
+                     current_mode = 'n';
+                  }
+               }
 
-         line_exports = new_map();
-         if (line_exports == NULL)
-         {
-            err = JB_ERR_MEMORY;
-            freez(result);
-         }
-         else
-         {
-            if (!err) err = map(line_exports, "index", 1, number, 1);
-            if (!err) err = map(line_exports, "name",  1, filter_group->name, 1);
-            if (!err) err = map(line_exports, "description",  1, filter_group->description, 1);
-            if (!err) err = map_radio(line_exports, "this-filter", "ynx", current_mode);
+               /* Generate a unique serial number */
+               snprintf(number, sizeof(number), "%x", index++);
+               number[sizeof(number) - 1] = '\0';
 
-            this_line = NULL;
-            if (!err)
-            {
-               this_line = strdup(filter_template);
-               if (this_line == NULL) err = JB_ERR_MEMORY;
-            }
-            if (!err) err = template_fill(&this_line, line_exports);
-            string_join(&result, this_line);
+               line_exports = new_map();
+               if (line_exports == NULL)
+               {
+                  err = JB_ERR_MEMORY;
+                  freez(result);
+               }
+               else
+               {
+                  if (!err) err = map(line_exports, "index", 1, number, 1);
+                  if (!err) err = map(line_exports, "name",  1, filter_group->name, 1);
+                  if (!err) err = map(line_exports, "description",  1, filter_group->description, 1);
+                  if (!err) err = map_radio(line_exports, "this-filter", "ynx", current_mode);
+
+                  this_line = NULL;
+                  if (!err)
+                  {
+                     this_line = strdup(filter_template);
+                     if (this_line == NULL) err = JB_ERR_MEMORY;
+                  }
+                  if (!err) err = template_fill(&this_line, line_exports);
+                  string_join(&result, this_line);
 
-            free_map(line_exports);
+                  free_map(line_exports);
+               }
+            }
          }
       }
-
       freez(filter_template);
 
       if (!err)
@@ -3196,7 +3191,7 @@ jb_err cgi_edit_actions_submit(struct client_state *csp,
    struct editable_file * file;
    struct file_line * cur_line;
    unsigned line_number;
-   char * target;
+   char target[1024];
    jb_err err;
    int index;
    const char * action_set_name;
@@ -3242,7 +3237,7 @@ jb_err cgi_edit_actions_submit(struct client_state *csp,
    get_string_param(parameters, "p", &action_set_name);
    if (action_set_name != NULL)
    {
-      for (index = 0; index < MAX_ACTION_FILES; index++)
+      for (index = 0; index < MAX_AF_FILES; index++)
       {
          if (((fl = csp->actions_list[index]) != NULL) && ((b = fl->f) != NULL))
          {
@@ -3384,29 +3379,12 @@ jb_err cgi_edit_actions_submit(struct client_state *csp,
       return err;
    }
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-   string_join(&target, section_target(sectionid));
-
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s#l%d",
+            (long) time(NULL), file->identifier, sectionid);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -3445,9 +3423,13 @@ jb_err cgi_edit_actions_url(struct client_state *csp,
    struct file_line * cur_line;
    unsigned line_number;
    unsigned section_start_line_number = 0;
-   char * target;
+   char target[1024];
    jb_err err;
 
+   assert(csp);
+   assert(rsp);
+   assert(parameters);
+
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
    {
       return cgi_error_disabled(csp, rsp);
@@ -3518,28 +3500,12 @@ jb_err cgi_edit_actions_url(struct client_state *csp,
       return err;
    }
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-   string_join(&target, section_target(section_start_line_number));
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s#l%d",
+            (long) time(NULL), file->identifier, section_start_line_number);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -3577,7 +3543,7 @@ jb_err cgi_edit_actions_add_url(struct client_state *csp,
    struct editable_file * file;
    struct file_line * cur_line;
    unsigned line_number;
-   char * target;
+   char target[1024];
    jb_err err;
 
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
@@ -3663,28 +3629,12 @@ jb_err cgi_edit_actions_add_url(struct client_state *csp,
       return err;
    }
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-   string_join(&target, section_target(sectionid));
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s#l%d",
+            (long) time(NULL), file->identifier, sectionid);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -3721,7 +3671,7 @@ jb_err cgi_edit_actions_remove_url(struct client_state *csp,
    struct file_line * prev_line;
    unsigned line_number;
    unsigned section_start_line_number = 0;
-   char * target;
+   char target[1024];
    jb_err err;
 
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
@@ -3790,28 +3740,12 @@ jb_err cgi_edit_actions_remove_url(struct client_state *csp,
       return err;
    }
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
-   string_join(&target, section_target(section_start_line_number));
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s#l%d",
+            (long) time(NULL), file->identifier, section_start_line_number);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -3848,7 +3782,7 @@ jb_err cgi_edit_actions_section_remove(struct client_state *csp,
    struct file_line * cur_line;
    struct file_line * prev_line;
    unsigned line_number;
-   char * target;
+   char target[1024];
    jb_err err;
 
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
@@ -3928,27 +3862,12 @@ jb_err cgi_edit_actions_section_remove(struct client_state *csp,
       return err;
    }
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s",
+            (long) time(NULL), file->identifier);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -3986,7 +3905,7 @@ jb_err cgi_edit_actions_section_add(struct client_state *csp,
    struct editable_file * file;
    struct file_line * cur_line;
    unsigned line_number;
-   char * target;
+   char target[1024];
    jb_err err;
 
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
@@ -4112,27 +4031,12 @@ jb_err cgi_edit_actions_section_add(struct client_state *csp,
       return err;
    }
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s",
+            (long) time(NULL), file->identifier);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -4181,7 +4085,7 @@ jb_err cgi_edit_actions_section_swap(struct client_state *csp,
    struct file_line * line_end_section2;
    struct file_line * line_after_section2;
    unsigned line_number;
-   char * target;
+   char target[1024];
    jb_err err;
 
    if (0 == (csp->config->feature_flags & RUNTIME_FEATURE_CGI_EDIT_ACTIONS))
@@ -4316,27 +4220,12 @@ jb_err cgi_edit_actions_section_swap(struct client_state *csp,
       }
    } /* END if (section1 != section2) */
 
-   target = strdup(CGI_PREFIX "edit-actions-list?f=");
-   string_append(&target, file->identifier);
+   snprintf(target, 1024, CGI_PREFIX "edit-actions-list?foo=%lu&f=%s",
+            (long) time(NULL), file->identifier);
 
    edit_free_file(file);
 
-   if (target == NULL)
-   {
-      /* Out of memory */
-      return JB_ERR_MEMORY;
-   }
-
-   rsp->status = strdup("302 Local Redirect from Privoxy");
-   if (rsp->status == NULL)
-   {
-      free(target);
-      return JB_ERR_MEMORY;
-   }
-   err = enlist_unique_header(rsp->headers, "Location", target);
-   free(target);
-
-   return err;
+   return cgi_redirect(rsp, target);
 }
 
 
@@ -4383,17 +4272,17 @@ jb_err cgi_toggle(struct client_state *csp,
    if (mode == 'E')
    {
       /* Enable */
-      g_bToggleIJB = 1;
+      global_toggle_state = 1;
    }
    else if (mode == 'D')
    {
       /* Disable */
-      g_bToggleIJB = 0;
+      global_toggle_state = 0;
    }
    else if (mode == 'T')
    {
       /* Toggle */
-      g_bToggleIJB = !g_bToggleIJB;
+      global_toggle_state = !global_toggle_state;
    }
 
    if (NULL == (exports = default_exports(csp, "toggle")))