Fix session race conditions when composing new messages

release-0.7
thomascube 13 years ago
parent 612eeca739
commit 06dc9838e0

@ -1,6 +1,7 @@
CHANGELOG Roundcube Webmail CHANGELOG Roundcube Webmail
=========================== ===========================
- Fix session race conditions when composing new messages
- Fix encoding of LDAP contacts identifiers (#1488079) - Fix encoding of LDAP contacts identifiers (#1488079)
- jQuery 1.6.4 - jQuery 1.6.4
- Make date/time format user configurable; drop 'date_today' config option - Make date/time format user configurable; drop 'date_today' config option

@ -219,6 +219,7 @@ class rcube_json_output
*/ */
public function send() public function send()
{ {
sleep(6);
$this->remote_response(); $this->remote_response();
exit; exit;
} }

@ -321,9 +321,9 @@ class rcube_session
*/ */
public function cleanup() public function cleanup()
{ {
// current compose information is stored in $_SESSION['compose'], move it to $_SESSION['compose_data'] // current compose information is stored in $_SESSION['compose'], move it to $_SESSION['compose_data_<ID>']
if ($_SESSION['compose']) { if ($compose_id = $_SESSION['compose']['id']) {
$_SESSION['compose_data'][$_SESSION['compose']['id']] = $_SESSION['compose']; $_SESSION['compose_data_'.$compose_id] = $_SESSION['compose'];
$this->remove('compose'); $this->remove('compose');
} }
} }

@ -25,7 +25,7 @@ if (!empty($_GET['_progress'])) {
} }
$COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GPC); $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']) { if (!$_SESSION['compose']) {
die("Invalid session var!"); die("Invalid session var!");

@ -29,7 +29,7 @@ $MESSAGE_FORM = NULL;
$MESSAGE = NULL; $MESSAGE = NULL;
$COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GET); $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 // 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). // if a compose-ID is given (i.e. when the compose step is opened in a new window/tab).
@ -39,7 +39,7 @@ if (!is_array($_SESSION['compose']))
if ($COMPOSE_ID) if ($COMPOSE_ID)
raise_error(array('code' => 500, 'type' => 'php', raise_error(array('code' => 500, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__,
'message' => "Invalid session"), true, true); 'message' => "Invalid compose ID"), true, true);
$_SESSION['compose'] = array( $_SESSION['compose'] = array(
'id' => uniqid(mt_rand()), 'id' => uniqid(mt_rand()),

@ -1430,12 +1430,12 @@ function rcmail_message_part_frame($attrib)
*/ */
function rcmail_compose_cleanup($id) function rcmail_compose_cleanup($id)
{ {
if (!isset($_SESSION['compose_data'][$id])) if (!isset($_SESSION['compose_data_'.$id]))
return; return;
$rcmail = rcmail::get_instance(); $rcmail = rcmail::get_instance();
$rcmail->plugins->exec_hook('attachments_cleanup', array('group' => $id)); $rcmail->plugins->exec_hook('attachments_cleanup', array('group' => $id));
unset($_SESSION['compose_data'][$id]); $rcmail->session->remove('compose_data_'.$id);
} }

@ -27,7 +27,7 @@ $OUTPUT->framed = TRUE;
$savedraft = !empty($_POST['_draft']) ? true : false; $savedraft = !empty($_POST['_draft']) ? true : false;
$COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GPC); $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GPC);
$_SESSION['compose'] = $_SESSION['compose_data'][$COMPOSE_ID]; $_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID];
/****** checks ********/ /****** checks ********/

Loading…
Cancel
Save