X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgi.c;h=3bdeda3fd981ffa2e7b7938f98e6369a25cba895;hp=19161082fa8a81c5f464cf078d01a2def5e8853f;hb=922ae4e04677a23a14feac41e55033a9953b2636;hpb=2ca8ded3499575f418dec20e8a7f4b033e0690af diff --git a/cgi.c b/cgi.c index 19161082..3bdeda3f 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.105 2008/04/17 14:40:47 fabiankeil Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.115 2009/03/01 18:28:23 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ @@ -11,7 +11,7 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.105 2008/04/17 14:40:47 fabiankeil Exp $" * Functions declared include: * * - * Copyright : Written by and Copyright (C) 2001-2004, 2006-2007 + * Copyright : Written by and Copyright (C) 2001-2004, 2006-2008 * the SourceForge Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -38,6 +38,47 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.105 2008/04/17 14:40:47 fabiankeil Exp $" * * Revisions : * $Log: cgi.c,v $ + * Revision 1.115 2009/03/01 18:28:23 fabiankeil + * Help clang understand that we aren't dereferencing + * NULL pointers here. + * + * Revision 1.114 2008/12/04 18:15:04 fabiankeil + * Fix some cparser warnings. + * + * Revision 1.113 2008/09/04 08:13:58 fabiankeil + * Prepare for critical sections on Windows by adding a + * layer of indirection before the pthread mutex functions. + * + * Revision 1.112 2008/08/31 16:08:12 fabiankeil + * "View the request headers" isn't more equal than the other + * menu items and thus doesn't need a trailing dot either. + * + * Revision 1.111 2008/08/31 15:59:02 fabiankeil + * There's no reason to let remote toggling support depend + * on FEATURE_CGI_EDIT_ACTIONS, so make sure it doesn't. + * + * Revision 1.110 2008/08/31 14:55:43 fabiankeil + * Add a @date@ symbol to include a date(1)-like time string + * in templates. Modified version of the patch Endre Szabo + * submitted in #2026468. + * + * Revision 1.109 2008/07/26 09:40:27 fabiankeil + * Remove the unconditional block in get_http_time(). + * It's pointless now that it's no longer used to limit + * dummy's scope. While at it, remove obvious comments + * and a trailing space. + * + * Revision 1.108 2008/05/26 17:30:53 fabiankeil + * Provide an OpenSearch Description to access the + * show-url-info page through "search engine plugins". + * + * Revision 1.107 2008/05/26 16:23:19 fabiankeil + * - Fix spelling in template-not-found message. + * - Declare referrer_is_safe()'s alternative_prefix[] static. + * + * Revision 1.106 2008/05/21 15:24:38 fabiankeil + * Mark csp as immutable for a bunch of functions. + * * Revision 1.105 2008/04/17 14:40:47 fabiankeil * Provide get_http_time() with the buffer size so it doesn't * have to blindly assume that the buffer is big enough. @@ -625,9 +666,9 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.105 2008/04/17 14:40:47 fabiankeil Exp $" #include "miscutil.h" #include "cgisimple.h" #include "jbsockets.h" -#ifdef FEATURE_CGI_EDIT_ACTIONS +#if defined(FEATURE_CGI_EDIT_ACTIONS) || defined(FEATURE_TOGGLE) #include "cgiedit.h" -#endif /* def FEATURE_CGI_EDIT_ACTIONS */ +#endif /* defined(FEATURE_CGI_EDIT_ACTIONS) || defined (FEATURE_TOGGLE) */ #include "loadcfg.h" /* loadcfg.h is for global_toggle_state only */ #ifdef FEATURE_PTHREAD @@ -667,19 +708,19 @@ static const struct cgi_dispatcher cgi_dispatchers[] = { TRUE }, { "show-request", cgi_show_request, - "View the request headers.", + "View the request headers", TRUE }, { "show-url-info", cgi_show_url_info, "Look up which actions apply to a URL and why", TRUE }, -#ifdef FEATURE_CGI_EDIT_ACTIONS #ifdef FEATURE_TOGGLE { "toggle", cgi_toggle, "Toggle Privoxy on or off", FALSE }, #endif /* def FEATURE_TOGGLE */ +#ifdef FEATURE_CGI_EDIT_ACTIONS { "edit-actions", /* Edit the actions list */ cgi_edit_actions, NULL, FALSE }, @@ -765,6 +806,9 @@ static const struct cgi_dispatcher cgi_dispatchers[] = { { "t", cgi_transparent_image, NULL, TRUE /* Send a transparent image (short name) */ }, + { "url-info-osd.xml", + cgi_send_url_info_osd, + NULL, TRUE /* Send templates/url-info-osd.xml */ }, { "user-manual", cgi_send_user_manual, NULL, TRUE /* Send user-manual */ }, @@ -963,7 +1007,7 @@ static char *grep_cgi_referrer(const struct client_state *csp) static int referrer_is_safe(const struct client_state *csp) { char *referrer; - const char alternative_prefix[] = "http://" CGI_SITE_1_HOST "/"; + static const char alternative_prefix[] = "http://" CGI_SITE_1_HOST "/"; referrer = grep_cgi_referrer(csp); @@ -1464,6 +1508,7 @@ struct http_response *error_response(struct client_state *csp, * XXX: While the template is called forwarding-failed, * it currently only handles socks forwarding failures. */ + assert(fwd != NULL); assert(fwd->type != SOCKS_NONE); /* @@ -1675,7 +1720,7 @@ jb_err cgi_error_no_template(const struct client_state *csp, "
Privoxy encountered an error while processing your request:
\r\n" "Could not load template file ";
static const char body_suffix[] =
- "
or one of it's included components.
Please contact your proxy administrator.
\r\n" "If you are the proxy administrator, please put the required file(s)"
"in the (confdir)/templates
directory. The "
@@ -1958,34 +2003,26 @@ void get_http_time(int time_offset, char *buf, size_t buffer_size)
struct tm *t;
time_t current_time;
#if defined(HAVE_GMTIME_R)
- /*
- * Declare dummy up here (instead of inside get/set gmt block) so it
- * doesn't go out of scope before it's potentially used in snprintf later.
- * Wrapping declaration inside HAVE_GMTIME_R keeps the compiler quiet when
- * !defined HAVE_GMTIME_R.
- */
- struct tm dummy;
+ struct tm dummy;
#endif
assert(buf);
- assert(buffer_size > 29);
+ assert(buffer_size > (size_t)29);
- time(¤t_time); /* get current time */
+ time(¤t_time);
current_time += time_offset;
/* get and save the gmt */
- {
#if HAVE_GMTIME_R
- t = gmtime_r(¤t_time, &dummy);
+ t = gmtime_r(¤t_time, &dummy);
#elif FEATURE_PTHREAD
- pthread_mutex_lock(&gmtime_mutex);
- t = gmtime(¤t_time);
- pthread_mutex_unlock(&gmtime_mutex);
+ privoxy_mutex_lock(&gmtime_mutex);
+ t = gmtime(¤t_time);
+ privoxy_mutex_unlock(&gmtime_mutex);
#else
- t = gmtime(¤t_time);
+ t = gmtime(¤t_time);
#endif
- }
/* Format: "Sun, 06 Nov 1994 08:49:37 GMT" */
snprintf(buf, buffer_size,
@@ -2001,6 +2038,51 @@ void get_http_time(int time_offset, char *buf, size_t buffer_size)
}
+/*********************************************************************
+ *
+ * Function : get_locale_time
+ *
+ * Description : Get the time in a date(1)-like format
+ * according to the current locale - e.g.:
+ * "Fri Aug 29 19:37:12 CEST 2008"
+ *
+ * XXX: Should we allow the user to change the format?
+ *
+ * Parameters :
+ * 1 : buf = Destination for result.
+ * 2 : buffer_size = Size of the buffer above. Must be big
+ * enough to hold 29 characters plus a
+ * trailing zero.
+ *
+ * Returns : N/A
+ *
+ *********************************************************************/
+static void get_locale_time(char *buf, size_t buffer_size)
+{
+ struct tm *timeptr;
+ time_t current_time;
+#if defined(HAVE_LOCALTIME_R)
+ struct tm dummy;
+#endif
+
+ assert(buf);
+ assert(buffer_size > (size_t)29);
+
+ time(¤t_time);
+
+#if HAVE_LOCALTIME_R
+ timeptr = localtime_r(¤t_time, &dummy);
+#elif FEATURE_PTHREAD
+ privoxy_mutex_lock(&localtime_mutex);
+ timeptr = localtime(¤t_time);
+ privoxy_mutex_unlock(&localtime_mutex);
+#else
+ timeptr = localtime(¤t_time);
+#endif
+
+ strftime(buf, buffer_size, "%a %b %d %X %Z %Y", timeptr);
+
+}
/*********************************************************************
*
@@ -2335,10 +2417,10 @@ jb_err template_load(const struct client_state *csp, char **template_ptr,
* 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.
+ * XXX: The comment handling could break with lines lengths > sizeof(buf).
+ * This is unlikely in practise.
*/
- while (fgets(buf, BUFFER_SIZE, fp))
+ while (fgets(buf, sizeof(buf), fp))
{
if (!recursive && !strncmp(buf, "#include ", 9))
{
@@ -2408,7 +2490,7 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
char buf[BUFFER_SIZE];
char *tmp_out_buffer;
char *file_buffer;
- size_t size;
+ size_t size;
int error;
const char *flags;
@@ -2431,7 +2513,7 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
* character and allow backreferences ($1 etc) in the
* "replace with" text.
*/
- snprintf(buf, BUFFER_SIZE, "%s", m->name + 1);
+ snprintf(buf, sizeof(buf), "%s", m->name + 1);
flags = "sigU";
}
else
@@ -2444,10 +2526,9 @@ jb_err template_fill(char **template_ptr, const struct map *exports)
flags = "sigTU";
/* Enclose name in @@ */
- snprintf(buf, BUFFER_SIZE, "@%s@", m->name);
+ snprintf(buf, sizeof(buf), "@%s@", m->name);
}
-
log_error(LOG_LEVEL_CGI, "Substituting: s/%s/%s/%s", buf, m->value, flags);
/* Make and run job. */
@@ -2574,7 +2655,7 @@ jb_err template_fill_for_cgi(const struct client_state *csp,
*********************************************************************/
struct map *default_exports(const struct client_state *csp, const char *caller)
{
- char buf[20];
+ char buf[30];
jb_err err;
struct map * exports;
int local_help_exists = 0;
@@ -2600,6 +2681,8 @@ struct map *default_exports(const struct client_state *csp, const char *caller)
}
err = map(exports, "version", 1, html_encode(VERSION), 0);
+ get_locale_time(buf, sizeof(buf));
+ if (!err) err = map(exports, "time", 1, html_encode(buf), 0);
if (!err) err = map(exports, "my-ip-address", 1, html_encode(ip_address ? ip_address : "unknown"), 0);
freez(ip_address);
if (!err) err = map(exports, "my-hostname", 1, html_encode(hostname ? hostname : "unknown"), 0);
@@ -2693,7 +2776,7 @@ jb_err map_block_killer(struct map *exports, const char *name)
assert(exports);
assert(name);
- assert(strlen(name) < 490);
+ assert(strlen(name) < (size_t)490);
snprintf(buf, sizeof(buf), "if-%s-start.*if-%s-end", name, name);
return map(exports, buf, 1, "", 1);
@@ -2723,7 +2806,7 @@ jb_err map_block_keep(struct map *exports, const char *name)
assert(exports);
assert(name);
- assert(strlen(name) < 490);
+ assert(strlen(name) < (size_t)490);
snprintf(buf, sizeof(buf), "if-%s-start", name);
err = map(exports, buf, 1, "", 1);
@@ -2770,7 +2853,7 @@ jb_err map_conditional(struct map *exports, const char *name, int choose_first)
assert(exports);
assert(name);
- assert(strlen(name) < 480);
+ assert(strlen(name) < (size_t)480);
snprintf(buf, sizeof(buf), (choose_first
? "else-not-%s@.*@endif-%s"