X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=cgi.c;h=6352b5927326e4079e102c4ecbe055dc0b1b6563;hb=321944b1997539a18dc73184c01a81f6b89acb65;hp=03ca2fa8515a0739b4b9e94e95ff5e585d4a1bb5;hpb=1d3e6f7cff56e9304ae5eaa4f3950fcb4331b821;p=privoxy.git
diff --git a/cgi.c b/cgi.c
index 03ca2fa8..6352b592 100644
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-const char cgi_rcs[] = "$Id: cgi.c,v 1.58 2002/03/29 03:33:13 david__schmidt Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 1.66 2002/04/26 18:32:57 jongfoster Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/cgi.c,v $
@@ -38,6 +38,40 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.58 2002/03/29 03:33:13 david__schmidt Exp
*
* Revisions :
* $Log: cgi.c,v $
+ * Revision 1.66 2002/04/26 18:32:57 jongfoster
+ * Fixing a memory leak on error
+ *
+ * Revision 1.65 2002/04/26 12:53:51 oes
+ * - New function add_help_link
+ * - default_exports now exports links to the user manual
+ * and a prefix for links into the config chapter
+ *
+ * Revision 1.64 2002/04/24 02:17:21 oes
+ * - Better descriptions for CGIs
+ * - Hide edit-actions, more shortcuts
+ * - Moved get_char_param, get_string_param and get_number_param here
+ * from cgiedit.c
+ *
+ * Revision 1.63 2002/04/15 19:06:43 jongfoster
+ * Typos
+ *
+ * Revision 1.62 2002/04/10 19:59:46 jongfoster
+ * Fixes to #include in templates:
+ * - Didn't close main file if loading an included template fails.
+ * - I'm paranoid and want to disallow "#include /etc/passwd".
+ *
+ * Revision 1.61 2002/04/10 13:37:48 oes
+ * Made templates modular: template_load now recursive with max depth 1
+ *
+ * Revision 1.60 2002/04/08 20:50:25 swa
+ * fixed JB spelling
+ *
+ * Revision 1.59 2002/04/05 15:51:51 oes
+ * - added send-stylesheet CGI
+ * - bugfix: error-pages now get correct request protocol
+ * - fixed
+ * - kludged CGI descriptions and menu not to break JS syntax
+ *
* Revision 1.58 2002/03/29 03:33:13 david__schmidt
* Fix Mac OSX compiler warnings
*
@@ -138,7 +172,7 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.58 2002/03/29 03:33:13 david__schmidt Exp
*
* CGI actions file editor that works and is actually useful.
*
- * Ability to toggle JunkBuster remotely using a CGI call.
+ * Ability to toggle Junkbuster remotely using a CGI call.
*
* You can turn off both the above features in the main configuration
* file, e.g. if you are running a multi-user proxy.
@@ -338,6 +372,7 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.58 2002/03/29 03:33:13 david__schmidt Exp
#include Privoxy encountered an error while processing your request: Could not load template file ";
static const char body_suffix[] =
- "
Please contact your proxy administrator.
\r\n" - "If you are the proxy administrator, please put the required file " + "
If you are the proxy administrator, please put the required file(s)"
"in the (confdir)/templates
directory. The "
"location of the (confdir)
directory "
"is specified in the main Privoxy config
"
@@ -1017,6 +1236,43 @@ jb_err cgi_error_bad_param(struct client_state *csp,
}
+/*********************************************************************
+ *
+ * Function : add_help_link
+ *
+ * Description : Produce a copy of the string given as item,
+ * embedded in an HTML link to its corresponding
+ * section (item name in uppercase) in the configuration
+ * chapter of the user manual, (whose URL is given in
+ * the config and defaults to our web site).
+ *
+ * Parameters :
+ * 1 : item = item (will NOT be free()d.)
+ * It is assumed to be HTML-safe.
+ *
+ * Returns : String with item embedded in link, or NULL on
+ * out-of-memory
+ *
+ *********************************************************************/
+char *add_help_link(const char *item,
+ struct configuration_spec *config)
+{
+ char *result;
+
+ if (!item) return NULL;
+
+ result = strdup("usermanual);
+ string_append(&result, HELP_LINK_PREFIX);
+ string_join (&result, string_toupper(item));
+ string_append(&result, "\">");
+ string_append(&result, item);
+ string_append(&result, " ");
+
+ return result;
+}
+
+
/*********************************************************************
*
* Function : get_http_time
@@ -1242,13 +1498,16 @@ void free_http_response(struct http_response *rsp)
*
* Description : CGI support function that loads a given HTML
* template from the confdir, ignoring comment
- * lines.
+ * lines and following #include statements up to
+ * a depth of 1.
*
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
* 2 : template_ptr = Destination for pointer to loaded
* template text.
* 3 : template = name of the HTML template to be used
+ * 4 : recursive = Flag set if this function calls itself
+ * following an #include statament
*
* Returns : JB_ERR_OK on success
* JB_ERR_MEMORY on out-of-memory error.
@@ -1256,11 +1515,14 @@ void free_http_response(struct http_response *rsp)
*
*********************************************************************/
jb_err template_load(struct client_state *csp, char **template_ptr,
- const char *templatename)
+ const char *templatename, int recursive)
{
+ jb_err err;
char *templates_dir_path;
char *full_path;
char *file_buffer;
+ char *included_module;
+ const char *p;
FILE *fp;
char buf[BUFFER_SIZE];
@@ -1270,9 +1532,21 @@ jb_err template_load(struct client_state *csp, char **template_ptr,
*template_ptr = NULL;
- /*
- * Open template file or fail
- */
+ /* Validate template name. Paranoia. */
+ for (p = templatename; *p != 0; p++)
+ {
+ if ( ((*p < 'a') || (*p > 'z'))
+ && ((*p < 'A') || (*p > 'Z'))
+ && ((*p < '0') || (*p > '9'))
+ && (*p != '-')
+ && (*p != '.'))
+ {
+ /* Illegal character */
+ return JB_ERR_FILE;
+ }
+ }
+
+ /* Generate full path */
templates_dir_path = make_path(csp->config->confdir, "templates");
if (templates_dir_path == NULL)
@@ -1287,6 +1561,8 @@ jb_err template_load(struct client_state *csp, char **template_ptr,
return JB_ERR_MEMORY;
}
+ /* Allocate buffer */
+
file_buffer = strdup("");
if (file_buffer == NULL)
{
@@ -1294,6 +1570,8 @@ jb_err template_load(struct client_state *csp, char **template_ptr,
return JB_ERR_MEMORY;
}
+ /* Open template file */
+
if (NULL == (fp = fopen(full_path, "r")))
{
log_error(LOG_LEVEL_ERROR, "Cannot open template file %s: %E", full_path);
@@ -1304,15 +1582,34 @@ jb_err template_load(struct client_state *csp, char **template_ptr,
free(full_path);
/*
- * Read the file, ignoring comments.
+ * Read the file, ignoring comments, and honoring #include
+ * statements, unless we're already called recursively.
*
* FIXME: The comment handling could break with lines >BUFFER_SIZE long.
* This is unlikely in practise.
*/
while (fgets(buf, BUFFER_SIZE, fp))
{
+ if (!recursive && !strncmp(buf, "#include ", 9))
+ {
+ if (JB_ERR_OK != (err = template_load(csp, &included_module, chomp(buf + 9), 1)))
+ {
+ free(file_buffer);
+ fclose(fp);
+ return err;
+ }
+
+ if (string_join(&file_buffer, included_module))
+ {
+ fclose(fp);
+ return JB_ERR_MEMORY;
+ }
+
+ continue;
+ }
+
/* skip lines starting with '#' */
- if(*buf == '#')
+ if (*buf == '#')
{
continue;
}
@@ -1472,7 +1769,7 @@ jb_err template_fill_for_cgi(struct client_state *csp,
assert(exports);
assert(rsp);
- err = template_load(csp, &rsp->body, templatename);
+ err = template_load(csp, &rsp->body, templatename, 0);
if (err == JB_ERR_FILE)
{
free_map(exports);
@@ -1526,6 +1823,8 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
if (!err) err = map(exports, "default-cgi", 1, html_encode(CGI_PREFIX), 0);
if (!err) err = map(exports, "menu", 1, make_menu(caller), 0);
if (!err) err = map(exports, "code-status", 1, CODE_STATUS, 1);
+ if (!err) err = map(exports, "user-manual", 1, csp->config->usermanual ,1);
+ if (!err) err = map(exports, "helplink", 1, HELP_LINK_PREFIX ,1);
if (!err) err = map_conditional(exports, "enabled-display", g_bToggleIJB);
snprintf(buf, 20, "%d", csp->config->hport);
@@ -1695,9 +1994,10 @@ jb_err map_conditional(struct map *exports, const char *name, int choose_first)
* Function : make_menu
*
* Description : Returns an HTML-formatted menu of the available
- * unhidden CGIs, excluding the one given in