From 3b0318ca3eea211c7d9bd4b5bd0300ae3e0897ef Mon Sep 17 00:00:00 2001 From: Aleksander Machniak <alec@alec.pl> Date: Sat, 31 Oct 2015 04:26:33 -0400 Subject: [PATCH] Fix race-condition in setting current page between list and getunread requests --- program/steps/mail/func.inc | 7 +++++-- program/js/app.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/program/js/app.js b/program/js/app.js index 27fe3a4..78df592 100644 --- a/program/js/app.js +++ b/program/js/app.js @@ -352,7 +352,7 @@ if (this.gui_objects.mailboxlist) { this.env.unread_counts = {}; this.gui_objects.folderlist = this.gui_objects.mailboxlist; - this.http_request('getunread'); + this.http_request('getunread', {_page: this.env.current_page}); } // init address book widget diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index e7b6940..672bbd2 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -78,11 +78,12 @@ // set current mailbox and some other vars in client environment $OUTPUT->set_env('mailbox', $mbox_name); $OUTPUT->set_env('pagesize', $RCMAIL->storage->get_pagesize()); + $OUTPUT->set_env('current_page', max(1, $_SESSION['page'])); $OUTPUT->set_env('delimiter', $delimiter); $OUTPUT->set_env('threading', $threading); $OUTPUT->set_env('threads', $threading || $RCMAIL->storage->get_capability('THREAD')); $OUTPUT->set_env('reply_all_mode', (int) $RCMAIL->config->get('reply_all_mode')); - $OUTPUT->set_env('preview_pane_mark_read', $RCMAIL->config->get('preview_pane_mark_read', 0)); + $OUTPUT->set_env('preview_pane_mark_read', (int) $RCMAIL->config->get('preview_pane_mark_read')); if ($RCMAIL->storage->get_capability('QUOTA')) { $OUTPUT->set_env('quota', true); @@ -163,7 +164,9 @@ $mbox = strlen($_SESSION['mbox']) ? $_SESSION['mbox'] : 'INBOX'; } - if ($RCMAIL->action == 'list') { + // we handle 'page' argument on 'list' and 'getunread' to prevent from + // race condition and unintentional page overwrite in session + if ($RCMAIL->action == 'list' || $RCMAIL->action == 'getunread') { if (!($page = intval($_GET['_page']))) { $page = $_SESSION['page'] ? $_SESSION['page'] : 1; } -- Gitblit v1.9.1