diff options
author | Ole Loots <ole@monochrom.net> | 2012-12-21 05:46:20 +0100 |
---|---|---|
committer | Ole Loots <ole@monochrom.net> | 2012-12-21 05:46:20 +0100 |
commit | 3bc7316ac8873d8b17ceef66168dfa5bb14928ff (patch) | |
tree | 9799fcbe0c53df1bd8cfcd23af9785e9ceabf1b2 /content | |
parent | 0d803b6c0d252c3a1a9fa07e37d9a0b08ce567b8 (diff) | |
download | netsurf-3bc7316ac8873d8b17ceef66168dfa5bb14928ff.tar.gz netsurf-3bc7316ac8873d8b17ceef66168dfa5bb14928ff.tar.bz2 |
Render HTML Form for Choices submission.
Causes memory corruption when submitted via GET.
Retrieving Post data requires a bit more indepth
knowledge about the fetcher.
Diffstat (limited to 'content')
-rw-r--r-- | content/fetchers/about.c | 123 |
1 files changed, 75 insertions, 48 deletions
diff --git a/content/fetchers/about.c b/content/fetchers/about.c index 78f22df01..81ff2e153 100644 --- a/content/fetchers/about.c +++ b/content/fetchers/about.c @@ -16,9 +16,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* about: URL handling. +/* about: URL handling. * - * Based on the data fetcher by Rob Kendrick + * Based on the data fetcher by Rob Kendrick * This fetcher provides a simple scheme for the user to access * information from the browser from a known, fixed URL. */ @@ -198,7 +198,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) msg.data.header_or_data.buf = (const uint8_t *) buffer; /* page head */ - slen = snprintf(buffer, sizeof buffer, + slen = snprintf(buffer, sizeof buffer, "<html>\n<head>\n" "<title>NetSurf Browser Image Cache Status</title>\n" "<link rel=\"stylesheet\" type=\"text/css\" " @@ -215,7 +215,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) goto fetch_about_imagecache_handler_aborted; /* image cache summary */ - slen = image_cache_snsummaryf(buffer, sizeof(buffer), + slen = image_cache_snsummaryf(buffer, sizeof(buffer), "<p>Configured limit of %a hysteresis of %b</p>\n" "<p>Total bitmap size in use %c (in %d)</p>\n" "<p>Age %es</p>\n" @@ -224,7 +224,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) "<p>Cache total/hit/miss/fail (counts) %j/%k/%l/%m " "(%pj%%/%pk%%/%pl%%/%pm%%)</p>\n" "<p>Cache total/hit/miss/fail (size) %n/%o/%q/%r " - "(%pn%%/%po%%/%pq%%/%pr%%)</p>\n" + "(%pn%%/%po%%/%pq%%/%pr%%)</p>\n" "<p>Total images never rendered: %s " "(includes %t that were converted)</p>\n" "<p>Total number of excessive conversions: %u " @@ -232,7 +232,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) "</p>\n" "<p>Bitmap of size %w had most (%x) conversions</p>\n" "<h2>Current image cache contents</h2>\n"); - if (slen >= (int) (sizeof(buffer))) + if (slen >= (int) (sizeof(buffer))) goto fetch_about_imagecache_handler_aborted; /* overflow */ msg.data.header_or_data.len = slen; @@ -241,7 +241,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) /* image cache entry table */ - slen = snprintf(buffer, sizeof buffer, + slen = snprintf(buffer, sizeof buffer, "<p class=\"imagecachelist\">\n" "<strong>" "<span>Entry</span>" @@ -266,7 +266,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) "<span>%s</span>" "<span>%o</span>" "</a>\n"); - if (res <= 0) + if (res <= 0) break; /* last option */ if (res >= (int) (sizeof buffer - slen)) { @@ -282,7 +282,7 @@ static bool fetch_about_imagecache_handler(struct fetch_about_context *ctx) } } while (res > 0); - slen += snprintf(buffer + slen, sizeof buffer - slen, + slen += snprintf(buffer + slen, sizeof buffer - slen, "</p>\n</body>\n</html>\n"); msg.data.header_or_data.len = slen; @@ -307,6 +307,9 @@ static bool fetch_about_config_handler(struct fetch_about_context *ctx) int slen; unsigned int opt_loop = 0; int res = 0; + lwc_string *path; + url_func_result status; + /* content is going to return ok */ fetch_set_http_code(ctx->fetchh, code); @@ -318,7 +321,8 @@ static bool fetch_about_config_handler(struct fetch_about_context *ctx) msg.type = FETCH_DATA; msg.data.header_or_data.buf = (const uint8_t *) buffer; - slen = snprintf(buffer, sizeof buffer, +#define NS_WITH_INTERACTIVE_ABOUT_CONFIG 1 + slen = snprintf(buffer, sizeof buffer, "<html>\n<head>\n" "<title>NetSurf Browser Config</title>\n" "<link rel=\"stylesheet\" type=\"text/css\" " @@ -330,14 +334,23 @@ static bool fetch_about_config_handler(struct fetch_about_context *ctx) "<img src=\"resource:netsurf.png\" alt=\"NetSurf\"></a>" "</p>\n" "<h1>NetSurf Browser Config</h1>\n" +#ifdef NS_WITH_INTERACTIVE_ABOUT_CONFIG + "<form action=\"about:config\" method=\"GET\">" +#endif "<table class=\"config\">\n" "<tr><th></th><th></th><th></th></tr>\n"); do { +#ifdef NS_WITH_INTERACTIVE_ABOUT_CONFIG + res = nsoption_snoptionf(buffer + slen, sizeof buffer - slen, + opt_loop, + "<tr><th>%k</th><td>%t</td><td>%I</td></tr>\n"); +#else res = nsoption_snoptionf(buffer + slen, sizeof buffer - slen, opt_loop, "<tr><th>%k</th><td>%t</td><td>%V</td></tr>\n"); - if (res <= 0) +#endif + if (res <= 0) break; /* last option */ if (res >= (int) (sizeof buffer - slen)) { @@ -353,8 +366,22 @@ static bool fetch_about_config_handler(struct fetch_about_context *ctx) } } while (res > 0); - slen += snprintf(buffer + slen, sizeof buffer - slen, +#ifdef NS_WITH_INTERACTIVE_ABOUT_CONFIG + slen += snprintf(buffer + slen, sizeof buffer - slen, + "</table>\n"); + slen += snprintf(buffer + slen, sizeof buffer - slen, + "<br/><center>" + "<input type=\"hidden\" name=\"token\" value=\"\" />\n" + "<input type=\"submit\" name=\"action\" value=\"Save\" />\n" + "<input type=\"submit\" name=\"action\" value=\"Abort\" />\n" + "</center><br/>\n" + "</form>\n" "</table>\n</body>\n</html>\n"); +#else + slen += snprintf(buffer + slen, sizeof buffer - slen, + "</table>\n</body>\n</html>\n"); +#endif + msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) @@ -371,7 +398,7 @@ fetch_about_config_handler_aborted: /** Generate the text of a Choices file which represents the current - * in use options. + * in use options. */ static bool fetch_about_choices_handler(struct fetch_about_context *ctx) { @@ -392,15 +419,15 @@ static bool fetch_about_choices_handler(struct fetch_about_context *ctx) msg.type = FETCH_DATA; msg.data.header_or_data.buf = (const uint8_t *) buffer; - slen = snprintf(buffer, sizeof buffer, + slen = snprintf(buffer, sizeof buffer, "# Automatically generated current NetSurf browser Choices\n"); do { - res = nsoption_snoptionf(buffer + slen, - sizeof buffer - slen, - opt_loop, + res = nsoption_snoptionf(buffer + slen, + sizeof buffer - slen, + opt_loop, "%k:%v\n"); - if (res <= 0) + if (res <= 0) break; /* last option */ if (res >= (int) (sizeof buffer - slen)) { @@ -441,7 +468,7 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx) int code = 200; int slen; int i; - + /* content is going to return ok */ fetch_set_http_code(ctx->fetchh, code); @@ -453,14 +480,14 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx) msg.type = FETCH_DATA; msg.data.header_or_data.buf = (const uint8_t *) buffer; - slen = snprintf(buffer, sizeof buffer, + slen = snprintf(buffer, sizeof buffer, "# Automatically generated by NetSurf build system\n\n"); msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) goto fetch_about_testament_handler_aborted; - - slen = snprintf(buffer, sizeof buffer, + + slen = snprintf(buffer, sizeof buffer, #if defined(WT_BRANCHISTRUNK) || defined(WT_BRANCHISMASTER) "# This is a *DEVELOPMENT* build from the main line.\n\n" #elif defined(WT_BRANCHISTAG) && (WT_MODIFIED == 0) @@ -482,29 +509,29 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx) #endif ); - msg.data.header_or_data.len = slen; + msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) goto fetch_about_testament_handler_aborted; - - slen = snprintf(buffer, sizeof buffer, + + slen = snprintf(buffer, sizeof buffer, "Built by %s (%s) from %s at revision %s\n\n", GECOS, USERNAME, WT_BRANCHPATH, WT_REVID); msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) goto fetch_about_testament_handler_aborted; - - slen = snprintf(buffer, sizeof buffer, + + slen = snprintf(buffer, sizeof buffer, "Built on %s in %s\n\n", WT_HOSTNAME, WT_ROOT); msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) goto fetch_about_testament_handler_aborted; - + if (WT_MODIFIED > 0) { - slen = snprintf(buffer, sizeof buffer, + slen = snprintf(buffer, sizeof buffer, "Working tree has %d modification%s\n\n", WT_MODIFIED, WT_MODIFIED == 1 ? "" : "s"); } else { @@ -515,7 +542,7 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx) msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) goto fetch_about_testament_handler_aborted; - + for (i = 0; i < WT_MODIFIED; ++i) { slen = snprintf(buffer, sizeof buffer, " %s %s\n", @@ -524,10 +551,10 @@ static bool fetch_about_testament_handler(struct fetch_about_context *ctx) msg.data.header_or_data.len = slen; if (fetch_about_send_callback(&msg, ctx)) goto fetch_about_testament_handler_aborted; - + } - msg.type = FETCH_FINISHED; + msg.type = FETCH_FINISHED; fetch_about_send_callback(&msg, ctx); return true; @@ -602,15 +629,15 @@ struct about_handlers about_handler_list[] = { fetch_about_imagecache_handler, true }, /* The default blank page */ { "blank", SLEN("blank"), NULL, - fetch_about_blank_handler, true } + fetch_about_blank_handler, true } }; #define about_handler_list_len (sizeof(about_handler_list) / \ sizeof(struct about_handlers)) /** - * List all the valid about: paths available - * + * List all the valid about: paths available + * * \param ctx The fetch context. * \return true for sucess or false to generate an error. */ @@ -633,7 +660,7 @@ static bool fetch_about_about_handler(struct fetch_about_context *ctx) msg.type = FETCH_DATA; msg.data.header_or_data.buf = (const uint8_t *) buffer; - slen = snprintf(buffer, sizeof buffer, + slen = snprintf(buffer, sizeof buffer, "<html>\n<head>\n" "<title>NetSurf List of About pages</title>\n" "<link rel=\"stylesheet\" type=\"text/css\" " @@ -653,11 +680,11 @@ static bool fetch_about_about_handler(struct fetch_about_context *ctx) if (about_handler_list[abt_loop].hidden) continue; - res = snprintf(buffer + slen, sizeof buffer - slen, - "<li><a href=\"about:%s\">about:%s</a></li>\n", - about_handler_list[abt_loop].name, + res = snprintf(buffer + slen, sizeof buffer - slen, + "<li><a href=\"about:%s\">about:%s</a></li>\n", + about_handler_list[abt_loop].name, about_handler_list[abt_loop].name); - if (res <= 0) + if (res <= 0) break; /* last option */ if (res >= (int)(sizeof buffer - slen)) { @@ -672,7 +699,7 @@ static bool fetch_about_about_handler(struct fetch_about_context *ctx) } } - slen += snprintf(buffer + slen, sizeof buffer - slen, + slen += snprintf(buffer + slen, sizeof buffer - slen, "</ul>\n</body>\n</html>\n"); msg.data.header_or_data.len = slen; @@ -696,8 +723,8 @@ static bool fetch_about_initialise(lwc_string *scheme) lwc_error error; for (abt_loop = 0; abt_loop < about_handler_list_len; abt_loop++) { - error = lwc_intern_string(about_handler_list[abt_loop].name, - about_handler_list[abt_loop].name_len, + error = lwc_intern_string(about_handler_list[abt_loop].name, + about_handler_list[abt_loop].name_len, &about_handler_list[abt_loop].lname); if (error != lwc_error_ok) { while (abt_loop-- != 0) { @@ -744,15 +771,15 @@ fetch_about_setup(struct fetch *fetchh, path = nsurl_get_component(url, NSURL_PATH); - for (handler_loop = 0; - handler_loop < about_handler_list_len; + for (handler_loop = 0; + handler_loop < about_handler_list_len; handler_loop++) { ctx->handler = about_handler_list[handler_loop].handler; - if (lwc_string_isequal(path, - about_handler_list[handler_loop].lname, + if (lwc_string_isequal(path, + about_handler_list[handler_loop].lname, &match) == lwc_error_ok && match) { break; - } + } } if (path != NULL) |