diff program/lib/Roundcube/bootstrap.php @ 0:4681f974d28b

vanilla 1.3.3 distro, I hope
author Charlie Root
date Thu, 04 Jan 2018 15:52:31 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/program/lib/Roundcube/bootstrap.php	Thu Jan 04 15:52:31 2018 -0500
@@ -0,0 +1,469 @@
+<?php
+
+/**
+ +-----------------------------------------------------------------------+
+ | This file is part of the Roundcube PHP suite                          |
+ | Copyright (C) 2005-2017, 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,
+);
+
+// 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.3.3');
+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);
+    }
+
+    // Translate PHP namespaces into directories,
+    // i.e. use \Sabre\VObject; $vcf = VObject\Reader::read(...)
+    //      -> Sabre/VObject/Reader.php
+    $classname = str_replace('\\', '/', $classname);
+
+    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);
+}