| | |
| | | <?php |
| | | |
| | | /* |
| | | /** |
| | | +-----------------------------------------------------------------------+ |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2008-2014, The Roundcube Dev Team | |
| | |
| | | | Author: Thomas Bruederli <roundcube@gmail.com> | |
| | | +-----------------------------------------------------------------------+ |
| | | */ |
| | | |
| | | |
| | | /** |
| | | * Base class of the Roundcube Framework |
| | |
| | | const REQUEST_VALID = 0; |
| | | const REQUEST_ERROR_URL = 1; |
| | | const REQUEST_ERROR_TOKEN = 2; |
| | | |
| | | const DEBUG_LINE_LENGTH = 4096; |
| | | |
| | | /** |
| | | * Singleton instace of rcube |
| | |
| | | return self::$instance; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Private constructor |
| | | */ |
| | |
| | | |
| | | register_shutdown_function(array($this, 'shutdown')); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Initial startup function |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Get the current database connection |
| | | * |
| | |
| | | |
| | | return $this->db; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Get global handle for memcache access |
| | |
| | | return $this->memcache; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Callback for memcache failure |
| | | */ |
| | |
| | | true, false); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Initialize and get cache object |
| | |
| | | |
| | | return $this->caches[$name]; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Initialize and get shared cache object |
| | |
| | | return $this->caches[$shared_name]; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Create SMTP object and connect to server |
| | | * |
| | | * @param boolean True if connection should be established |
| | | * @param boolean $connect True if connection should be established |
| | | */ |
| | | public function smtp_init($connect = false) |
| | | { |
| | |
| | | $this->smtp->connect(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Initialize and get storage object |
| | |
| | | |
| | | return $this->storage; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Initialize storage object |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Set special folders type association. |
| | | * This must be done AFTER connecting to the server! |
| | |
| | | $storage->create_default_folders(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Callback for IMAP connection events to log session identifiers |
| | |
| | | ini_set('session.use_only_cookies', 1); |
| | | ini_set('session.cookie_httponly', 1); |
| | | |
| | | // use database for storing session data |
| | | $this->session = new rcube_session($this->get_dbh(), $this->config); |
| | | |
| | | // get session driver instance |
| | | $this->session = rcube_session::factory($this->config); |
| | | $this->session->register_gc_handler(array($this, 'gc')); |
| | | $this->session->set_secret($this->config->get('des_key') . dirname($_SERVER['SCRIPT_NAME'])); |
| | | $this->session->set_ip_check($this->config->get('ip_check')); |
| | | |
| | | if ($this->config->get('session_auth_name')) { |
| | | $this->session->set_cookiename($this->config->get('session_auth_name')); |
| | | } |
| | | |
| | | // start PHP session (if not in CLI mode) |
| | | if ($_SERVER['REMOTE_ADDR']) { |
| | | $this->session->start(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Garbage collector - cache/temp cleaner |
| | |
| | | |
| | | $this->gc_temp(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Garbage collector function for temp files. |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Runs garbage collector with probability based on |
| | | * session settings. This is intended for environments |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Get localized text in the desired language |
| | |
| | | return strtr($text, array('\n' => "\n")); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Check if the given text label exists |
| | | * |
| | |
| | | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Load a localization package |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Check the given string and return a valid language code |
| | | * |
| | | * @param string Language code |
| | | * @param string $lang Language code |
| | | * |
| | | * @return string Valid language code |
| | | */ |
| | |
| | | return $lang; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Read directory program/localization and return a list of available languages |
| | | * |
| | |
| | | return $sa_languages; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Encrypt using 3DES |
| | | * |
| | | * @param string $clear clear text input |
| | | * @param string $key encryption key to retrieve from the configuration, defaults to 'des_key' |
| | | * @param boolean $base64 whether or not to base64_encode() the result before returning |
| | | * @param string $clear Clear text input |
| | | * @param string $key Encryption key to retrieve from the configuration, defaults to 'des_key' |
| | | * @param boolean $base64 Whether or not to base64_encode() the result before returning |
| | | * |
| | | * @return string encrypted text |
| | | */ |
| | |
| | | return ''; |
| | | } |
| | | |
| | | /*- |
| | | * Add a single canary byte to the end of the clear text, which |
| | | * will help find out how much of padding will need to be removed |
| | | * upon decryption; see http://php.net/mcrypt_generic#68082 |
| | | */ |
| | | // Add a single canary byte to the end of the clear text, which |
| | | // will help find out how much of padding will need to be removed |
| | | // upon decryption; see http://php.net/mcrypt_generic#68082. |
| | | $clear = pack("a*H2", $clear, "80"); |
| | | $ckey = $this->config->get_crypto_key($key); |
| | | |
| | |
| | | return $base64 ? base64_encode($cipher) : $cipher; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Decrypt 3DES-encrypted string |
| | | * |
| | | * @param string $cipher encrypted text |
| | | * @param string $key encryption key to retrieve from the configuration, defaults to 'des_key' |
| | | * @param boolean $base64 whether or not input is base64-encoded |
| | | * @param string $cipher Encrypted text |
| | | * @param string $key Encryption key to retrieve from the configuration, defaults to 'des_key' |
| | | * @param boolean $base64 Whether or not input is base64-encoded |
| | | * |
| | | * @return string decrypted text |
| | | */ |
| | |
| | | } |
| | | } |
| | | |
| | | /*- |
| | | * Trim PHP's padding and the canary byte; see note in |
| | | * rcube::encrypt() and http://php.net/mcrypt_generic#68082 |
| | | */ |
| | | // Trim PHP's padding and the canary byte; see note in |
| | | // rcube::encrypt() and http://php.net/mcrypt_generic#68082 |
| | | $clear = substr(rtrim($clear, "\0"), 0, -1); |
| | | |
| | | return $clear; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Generates encryption initialization vector (IV) |
| | | * |
| | | * @param int Vector size |
| | | * @param int $size Vector size |
| | | * |
| | | * @return string Vector string |
| | | */ |
| | |
| | | return $iv; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Returns session token for secure URLs |
| | | * |
| | |
| | | if (empty($_SESSION['secure_token']) && $generate) { |
| | | // generate x characters long token |
| | | $length = $len > 1 ? $len : 16; |
| | | $token = openssl_random_pseudo_bytes($length / 2); |
| | | $token = bin2hex($token); |
| | | $token = rcube_utils::random_bytes($length); |
| | | |
| | | $plugin = $this->plugins->exec_hook('secure_token', |
| | | array('value' => $token, 'length' => $length)); |
| | |
| | | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Generate a unique token to be used in a form request |
| | |
| | | return $plugin['value']; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Check if the current request contains a valid token. |
| | | * Empty requests aren't checked until use_secure_urls is set. |
| | | * |
| | | * @param int Request method |
| | | * @param int $mode Request method |
| | | * |
| | | * @return boolean True if request token is valid false if not |
| | | */ |
| | |
| | | return true; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Build a valid URL to this instance of Roundcube |
| | | * |
| | | * @param mixed Either a string with the action or url parameters as key-value pairs |
| | | * @param mixed $p Either a string with the action or url parameters as key-value pairs |
| | | * |
| | | * @return string Valid application URL |
| | | */ |
| | | public function url($p) |
| | |
| | | // STUB: should be overloaded by the application |
| | | return ''; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Function to be executed in script shutdown |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Registers shutdown function to be executed on shutdown. |
| | | * The functions will be executed before destroying any |
| | |
| | | $this->shutdown_functions[] = $function; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Quote a given string. |
| | | * Shortcut function for rcube_utils::rep_specialchars_output() |
| | |
| | | { |
| | | return rcube_utils::rep_specialchars_output($str, 'html', $mode, $newlines); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Quote a given string for javascript output. |
| | |
| | | return rcube_utils::rep_specialchars_output($str, 'js'); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Construct shell command, execute it and return output as string. |
| | | * Keywords {keyword} are replaced with arguments |
| | | * |
| | | * @param $cmd Format string with {keywords} to be replaced |
| | | * @param $cmd Format string with {keywords} to be replaced |
| | | * @param $values (zero, one or more arrays can be passed) |
| | | * |
| | | * @return output of command. shell errors not detectable |
| | |
| | | return (string)shell_exec($cmd); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Print or write debug messages |
| | | * |
| | |
| | | $args = func_get_args(); |
| | | |
| | | if (class_exists('rcube', false)) { |
| | | $rcube = self::get_instance(); |
| | | $rcube = self::get_instance(); |
| | | $plugin = $rcube->plugins->exec_hook('console', array('args' => $args)); |
| | | if ($plugin['abort']) { |
| | | return; |
| | | } |
| | | $args = $plugin['args']; |
| | | |
| | | $args = $plugin['args']; |
| | | } |
| | | |
| | | $msg = array(); |
| | |
| | | self::write_log('console', join(";\n", $msg)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Append a line to a logfile in the logs directory. |
| | | * Date will be added automatically to the line. |
| | | * |
| | | * @param $name name of log file |
| | | * @param line Line to append |
| | | * @param string $name Name of the log file |
| | | * @param mixed $line Line to append |
| | | */ |
| | | public static function write_log($name, $line) |
| | | { |
| | |
| | | return false; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Throw system error (and show error page). |
| | | * |
| | | * @param array Named parameters |
| | | * @param array $arg Named parameters |
| | | * - code: Error code (required) |
| | | * - type: Error type [php|db|imap|javascript] (required) |
| | | * - message: Error message |
| | | * - file: File where error occurred |
| | | * - line: Line where error occurred |
| | | * @param boolean True to log the error |
| | | * @param boolean Terminate script execution |
| | | * @param boolean $log True to log the error |
| | | * @param boolean $terminate Terminate script execution |
| | | */ |
| | | public static function raise_error($arg = array(), $log = false, $terminate = false) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Report error according to configured debug_level |
| | | * |
| | | * @param array Named parameters |
| | | * @param array $arg_arr Named parameters |
| | | * @see self::raise_error() |
| | | */ |
| | | public static function log_bug($arg_arr) |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Write debug info to the log |
| | | * |
| | | * @param string $engine Engine type - file name (memcache, apc) |
| | | * @param string $data Data string to log |
| | | * @param bool $result Operation result |
| | | */ |
| | | public static function debug($engine, $data, $result = null) |
| | | { |
| | | static $debug_counter; |
| | | |
| | | $line = '[' . (++$debug_counter[$engine]) . '] ' . $data; |
| | | |
| | | if (($len = strlen($line)) > self::DEBUG_LINE_LENGTH) { |
| | | $diff = $len - self::DEBUG_LINE_LENGTH; |
| | | $line = substr($line, 0, self::DEBUG_LINE_LENGTH) . "... [truncated $diff bytes]"; |
| | | } |
| | | |
| | | if ($result !== null) { |
| | | $line .= ' [' . ($result ? 'TRUE' : 'FALSE') . ']'; |
| | | } |
| | | |
| | | self::write_log($engine, $line); |
| | | } |
| | | |
| | | /** |
| | | * Returns current time (with microseconds). |
| | |
| | | return microtime(true); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Logs time difference according to provided timer |
| | | * |
| | | * @param float $timer Timer (self::timer() result) |
| | | * @param string $label Log line prefix |
| | | * @param string $dest Log file name |
| | | * @param float $timer Timer (self::timer() result) |
| | | * @param string $label Log line prefix |
| | | * @param string $dest Log file name |
| | | * |
| | | * @see self::timer() |
| | | */ |
| | |
| | | return null; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Getter for logged user name. |
| | | * |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Getter for logged user email (derived from user name not identity). |
| | | * |
| | |
| | | return $this->user->get_username('mail'); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Getter for logged user password. |
| | |
| | | /** |
| | | * 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 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. |
| | | */ |
| | |
| | | |
| | | return $sent; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Lightweight plugin API class serving as a dummy if plugins are not enabled |
| | | * |
| | | * @package Framework |
| | | * @package Framework |
| | | * @subpackage Core |
| | | */ |
| | | class rcube_dummy_plugin_api |