added default config section
[privoxy.git] / cgiedit.c
index 0e230ee..e3ffce4 100644 (file)
--- a/cgiedit.c
+++ b/cgiedit.c
@@ -1,4 +1,4 @@
-const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.9 2002/01/17 20:56:22 jongfoster Exp $";
+const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.15 2002/03/06 22:54:35 jongfoster Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgiedit.c,v $
@@ -42,6 +42,53 @@ const char cgiedit_rcs[] = "$Id: cgiedit.c,v 1.9 2002/01/17 20:56:22 jongfoster
  *
  * Revisions   :
  *    $Log: cgiedit.c,v $
+ *    Revision 1.15  2002/03/06 22:54:35  jongfoster
+ *    Automated function-comment nitpicking.
+ *
+ *    Revision 1.14  2002/03/05 00:24:51  jongfoster
+ *    Patch to always edit the current actions file.
+ *
+ *    Revision 1.13  2002/03/04 02:07:59  david__schmidt
+ *    Enable web editing of actions file on OS/2 (it had been broken all this time!)
+ *
+ *    Revision 1.12  2002/03/03 09:18:03  joergs
+ *    Made jumbjuster work on AmigaOS again.
+ *
+ *    Revision 1.11  2002/01/23 01:03:31  jongfoster
+ *    Fixing gcc [CygWin] compiler warnings
+ *
+ *    Revision 1.10  2002/01/23 00:22:59  jongfoster
+ *    Adding new function cgi_edit_actions_section_swap(), to reorder
+ *    the actions file.
+ *
+ *    Adding get_url_spec_param() to get a validated URL pattern.
+ *
+ *    Moving edit_read_line() out of this file and into loaders.c.
+ *
+ *    Adding missing html_encode() to many CGI functions.
+ *
+ *    Moving the functions that #include actionlist.h to the end of the file,
+ *    because the Visual C++ 97 debugger gets extremely confused if you try
+ *    to debug any code that comes after them in the file.
+ *
+ *    Major optimizations in cgi_edit_actions_list() to reduce the size of
+ *    the generated HTML (down 40% from 550k to 304k), with major side-effects
+ *    throughout the editor and templates.  In particular, the length of the
+ *    URLs throughout the editor has been drastically reduced, by cutting
+ *    paramater names down to 1 character and CGI names down to 3-4
+ *    characters, by removing all non-essential CGI paramaters even at the
+ *    expense of having to re-read the actions file for the most trivial
+ *    page, and by using relative rather than absolute URLs.  This means
+ *    that this (typical example):
+ *
+ *    <a href="http://ijbswa.sourceforge.net/config/edit-actions-url-form?
+ *    filename=ijb&amp;ver=1011487572&amp;section=12&amp;pattern=13
+ *    &amp;oldval=www.oesterhelt.org%2Fdeanimate-demo">
+ *
+ *    is now this:
+ *
+ *    <a href="eau?f=ijb&amp;v=1011487572&amp;p=13">
+ *
  *    Revision 1.9  2002/01/17 20:56:22  jongfoster
  *    Replacing hard references to the URL of the config interface
  *    with #defines from project.h
@@ -277,7 +324,7 @@ static jb_err get_url_spec_param(struct client_state *csp,
 static jb_err map_radio(struct map * exports,
                         const char * optionname,
                         const char * values,
-                        char value);
+                        int value);
 static jb_err actions_to_radio(struct map * exports,
                                const struct action_spec *action);
 static jb_err actions_from_radio(const struct map * parameters,
@@ -287,10 +334,11 @@ static jb_err actions_from_radio(const struct map * parameters,
 static jb_err map_copy_parameter_html(struct map *out,
                                       const struct map *in,
                                       const char *name);
+#if 0 /* unused function */
 static jb_err map_copy_parameter_url(struct map *out,
                                      const struct map *in,
                                      const char *name);
-
+#endif /* unused function */
 
 /*********************************************************************
  *
@@ -300,9 +348,9 @@ static jb_err map_copy_parameter_url(struct map *out,
  *                encoding it.
  *
  * Parameters  :
- *           1 :  out = target map
- *           2 :  in = source map
- *           3 :  name = name of cgi parameter to copy
+ *           :  out = target map
+ *           :  in = source map
+ *           :  name = name of cgi parameter to copy
  *
  * Returns     :  JB_ERR_OK on success
  *                JB_ERR_MEMORY on out-of-memory
@@ -340,6 +388,7 @@ static jb_err map_copy_parameter_html(struct map *out,
 }
 
 
+#if 0 /* unused function */
 /*********************************************************************
  *
  * Function    :  map_copy_parameter_html
@@ -348,9 +397,9 @@ static jb_err map_copy_parameter_html(struct map *out,
  *                encoding it.
  *
  * Parameters  :
- *           1 :  out = target map
- *           2 :  in = source map
- *           3 :  name = name of cgi parameter to copy
+ *           :  out = target map
+ *           :  in = source map
+ *           :  name = name of cgi parameter to copy
  *
  * Returns     :  JB_ERR_OK on success
  *                JB_ERR_MEMORY on out-of-memory
@@ -386,7 +435,7 @@ static jb_err map_copy_parameter_url(struct map *out,
       return JB_ERR_OK;
    }
 }
-
+#endif /* 0 - unused function */
 
 /*********************************************************************
  *
@@ -396,9 +445,9 @@ static jb_err map_copy_parameter_url(struct map *out,
  *                edit-actions-url
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters
  *           f : (filename) Identifies the file to edit
@@ -492,9 +541,9 @@ jb_err cgi_edit_actions_url_form(struct client_state *csp,
  *                edit-actions-url
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *           f : (filename) Identifies the file to edit
@@ -550,9 +599,9 @@ jb_err cgi_edit_actions_add_url_form(struct client_state *csp,
  *                edit-actions-url
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *           f : (filename) Identifies the file to edit
@@ -666,7 +715,11 @@ jb_err edit_write_file(struct editable_file * file)
    assert(file);
    assert(file->filename);
 
+#if defined(AMIGA) || defined(__OS2__)
+   if (NULL == (fp = fopen(file->filename, "w")))
+#else
    if (NULL == (fp = fopen(file->filename, "wt")))
+#endif /* def AMIGA */
    {
       return JB_ERR_FILE;
    }
@@ -718,7 +771,7 @@ jb_err edit_write_file(struct editable_file * file)
 
                /* Allocate new memory for string */
                len = strlen(cur_line->unprocessed);
-               if (NULL == (str = malloc(len + 1 + numhash)))
+               if (NULL == (str = malloc((size_t) len + 1 + numhash)))
                {
                   /* Uh oh, just trashed file! */
                   fclose(fp);
@@ -897,15 +950,15 @@ static void edit_free_file_lines(struct file_line * first_line)
  * Description :  Match an actions file {{header}} line
  *
  * Parameters  :
- *          1  :  line - String from file
- *          2  :  name - Header to match against
+ *          1  :  line = String from file
+ *          2  :  name = Header to match against
  *
  * Returns     :  0 iff they match.
  *
  *********************************************************************/
 static int match_actions_file_header_line(const char * line, const char * name)
 {
-   int len;
+   size_t len;
 
    assert(line);
    assert(name);
@@ -955,10 +1008,10 @@ static int match_actions_file_header_line(const char * line, const char * name)
  * Description :  Match an actions file {{header}} line
  *
  * Parameters  :
- *          1  :  line - String from file.  Must not start with
+ *          1  :  line = String from file.  Must not start with
  *                       whitespace (else infinite loop!)
- *          2  :  name - Destination for name
- *          2  :  name - Destination for value
+ *          2  :  name = Destination for name
+ *          2  :  name = Destination for value
  *
  * Returns     :  JB_ERR_OK     on success
  *                JB_ERR_MEMORY on out-of-memory
@@ -971,7 +1024,7 @@ static jb_err split_line_on_equals(const char * line, char ** pname, char ** pva
 {
    const char * name_end;
    const char * value_start;
-   int name_len;
+   size_t name_len;
 
    assert(line);
    assert(pname);
@@ -1051,7 +1104,7 @@ static jb_err split_line_on_equals(const char * line, char ** pname, char ** pva
 jb_err edit_parse_actions_file(struct editable_file * file)
 {
    struct file_line * cur_line;
-   int len;
+   size_t len;
    const char * text; /* Text from a line */
    char * name;  /* For lines of the form name=value */
    char * value; /* For lines of the form name=value */
@@ -1493,7 +1546,11 @@ jb_err edit_read_file(struct client_state *csp,
       }
    }
 
+#if defined(AMIGA) || defined(__OS2__)
+   if (NULL == (fp = fopen(filename,"r")))
+#else
    if (NULL == (fp = fopen(filename,"rt")))
+#endif /* def AMIGA */
    {
       free(filename);
       return JB_ERR_FILE;
@@ -1666,13 +1723,13 @@ jb_err edit_read_actions_file(struct client_state *csp,
  *                secure.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  parameters = map of cgi parameters
- *           3 :  param_name = The name of the parameter to read
- *           4 :  suffix = File extension, e.g. ".actions"
- *           5 :  pfilename = destination for full filename.  Caller
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  parameters = map of cgi parameters
+ *           :  param_name = The name of the parameter to read
+ *           :  suffix = File extension, e.g. ".actions"
+ *           :  pfilename = destination for full filename.  Caller
  *                free()s.  Set to NULL on error.
- *           6 :  pparam = destination for partial filename,
+ *           :  pparam = destination for partial filename,
  *                suitable for use in another URL.  Allocated as part
  *                of the map "parameters", so don't free it.
  *                Set to NULL if not specified.
@@ -1692,7 +1749,9 @@ static jb_err get_file_name_param(struct client_state *csp,
 {
    const char *param;
    const char *s;
+#if 0 /* Patch to make 3.0.0 work properly. */
    char *name;
+#endif /* 0 - Patch to make 3.0.0 work properly. */
    char *fullpath;
    char ch;
    int len;
@@ -1736,6 +1795,13 @@ static jb_err get_file_name_param(struct client_state *csp,
       }
    }
 
+   /*
+    * FIXME Following is a hack to make 3.0.0 work properly.
+    * Change "#if 0" --> "#if 1" below when we have modular action
+    * files.
+    *    -- Jon
+    */
+#if 0 /* Patch to make 3.0.0 work properly. */
    /* Append extension */
    name = malloc(len + strlen(suffix) + 1);
    if (name == NULL)
@@ -1748,6 +1814,16 @@ static jb_err get_file_name_param(struct client_state *csp,
    /* Prepend path */
    fullpath = make_path(csp->config->confdir, name);
    free(name);
+#else /* 1 - Patch to make 3.0.0 work properly. */
+   if ((csp->actions_list == NULL)
+    || (csp->actions_list->filename == NULL))
+   {
+      return JB_ERR_CGI_PARAMS;
+   }
+
+   fullpath = ( (csp->actions_list && csp->actions_list->filename)
+             ? strdup(csp->actions_list->filename) : NULL);
+#endif /* 1 - Patch to make 3.0.0 work properly. */
    if (fullpath == NULL)
    {
       return JB_ERR_MEMORY;
@@ -1768,10 +1844,10 @@ static jb_err get_file_name_param(struct client_state *csp,
  *                passed to a CGI function.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  parameters = map of cgi parameters
- *           3 :  name = Name of CGI parameter to read
- *           4 :  pvalue = destination for value.
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  parameters = map of cgi parameters
+ *           :  name = Name of CGI parameter to read
+ *           :  pvalue = destination for value.
  *                         Set to -1 on error.
  *
  * Returns     :  JB_ERR_OK         on success
@@ -1794,7 +1870,7 @@ static jb_err get_number_param(struct client_state *csp,
    assert(name);
    assert(pvalue);
 
-   *pvalue = -1;
+   *pvalue = 0; 
 
    param = lookup(parameters, name);
    if (!*param)
@@ -1833,6 +1909,7 @@ static jb_err get_number_param(struct client_state *csp,
    *pvalue = value;
 
    return JB_ERR_OK;
+
 }
 
 
@@ -1845,10 +1922,10 @@ static jb_err get_number_param(struct client_state *csp,
  *                spaces and validates it.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  parameters = map of cgi parameters
- *           3 :  name = Name of CGI parameter to read
- *           4 :  pvalue = destination for value.  Will be malloc()'d.
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  parameters = map of cgi parameters
+ *           :  name = Name of CGI parameter to read
+ *           :  pvalue = destination for value.  Will be malloc()'d.
  *                         Set to NULL on error.
  *
  * Returns     :  JB_ERR_OK         on success
@@ -1978,10 +2055,10 @@ static jb_err get_url_spec_param(struct client_state *csp,
  *                Where 'sel' is 'a', 'b', or 'c'.
  *
  * Parameters  :
- *           1 :  exports = Exports map to modify.
- *           2 :  optionname = name for map
- *           3 :  values = null-terminated list of values;
- *           4 :  value = Selected value.
+ *           :  exports = Exports map to modify.
+ *           :  optionname = name for map
+ *           :  values = null-terminated list of values;
+ *           :  value = Selected value.
  *
  * CGI Parameters : None
  *
@@ -1992,9 +2069,9 @@ static jb_err get_url_spec_param(struct client_state *csp,
 static jb_err map_radio(struct map * exports,
                         const char * optionname,
                         const char * values,
-                        char value)
+                        int value)
 {
-   int len;
+   size_t len;
    char * buf;
    char * p;
    char c;
@@ -2047,9 +2124,9 @@ static jb_err map_radio(struct map * exports,
  *                outside the CGI editor.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  filename = The file that was modified.
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  filename = The file that was modified.
  *
  * CGI Parameters : none
  *
@@ -2092,9 +2169,9 @@ jb_err cgi_error_modified(struct client_state *csp,
  *                be parsed by the CGI editor.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  file = The file that was modified.
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  file = The file that was modified.
  *
  * CGI Parameters : none
  *
@@ -2146,9 +2223,9 @@ jb_err cgi_error_parse(struct client_state *csp,
  *                opened by the CGI editor.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  filename = The file that was modified.
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  filename = The file that was modified.
  *
  * CGI Parameters : none
  *
@@ -2191,8 +2268,8 @@ jb_err cgi_error_file(struct client_state *csp,
  *                (query string) for a CGI were wrong.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
  *
  * CGI Parameters : none
  *
@@ -2225,9 +2302,9 @@ jb_err cgi_error_disabled(struct client_state *csp,
  *                actions file to edit.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters : None
  *
@@ -2271,9 +2348,9 @@ jb_err cgi_edit_actions(struct client_state *csp,
  *                FIXME: This function shouldn't FATAL ever.
  *                FIXME: This function doesn't check the retval of map()
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters : filename
  *
@@ -2626,9 +2703,9 @@ jb_err cgi_edit_actions_list(struct client_state *csp,
  * Description :  CGI function that edits the Actions list.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters : None
  *
@@ -2715,9 +2792,9 @@ jb_err cgi_edit_actions_for_url(struct client_state *csp,
  * Description :  CGI function that actually edits the Actions list.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters : None
  *
@@ -2734,7 +2811,7 @@ jb_err cgi_edit_actions_submit(struct client_state *csp,
    unsigned sectionid;
    char * actiontext;
    char * newtext;
-   int len;
+   size_t len;
    struct editable_file * file;
    struct file_line * cur_line;
    unsigned line_number;
@@ -2858,9 +2935,9 @@ jb_err cgi_edit_actions_submit(struct client_state *csp,
  *                an actions file.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *    filename : Identifies the file to edit
@@ -2980,9 +3057,9 @@ jb_err cgi_edit_actions_url(struct client_state *csp,
  *                an actions file.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *    filename : Identifies the file to edit
@@ -3119,9 +3196,9 @@ jb_err cgi_edit_actions_add_url(struct client_state *csp,
  *                the actions file.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *           f : (filename) Identifies the file to edit
@@ -3236,9 +3313,9 @@ jb_err cgi_edit_actions_remove_url(struct client_state *csp,
  *                (else JB_ERR_CGI_PARAMS).
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *           f : (filename) Identifies the file to edit
@@ -3367,9 +3444,9 @@ jb_err cgi_edit_actions_section_remove(struct client_state *csp,
  *                an actions file.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *           f : (filename) Identifies the file to edit
@@ -3544,9 +3621,9 @@ jb_err cgi_edit_actions_section_add(struct client_state *csp,
  *                specified.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *           f : (filename) Identifies the file to edit
@@ -3740,9 +3817,9 @@ jb_err cgi_edit_actions_section_swap(struct client_state *csp,
  *                an actions file.
  *
  * Parameters  :
- *           1 :  csp = Current client state (buffers, headers, etc...)
- *           2 :  rsp = http_response data structure for output
- *           3 :  parameters = map of cgi parameters
+ *           :  csp = Current client state (buffers, headers, etc...)
+ *           :  rsp = http_response data structure for output
+ *           :  parameters = map of cgi parameters
  *
  * CGI Parameters :
  *         set : If present, how to change toggle setting: