From 59478e06c25303a790a0840ab2ac30662c4ef781 Mon Sep 17 00:00:00 2001 From: Hugues Hiegel Date: Tue, 5 Aug 2014 16:46:22 +0200 Subject: c'est la merde.. --- program/lib/Roundcube/rcube.php | 302 ++++------------------------------------ 1 file changed, 27 insertions(+), 275 deletions(-) (limited to 'program/lib/Roundcube/rcube.php') diff --git a/program/lib/Roundcube/rcube.php b/program/lib/Roundcube/rcube.php index d9c3dd8b9..7329b09fb 100644 --- a/program/lib/Roundcube/rcube.php +++ b/program/lib/Roundcube/rcube.php @@ -99,20 +99,20 @@ class rcube protected $texts; protected $caches = array(); protected $shutdown_functions = array(); + protected $expunge_cache = false; /** * This implements the 'singleton' design pattern * * @param integer Options to initialize with this instance. See rcube::INIT_WITH_* constants - * @param string Environment name to run (e.g. live, dev, test) * * @return rcube The one and only instance */ - static function get_instance($mode = 0, $env = '') + static function get_instance($mode = 0) { if (!self::$instance) { - self::$instance = new rcube($env); + self::$instance = new rcube(); self::$instance->init($mode); } @@ -123,10 +123,10 @@ class rcube /** * Private constructor */ - protected function __construct($env = '') + protected function __construct() { // load configuration - $this->config = new rcube_config($env); + $this->config = new rcube_config; $this->plugins = new rcube_dummy_plugin_api; register_shutdown_function(array($this, 'shutdown')); @@ -257,39 +257,6 @@ class rcube } - /** - * Initialize and get shared cache object - * - * @param string $name Cache identifier - * @param bool $packed Enables/disables data serialization - * - * @return rcube_cache_shared Cache object - */ - public function get_cache_shared($name, $packed=true) - { - $shared_name = "shared_$name"; - - if (!array_key_exists($shared_name, $this->caches)) { - $opt = strtolower($name) . '_cache'; - $type = $this->config->get($opt); - $ttl = $this->config->get($opt . '_ttl'); - - if (!$type) { - // cache is disabled - return $this->caches[$shared_name] = null; - } - - if ($ttl === null) { - $ttl = $this->config->get('shared_cache_ttl', '10d'); - } - - $this->caches[$shared_name] = new rcube_cache_shared($type, $name, $ttl, $packed); - } - - return $this->caches[$shared_name]; - } - - /** * Create SMTP object and connect to server * @@ -378,7 +345,6 @@ class rcube 'auth_pw' => $this->config->get("{$driver}_auth_pw"), 'debug' => (bool) $this->config->get("{$driver}_debug"), 'force_caps' => (bool) $this->config->get("{$driver}_force_caps"), - 'disabled_caps' => $this->config->get("{$driver}_disabled_caps"), 'timeout' => (int) $this->config->get("{$driver}_timeout"), 'skip_deleted' => (bool) $this->config->get('skip_deleted'), 'driver' => $driver, @@ -458,12 +424,15 @@ class rcube 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'); ini_set('session.cookie_httponly', 1); // use database for storing session data $this->session = new rcube_session($this->get_dbh(), $this->config); - $this->session->register_gc_handler(array($this, 'gc')); + $this->session->register_gc_handler(array($this, 'temp_gc')); + $this->session->register_gc_handler(array($this, 'cache_gc')); + $this->session->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME'])); $this->session->set_ip_check($this->config->get('ip_check')); @@ -473,47 +442,27 @@ class rcube // start PHP session (if not in CLI mode) if ($_SERVER['REMOTE_ADDR']) { - $this->session->start(); + session_start(); } } - /** - * Garbage collector - cache/temp cleaner - */ - public function gc() - { - rcube_cache::gc(); - rcube_cache_shared::gc(); - $this->get_storage()->cache_gc(); - - $this->gc_temp(); - } - - /** * Garbage collector function for temp files. * Remove temp files older than two days */ - public function gc_temp() + public function temp_gc() { $tmp = unslashify($this->config->get('temp_dir')); - - // expire in 48 hours by default - $temp_dir_ttl = $this->config->get('temp_dir_ttl', '48h'); - $temp_dir_ttl = get_offset_sec($temp_dir_ttl); - if ($temp_dir_ttl < 6*3600) - $temp_dir_ttl = 6*3600; // 6 hours sensible lower bound. - - $expire = time() - $temp_dir_ttl; + $expire = time() - 172800; // expire in 48 hours if ($tmp && ($dir = opendir($tmp))) { while (($fname = readdir($dir)) !== false) { - if ($fname[0] == '.') { + if ($fname{0} == '.') { continue; } - if (@filemtime($tmp.'/'.$fname) < $expire) { + if (filemtime($tmp.'/'.$fname) < $expire) { @unlink($tmp.'/'.$fname); } } @@ -524,21 +473,14 @@ class rcube /** - * Runs garbage collector with probability based on - * session settings. This is intended for environments - * without a session. + * Garbage collector for cache entries. + * Set flag to expunge caches on shutdown */ - public function gc_run() + public function cache_gc() { - $probability = (int) ini_get('session.gc_probability'); - $divisor = (int) ini_get('session.gc_divisor'); - - if ($divisor > 0 && $probability > 0) { - $random = mt_rand(1, $divisor); - if ($random <= $probability) { - $this->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; } @@ -797,7 +739,7 @@ class rcube mcrypt_module_close($td); } else { - @include_once 'des.inc'; + // @include_once 'des.inc'; (not shipped with this distribution) if (function_exists('des')) { $des_iv_size = 8; @@ -852,7 +794,7 @@ class rcube mcrypt_module_close($td); } else { - @include_once 'des.inc'; + // @include_once 'des.inc'; (not shipped with this distribution) if (function_exists('des')) { $des_iv_size = 8; @@ -922,14 +864,6 @@ class rcube call_user_func($function); } - // write session data as soon as possible and before - // closing database connection, don't do this before - // registered shutdown functions, they may need the session - // Note: this will run registered gc handlers (ie. cache gc) - if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) { - $this->session->write_close(); - } - if (is_object($this->smtp)) { $this->smtp->disconnect(); } @@ -941,6 +875,9 @@ class rcube } if (is_object($this->storage)) { + if ($this->expunge_cache) { + $this->storage->expunge_cache(); + } $this->storage->close(); } } @@ -1132,8 +1069,8 @@ class rcube * - code: Error code (required) * - type: Error type [php|db|imap|javascript] (required) * - message: Error message - * - file: File where error occured - * - line: Line where error occured + * - file: File where error occurred + * - line: Line where error occurred * @param boolean True to log the error * @param boolean Terminate script execution */ @@ -1359,191 +1296,6 @@ class rcube } } - /** - * Unique Message-ID generator. - * - * @return string Message-ID - */ - public function gen_message_id() - { - $local_part = md5(uniqid('rcube'.mt_rand(), true)); - $domain_part = $this->user->get_username('domain'); - - // Try to find FQDN, some spamfilters doesn't like 'localhost' (#1486924) - if (!preg_match('/\.[a-z]+$/i', $domain_part)) { - foreach (array($_SERVER['HTTP_HOST'], $_SERVER['SERVER_NAME']) as $host) { - $host = preg_replace('/:[0-9]+$/', '', $host); - if ($host && preg_match('/\.[a-z]+$/i', $host)) { - $domain_part = $host; - } - } - } - - return sprintf('<%s@%s>', $local_part, $domain_part); - } - - /** - * Send the given message using the configured method. - * - * @param object $message Reference to Mail_MIME object - * @param string $from Sender address string - * @param array $mailto Array of recipient address strings - * @param array $error SMTP error array (reference) - * @param string $body_file Location of file with saved message body (reference), - * used when delay_file_io is enabled - * @param array $options SMTP options (e.g. DSN request) - * - * @return boolean Send status. - */ - public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null) - { - $plugin = $this->plugins->exec_hook('message_before_send', array( - 'message' => $message, - 'from' => $from, - 'mailto' => $mailto, - 'options' => $options, - )); - - if ($plugin['abort']) { - return isset($plugin['result']) ? $plugin['result'] : false; - } - - $from = $plugin['from']; - $mailto = $plugin['mailto']; - $options = $plugin['options']; - $message = $plugin['message']; - $headers = $message->headers(); - - // send thru SMTP server using custom SMTP library - if ($this->config->get('smtp_server')) { - // generate list of recipients - $a_recipients = array($mailto); - - if (strlen($headers['Cc'])) - $a_recipients[] = $headers['Cc']; - if (strlen($headers['Bcc'])) - $a_recipients[] = $headers['Bcc']; - - // clean Bcc from header for recipients - $send_headers = $headers; - unset($send_headers['Bcc']); - // here too, it because txtHeaders() below use $message->_headers not only $send_headers - unset($message->_headers['Bcc']); - - $smtp_headers = $message->txtHeaders($send_headers, true); - - if ($message->getParam('delay_file_io')) { - // use common temp dir - $temp_dir = $this->config->get('temp_dir'); - $body_file = tempnam($temp_dir, 'rcmMsg'); - if (PEAR::isError($mime_result = $message->saveMessageBody($body_file))) { - self::raise_error(array('code' => 650, 'type' => 'php', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Could not create message: ".$mime_result->getMessage()), - TRUE, FALSE); - return false; - } - $msg_body = fopen($body_file, 'r'); - } - else { - $msg_body = $message->get(); - } - - // send message - if (!is_object($this->smtp)) { - $this->smtp_init(true); - } - - $sent = $this->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $options); - $response = $this->smtp->get_response(); - $error = $this->smtp->get_error(); - - // log error - if (!$sent) { - self::raise_error(array('code' => 800, 'type' => 'smtp', - 'line' => __LINE__, 'file' => __FILE__, - 'message' => "SMTP error: ".join("\n", $response)), TRUE, FALSE); - } - } - // send mail using PHP's mail() function - else { - // unset some headers because they will be added by the mail() function - $headers_enc = $message->headers($headers); - $headers_php = $message->_headers; - unset($headers_php['To'], $headers_php['Subject']); - - // reset stored headers and overwrite - $message->_headers = array(); - $header_str = $message->txtHeaders($headers_php); - - // #1485779 - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - if (preg_match_all('/<([^@]+@[^>]+)>/', $headers_enc['To'], $m)) { - $headers_enc['To'] = implode(', ', $m[1]); - } - } - - $msg_body = $message->get(); - - if (PEAR::isError($msg_body)) { - self::raise_error(array('code' => 650, 'type' => 'php', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Could not create message: ".$msg_body->getMessage()), - TRUE, FALSE); - } - else { - $delim = $this->config->header_delimiter(); - $to = $headers_enc['To']; - $subject = $headers_enc['Subject']; - $header_str = rtrim($header_str); - - if ($delim != "\r\n") { - $header_str = str_replace("\r\n", $delim, $header_str); - $msg_body = str_replace("\r\n", $delim, $msg_body); - $to = str_replace("\r\n", $delim, $to); - $subject = str_replace("\r\n", $delim, $subject); - } - - if (filter_var(ini_get('safe_mode'), FILTER_VALIDATE_BOOLEAN)) - $sent = mail($to, $subject, $msg_body, $header_str); - else - $sent = mail($to, $subject, $msg_body, $header_str, "-f$from"); - } - } - - if ($sent) { - $this->plugins->exec_hook('message_sent', array('headers' => $headers, 'body' => $msg_body)); - - // remove MDN headers after sending - unset($headers['Return-Receipt-To'], $headers['Disposition-Notification-To']); - - // get all recipients - if ($headers['Cc']) - $mailto .= $headers['Cc']; - if ($headers['Bcc']) - $mailto .= $headers['Bcc']; - if (preg_match_all('/<([^@]+@[^>]+)>/', $mailto, $m)) - $mailto = implode(', ', array_unique($m[1])); - - if ($this->config->get('smtp_log')) { - self::write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s", - $this->user->get_username(), - $_SERVER['REMOTE_ADDR'], - $mailto, - !empty($response) ? join('; ', $response) : '')); - } - } - - if (is_resource($msg_body)) { - fclose($msg_body); - } - - $message->_headers = array(); - $message->headers($headers); - - return $sent; - } - } -- cgit v1.2.3