| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466 | 
							- <?php
 - 
 - /**
 -  +-----------------------------------------------------------------------+
 -  | This file is part of the Roundcube PHP suite                          |
 -  | Copyright (C) 2005-2015, The Roundcube Dev Team                       |
 -  |                                                                       |
 -  | Licensed under the GNU General Public License version 3 or            |
 -  | any later version with exceptions for skins & plugins.                |
 -  | See the README file for a full license statement.                     |
 -  |                                                                       |
 -  | CONTENTS:                                                             |
 -  |   Roundcube Framework Initialization                                  |
 -  +-----------------------------------------------------------------------+
 -  | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 -  | Author: Aleksander Machniak <alec@alec.pl>                            |
 -  +-----------------------------------------------------------------------+
 - */
 - 
 - /**
 -  * Roundcube Framework Initialization
 -  *
 -  * @package    Framework
 -  * @subpackage Core
 -  */
 - 
 - $config = array(
 -     'error_reporting'         => E_ALL & ~E_NOTICE & ~E_STRICT,
 -     // Some users are not using Installer, so we'll check some
 -     // critical PHP settings here. Only these, which doesn't provide
 -     // an error/warning in the logs later. See (#1486307).
 -     'mbstring.func_overload'  => 0,
 -     'magic_quotes_runtime'    => false,
 -     'magic_quotes_sybase'     => false, // #1488506
 - );
 - 
 - // check these additional ini settings if not called via CLI
 - if (php_sapi_name() != 'cli') {
 -     $config += array(
 -         'suhosin.session.encrypt' => false,
 -         'file_uploads'            => true,
 -     );
 - }
 - 
 - foreach ($config as $optname => $optval) {
 -     $ini_optval = filter_var(ini_get($optname), is_bool($optval) ? FILTER_VALIDATE_BOOLEAN : FILTER_VALIDATE_INT);
 -     if ($optval != $ini_optval && @ini_set($optname, $optval) === false) {
 -         $optval = !is_bool($optval) ? $optval : ($optval ? 'On' : 'Off');
 -         $error  = "ERROR: Wrong '$optname' option value and it wasn't possible to set it to required value ($optval).\n"
 -             . "Check your PHP configuration (including php_admin_flag).";
 - 
 -         if (defined('STDERR')) fwrite(STDERR, $error); else echo $error;
 -         exit(1);
 -     }
 - }
 - 
 - // framework constants
 - define('RCUBE_VERSION', '1.2.2');
 - define('RCUBE_CHARSET', 'UTF-8');
 - 
 - if (!defined('RCUBE_LIB_DIR')) {
 -     define('RCUBE_LIB_DIR', __DIR__ . '/');
 - }
 - 
 - if (!defined('RCUBE_INSTALL_PATH')) {
 -     define('RCUBE_INSTALL_PATH', RCUBE_LIB_DIR);
 - }
 - 
 - if (!defined('RCUBE_CONFIG_DIR')) {
 -     define('RCUBE_CONFIG_DIR', RCUBE_INSTALL_PATH . 'config/');
 - }
 - 
 - if (!defined('RCUBE_PLUGINS_DIR')) {
 -     define('RCUBE_PLUGINS_DIR', RCUBE_INSTALL_PATH . 'plugins/');
 - }
 - 
 - if (!defined('RCUBE_LOCALIZATION_DIR')) {
 -     define('RCUBE_LOCALIZATION_DIR', RCUBE_INSTALL_PATH . 'localization/');
 - }
 - 
 - // set internal encoding for mbstring extension
 - if (function_exists('mb_internal_encoding')) {
 -     mb_internal_encoding(RCUBE_CHARSET);
 - }
 - if (function_exists('mb_regex_encoding')) {
 -     mb_regex_encoding(RCUBE_CHARSET);
 - }
 - 
 - // make sure the Roundcube lib directory is in the include_path
 - $rcube_path = realpath(RCUBE_LIB_DIR . '..');
 - $sep        = PATH_SEPARATOR;
 - $regexp     = "!(^|$sep)" . preg_quote($rcube_path, '!') . "($sep|\$)!";
 - $path       = ini_get('include_path');
 - 
 - if (!preg_match($regexp, $path)) {
 -     set_include_path($path . PATH_SEPARATOR . $rcube_path);
 - }
 - 
 - // Register autoloader
 - spl_autoload_register('rcube_autoload');
 - 
 - // set PEAR error handling (will also load the PEAR main class)
 - PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'rcube_pear_error');
 - 
 - 
 - /**
 -  * Similar function as in_array() but case-insensitive with multibyte support.
 -  *
 -  * @param string $needle   Needle value
 -  * @param array  $heystack Array to search in
 -  *
 -  * @return boolean True if found, False if not
 -  */
 - function in_array_nocase($needle, $haystack)
 - {
 -     // use much faster method for ascii
 -     if (is_ascii($needle)) {
 -         foreach ((array) $haystack as $value) {
 -             if (strcasecmp($value, $needle) === 0) {
 -                 return true;
 -             }
 -         }
 -     }
 -     else {
 -         $needle = mb_strtolower($needle);
 -         foreach ((array) $haystack as $value) {
 -             if ($needle === mb_strtolower($value)) {
 -                 return true;
 -             }
 -         }
 -     }
 - 
 -     return false;
 - }
 - 
 - /**
 -  * Parse a human readable string for a number of bytes.
 -  *
 -  * @param string $str Input string
 -  *
 -  * @return float Number of bytes
 -  */
 - function parse_bytes($str)
 - {
 -     if (is_numeric($str)) {
 -         return floatval($str);
 -     }
 - 
 -     if (preg_match('/([0-9\.]+)\s*([a-z]*)/i', $str, $regs)) {
 -         $bytes = floatval($regs[1]);
 -         switch (strtolower($regs[2])) {
 -         case 'g':
 -         case 'gb':
 -             $bytes *= 1073741824;
 -             break;
 -         case 'm':
 -         case 'mb':
 -             $bytes *= 1048576;
 -             break;
 -         case 'k':
 -         case 'kb':
 -             $bytes *= 1024;
 -             break;
 -         }
 -     }
 - 
 -     return floatval($bytes);
 - }
 - 
 - /**
 -  * Make sure the string ends with a slash
 -  */
 - function slashify($str)
 - {
 -   return unslashify($str).'/';
 - }
 - 
 - /**
 -  * Remove slashes at the end of the string
 -  */
 - function unslashify($str)
 - {
 -   return preg_replace('/\/+$/', '', $str);
 - }
 - 
 - /**
 -  * Returns number of seconds for a specified offset string.
 -  *
 -  * @param string $str String representation of the offset (e.g. 20min, 5h, 2days, 1week)
 -  *
 -  * @return int Number of seconds
 -  */
 - function get_offset_sec($str)
 - {
 -     if (preg_match('/^([0-9]+)\s*([smhdw])/i', $str, $regs)) {
 -         $amount = (int) $regs[1];
 -         $unit   = strtolower($regs[2]);
 -     }
 -     else {
 -         $amount = (int) $str;
 -         $unit   = 's';
 -     }
 - 
 -     switch ($unit) {
 -     case 'w':
 -         $amount *= 7;
 -     case 'd':
 -         $amount *= 24;
 -     case 'h':
 -         $amount *= 60;
 -     case 'm':
 -         $amount *= 60;
 -     }
 - 
 -     return $amount;
 - }
 - 
 - /**
 -  * Create a unix timestamp with a specified offset from now.
 -  *
 -  * @param string $offset_str String representation of the offset (e.g. 20min, 5h, 2days)
 -  * @param int    $factor     Factor to multiply with the offset
 -  *
 -  * @return int Unix timestamp
 -  */
 - function get_offset_time($offset_str, $factor = 1)
 - {
 -     return time() + get_offset_sec($offset_str) * $factor;
 - }
 - 
 - /**
 -  * Truncate string if it is longer than the allowed length.
 -  * Replace the middle or the ending part of a string with a placeholder.
 -  *
 -  * @param string $str         Input string
 -  * @param int    $maxlength   Max. length
 -  * @param string $placeholder Replace removed chars with this
 -  * @param bool   $ending      Set to True if string should be truncated from the end
 -  *
 -  * @return string Abbreviated string
 -  */
 - function abbreviate_string($str, $maxlength, $placeholder = '...', $ending = false)
 - {
 -     $length = mb_strlen($str);
 - 
 -     if ($length > $maxlength) {
 -         if ($ending) {
 -             return mb_substr($str, 0, $maxlength) . $placeholder;
 -         }
 - 
 -         $placeholder_length = mb_strlen($placeholder);
 -         $first_part_length  = floor(($maxlength - $placeholder_length)/2);
 -         $second_starting_location = $length - $maxlength + $first_part_length + $placeholder_length;
 - 
 -         $prefix = mb_substr($str, 0, $first_part_length);
 -         $suffix = mb_substr($str, $second_starting_location);
 -         $str    = $prefix . $placeholder . $suffix;
 -     }
 - 
 -     return $str;
 - }
 - 
 - /**
 -  * Get all keys from array (recursive).
 -  *
 -  * @param array $array Input array
 -  *
 -  * @return array List of array keys
 -  */
 - function array_keys_recursive($array)
 - {
 -     $keys = array();
 - 
 -     if (!empty($array) && is_array($array)) {
 -         foreach ($array as $key => $child) {
 -             $keys[] = $key;
 -             foreach (array_keys_recursive($child) as $val) {
 -                 $keys[] = $val;
 -             }
 -         }
 -     }
 - 
 -     return $keys;
 - }
 - 
 - /**
 -  * Remove all non-ascii and non-word chars except ., -, _
 -  */
 - function asciiwords($str, $css_id = false, $replace_with = '')
 - {
 -     $allowed = 'a-z0-9\_\-' . (!$css_id ? '\.' : '');
 -     return preg_replace("/[^$allowed]/i", $replace_with, $str);
 - }
 - 
 - /**
 -  * Check if a string contains only ascii characters
 -  *
 -  * @param string $str           String to check
 -  * @param bool   $control_chars Includes control characters
 -  *
 -  * @return bool
 -  */
 - function is_ascii($str, $control_chars = true)
 - {
 -     $regexp = $control_chars ? '/[^\x00-\x7F]/' : '/[^\x20-\x7E]/';
 -     return preg_match($regexp, $str) ? false : true;
 - }
 - 
 - /**
 -  * Compose a valid representation of name and e-mail address
 -  *
 -  * @param string $email E-mail address
 -  * @param string $name  Person name
 -  *
 -  * @return string Formatted string
 -  */
 - function format_email_recipient($email, $name = '')
 - {
 -     $email = trim($email);
 - 
 -     if ($name && $name != $email) {
 -         // Special chars as defined by RFC 822 need to in quoted string (or escaped).
 -         if (preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name)) {
 -             $name = '"'.addcslashes($name, '"').'"';
 -         }
 - 
 -         return "$name <$email>";
 -     }
 - 
 -     return $email;
 - }
 - 
 - /**
 -  * Format e-mail address
 -  *
 -  * @param string $email E-mail address
 -  *
 -  * @return string Formatted e-mail address
 -  */
 - function format_email($email)
 - {
 -     $email = trim($email);
 -     $parts = explode('@', $email);
 -     $count = count($parts);
 - 
 -     if ($count > 1) {
 -         $parts[$count-1] = mb_strtolower($parts[$count-1]);
 - 
 -         $email = implode('@', $parts);
 -     }
 - 
 -     return $email;
 - }
 - 
 - /**
 -  * Fix version number so it can be used correctly in version_compare()
 -  *
 -  * @param string $version Version number string
 -  *
 -  * @param return Version number string
 -  */
 - function version_parse($version)
 - {
 -     return str_replace(
 -         array('-stable', '-git'),
 -         array('.0', '.99'),
 -         $version
 -     );
 - }
 - 
 - /**
 -  * intl replacement functions
 -  */
 - 
 - if (!function_exists('idn_to_utf8'))
 - {
 -     function idn_to_utf8($domain)
 -     {
 -         static $idn, $loaded;
 - 
 -         if (!$loaded) {
 -             $idn    = new Net_IDNA2();
 -             $loaded = true;
 -         }
 - 
 -         if ($idn && $domain && preg_match('/(^|\.)xn--/i', $domain)) {
 -             try {
 -                 $domain = $idn->decode($domain);
 -             }
 -             catch (Exception $e) {
 -             }
 -         }
 - 
 -         return $domain;
 -     }
 - }
 - 
 - if (!function_exists('idn_to_ascii'))
 - {
 -     function idn_to_ascii($domain)
 -     {
 -         static $idn, $loaded;
 - 
 -         if (!$loaded) {
 -             $idn    = new Net_IDNA2();
 -             $loaded = true;
 -         }
 - 
 -         if ($idn && $domain && preg_match('/[^\x20-\x7E]/', $domain)) {
 -             try {
 -                 $domain = $idn->encode($domain);
 -             }
 -             catch (Exception $e) {
 -             }
 -         }
 - 
 -         return $domain;
 -     }
 - }
 - 
 - /**
 -  * Use PHP5 autoload for dynamic class loading
 -  *
 -  * @todo Make Zend, PEAR etc play with this
 -  * @todo Make our classes conform to a more straight forward CS.
 -  */
 - function rcube_autoload($classname)
 - {
 -     if (strpos($classname, 'rcube') === 0) {
 -         $classname = 'Roundcube/' . $classname;
 -     }
 -     else if (strpos($classname, 'html_') === 0 || $classname === 'html') {
 -         $classname = 'Roundcube/html';
 -     }
 -     else if (strpos($classname, 'Mail_') === 0) {
 -         $classname = 'Mail/' . substr($classname, 5);
 -     }
 -     else if (strpos($classname, 'Net_') === 0) {
 -         $classname = 'Net/' . substr($classname, 4);
 -     }
 -     else if (strpos($classname, 'Auth_') === 0) {
 -         $classname = 'Auth/' . substr($classname, 5);
 -     }
 - 
 -     if ($fp = @fopen("$classname.php", 'r', true)) {
 -         fclose($fp);
 -         include_once "$classname.php";
 -         return true;
 -     }
 - 
 -     return false;
 - }
 - 
 - /**
 -  * Local callback function for PEAR errors
 -  */
 - function rcube_pear_error($err)
 - {
 -     $msg = sprintf("ERROR: %s (%s)", $err->getMessage(), $err->getCode());
 - 
 -     if ($info = $err->getUserinfo()) {
 -         $msg .= ': ' . $info;
 -     }
 - 
 -     error_log($msg, 0);
 - }
 
 
  |