From ba6f21caeb405c7e8512a09941fefbc97286e45f Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Wed, 21 Nov 2012 19:52:03 +0100 Subject: Framework files moved to lib/Roundcube --- program/lib/Roundcube/bootstrap.php | 482 +++ program/lib/Roundcube/html.php | 849 +++++ program/lib/Roundcube/rcube.php | 1227 +++++++ program/lib/Roundcube/rcube_addressbook.php | 533 +++ program/lib/Roundcube/rcube_base_replacer.php | 108 + program/lib/Roundcube/rcube_browser.php | 73 + program/lib/Roundcube/rcube_cache.php | 559 +++ program/lib/Roundcube/rcube_charset.php | 791 +++++ program/lib/Roundcube/rcube_config.php | 441 +++ program/lib/Roundcube/rcube_contacts.php | 1002 ++++++ program/lib/Roundcube/rcube_content_filter.php | 60 + program/lib/Roundcube/rcube_csv2vcard.php | 382 +++ program/lib/Roundcube/rcube_db.php | 1009 ++++++ program/lib/Roundcube/rcube_db_mssql.php | 156 + program/lib/Roundcube/rcube_db_mysql.php | 159 + program/lib/Roundcube/rcube_db_pgsql.php | 136 + program/lib/Roundcube/rcube_db_sqlite.php | 179 + program/lib/Roundcube/rcube_db_sqlsrv.php | 157 + program/lib/Roundcube/rcube_image.php | 268 ++ program/lib/Roundcube/rcube_imap.php | 4167 +++++++++++++++++++++++ program/lib/Roundcube/rcube_imap_cache.php | 1160 +++++++ program/lib/Roundcube/rcube_imap_generic.php | 3694 ++++++++++++++++++++ program/lib/Roundcube/rcube_ldap.php | 2352 +++++++++++++ program/lib/Roundcube/rcube_message.php | 758 +++++ program/lib/Roundcube/rcube_message_header.php | 288 ++ program/lib/Roundcube/rcube_message_part.php | 100 + program/lib/Roundcube/rcube_mime.php | 713 ++++ program/lib/Roundcube/rcube_output.php | 284 ++ program/lib/Roundcube/rcube_output_html.php | 1775 ++++++++++ program/lib/Roundcube/rcube_output_json.php | 258 ++ program/lib/Roundcube/rcube_plugin.php | 360 ++ program/lib/Roundcube/rcube_plugin_api.php | 495 +++ program/lib/Roundcube/rcube_result_index.php | 453 +++ program/lib/Roundcube/rcube_result_set.php | 72 + program/lib/Roundcube/rcube_result_thread.php | 676 ++++ program/lib/Roundcube/rcube_session.php | 632 ++++ program/lib/Roundcube/rcube_smtp.php | 470 +++ program/lib/Roundcube/rcube_spellchecker.php | 621 ++++ program/lib/Roundcube/rcube_storage.php | 991 ++++++ program/lib/Roundcube/rcube_string_replacer.php | 195 ++ program/lib/Roundcube/rcube_user.php | 723 ++++ program/lib/Roundcube/rcube_utils.php | 977 ++++++ 42 files changed, 30785 insertions(+) create mode 100644 program/lib/Roundcube/bootstrap.php create mode 100644 program/lib/Roundcube/html.php create mode 100644 program/lib/Roundcube/rcube.php create mode 100644 program/lib/Roundcube/rcube_addressbook.php create mode 100644 program/lib/Roundcube/rcube_base_replacer.php create mode 100644 program/lib/Roundcube/rcube_browser.php create mode 100644 program/lib/Roundcube/rcube_cache.php create mode 100644 program/lib/Roundcube/rcube_charset.php create mode 100644 program/lib/Roundcube/rcube_config.php create mode 100644 program/lib/Roundcube/rcube_contacts.php create mode 100644 program/lib/Roundcube/rcube_content_filter.php create mode 100644 program/lib/Roundcube/rcube_csv2vcard.php create mode 100644 program/lib/Roundcube/rcube_db.php create mode 100644 program/lib/Roundcube/rcube_db_mssql.php create mode 100644 program/lib/Roundcube/rcube_db_mysql.php create mode 100644 program/lib/Roundcube/rcube_db_pgsql.php create mode 100644 program/lib/Roundcube/rcube_db_sqlite.php create mode 100644 program/lib/Roundcube/rcube_db_sqlsrv.php create mode 100644 program/lib/Roundcube/rcube_image.php create mode 100644 program/lib/Roundcube/rcube_imap.php create mode 100644 program/lib/Roundcube/rcube_imap_cache.php create mode 100644 program/lib/Roundcube/rcube_imap_generic.php create mode 100644 program/lib/Roundcube/rcube_ldap.php create mode 100644 program/lib/Roundcube/rcube_message.php create mode 100644 program/lib/Roundcube/rcube_message_header.php create mode 100644 program/lib/Roundcube/rcube_message_part.php create mode 100644 program/lib/Roundcube/rcube_mime.php create mode 100644 program/lib/Roundcube/rcube_output.php create mode 100644 program/lib/Roundcube/rcube_output_html.php create mode 100644 program/lib/Roundcube/rcube_output_json.php create mode 100644 program/lib/Roundcube/rcube_plugin.php create mode 100644 program/lib/Roundcube/rcube_plugin_api.php create mode 100644 program/lib/Roundcube/rcube_result_index.php create mode 100644 program/lib/Roundcube/rcube_result_set.php create mode 100644 program/lib/Roundcube/rcube_result_thread.php create mode 100644 program/lib/Roundcube/rcube_session.php create mode 100644 program/lib/Roundcube/rcube_smtp.php create mode 100644 program/lib/Roundcube/rcube_spellchecker.php create mode 100644 program/lib/Roundcube/rcube_storage.php create mode 100644 program/lib/Roundcube/rcube_string_replacer.php create mode 100644 program/lib/Roundcube/rcube_user.php create mode 100644 program/lib/Roundcube/rcube_utils.php (limited to 'program/lib') diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php new file mode 100644 index 000000000..bc0456cf3 --- /dev/null +++ b/program/lib/Roundcube/bootstrap.php @@ -0,0 +1,482 @@ + | + | 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_.+/', + '/^rcube(.*)/', + '/^utf8$/', + ), + array( + 'Mail/\\1', + 'Net/\\1', + 'Auth/\\1', + 'Roundcube/html', + 'Roundcube/rcube\\1', + '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/lib/Roundcube/html.php b/program/lib/Roundcube/html.php new file mode 100644 index 000000000..8ff685a84 --- /dev/null +++ b/program/lib/Roundcube/html.php @@ -0,0 +1,849 @@ + | + +-----------------------------------------------------------------------+ +*/ + + +/** + * Class for HTML code creation + * + * @package Framework + * @subpackage HTML + */ +class html +{ + protected $tagname; + protected $attrib = array(); + protected $allowed = array(); + protected $content; + + public static $doctype = 'xhtml'; + public static $lc_tags = true; + public static $common_attrib = array('id','class','style','title','align'); + public static $containers = array('iframe','div','span','p','h1','h2','h3','form','textarea','table','thead','tbody','tr','th','td','style','script'); + + /** + * Constructor + * + * @param array $attrib Hash array with tag attributes + */ + public function __construct($attrib = array()) + { + if (is_array($attrib)) { + $this->attrib = $attrib; + } + } + + /** + * Return the tag code + * + * @return string The finally composed HTML tag + */ + public function show() + { + return self::tag($this->tagname, $this->attrib, $this->content, array_merge(self::$common_attrib, $this->allowed)); + } + + /****** STATIC METHODS *******/ + + /** + * Generic method to create a HTML tag + * + * @param string $tagname Tag name + * @param array $attrib Tag attributes as key/value pairs + * @param string $content Optinal Tag content (creates a container tag) + * @param array $allowed_attrib List with allowed attributes, omit to allow all + * @return string The XHTML tag + */ + public static function tag($tagname, $attrib = array(), $content = null, $allowed_attrib = null) + { + if (is_string($attrib)) + $attrib = array('class' => $attrib); + + $inline_tags = array('a','span','img'); + $suffix = $attrib['nl'] || ($content && $attrib['nl'] !== false && !in_array($tagname, $inline_tags)) ? "\n" : ''; + + $tagname = self::$lc_tags ? strtolower($tagname) : $tagname; + if (isset($content) || in_array($tagname, self::$containers)) { + $suffix = $attrib['noclose'] ? $suffix : '' . $suffix; + unset($attrib['noclose'], $attrib['nl']); + return '<' . $tagname . self::attrib_string($attrib, $allowed_attrib) . '>' . $content . $suffix; + } + else { + return '<' . $tagname . self::attrib_string($attrib, $allowed_attrib) . '>' . $suffix; + } + } + + /** + * + */ + public static function doctype($type) + { + $doctypes = array( + 'html5' => '', + 'xhtml' => '', + 'xhtml-trans' => '', + 'xhtml-strict' => '', + ); + + if ($doctypes[$type]) { + self::$doctype = preg_replace('/-\w+$/', '', $type); + return $doctypes[$type]; + } + + return ''; + } + + /** + * Derrived method for
containers + * + * @param mixed $attr Hash array with tag attributes or string with class name + * @param string $cont Div content + * @return string HTML code + * @see html::tag() + */ + public static function div($attr = null, $cont = null) + { + if (is_string($attr)) { + $attr = array('class' => $attr); + } + return self::tag('div', $attr, $cont, array_merge(self::$common_attrib, array('onclick'))); + } + + /** + * Derrived method for

blocks + * + * @param mixed $attr Hash array with tag attributes or string with class name + * @param string $cont Paragraph content + * @return string HTML code + * @see html::tag() + */ + public static function p($attr = null, $cont = null) + { + if (is_string($attr)) { + $attr = array('class' => $attr); + } + return self::tag('p', $attr, $cont, self::$common_attrib); + } + + /** + * Derrived method to create + * + * @param mixed $attr Hash array with tag attributes or string with image source (src) + * @return string HTML code + * @see html::tag() + */ + public static function img($attr = null) + { + if (is_string($attr)) { + $attr = array('src' => $attr); + } + return self::tag('img', $attr + array('alt' => ''), null, array_merge(self::$common_attrib, + array('src','alt','width','height','border','usemap','onclick'))); + } + + /** + * Derrived method for link tags + * + * @param mixed $attr Hash array with tag attributes or string with link location (href) + * @param string $cont Link content + * @return string HTML code + * @see html::tag() + */ + public static function a($attr, $cont) + { + if (is_string($attr)) { + $attr = array('href' => $attr); + } + return self::tag('a', $attr, $cont, array_merge(self::$common_attrib, + array('href','target','name','rel','onclick','onmouseover','onmouseout','onmousedown','onmouseup'))); + } + + /** + * Derrived method for inline span tags + * + * @param mixed $attr Hash array with tag attributes or string with class name + * @param string $cont Tag content + * @return string HTML code + * @see html::tag() + */ + public static function span($attr, $cont) + { + if (is_string($attr)) { + $attr = array('class' => $attr); + } + return self::tag('span', $attr, $cont, self::$common_attrib); + } + + /** + * Derrived method for form element labels + * + * @param mixed $attr Hash array with tag attributes or string with 'for' attrib + * @param string $cont Tag content + * @return string HTML code + * @see html::tag() + */ + public static function label($attr, $cont) + { + if (is_string($attr)) { + $attr = array('for' => $attr); + } + return self::tag('label', $attr, $cont, array_merge(self::$common_attrib, array('for'))); + } + + /** + * Derrived method to create + * + * @param mixed $attr Hash array with tag attributes or string with frame source (src) + * @return string HTML code + * @see html::tag() + */ + public static function iframe($attr = null, $cont = null) + { + if (is_string($attr)) { + $attr = array('src' => $attr); + } + return self::tag('iframe', $attr, $cont, array_merge(self::$common_attrib, + array('src','name','width','height','border','frameborder'))); + } + + /** + * Derrived method to create