From 42e328a85f5880e3e767eebaaa88b55a2b49d2ff Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Fri, 19 Sep 2008 15:42:11 -0400 Subject: [PATCH] Indent with spaces not tabs. Please respect our code-style when creating patches! --- program/include/rcube_shared.inc | 304 ++++++++++++++++++-------------------------------- 1 files changed, 108 insertions(+), 196 deletions(-) diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index acf98c9..4d35a4d 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -28,177 +28,6 @@ /** - * Provide details about the client's browser - * - * @return array Key-value pairs of browser properties - */ -function rcube_browser() -{ - $HTTP_USER_AGENT = $_SERVER['HTTP_USER_AGENT']; - - $bw['ver'] = 0; - $bw['win'] = stristr($HTTP_USER_AGENT, 'win'); - $bw['mac'] = stristr($HTTP_USER_AGENT, 'mac'); - $bw['linux'] = stristr($HTTP_USER_AGENT, 'linux'); - $bw['unix'] = stristr($HTTP_USER_AGENT, 'unix'); - - $bw['ns4'] = stristr($HTTP_USER_AGENT, 'mozilla/4') && !stristr($HTTP_USER_AGENT, 'msie'); - $bw['ns'] = ($bw['ns4'] || stristr($HTTP_USER_AGENT, 'netscape')); - $bw['ie'] = stristr($HTTP_USER_AGENT, 'msie'); - $bw['mz'] = stristr($HTTP_USER_AGENT, 'mozilla/5'); - $bw['opera'] = stristr($HTTP_USER_AGENT, 'opera'); - $bw['safari'] = stristr($HTTP_USER_AGENT, 'safari'); - - if($bw['ns']) - { - $test = eregi("mozilla\/([0-9\.]+)", $HTTP_USER_AGENT, $regs); - $bw['ver'] = $test ? (float)$regs[1] : 0; - } - if($bw['mz']) - { - $test = ereg("rv:([0-9\.]+)", $HTTP_USER_AGENT, $regs); - $bw['ver'] = $test ? (float)$regs[1] : 0; - } - if($bw['ie']) - { - $test = eregi("msie ([0-9\.]+)", $HTTP_USER_AGENT, $regs); - $bw['ver'] = $test ? (float)$regs[1] : 0; - } - if($bw['opera']) - { - $test = eregi("opera ([0-9\.]+)", $HTTP_USER_AGENT, $regs); - $bw['ver'] = $test ? (float)$regs[1] : 0; - } - - if(eregi(" ([a-z]{2})-([a-z]{2})", $HTTP_USER_AGENT, $regs)) - $bw['lang'] = $regs[1]; - else - $bw['lang'] = 'en'; - - $bw['dom'] = ($bw['mz'] || $bw['safari'] || ($bw['ie'] && $bw['ver']>=5) || ($bw['opera'] && $bw['ver']>=7)); - $bw['pngalpha'] = $bw['mz'] || $bw['safari'] || ($bw['ie'] && $bw['ver']>=5.5) || - ($bw['ie'] && $bw['ver']>=5 && $bw['mac']) || ($bw['opera'] && $bw['ver']>=7) ? TRUE : FALSE; - - return $bw; -} - - -/** - * Get localized text in the desired language - * - * @param mixed Named parameters array or label name - * @return string Localized text - */ -function rcube_label($attrib) -{ - global $sess_user_lang, $INSTALL_PATH, $OUTPUT; - static $sa_text_data, $s_language, $utf8_decode; - - // extract attributes - if (is_string($attrib)) - $attrib = array('name' => $attrib); - - $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1; - $vars = isset($attrib['vars']) ? $attrib['vars'] : ''; - - $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL; - $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : ''); - - - // load localized texts - if (!$sa_text_data || $s_language != $sess_user_lang) - { - $sa_text_data = array(); - - // get english labels (these should be complete) - @include($INSTALL_PATH.'program/localization/en_US/labels.inc'); - @include($INSTALL_PATH.'program/localization/en_US/messages.inc'); - - if (is_array($labels)) - $sa_text_data = $labels; - if (is_array($messages)) - $sa_text_data = array_merge($sa_text_data, $messages); - - // include user language files - if ($sess_user_lang!='en' && is_dir($INSTALL_PATH.'program/localization/'.$sess_user_lang)) - { - include_once($INSTALL_PATH.'program/localization/'.$sess_user_lang.'/labels.inc'); - include_once($INSTALL_PATH.'program/localization/'.$sess_user_lang.'/messages.inc'); - - if (is_array($labels)) - $sa_text_data = array_merge($sa_text_data, $labels); - if (is_array($messages)) - $sa_text_data = array_merge($sa_text_data, $messages); - } - - $s_language = $sess_user_lang; - } - - // text does not exist - if (!($text_item = $sa_text_data[$alias])) - { - /* - raise_error(array( - 'code' => 500, - 'type' => 'php', - 'line' => __LINE__, - 'file' => __FILE__, - 'message' => "Missing localized text for '$alias' in '$sess_user_lang'"), TRUE, FALSE); - */ - return "[$alias]"; - } - - // make text item array - $a_text_item = is_array($text_item) ? $text_item : array('single' => $text_item); - - // decide which text to use - if ($nr==1) - $text = $a_text_item['single']; - else if ($nr>0) - $text = $a_text_item['multiple']; - else if ($nr==0) - { - if ($a_text_item['none']) - $text = $a_text_item['none']; - else if ($a_text_item['single']) - $text = $a_text_item['single']; - else if ($a_text_item['multiple']) - $text = $a_text_item['multiple']; - } - - // default text is single - if ($text=='') - $text = $a_text_item['single']; - - // replace vars in text - if (is_array($attrib['vars'])) - { - foreach ($attrib['vars'] as $var_key=>$var_value) - $a_replace_vars[substr($var_key, 0, 1)=='$' ? substr($var_key, 1) : $var_key] = $var_value; - } - - if ($a_replace_vars) - $text = preg_replace('/\${?([_a-z]{1}[_a-z0-9]*)}?/ei', '$a_replace_vars["\1"]', $text); - - // remove variables in text which were not available in arg $vars and $nr - eval("\$text = <<<EOF -$text -EOF; -"); - - // format output - if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst']) - return ucfirst($text); - else if ($attrib['uppercase']) - return strtoupper($text); - else if ($attrib['lowercase']) - return strtolower($text); - - return $text; -} - - -/** * Send HTTP headers to prevent caching this page */ function send_nocacheing_headers() @@ -208,8 +37,14 @@ header("Expires: ".gmdate("D, d M Y H:i:s")." GMT"); header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT"); - header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); + header("Cache-Control: private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0"); header("Pragma: no-cache"); + + // We need to set the following headers to make downloads work using IE in HTTPS mode. + if (isset($_SERVER['HTTPS'])) { + header('Pragma: '); + header('Cache-Control: '); + } } @@ -236,18 +71,22 @@ * @param int Modified date as unix timestamp * @param string Etag value for caching */ -function send_modified_header($mdate, $etag=null) +function send_modified_header($mdate, $etag=null, $skip_check=false) { if (headers_sent()) return; $iscached = false; - if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mdate) - $iscached = true; - $etag = $etag ? "\"$etag\"" : null; - if ($etag && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) - $iscached = true; + + if (!$skip_check) + { + if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mdate) + $iscached = true; + + if ($etag) + $iscached = ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag); + } if ($iscached) header("HTTP/1.x 304 Not Modified"); @@ -262,7 +101,10 @@ header("Etag: $etag"); if ($iscached) + { + ob_end_clean(); exit; + } } @@ -434,6 +276,10 @@ { $host_url = $base_url; $abs_path = $path; + + // check if path is an absolute URL + if (preg_match('/^[fhtps]+:\/\//', $path)) + return $path; // cut base_url to the last directory if (strpos($base_url, '/')>7) @@ -523,15 +369,39 @@ /** + * Read a specific HTTP request header + * + * @access static + * @param string $name Header name + * @return mixed Header value or null if not available + */ +function rc_request_header($name) +{ + if (function_exists('getallheaders')) + { + $hdrs = array_change_key_case(getallheaders(), CASE_UPPER); + $key = strtoupper($name); + } + else + { + $key = 'HTTP_' . strtoupper(strtr($name, '-', '_')); + $hdrs = array_change_key_case($_SERVER, CASE_UPPER); + } + + return $hdrs[$key]; + } + + +/** * Replace the middle part of a string with ... * if it is longer than the allowed length * * @param string Input string * @param int Max. length * @param string Replace removed chars with this - * @return string Abbrevated string + * @return string Abbreviated string */ -function abbrevate_string($str, $maxlength, $place_holder='...') +function abbreviate_string($str, $maxlength, $place_holder='...') { $length = rc_strlen($str); $first_part_length = floor($maxlength/2) - rc_strlen($place_holder); @@ -624,27 +494,69 @@ /** - * Return the last occurence of a string in another string + * A method to guess the mime_type of an attachment. * - * @param haystack string string in which to search - * @param needle string string for which to search - * @return index of needle within haystack, or false if not found + * @param string $path Path to the file. + * @param string $failover Mime type supplied for failover. + * + * @return string + * @author Till Klampaeckel <till@php.net> + * @see http://de2.php.net/manual/en/ref.fileinfo.php + * @see http://de2.php.net/mime_content_type */ -function strrstr($haystack, $needle) +function rc_mime_content_type($path, $failover = 'application/octet-stream') { - $pver = phpversion(); - if ($pver[0] >= 5) - return strrpos($haystack, $needle); - else - { - $index = strpos(strrev($haystack), strrev($needle)); - if($index === false) - return false; + $mime_type = null; + $mime_magic = rcmail::get_instance()->config->get('mime_magic'); + + if (!extension_loaded('fileinfo')) { + @dl('fileinfo.' . PHP_SHLIB_SUFFIX); + } + + if (function_exists('finfo_open')) { + if ($finfo = finfo_open(FILEINFO_MIME, $mime_magic)) { + $mime_type = finfo_file($finfo, $path); + finfo_close($finfo); + } + } + if (!$mime_type && function_exists('mime_content_type')) { + $mime_type = mime_content_type($path); + } - $index = strlen($haystack) - strlen($needle) - $index; - return $index; - } + if (!$mime_type) { + $mime_type = $failover; + } + + return $mime_type; } +/** + * A method to guess encoding of a string. + * + * @param string $string String. + * @param string $failover Default result for failover. + * + * @return string + */ +function rc_detect_encoding($string, $failover='') +{ + if (!function_exists('mb_detect_encoding')) { + return $failover; + } + + // FIXME: the order is important, because sometimes + // iso string is detected as euc-jp and etc. + $enc = array( + 'UTF-8', 'ISO-8859-1', 'ISO-8859-2', 'ISO-8859-3', 'ISO-8859-4', + 'ISO-8859-5', 'ISO-8859-6', 'ISO-8859-7', 'ISO-8859-8', 'ISO-8859-9', + 'ISO-8859-10', 'ISO-8859-13', 'ISO-8859-14', 'ISO-8859-15', 'ISO-8859-16', + 'WINDOWS-1252', 'WINDOWS-1251', 'EUC-JP', 'EUC-TW', 'KOI8-R' + ); + + $result = mb_detect_encoding($string, join(',', $enc)); + + return $result ? $result : $failover; +} + ?> -- Gitblit v1.9.1