| | |
| | | $this->output->set_charset(RCMAIL_CHARSET); |
| | | |
| | | // add some basic labels to client |
| | | $this->output->add_label('loading', 'servererror'); |
| | | $this->output->add_label('loading', 'servererror', 'requesttimedout'); |
| | | |
| | | return $this->output; |
| | | } |
| | |
| | | */ |
| | | public function session_init() |
| | | { |
| | | // session started (Installer?) |
| | | if (session_id()) |
| | | return; |
| | | |
| | | $sess_name = $this->config->get('session_name'); |
| | | $sess_domain = $this->config->get('session_domain'); |
| | | $lifetime = $this->config->get('session_lifetime', 0) * 60; |
| | | |
| | | // set session domain |
| | | if ($sess_domain) { |
| | | ini_set('session.cookie_domain', $sess_domain); |
| | | } |
| | | // set session garbage collecting time according to session_lifetime |
| | | if ($lifetime) { |
| | | ini_set('session.gc_maxlifetime', $lifetime * 2); |
| | | } |
| | | |
| | | ini_set('session.cookie_secure', rcube_utils::https_check()); |
| | | ini_set('session.name', $sess_name ? $sess_name : 'roundcube_sessid'); |
| | | ini_set('session.use_cookies', 1); |
| | | ini_set('session.use_only_cookies', 1); |
| | | ini_set('session.serialize_handler', 'php'); |
| | | |
| | | // use database for storing session data |
| | | $this->session = new rcube_session($this->get_dbh(), $this->config); |
| | | |
| | | $this->session->register_gc_handler(array($this, 'temp_gc')); |
| | | $this->session->register_gc_handler(array($this, 'cache_gc')); |
| | | |
| | | // start PHP session (if not in CLI mode) |
| | | if ($_SERVER['REMOTE_ADDR']) |
| | | session_start(); |
| | | parent::session_init(); |
| | | |
| | | // set initial session vars |
| | | if (!$_SESSION['user_id']) |
| | |
| | | // restore skin selection after logout |
| | | if ($_SESSION['temp'] && !empty($_SESSION['skin'])) |
| | | $this->config->set('skin', $_SESSION['skin']); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Configure session object internals |
| | | */ |
| | | public function session_configure() |
| | | { |
| | | if (!$this->session) |
| | | return; |
| | | |
| | | $lifetime = $this->config->get('session_lifetime', 0) * 60; |
| | | |
| | | // set keep-alive/check-recent interval |
| | | if ($keep_alive = $this->config->get('keep_alive')) { |
| | | // be sure that it's less than session lifetime |
| | | if ($lifetime) |
| | | $keep_alive = min($keep_alive, $lifetime - 30); |
| | | $keep_alive = max(60, $keep_alive); |
| | | $this->session->set_keep_alive($keep_alive); |
| | | } |
| | | |
| | | $this->session->set_secret($this->config->get('des_key') . $_SERVER['HTTP_USER_AGENT']); |
| | | $this->session->set_ip_check($this->config->get('ip_check')); |
| | | } |
| | | |
| | | |
| | |
| | | $_SESSION['storage_port'] = $port; |
| | | $_SESSION['storage_ssl'] = $ssl; |
| | | $_SESSION['password'] = $this->encrypt($pass); |
| | | $_SESSION['login_time'] = mktime(); |
| | | $_SESSION['login_time'] = time(); |
| | | |
| | | if (isset($_REQUEST['_timezone']) && $_REQUEST['_timezone'] != '_default_') |
| | | $_SESSION['timezone'] = floatval($_REQUEST['_timezone']); |
| | |
| | | if (!empty($_SESSION['preferences'])) { |
| | | $this->user->save_prefs(unserialize($_SESSION['preferences'])); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Garbage collector for cache entries. |
| | | * Set flag to expunge caches on shutdown |
| | | */ |
| | | function cache_gc() |
| | | { |
| | | // because this gc function is called before storage is initialized, |
| | | // we just set a flag to expunge storage cache on shutdown. |
| | | $this->expunge_cache = true; |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | |
| | | /** |
| | | * Garbage collector function for temp files. |
| | | * Remove temp files older than two days |
| | | */ |
| | | public function temp_gc() |
| | | { |
| | | $tmp = unslashify($this->config->get('temp_dir')); |
| | | $expire = mktime() - 172800; // expire in 48 hours |
| | | |
| | | if ($tmp && ($dir = opendir($tmp))) { |
| | | while (($fname = readdir($dir)) !== false) { |
| | | if ($fname{0} == '.') { |
| | | continue; |
| | | } |
| | | |
| | | if (filemtime($tmp.'/'.$fname) < $expire) { |
| | | @unlink($tmp.'/'.$fname); |
| | | } |
| | | } |
| | | |
| | | closedir($dir); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Create a HTML table based on the given data |
| | | * |
| | | * @param array Named table attributes |
| | |
| | | $attrib = $hook['attribs']; |
| | | |
| | | if ($type == 'select') { |
| | | $attrib['is_escaped'] = true; |
| | | $select = new html_select($attrib); |
| | | |
| | | // add no-selection option |
| | | if ($attrib['noselection']) { |
| | | $select->add($rcmail->gettext($attrib['noselection']), ''); |
| | | $select->add(html::quote($rcmail->gettext($attrib['noselection'])), ''); |
| | | } |
| | | |
| | | $rcmail->render_folder_tree_select($a_mailboxes, $mbox_name, $attrib['maxlength'], $select, $attrib['realnames']); |
| | |
| | | */ |
| | | public function folder_selector($p = array()) |
| | | { |
| | | $p += array('maxlength' => 100, 'realnames' => false); |
| | | $p += array('maxlength' => 100, 'realnames' => false, 'is_escaped' => true); |
| | | $a_mailboxes = array(); |
| | | $storage = $this->get_storage(); |
| | | |
| | |
| | | $select = new html_select($p); |
| | | |
| | | if ($p['noselection']) { |
| | | $select->add($p['noselection'], ''); |
| | | $select->add(html::quote($p['noselection']), ''); |
| | | } |
| | | |
| | | $this->render_folder_tree_select($a_mailboxes, $mbox, $p['maxlength'], $select, $p['realnames'], 0, $p); |
| | |
| | | if ($maxlength && $maxlength > 1) { |
| | | $foldername = abbreviate_string($foldername, $maxlength); |
| | | } |
| | | } |
| | | |
| | | $select->add(str_repeat(' ', $nestLevel*4) . $foldername, $folder['id']); |
| | | $select->add(str_repeat(' ', $nestLevel*4) . html::quote($foldername), $folder['id']); |
| | | |
| | | if (!empty($folder['folders'])) { |
| | | $out .= $this->render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, |
| | | $select, $realnames, $nestLevel+1, $opts); |
| | | } |
| | | if (!empty($folder['folders'])) { |
| | | $out .= $this->render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, |
| | | $select, $realnames, $nestLevel+1, $opts); |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | rcube_utils::setcookie($name, $value, $exp); |
| | | } |
| | | |
| | | public function imap_connect() |
| | | { |
| | | return $this->storage_connect(); |
| | | } |
| | | |
| | | /** |
| | | * Connect to the mail storage server with stored session data |
| | | * |
| | | * @return bool True on success, False on error |
| | | */ |
| | | public function storage_connect() |
| | | { |
| | | $storage = $this->get_storage(); |
| | | |
| | | if ($_SESSION['storage_host'] && !$storage->is_connected()) { |
| | | $host = $_SESSION['storage_host']; |
| | | $user = $_SESSION['username']; |
| | | $port = $_SESSION['storage_port']; |
| | | $ssl = $_SESSION['storage_ssl']; |
| | | $pass = $this->decrypt($_SESSION['password']); |
| | | |
| | | if (!$storage->connect($host, $user, $pass, $port, $ssl)) { |
| | | if (is_object($this->output)) { |
| | | $error = $storage->get_error_code() == -1 ? 'storageerror' : 'sessionerror'; |
| | | $this->output->show_message($error, 'error'); |
| | | } |
| | | } |
| | | else { |
| | | $this->set_storage_prop(); |
| | | return $storage->is_connected(); |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | } |