From 06dc9838e0327c9472cbd3f353b40317eba0ecef Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Fri, 16 Sep 2011 13:53:35 -0400 Subject: [PATCH] Fix session race conditions when composing new messages --- CHANGELOG | 1 + program/steps/mail/attachments.inc | 2 +- program/steps/mail/compose.inc | 4 ++-- program/include/rcube_json_output.php | 1 + program/steps/mail/func.inc | 4 ++-- program/include/rcube_session.php | 6 +++--- program/steps/mail/sendmail.inc | 2 +- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a7d7522..f6ab58b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,7 @@ CHANGELOG Roundcube Webmail =========================== +- Fix session race conditions when composing new messages - Fix encoding of LDAP contacts identifiers (#1488079) - jQuery 1.6.4 - Make date/time format user configurable; drop 'date_today' config option diff --git a/program/include/rcube_json_output.php b/program/include/rcube_json_output.php index ade9cc0..e0a29c1 100644 --- a/program/include/rcube_json_output.php +++ b/program/include/rcube_json_output.php @@ -219,6 +219,7 @@ */ public function send() { + sleep(6); $this->remote_response(); exit; } diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php index c1d9b9c..27cf694 100644 --- a/program/include/rcube_session.php +++ b/program/include/rcube_session.php @@ -321,9 +321,9 @@ */ public function cleanup() { - // current compose information is stored in $_SESSION['compose'], move it to $_SESSION['compose_data'] - if ($_SESSION['compose']) { - $_SESSION['compose_data'][$_SESSION['compose']['id']] = $_SESSION['compose']; + // current compose information is stored in $_SESSION['compose'], move it to $_SESSION['compose_data_<ID>'] + if ($compose_id = $_SESSION['compose']['id']) { + $_SESSION['compose_data_'.$compose_id] = $_SESSION['compose']; $this->remove('compose'); } } diff --git a/program/steps/mail/attachments.inc b/program/steps/mail/attachments.inc index 4674034..ffb1642 100644 --- a/program/steps/mail/attachments.inc +++ b/program/steps/mail/attachments.inc @@ -25,7 +25,7 @@ } $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GPC); -$_SESSION['compose'] = $_SESSION['compose_data'][$COMPOSE_ID]; +$_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID]; if (!$_SESSION['compose']) { die("Invalid session var!"); diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 7e8a26f..4307c36 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -29,7 +29,7 @@ $MESSAGE = NULL; $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GET); -$_SESSION['compose'] = $_SESSION['compose_data'][$COMPOSE_ID]; +$_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID]; // Nothing below is called during message composition, only at "new/forward/reply/draft" initialization or // if a compose-ID is given (i.e. when the compose step is opened in a new window/tab). @@ -39,7 +39,7 @@ if ($COMPOSE_ID) raise_error(array('code' => 500, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Invalid session"), true, true); + 'message' => "Invalid compose ID"), true, true); $_SESSION['compose'] = array( 'id' => uniqid(mt_rand()), diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 98040e9..36b18ce 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1430,12 +1430,12 @@ */ function rcmail_compose_cleanup($id) { - if (!isset($_SESSION['compose_data'][$id])) + if (!isset($_SESSION['compose_data_'.$id])) return; $rcmail = rcmail::get_instance(); $rcmail->plugins->exec_hook('attachments_cleanup', array('group' => $id)); - unset($_SESSION['compose_data'][$id]); + $rcmail->session->remove('compose_data_'.$id); } diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index f81c152..7850859 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -27,7 +27,7 @@ $savedraft = !empty($_POST['_draft']) ? true : false; $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GPC); -$_SESSION['compose'] = $_SESSION['compose_data'][$COMPOSE_ID]; +$_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID]; /****** checks ********/ -- Gitblit v1.9.1