X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgi.c;h=3bdeda3fd981ffa2e7b7938f98e6369a25cba895;hp=cc8ef2cc89898b4f8dbe145f6ca27656a0ee7585;hb=42a63263b2fec9d1cb5118ec1d5b0f799f08b45c;hpb=e1a5911ec4ffee093da8352b1b6973d40b322f77 diff --git a/cgi.c b/cgi.c index cc8ef2cc..3bdeda3f 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.107 2008/05/26 16:23:19 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 $ @@ -38,6 +38,40 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.107 2008/05/26 16:23:19 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. @@ -632,9 +666,9 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.107 2008/05/26 16:23:19 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 @@ -674,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 }, @@ -1474,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); /* @@ -1968,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, @@ -2011,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); + +} /********************************************************************* * @@ -2345,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)) { @@ -2418,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; @@ -2441,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 @@ -2454,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. */ @@ -2584,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; @@ -2610,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); @@ -2703,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); @@ -2733,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); @@ -2780,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"