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