From 7a8ed3a3f6b48f81b406e1f35559e67ce3fbbf41 Mon Sep 17 00:00:00 2001
From: oes 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
"
@@ -1248,13 +1251,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.
@@ -1262,11 +1268,13 @@ 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;
FILE *fp;
char buf[BUFFER_SIZE];
@@ -1310,15 +1318,35 @@ 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 honring #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);
+ return err;
+ }
+
+ if (string_append(&file_buffer, included_module))
+ {
+ fclose(fp);
+ free(included_module);
+ return JB_ERR_MEMORY;
+ }
+
+ free(included_module);
+ continue;
+ }
+
/* skip lines starting with '#' */
- if(*buf == '#')
+ if (*buf == '#')
{
continue;
}
@@ -1478,7 +1506,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);
--
2.49.0