Exemple #1
0
 /**
  * Destroy session data and remove cookie
  */
 public function kill_session()
 {
     $this->plugins->exec_hook('session_destroy');
     $this->session->remove();
     $_SESSION = array('language' => $this->user->language, 'auth_time' => time(), 'temp' => true);
     rcmail::setcookie('sessauth', '-del-', time() - 60);
     $this->user->reset();
 }
Exemple #2
0
 /**
  * Initialize storage object
  */
 public function storage_init()
 {
     // already initialized
     if (is_object($this->storage)) {
         return;
     }
     $driver = $this->config->get('storage_driver', 'imap');
     $driver_class = "rcube_{$driver}";
     if (!class_exists($driver_class)) {
         self::raise_error(array('code' => 700, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Storage driver class ({$driver}) not found!"), true, true);
     }
     // Initialize storage object
     $this->storage = new $driver_class();
     // for backward compat. (deprecated, will be removed)
     $this->imap = $this->storage;
     // enable caching of mail data
     $storage_cache = $this->config->get("{$driver}_cache");
     $messages_cache = $this->config->get('messages_cache');
     // for backward compatybility
     if ($storage_cache === null && $messages_cache === null && $this->config->get('enable_caching')) {
         $storage_cache = 'db';
         $messages_cache = true;
     }
     if ($storage_cache) {
         $this->storage->set_caching($storage_cache);
     }
     if ($messages_cache) {
         $this->storage->set_messages_caching(true);
     }
     // set pagesize from config
     $pagesize = $this->config->get('mail_pagesize');
     if (!$pagesize) {
         $pagesize = $this->config->get('pagesize', 50);
     }
     $this->storage->set_pagesize($pagesize);
     // set class options
     $options = array('auth_type' => $this->config->get("{$driver}_auth_type", 'check'), 'auth_cid' => $this->config->get("{$driver}_auth_cid"), 'auth_pw' => $this->config->get("{$driver}_auth_pw"), 'debug' => (bool) $this->config->get("{$driver}_debug"), 'force_caps' => (bool) $this->config->get("{$driver}_force_caps"), 'timeout' => (int) $this->config->get("{$driver}_timeout"), 'skip_deleted' => (bool) $this->config->get('skip_deleted'), 'driver' => $driver);
     if (!empty($_SESSION['storage_host'])) {
         $options['host'] = $_SESSION['storage_host'];
         $options['user'] = $_SESSION['username'];
         $options['port'] = $_SESSION['storage_port'];
         $options['ssl'] = $_SESSION['storage_ssl'];
         $options['password'] = $this->decrypt($_SESSION['password']);
         $_SESSION[$driver . '_host'] = $_SESSION['storage_host'];
     }
     $options = $this->plugins->exec_hook("storage_init", $options);
     // for backward compat. (deprecated, to be removed)
     $options = $this->plugins->exec_hook("imap_init", $options);
     $this->storage->set_options($options);
     $this->set_storage_prop();
 }
Exemple #3
0
 /**
  * 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']) {
         if (!empty($plugin['error'])) {
             $error = $plugin['error'];
         }
         if (!empty($plugin['body_file'])) {
             $body_file = $plugin['body_file'];
         }
         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' => join("\n", $response)), true, false);
         }
     } 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']);
         if ($this->config->get('smtp_log')) {
             // get all recipient addresses
             if (is_array($mailto)) {
                 $mailto = implode(',', $mailto);
             }
             if ($headers['Cc']) {
                 $mailto .= ',' . $headers['Cc'];
             }
             if ($headers['Bcc']) {
                 $mailto .= ',' . $headers['Bcc'];
             }
             $mailto = rcube_mime::decode_address_list($mailto, null, false, null, true);
             self::write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s", $this->user->get_username(), rcube_utils::remote_addr(), implode(', ', $mailto), !empty($response) ? join('; ', $response) : ''));
         }
     } else {
         // allow plugins to catch sending errors with the same parameters as in 'message_before_send'
         $this->plugins->exec_hook('message_send_error', $plugin + array('error' => $error));
     }
     if (is_resource($msg_body)) {
         fclose($msg_body);
     }
     $message->_headers = array();
     $message->headers($headers);
     return $sent;
 }
Exemple #4
0
 /**
  * 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)
  * @param bool   $disconnect Close SMTP connection ASAP
  *
  * @return boolean Send status.
  */
 public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null, $disconnect = false)
 {
     $plugin = $this->plugins->exec_hook('message_before_send', array('message' => $message, 'from' => $from, 'mailto' => $mailto, 'options' => $options));
     if ($plugin['abort']) {
         if (!empty($plugin['error'])) {
             $error = $plugin['error'];
         }
         if (!empty($plugin['body_file'])) {
             $body_file = $plugin['body_file'];
         }
         return isset($plugin['result']) ? $plugin['result'] : false;
     }
     $from = $plugin['from'];
     $mailto = $plugin['mailto'];
     $options = $plugin['options'];
     $message = $plugin['message'];
     $headers = $message->headers();
     // generate list of recipients
     $a_recipients = (array) $mailto;
     if (strlen($headers['Cc'])) {
         $a_recipients[] = $headers['Cc'];
     }
     if (strlen($headers['Bcc'])) {
         $a_recipients[] = $headers['Bcc'];
     }
     // remove Bcc header and get the whole head of the message as string
     $smtp_headers = $message->txtHeaders(array('Bcc' => null), true);
     if ($message->getParam('delay_file_io')) {
         // use common temp dir
         $temp_dir = $this->config->get('temp_dir');
         $body_file = tempnam($temp_dir, 'rcmMsg');
         $mime_result = $message->saveMessageBody($body_file);
         if (is_a($mime_result, 'PEAR_Error')) {
             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();
     }
     // initialize SMTP connection
     if (!is_object($this->smtp)) {
         $this->smtp_init(true);
     }
     // send message
     $sent = $this->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $options);
     $response = $this->smtp->get_response();
     $error = $this->smtp->get_error();
     if (!$sent) {
         self::raise_error(array('code' => 800, 'type' => 'smtp', 'line' => __LINE__, 'file' => __FILE__, 'message' => join("\n", $response)), true, false);
         // allow plugins to catch sending errors with the same parameters as in 'message_before_send'
         $this->plugins->exec_hook('message_send_error', $plugin + array('error' => $error));
     } else {
         $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']);
         if ($this->config->get('smtp_log')) {
             // get all recipient addresses
             $mailto = implode(',', $a_recipients);
             $mailto = rcube_mime::decode_address_list($mailto, null, false, null, true);
             self::write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s", $this->user->get_username(), rcube_utils::remote_addr(), implode(', ', $mailto), !empty($response) ? join('; ', $response) : ''));
         }
     }
     if (is_resource($msg_body)) {
         fclose($msg_body);
     }
     if ($disconnect) {
         $this->smtp->disconnect();
     }
     $message->headers($headers, true);
     return $sent;
 }
Exemple #5
0
 /**
  * Generate a unique token to be used in a form request
  *
  * @return string The request token
  */
 public function get_request_token()
 {
     $sess_id = $_COOKIE[ini_get('session.name')];
     if (!$sess_id) {
         $sess_id = session_id();
     }
     $plugin = $this->plugins->exec_hook('request_token', array('value' => md5('RT' . $this->user->ID . $this->config->get('des_key') . $sess_id)));
     return $plugin['value'];
 }