diff options
author | thomascube <thomas@roundcube.net> | 2012-01-16 15:14:41 +0000 |
---|---|---|
committer | thomascube <thomas@roundcube.net> | 2012-01-16 15:14:41 +0000 |
commit | c321a955a7b0f6d6b13ffaebf040a6c7091037ae (patch) | |
tree | 60c257d29a726d9bdda7fb75a198342aaef315fa /program/include/main.inc | |
parent | 8764b6ecf0c8d1b0646915a8139cdf6bbac2ca14 (diff) |
Merged devel-framework branch (r5746:5779) back into trunk
Diffstat (limited to 'program/include/main.inc')
-rw-r--r-- | program/include/main.inc | 374 |
1 files changed, 41 insertions, 333 deletions
diff --git a/program/include/main.inc b/program/include/main.inc index 9f154e4b7..29f6de79d 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -26,7 +26,6 @@ * @author Thomas Bruederli <roundcube@gmail.com> */ -require_once 'utf7.inc'; require_once INSTALL_PATH . 'program/include/rcube_shared.inc'; // define constannts for input reading @@ -183,336 +182,40 @@ function rcmail_cache_gc() } -/** - * Catch an error and throw an exception. - * - * @param int Level of the error - * @param string Error message - */ -function rcube_error_handler($errno, $errstr) +// Deprecated +function rcube_charset_convert($str, $from, $to=NULL) { - throw new ErrorException($errstr, 0, $errno); + return rcube_charset::convert($str, $from, $to); } -/** - * Convert a string from one charset to another. - * Uses mbstring and iconv functions if possible - * - * @param string Input string - * @param string Suspected charset of the input string - * @param string Target charset to convert to; defaults to RCMAIL_CHARSET - * @return string Converted string - */ -function rcube_charset_convert($str, $from, $to=NULL) +// Deprecated +function rc_detect_encoding($string, $failover='') { - static $iconv_options = null; - static $mbstring_loaded = null; - static $mbstring_list = null; - static $conv = null; - - $error = false; - - $to = empty($to) ? strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to); - $from = rcube_parse_charset($from); - - if ($from == $to || empty($str) || empty($from)) - return $str; - - // convert charset using iconv module - if (function_exists('iconv') && $from != 'UTF7-IMAP' && $to != 'UTF7-IMAP') { - if ($iconv_options === null) { - // ignore characters not available in output charset - $iconv_options = '//IGNORE'; - if (iconv('', $iconv_options, '') === false) { - // iconv implementation does not support options - $iconv_options = ''; - } - } - - // throw an exception if iconv reports an illegal character in input - // it means that input string has been truncated - set_error_handler('rcube_error_handler', E_NOTICE); - try { - $_iconv = iconv($from, $to . $iconv_options, $str); - } catch (ErrorException $e) { - $_iconv = false; - } - restore_error_handler(); - if ($_iconv !== false) { - return $_iconv; - } - } - - if ($mbstring_loaded === null) - $mbstring_loaded = extension_loaded('mbstring'); - - // convert charset using mbstring module - if ($mbstring_loaded) { - $aliases['WINDOWS-1257'] = 'ISO-8859-13'; - - if ($mbstring_list === null) { - $mbstring_list = mb_list_encodings(); - $mbstring_list = array_map('strtoupper', $mbstring_list); - } - - $mb_from = $aliases[$from] ? $aliases[$from] : $from; - $mb_to = $aliases[$to] ? $aliases[$to] : $to; - - // return if encoding found, string matches encoding and convert succeeded - if (in_array($mb_from, $mbstring_list) && in_array($mb_to, $mbstring_list)) { - if (mb_check_encoding($str, $mb_from) && ($out = mb_convert_encoding($str, $mb_to, $mb_from))) - return $out; - } - } - - // convert charset using bundled classes/functions - if ($to == 'UTF-8') { - if ($from == 'UTF7-IMAP') { - if ($_str = utf7_to_utf8($str)) - return $_str; - } - else if ($from == 'UTF-7') { - if ($_str = rcube_utf7_to_utf8($str)) - return $_str; - } - else if (($from == 'ISO-8859-1') && function_exists('utf8_encode')) { - return utf8_encode($str); - } - else if (class_exists('utf8')) { - if (!$conv) - $conv = new utf8($from); - else - $conv->loadCharset($from); - - if($_str = $conv->strToUtf8($str)) - return $_str; - } - $error = true; - } - - // encode string for output - if ($from == 'UTF-8') { - // @TODO: we need a function for UTF-7 (RFC2152) conversion - if ($to == 'UTF7-IMAP' || $to == 'UTF-7') { - if ($_str = utf8_to_utf7($str)) - return $_str; - } - else if ($to == 'ISO-8859-1' && function_exists('utf8_decode')) { - return utf8_decode($str); - } - else if (class_exists('utf8')) { - if (!$conv) - $conv = new utf8($to); - else - $conv->loadCharset($from); - - if ($_str = $conv->strToUtf8($str)) - return $_str; - } - $error = true; - } - - // return UTF-8 or original string - return $str; + return rcube_charset::detect($string, $failover); } -/** - * Parse and validate charset name string (see #1485758). - * Sometimes charset string is malformed, there are also charset aliases - * but we need strict names for charset conversion (specially utf8 class) - * - * @param string Input charset name - * @return string The validated charset name - */ -function rcube_parse_charset($input) +// Deprecated +function rc_utf8_clean($input) { - static $charsets = array(); - $charset = strtoupper($input); - - if (isset($charsets[$input])) - return $charsets[$input]; - - $charset = preg_replace(array( - '/^[^0-9A-Z]+/', // e.g. _ISO-8859-JP$SIO - '/\$.*$/', // e.g. _ISO-8859-JP$SIO - '/UNICODE-1-1-*/', // RFC1641/1642 - '/^X-/', // X- prefix (e.g. X-ROMAN8 => ROMAN8) - ), '', $charset); - - if ($charset == 'BINARY') - return $charsets[$input] = null; - - # Aliases: some of them from HTML5 spec. - $aliases = array( - 'USASCII' => 'WINDOWS-1252', - 'ANSIX31101983' => 'WINDOWS-1252', - 'ANSIX341968' => 'WINDOWS-1252', - 'UNKNOWN8BIT' => 'ISO-8859-15', - 'UNKNOWN' => 'ISO-8859-15', - 'USERDEFINED' => 'ISO-8859-15', - 'KSC56011987' => 'EUC-KR', - 'GB2312' => 'GBK', - 'GB231280' => 'GBK', - 'UNICODE' => 'UTF-8', - 'UTF7IMAP' => 'UTF7-IMAP', - 'TIS620' => 'WINDOWS-874', - 'ISO88599' => 'WINDOWS-1254', - 'ISO885911' => 'WINDOWS-874', - 'MACROMAN' => 'MACINTOSH', - '77' => 'MAC', - '128' => 'SHIFT-JIS', - '129' => 'CP949', - '130' => 'CP1361', - '134' => 'GBK', - '136' => 'BIG5', - '161' => 'WINDOWS-1253', - '162' => 'WINDOWS-1254', - '163' => 'WINDOWS-1258', - '177' => 'WINDOWS-1255', - '178' => 'WINDOWS-1256', - '186' => 'WINDOWS-1257', - '204' => 'WINDOWS-1251', - '222' => 'WINDOWS-874', - '238' => 'WINDOWS-1250', - 'MS950' => 'CP950', - 'WINDOWS949' => 'UHC', - ); - - // allow A-Z and 0-9 only - $str = preg_replace('/[^A-Z0-9]/', '', $charset); - - if (isset($aliases[$str])) - $result = $aliases[$str]; - // UTF - else if (preg_match('/U[A-Z][A-Z](7|8|16|32)(BE|LE)*/', $str, $m)) - $result = 'UTF-' . $m[1] . $m[2]; - // ISO-8859 - else if (preg_match('/ISO8859([0-9]{0,2})/', $str, $m)) { - $iso = 'ISO-8859-' . ($m[1] ? $m[1] : 1); - // some clients sends windows-1252 text as latin1, - // it is safe to use windows-1252 for all latin1 - $result = $iso == 'ISO-8859-1' ? 'WINDOWS-1252' : $iso; - } - // handle broken charset names e.g. WINDOWS-1250HTTP-EQUIVCONTENT-TYPE - else if (preg_match('/(WIN|WINDOWS)([0-9]+)/', $str, $m)) { - $result = 'WINDOWS-' . $m[2]; - } - // LATIN - else if (preg_match('/LATIN(.*)/', $str, $m)) { - $aliases = array('2' => 2, '3' => 3, '4' => 4, '5' => 9, '6' => 10, - '7' => 13, '8' => 14, '9' => 15, '10' => 16, - 'ARABIC' => 6, 'CYRILLIC' => 5, 'GREEK' => 7, 'GREEK1' => 7, 'HEBREW' => 8); - - // some clients sends windows-1252 text as latin1, - // it is safe to use windows-1252 for all latin1 - if ($m[1] == 1) { - $result = 'WINDOWS-1252'; - } - // if iconv is not supported we need ISO labels, it's also safe for iconv - else if (!empty($aliases[$m[1]])) { - $result = 'ISO-8859-'.$aliases[$m[1]]; - } - // iconv requires convertion of e.g. LATIN-1 to LATIN1 - else { - $result = $str; - } - } - else { - $result = $charset; - } - - $charsets[$input] = $result; - - return $result; + return rcube_charset::clean($input); } /** - * Converts string from standard UTF-7 (RFC 2152) to UTF-8. + * Convert a variable into a javascript object notation * - * @param string Input string - * @return string The converted string + * @param mixed Input value + * @return string Serialized JSON string */ -function rcube_utf7_to_utf8($str) +function json_serialize($input) { - $Index_64 = array( - 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, - 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, - 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0, - 1,1,1,1, 1,1,1,1, 1,1,0,0, 0,0,0,0, - 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, - 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0, - 0,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, - 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0, - ); - - $u7len = strlen($str); - $str = strval($str); - $res = ''; - - for ($i=0; $u7len > 0; $i++, $u7len--) - { - $u7 = $str[$i]; - if ($u7 == '+') - { - $i++; - $u7len--; - $ch = ''; - - for (; $u7len > 0; $i++, $u7len--) - { - $u7 = $str[$i]; - - if (!$Index_64[ord($u7)]) - break; - - $ch .= $u7; - } + $input = rcube_charset::clean($input); - if ($ch == '') { - if ($u7 == '-') - $res .= '+'; - continue; - } - - $res .= rcube_utf16_to_utf8(base64_decode($ch)); - } - else - { - $res .= $u7; - } - } - - return $res; -} - -/** - * Converts string from UTF-16 to UTF-8 (helper for utf-7 to utf-8 conversion) - * - * @param string Input string - * @return string The converted string - */ -function rcube_utf16_to_utf8($str) -{ - $len = strlen($str); - $dec = ''; - - for ($i = 0; $i < $len; $i += 2) { - $c = ord($str[$i]) << 8 | ord($str[$i + 1]); - if ($c >= 0x0001 && $c <= 0x007F) { - $dec .= chr($c); - } else if ($c > 0x07FF) { - $dec .= chr(0xE0 | (($c >> 12) & 0x0F)); - $dec .= chr(0x80 | (($c >> 6) & 0x3F)); - $dec .= chr(0x80 | (($c >> 0) & 0x3F)); - } else { - $dec .= chr(0xC0 | (($c >> 6) & 0x1F)); - $dec .= chr(0x80 | (($c >> 0) & 0x3F)); - } - } - return $dec; + // sometimes even using rcube_charset::clean() the input contains invalid UTF-8 sequences + // that's why we have @ here + return @json_encode($input); } @@ -1193,13 +896,13 @@ function rcmail_mailbox_list($attrib) $attrib['folder_name'] = '*'; // get mailbox list - $mbox_name = $RCMAIL->imap->get_mailbox_name(); + $mbox_name = $RCMAIL->storage->get_folder(); // build the folders tree if (empty($a_mailboxes)) { // get mailbox list - $a_folders = $RCMAIL->imap->list_mailboxes('', $attrib['folder_name'], $attrib['folder_filter']); - $delimiter = $RCMAIL->imap->get_hierarchy_delimiter(); + $a_folders = $RCMAIL->storage->list_folders_subscribed('', $attrib['folder_name'], $attrib['folder_filter']); + $delimiter = $RCMAIL->storage->get_hierarchy_delimiter(); $a_mailboxes = array(); foreach ($a_folders as $folder) @@ -1245,16 +948,18 @@ function rcmail_mailbox_select($p = array()) $p += array('maxlength' => 100, 'realnames' => false); $a_mailboxes = array(); + $storage = $RCMAIL->get_storage(); - if (empty($p['folder_name'])) + if (empty($p['folder_name'])) { $p['folder_name'] = '*'; + } if ($p['unsubscribed']) - $list = $RCMAIL->imap->list_unsubscribed('', $p['folder_name'], $p['folder_filter'], $p['folder_rights']); + $list = $storage->list_folders('', $p['folder_name'], $p['folder_filter'], $p['folder_rights']); else - $list = $RCMAIL->imap->list_mailboxes('', $p['folder_name'], $p['folder_filter'], $p['folder_rights']); + $list = $storage->list_folders_subscribed('', $p['folder_name'], $p['folder_filter'], $p['folder_rights']); - $delimiter = $RCMAIL->imap->get_hierarchy_delimiter(); + $delimiter = $storage->get_hierarchy_delimiter(); foreach ($list as $folder) { if (empty($p['exceptions']) || !in_array($folder, $p['exceptions'])) @@ -1285,7 +990,7 @@ function rcmail_build_folder_tree(&$arrFolders, $folder, $delm='/', $path='') $prefix = ''; if (!$path) { $n_folder = $folder; - $folder = $RCMAIL->imap->mod_mailbox($folder); + $folder = $RCMAIL->storage->mod_folder($folder); if ($n_folder != $folder) { $prefix = substr($n_folder, 0, -strlen($folder)); @@ -1340,7 +1045,7 @@ function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, &$jslist, $at $maxlength = intval($attrib['maxlength']); $realnames = (bool)$attrib['realnames']; - $msgcounts = $RCMAIL->imap->get_cache('messagecount'); + $msgcounts = $RCMAIL->storage->get_cache('messagecount'); $out = ''; foreach ($arrFolders as $key => $folder) { @@ -1432,7 +1137,7 @@ function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, } // skip folders in which it isn't possible to create subfolders - if (!empty($opts['skip_noinferiors']) && ($attrs = $RCMAIL->imap->mailbox_attributes($folder['id'])) + if (!empty($opts['skip_noinferiors']) && ($attrs = $RCMAIL->storage->folder_attributes($folder['id'])) && in_array('\\Noinferiors', $attrs) ) { continue; @@ -1501,8 +1206,8 @@ function rcmail_localize_folderpath($path) global $RCMAIL; $protect_folders = $RCMAIL->config->get('protect_default_folders'); - $default_folders = (array) $RCMAIL->config->get('default_imap_folders'); - $delimiter = $RCMAIL->imap->get_hierarchy_delimiter(); + $default_folders = (array) $RCMAIL->config->get('default_folders'); + $delimiter = $RCMAIL->storage->get_hierarchy_delimiter(); $path = explode($delimiter, $path); $result = array(); @@ -1545,7 +1250,7 @@ function rcmail_quota_content($attrib=NULL) { global $RCMAIL; - $quota = $RCMAIL->imap->get_quota(); + $quota = $RCMAIL->storage->get_quota(); $quota = $RCMAIL->plugins->exec_hook('quota', $quota); $quota_result = (array) $quota; @@ -1591,16 +1296,19 @@ function rcmail_display_server_error($fallback=null, $fallback_args=null) { global $RCMAIL; - $err_code = $RCMAIL->imap->get_error_code(); - $res_code = $RCMAIL->imap->get_response_code(); + $err_code = $RCMAIL->storage->get_error_code(); + $res_code = $RCMAIL->storage->get_response_code(); - if ($res_code == rcube_imap::NOPERM) { + if ($err_code < 0) { + $RCMAIL->output->show_message('storageerror', 'error'); + } + else if ($res_code == rcube_storage::NOPERM) { $RCMAIL->output->show_message('errornoperm', 'error'); } - else if ($res_code == rcube_imap::READONLY) { + else if ($res_code == rcube_storage::READONLY) { $RCMAIL->output->show_message('errorreadonly', 'error'); } - else if ($err_code && ($err_str = $RCMAIL->imap->get_error_str())) { + else if ($err_code && ($err_str = $RCMAIL->storage->get_error_str())) { // try to detect access rights problem and display appropriate message if (stripos($err_str, 'Permission denied') !== false) $RCMAIL->output->show_message('errornoperm', 'error'); @@ -1968,7 +1676,7 @@ function rcube_parse_host($name, $host='') // %d - domain name without first part, e.g. %n=mail.domain.tld, %d=domain.tld $d = preg_replace('/^[^\.]+\./', '', $n); // %h - IMAP host - $h = $_SESSION['imap_host'] ? $_SESSION['imap_host'] : $host; + $h = $_SESSION['storage_host'] ? $_SESSION['storage_host'] : $host; // %z - IMAP domain without first part, e.g. %h=imap.domain.tld, %z=domain.tld $z = preg_replace('/^[^\.]+\./', '', $h); // %s - domain name after the '@' from e-mail address provided at login screen. Returns FALSE if an invalid email is provided |