From df4dbaf4cfebf0b8b5ec9ae7d0bf6ae467609a4e Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Sat, 27 Jan 2007 20:58:20 +0000 Subject: Handle cookies in unverifiable transactions svn path=/trunk/netsurf/; revision=3151 --- desktop/browser.c | 84 ++++++++++++++++++++++++++++++++++++++----------------- desktop/browser.h | 21 +++++++------- desktop/frames.c | 30 ++++++++++++++++---- 3 files changed, 93 insertions(+), 42 deletions(-) (limited to 'desktop') diff --git a/desktop/browser.c b/desktop/browser.c index b3fe85127..f2ac0cde3 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -59,6 +59,11 @@ struct content browser_window_href_content; /** maximum frame depth */ #define FRAME_DEPTH 8 +static void browser_window_go_post(struct browser_window *bw, + const char *url, char *post_urlenc, + struct form_successful_control *post_multipart, + bool history_add, const char *referer, bool download, + bool verifiable); static void browser_window_callback(content_msg msg, struct content *c, intptr_t p1, intptr_t p2, union content_msg_data data); static void browser_window_refresh(void *p); @@ -111,12 +116,12 @@ static void browser_window_scroll_box(struct browser_window *bw, * * \param url URL to start fetching in the new window (copied) * \param clone The browser window to clone - * \param referer The referring uri + * \param referer The referring uri (copied), or 0 if none */ struct browser_window *browser_window_create(const char *url, struct browser_window *clone, - char *referer, bool history_add) + const char *referer, bool history_add) { struct browser_window *bw; @@ -153,6 +158,7 @@ struct browser_window *browser_window_create(const char *url, } if (url) browser_window_go(bw, url, referer, history_add); + return bw; } @@ -162,18 +168,40 @@ struct browser_window *browser_window_create(const char *url, * * \param bw browser window * \param url URL to start fetching (copied) - * \param referer the referring uri + * \param referer the referring uri (copied), or 0 if none * * Any existing fetches in the window are aborted. */ void browser_window_go(struct browser_window *bw, const char *url, - char* referer, bool history_add) + const char* referer, bool history_add) { - browser_window_go_post(bw, url, 0, 0, history_add, referer, false); + /* All fetches passing through here are verifiable + * (i.e are the result of user action) */ + browser_window_go_post(bw, url, 0, 0, history_add, referer, + false, true); } +/** + * Start fetching a page in a browser window. + * + * \param bw browser window + * \param url URL to start fetching (copied) + * \param referer the referring uri (copied), or 0 if none + * + * Any existing fetches in the window are aborted. + */ + +void browser_window_go_unverifiable(struct browser_window *bw, + const char *url, const char* referer, bool history_add) +{ + /* All fetches passing through here are unverifiable + * (i.e are not the result of user action) */ + browser_window_go_post(bw, url, 0, 0, history_add, referer, + false, false); +} + /** * Start fetching a page in a browser window, POSTing form data. * @@ -182,8 +210,9 @@ void browser_window_go(struct browser_window *bw, const char *url, * \param post_urlenc url encoded post data, or 0 if none * \param post_multipart multipart post data, or 0 if none * \param history_add add to window history - * \param referer the referring uri + * \param referer the referring uri (copied), or 0 if none * \param download download, rather than render the uri + * \param verifiable this transaction is verifiable * * Any existing fetches in the window are aborted. * @@ -196,7 +225,8 @@ void browser_window_go(struct browser_window *bw, const char *url, void browser_window_go_post(struct browser_window *bw, const char *url, char *post_urlenc, struct form_successful_control *post_multipart, - bool history_add, char *referer, bool download) + bool history_add, const char *referer, bool download, + bool verifiable) { struct content *c; char *url2; @@ -215,7 +245,7 @@ void browser_window_go_post(struct browser_window *bw, const char *url, for (cur = bw; cur->parent; cur = cur->parent) depth++; if (depth > FRAME_DEPTH) { - LOG(("frame depth too high.")); + LOG(("frame depth too high.")); return; } @@ -287,7 +317,7 @@ void browser_window_go_post(struct browser_window *bw, const char *url, bw->history_add = history_add; c = fetchcache(url2, browser_window_callback, (intptr_t) bw, 0, width, height, false, - post_urlenc, post_multipart, true, download); + post_urlenc, post_multipart, verifiable, download); free(url2); if (!c) { browser_window_set_status(bw, messages_get("NoMemory")); @@ -304,9 +334,9 @@ void browser_window_go_post(struct browser_window *bw, const char *url, } bw->download = download; - fetchcache_go(c, option_send_referer ? referer : 0, - browser_window_callback, (intptr_t) bw, 0, width, height, - post_urlenc, post_multipart, true); + fetchcache_go(c, referer, browser_window_callback, + (intptr_t) bw, 0, width, height, + post_urlenc, post_multipart, verifiable); } @@ -318,7 +348,6 @@ void browser_window_callback(content_msg msg, struct content *c, intptr_t p1, intptr_t p2, union content_msg_data data) { struct browser_window *bw = (struct browser_window *) p1; - char status[40]; char url[256]; switch (msg) { @@ -453,7 +482,7 @@ void browser_window_callback(content_msg msg, struct content *c, * referer across the redirect */ browser_window_go_post(bw, data.redirect, 0, 0, bw->history_add, bw->referer, - bw->download); + bw->download, false); break; case CONTENT_MSG_REFORMAT: @@ -462,7 +491,7 @@ void browser_window_callback(content_msg msg, struct content *c, /* reposition frames */ if (c->data.html.frameset) browser_window_recalculate_frameset(bw); - /* reflow iframe positions */ + /* reflow iframe positions */ if (c->data.html.iframe) browser_window_recalculate_iframes(bw); /* box tree may have changed, need to relabel */ @@ -586,7 +615,7 @@ void browser_window_refresh(void *p) bw->current_content->refresh))) history_add = false; - browser_window_go(bw, bw->current_content->refresh, + browser_window_go_unverifiable(bw, bw->current_content->refresh, bw->current_content->url, history_add); } @@ -759,7 +788,7 @@ void browser_window_reload(struct browser_window *bw, bool all) } bw->current_content->fresh = false; browser_window_go_post(bw, bw->current_content->url, 0, 0, - false, 0, false); + false, 0, false, true); } @@ -1413,7 +1442,7 @@ void browser_window_mouse_action_html(struct browser_window *bw, mouse & BROWSER_MOUSE_MOD_1) { /* force download of link */ browser_window_go_post(bw, url, 0, 0, false, - c->url, true); + c->url, true, true); } else if (mouse & BROWSER_MOUSE_CLICK_1) { bw = browser_window_find_target(bw, target); @@ -1426,7 +1455,8 @@ void browser_window_mouse_action_html(struct browser_window *bw, if (!browser_window_href_content.url) warn_user("NoMemory", 0); else - gui_window_save_as_link(bw->window, &browser_window_href_content); + gui_window_save_as_link(bw->window, + &browser_window_href_content); } else if (mouse & BROWSER_MOUSE_CLICK_2) { /* open link in new window */ browser_window_create(url, bw, c->url, true); @@ -2246,7 +2276,8 @@ void browser_form_submit(struct browser_window *bw, const char *target, warn_user("NoMemory", 0); return; } - url = calloc(1, strlen(form->action) + strlen(data) + 2); + url = calloc(1, strlen(form->action) + + strlen(data) + 2); if (!url) { form_free_successful(success); free(data); @@ -2259,8 +2290,8 @@ void browser_form_submit(struct browser_window *bw, const char *target, else { sprintf(url, "%s?%s", form->action, data); } - browser_window_go(bw_form, url, bw->current_content->url, - true); + browser_window_go(bw_form, url, + bw->current_content->url, true); break; case method_POST_URLENC: @@ -2272,13 +2303,14 @@ void browser_form_submit(struct browser_window *bw, const char *target, } browser_window_go_post(bw_form, form->action, data, 0, true, bw->current_content->url, - false); + false, true); break; case method_POST_MULTIPART: - browser_window_go_post(bw_form, form->action, 0, success, - true, bw->current_content->url, - false); + browser_window_go_post(bw_form, form->action, 0, + success, true, + bw->current_content->url, + false, true); break; default: diff --git a/desktop/browser.h b/desktop/browser.h index 8f0e74e89..941fc342d 100644 --- a/desktop/browser.h +++ b/desktop/browser.h @@ -123,11 +123,11 @@ struct browser_window { /** Window characteristics */ enum { - BROWSER_WINDOW_NORMAL, - BROWSER_WINDOW_IFRAME, - BROWSER_WINDOW_FRAME, - BROWSER_WINDOW_FRAMESET, - } browser_window_type; + BROWSER_WINDOW_NORMAL, + BROWSER_WINDOW_IFRAME, + BROWSER_WINDOW_FRAME, + BROWSER_WINDOW_FRAMESET, + } browser_window_type; /** frameset characteristics */ int rows; @@ -179,13 +179,12 @@ typedef enum { extern struct browser_window *current_redraw_browser; struct browser_window * browser_window_create(const char *url, - struct browser_window *clone, char *referer, bool history_add); + struct browser_window *clone, const char *referer, + bool history_add); void browser_window_go(struct browser_window *bw, const char *url, - char *referer, bool history_add); -void browser_window_go_post(struct browser_window *bw, const char *url, - char *post_urlenc, - struct form_successful_control *post_multipart, - bool history_add, char *referer, bool download); + const char *referer, bool history_add); +void browser_window_go_unverifiable(struct browser_window *bw, + const char *url, const char *referer, bool history_add); void browser_window_update(struct browser_window *bw, bool scroll_to_top); void browser_window_stop(struct browser_window *bw); void browser_window_reload(struct browser_window *bw, bool all); diff --git a/desktop/frames.c b/desktop/frames.c index 922ac01ab..f78928148 100644 --- a/desktop/frames.c +++ b/desktop/frames.c @@ -99,7 +99,8 @@ void browser_window_create_iframes(struct browser_window *bw, for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); if (cur->url) - browser_window_go(window, cur->url, NULL, true); + browser_window_go_unverifiable(window, cur->url, + bw->current_content->url, true); } } @@ -148,6 +149,7 @@ void browser_window_create_frameset(struct browser_window *bw, int row, col, index; struct content_html_frames *frame; struct browser_window *window; + const char *referer; assert(bw && frameset); @@ -174,9 +176,11 @@ void browser_window_create_frameset(struct browser_window *bw, /* window characteristics */ window->drag_type = DRAGGING_NONE; if (frame->children) - window->browser_window_type = BROWSER_WINDOW_FRAMESET; + window->browser_window_type = + BROWSER_WINDOW_FRAMESET; else - window->browser_window_type = BROWSER_WINDOW_FRAME; + window->browser_window_type = + BROWSER_WINDOW_FRAME; window->scrolling = frame->scrolling; window->border = frame->border; window->border_colour = frame->border_colour; @@ -212,6 +216,18 @@ void browser_window_create_frameset(struct browser_window *bw, } } + /* Use the URL of the first ancestor window containing html content + * as the referer */ + for (window = bw; window->parent; window = window->parent) { + if (window->current_content && + window->current_content->type == CONTENT_HTML) + break; + } + if (window->current_content) + referer = window->current_content->url; + else + referer = NULL; + /* 4. Launch content */ for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { @@ -219,8 +235,12 @@ void browser_window_create_frameset(struct browser_window *bw, frame = &frameset->children[index]; window = &bw->children[index]; - if (frame->url) - browser_window_go(window, frame->url, NULL, true); + if (frame->url) { + browser_window_go_unverifiable(window, + frame->url, + referer, + true); + } } } } -- cgit v1.2.3