Store compose parameters in session and redirect to a unique URL
| | |
| | | CHANGELOG RoundCube Webmail |
| | | --------------------------- |
| | | |
| | | 2008/06/20 (thomasb) |
| | | ---------- |
| | | - Store compose parameters in session and redirect to a unique URL |
| | | |
| | | 2008/06/18 (thomasb) |
| | | ---------- |
| | | - Fixed CRAM-MD5 authentication (#1484819) |
| | |
| | | /* |
| | | +-------------------------------------------------------------------------+ |
| | | | RoundCube Webmail IMAP Client | |
| | | | Version 0.2-20080619 | |
| | | | Version 0.2-20080620 | |
| | | | | |
| | | | Copyright (C) 2005-2008, RoundCube Dev. - Switzerland | |
| | | | | |
| | |
| | | $_SERVER['REMOTE_ADDR'])); |
| | | |
| | | // send redirect |
| | | header("Location: {$RCMAIL->comm_path}"); |
| | | exit; |
| | | $OUTPUT->redirect(); |
| | | } |
| | | else { |
| | | $OUTPUT->show_message($IMAP->error_code == -1 ? 'imaperror' : 'loginfailed', 'warning'); |
| | |
| | | if (empty($RCMAIL->user->ID)) { |
| | | |
| | | if ($OUTPUT->ajax_call) |
| | | $OUTPUT->remote_response("setTimeout(\"location.href='\"+this.env.comm_path+\"'\", 2000);"); |
| | | $OUTPUT->redirect(array(), 2000); |
| | | |
| | | // check if installer is still active |
| | | if ($RCMAIL->config->get('enable_installer') && is_readable('./installer/index.php')) { |
| | |
| | | $task = 'mail'; |
| | | |
| | | $this->task = $task; |
| | | $this->comm_path = './?_task=' . $task; |
| | | $this->comm_path = $this->url(array('task' => $task)); |
| | | |
| | | if ($this->output) |
| | | $this->output->set_env('task', $task); |
| | |
| | | return preg_replace('/\x00/', '', $pass); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Build a valid URL to this instance of RoundCube |
| | | * |
| | | * @param mixed Either a string with the action or url parameters as key-value pairs |
| | | * @return string Valid application URL |
| | | */ |
| | | public function url($p) |
| | | { |
| | | if (!is_array($p)) |
| | | $p = array('action' => @func_get_arg(0)); |
| | | |
| | | $url = $p['task'] ? './?_task=' . $p['task'] : $this->comm_path; |
| | | unset($p['task']); |
| | | |
| | | foreach ($p as $par => $val) |
| | | $url .= sprintf('&%s=%s', urlencode($par), urlencode($val)); |
| | | |
| | | return $url; |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | { |
| | | $this->_expunge($mailbox, FALSE); |
| | | $this->_clear_messagecount($mailbox); |
| | | unset($this->uid_id_map[$mailbox]); |
| | | } |
| | | |
| | | // remove message ids from search set |
| | |
| | | } |
| | | |
| | | /** |
| | | * @ignore |
| | | * Issue command to set page title |
| | | * |
| | | * @param string New page title |
| | | */ |
| | | public function set_pagetitle($title) |
| | | { |
| | | $name = $this->config->get('product_name'); |
| | | $this->command('set_pagetitle', JQ(empty($name) ? $title : $name.' :: '.$title)); |
| | | $name = $this->config->get('product_name'); |
| | | $this->command('set_pagetitle', JQ(empty($name) ? $title : $name.' :: '.$title)); |
| | | } |
| | | |
| | | /** |
| | |
| | | $this->commands = array(); |
| | | } |
| | | |
| | | /** |
| | | * Redirect to a certain url |
| | | * |
| | | * @param mixed Either a string with the action or url parameters as key-value pairs |
| | | * @see rcmail::url() |
| | | */ |
| | | public function redirect($p = array(), $delay = 0) |
| | | { |
| | | $location = rcmail::get_instance()->url($p); |
| | | $this->remote_response("window.setTimeout(\"location.href='{$location}'\", $delay);"); |
| | | exit; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Send an AJAX response to the client. |
| | |
| | | * @uses self::$js_commands |
| | | * @uses self::$object_handlers |
| | | */ |
| | | public public function reset() |
| | | public function reset() |
| | | { |
| | | $this->env = array(); |
| | | $this->js_env = array(); |
| | |
| | | |
| | | |
| | | /** |
| | | * Redirect to a certain url |
| | | * |
| | | * @param mixed Either a string with the action or url parameters as key-value pairs |
| | | * @see rcmail::url() |
| | | */ |
| | | public function redirect($p = array()) |
| | | { |
| | | $location = $this->app->url($p); |
| | | header('Location: ' . $location); |
| | | exit; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Send the request output to the client. |
| | | * This will either parse a skin tempalte or send an AJAX response |
| | | * |
| | |
| | | if (!is_array($_SESSION['compose']) || $_SESSION['compose']['id'] != get_input_value('_id', RCUBE_INPUT_GET)) |
| | | { |
| | | rcmail_compose_cleanup(); |
| | | $_SESSION['compose'] = array('id' => uniqid(rand())); |
| | | $_SESSION['compose'] = array('id' => uniqid(rand()), 'param' => array_map('strip_tags', $_GET)); |
| | | |
| | | // redirect to a unique URL with all parameters stored in session |
| | | $OUTPUT->redirect(array('_action' => 'compose', '_id' => $_SESSION['compose']['id'])); |
| | | } |
| | | |
| | | // add some labels to client |
| | |
| | | |
| | | |
| | | // get reference message and set compose mode |
| | | if ($msg_uid = get_input_value('_reply_uid', RCUBE_INPUT_GET)) |
| | | if ($msg_uid = $_SESSION['compose']['param']['_reply_uid']) |
| | | $compose_mode = RCUBE_COMPOSE_REPLY; |
| | | else if ($msg_uid = get_input_value('_forward_uid', RCUBE_INPUT_GET)) |
| | | else if ($msg_uid = $_SESSION['compose']['param']['_forward_uid']) |
| | | $compose_mode = RCUBE_COMPOSE_FORWARD; |
| | | else if ($msg_uid = get_input_value('_draft_uid', RCUBE_INPUT_GET)) |
| | | else if ($msg_uid = $_SESSION['compose']['param']['_draft_uid']) |
| | | $compose_mode = RCUBE_COMPOSE_DRAFT; |
| | | |
| | | if (!empty($msg_uid)) |
| | |
| | | $_SESSION['compose']['reply_msgid'] = $MESSAGE->headers->messageID; |
| | | $_SESSION['compose']['references'] = trim($MESSAGE->headers->references . " " . $MESSAGE->headers->messageID); |
| | | |
| | | if (!empty($_GET['_all'])) |
| | | if (!empty($_SESSION['compose']['param']['_all'])) |
| | | $MESSAGE->reply_all = 1; |
| | | } |
| | | else if ($compose_mode == RCUBE_COMPOSE_FORWARD) |
| | |
| | | $header = 'to'; |
| | | |
| | | // we have a set of recipients stored is session |
| | | if (($mailto_id = get_input_value('_mailto', RCUBE_INPUT_GET)) && $_SESSION['mailto'][$mailto_id]) |
| | | if (($mailto_id = $_SESSION['compose']['param']['_mailto']) && $_SESSION['mailto'][$mailto_id]) |
| | | $fvalue = $_SESSION['mailto'][$mailto_id]; |
| | | else if (!empty($_GET['_to'])) |
| | | $fvalue = get_input_value('_to', RCUBE_INPUT_GET); |
| | | else if (!empty($_SESSION['compose']['param']['_to'])) |
| | | $fvalue = $_SESSION['compose']['param']['_to']; |
| | | |
| | | case 'cc': |
| | | if (!$fname) |
| | |
| | | if ($olddraftmessageid) |
| | | { |
| | | // delete previous saved draft |
| | | $a_deleteid = $IMAP->search($CONFIG['drafts_mbox'],'HEADER Message-ID',$olddraftmessageid); |
| | | $deleted = $IMAP->delete_message($IMAP->get_uid($a_deleteid[0],$CONFIG['drafts_mbox']),$CONFIG['drafts_mbox']); |
| | | $a_deleteid = $IMAP->search($CONFIG['drafts_mbox'], 'HEADER Message-ID', $olddraftmessageid); |
| | | $deleted = $IMAP->delete_message($IMAP->get_uid($a_deleteid[0], $CONFIG['drafts_mbox']), $CONFIG['drafts_mbox']); |
| | | |
| | | // raise error if deletion of old draft failed |
| | | if (!$deleted) |
| | |
| | | |
| | | if ($savedraft) |
| | | { |
| | | $msgid = strtr($message_id, array('>' => '', '<' => '')); |
| | | |
| | | // remember new draft-uid |
| | | $draftids = $IMAP->search($CONFIG['drafts_mbox'], 'HEADER Message-ID', $msgid); |
| | | $_SESSION['compose']['param']['_draft_uid'] = $IMAP->get_uid($draftids[0], $CONFIG['drafts_mbox']); |
| | | |
| | | // display success |
| | | $OUTPUT->show_message('messagesaved', 'confirmation'); |
| | | |
| | | // update "_draft_saveid" and the "cmp_hash" to prevent "Unsaved changes" warning |
| | | $OUTPUT->command('set_draft_id', str_replace(array('<','>'), "", $message_id)); |
| | | $OUTPUT->command('set_draft_id', $msgid); |
| | | $OUTPUT->command('compose_field_hash', true); |
| | | |
| | | // start the auto-save timer again |