From f707fec0001d7dc7d46be114c42b37e49a052660 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 21 Nov 2012 19:27:40 +0100 Subject: Create Roundcube Framework initialization script (bootstrap) --- program/include/bootstrap.php | 480 ++++++++++++++++++++++++++++++++++ program/include/iniset.php | 30 +-- program/include/rcube_bc.inc | 5 + program/include/rcube_output_html.php | 4 +- program/include/rcube_shared.inc | 475 --------------------------------- program/include/rcube_utils.php | 16 ++ 6 files changed, 507 insertions(+), 503 deletions(-) create mode 100644 program/include/bootstrap.php delete mode 100644 program/include/rcube_shared.inc diff --git a/program/include/bootstrap.php b/program/include/bootstrap.php new file mode 100644 index 000000000..9541f7e65 --- /dev/null +++ b/program/include/bootstrap.php @@ -0,0 +1,480 @@ + | + | Author: Aleksander Machniak | + +-----------------------------------------------------------------------+ +*/ + + +/** + * 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, + 'suhosin.session.encrypt' => 0, + 'session.auto_start' => 0, + 'file_uploads' => 1, + 'magic_quotes_runtime' => 0, + 'magic_quotes_sybase' => 0, // #1488506 +); +foreach ($config as $optname => $optval) { + if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) { + die("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)."); + } +} + +// application constants +define('RCMAIL_VERSION', '0.9-git'); +define('RCMAIL_CHARSET', 'UTF-8'); +define('RCMAIL_START', microtime(true)); + +if (!defined('INSTALL_PATH')) { + define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/'); +} + +if (!defined('RCMAIL_CONFIG_DIR')) { + define('RCMAIL_CONFIG_DIR', INSTALL_PATH . 'config'); +} + +// set internal encoding for mbstring extension +if (extension_loaded('mbstring')) { + mb_internal_encoding(RCMAIL_CHARSET); + @mb_regex_encoding(RCMAIL_CHARSET); +} + +// 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 + * + * @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) +{ + $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; + + $str = mb_substr($str, 0, $first_part_length) . $placeholder . mb_substr($str, $second_starting_location); + } + + 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; +} + + +/** + * Remove single and double quotes from a given string + * + * @param string Input value + * + * @return string Dequoted string + */ +function strip_quotes($str) +{ + return str_replace(array("'", '"'), '', $str); +} + + +/** + * Remove new lines characters from given string + * + * @param string $str Input value + * + * @return string Stripped string + */ +function strip_newlines($str) +{ + return preg_replace('/[\r\n]/', '', $str); +} + + +/** + * 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; +} + + +/** + * mbstring replacement functions + */ +if (!extension_loaded('mbstring')) +{ + function mb_strlen($str) + { + return strlen($str); + } + + function mb_strtolower($str) + { + return strtolower($str); + } + + function mb_strtoupper($str) + { + return strtoupper($str); + } + + function mb_substr($str, $start, $len=null) + { + return substr($str, $start, $len); + } + + function mb_strpos($haystack, $needle, $offset=0) + { + return strpos($haystack, $needle, $offset); + } + + function mb_strrpos($haystack, $needle, $offset=0) + { + return strrpos($haystack, $needle, $offset); + } +} + +/** + * intl replacement functions + */ + +if (!function_exists('idn_to_utf8')) +{ + function idn_to_utf8($domain, $flags=null) + { + 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, $flags=null) + { + 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) +{ + $filename = preg_replace( + array( + '/Mail_(.+)/', + '/Net_(.+)/', + '/Auth_(.+)/', + '/^html_.+/', + '/^utf8$/', + ), + array( + 'Mail/\\1', + 'Net/\\1', + 'Auth/\\1', + 'html', + 'utf8.class', + ), + $classname + ); + + if ($fp = @fopen("$filename.php", 'r', true)) { + fclose($fp); + include_once "$filename.php"; + return true; + } + + return false; +} + +/** + * Local callback function for PEAR errors + */ +function rcube_pear_error($err) +{ + error_log(sprintf("%s (%s): %s", + $err->getMessage(), + $err->getCode(), + $err->getUserinfo()), 0); +} diff --git a/program/include/iniset.php b/program/include/iniset.php index 82278c9f8..d01376bb1 100644 --- a/program/include/iniset.php +++ b/program/include/iniset.php @@ -12,7 +12,7 @@ | See the README file for a full license statement. | | | | PURPOSE: | - | Setup the application envoronment required to process | + | Setup the application environment required to process | | any request. | +-----------------------------------------------------------------------+ | Author: Till Klampaeckel | @@ -21,30 +21,20 @@ */ $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, 'suhosin.session.encrypt' => 0, 'session.auto_start' => 0, 'file_uploads' => 1, - 'magic_quotes_runtime' => 0, - 'magic_quotes_sybase' => 0, // #1488506 ); foreach ($config as $optname => $optval) { if ($optval != ini_get($optname) && @ini_set($optname, $optval) === false) { die("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).\n" - ."Read REQUIREMENTS section in INSTALL file or use Roundcube Installer!"); + ."Check your PHP configuration (including php_admin_flag)."); } } -// application constants -define('RCMAIL_VERSION', '0.9-git'); -define('RCMAIL_CHARSET', 'UTF-8'); -define('RCMAIL_START', microtime(true)); - if (!defined('INSTALL_PATH')) { define('INSTALL_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/'); } @@ -67,20 +57,8 @@ if (set_include_path($include_path) === false) { // (does not work in safe mode) @set_time_limit(120); -// set internal encoding for mbstring extension -if (extension_loaded('mbstring')) { - mb_internal_encoding(RCMAIL_CHARSET); - @mb_regex_encoding(RCMAIL_CHARSET); -} - -// include global functions -require_once INSTALL_PATH . 'program/include/rcube_shared.inc'; - -// 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'); +// include Roundcube Framework +require_once INSTALL_PATH . 'program/include/bootstrap.php'; // backward compatybility (to be removed) require_once INSTALL_PATH . 'program/include/rcube_bc.inc'; diff --git a/program/include/rcube_bc.inc b/program/include/rcube_bc.inc index c6620e0db..80ca7b907 100644 --- a/program/include/rcube_bc.inc +++ b/program/include/rcube_bc.inc @@ -392,3 +392,8 @@ function prompt_silent($prompt = 'Password:') { return rcube_utils::prompt_silent($prompt); } + +function get_boolean($str) +{ + return rcube_utils::get_boolean($str); +} diff --git a/program/include/rcube_output_html.php b/program/include/rcube_output_html.php index 6dd58fd36..d751eb294 100644 --- a/program/include/rcube_output_html.php +++ b/program/include/rcube_output_html.php @@ -763,7 +763,7 @@ class rcube_output_html extends rcube_output ), array( "\$_SESSION['\\1']", - "\$this->app->config->get('\\1',get_boolean('\\3'))", + "\$this->app->config->get('\\1',rcube_utils::get_boolean('\\3'))", "\$this->env['\\1']", "rcube_utils::get_input_value('\\1', rcube_utils::INPUT_GPC)", "\$_COOKIE['\\1']", @@ -835,7 +835,7 @@ class rcube_output_html extends rcube_output unset($vars['name'], $vars['command']); $label = $this->app->gettext($attrib + array('vars' => $vars)); - $quoting = !empty($attrib['quoting']) ? strtolower($attrib['quoting']) : (get_boolean((string)$attrib['html']) ? 'no' : ''); + $quoting = !empty($attrib['quoting']) ? strtolower($attrib['quoting']) : (rcube_utils::get_boolean((string)$attrib['html']) ? 'no' : ''); switch ($quoting) { case 'no': diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc deleted file mode 100644 index 5105fe22f..000000000 --- a/program/include/rcube_shared.inc +++ /dev/null @@ -1,475 +0,0 @@ - | - +-----------------------------------------------------------------------+ -*/ - - -/** - * Roundcube shared functions - * - * @package Framework - * @subpackage Core - */ - - -/** - * Similar function as in_array() but case-insensitive - * - * @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) -{ - $needle = mb_strtolower($needle); - foreach ((array)$haystack as $value) { - if ($needle === mb_strtolower($value)) { - return true; - } - } - - return false; -} - - -/** - * Find out if the string content means true or false - * - * @param string $str Input value - * - * @return boolean Boolean value - */ -function get_boolean($str) -{ - $str = strtolower($str); - - return !in_array($str, array('false', '0', 'no', 'off', 'nein', ''), true); -} - - -/** - * 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); -} - - -/** - * Delete all files within a folder - * - * @param string Path to directory - * - * @return boolean True on success, False if directory was not found - */ -function clear_directory($dir_path) -{ - $dir = @opendir($dir_path); - if (!$dir) { - return false; - } - - while ($file = readdir($dir)) { - if (strlen($file) > 2) { - unlink("$dir_path/$file"); - } - } - - closedir($dir); - - return true; -} - - -/** - * 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; - - $str = mb_substr($str, 0, $first_part_length) . $placeholder . mb_substr($str, $second_starting_location); - } - - 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; -} - - -/** - * Remove single and double quotes from a given string - * - * @param string Input value - * - * @return string Dequoted string - */ -function strip_quotes($str) -{ - return str_replace(array("'", '"'), '', $str); -} - - -/** - * Remove new lines characters from given string - * - * @param string $str Input value - * - * @return string Stripped string - */ -function strip_newlines($str) -{ - return preg_replace('/[\r\n]/', '', $str); -} - - -/** - * 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; -} - - -/** - * mbstring replacement functions - */ -if (!extension_loaded('mbstring')) -{ - function mb_strlen($str) - { - return strlen($str); - } - - function mb_strtolower($str) - { - return strtolower($str); - } - - function mb_strtoupper($str) - { - return strtoupper($str); - } - - function mb_substr($str, $start, $len=null) - { - return substr($str, $start, $len); - } - - function mb_strpos($haystack, $needle, $offset=0) - { - return strpos($haystack, $needle, $offset); - } - - function mb_strrpos($haystack, $needle, $offset=0) - { - return strrpos($haystack, $needle, $offset); - } -} - -/** - * intl replacement functions - */ - -if (!function_exists('idn_to_utf8')) -{ - function idn_to_utf8($domain, $flags=null) - { - 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, $flags=null) - { - 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) -{ - $filename = preg_replace( - array( - '/Mail_(.+)/', - '/Net_(.+)/', - '/Auth_(.+)/', - '/^html_.+/', - '/^utf8$/', - ), - array( - 'Mail/\\1', - 'Net/\\1', - 'Auth/\\1', - 'html', - 'utf8.class', - ), - $classname - ); - - if ($fp = @fopen("$filename.php", 'r', true)) { - fclose($fp); - include_once "$filename.php"; - return true; - } - - return false; -} - -/** - * Local callback function for PEAR errors - */ -function rcube_pear_error($err) -{ - error_log(sprintf("%s (%s): %s", - $err->getMessage(), - $err->getCode(), - $err->getUserinfo()), 0); -} diff --git a/program/include/rcube_utils.php b/program/include/rcube_utils.php index 2b48e7c97..df77dfe42 100644 --- a/program/include/rcube_utils.php +++ b/program/include/rcube_utils.php @@ -958,4 +958,20 @@ class rcube_utils return $password; } } + + + /** + * Find out if the string content means true or false + * + * @param string $str Input value + * + * @return boolean Boolean value + */ + public static function get_boolean($str) + { + $str = strtolower($str); + + return !in_array($str, array('false', '0', 'no', 'off', 'nein', ''), true); + } + } -- cgit v1.2.3