From e17702395e1aa0fa54eea36817e1150c231d49eb Mon Sep 17 00:00:00 2001 From: svncommit <devs@roundcube.net> Date: Mon, 26 Feb 2007 01:51:39 -0500 Subject: [PATCH] fixed check for selected value in value array in rcube_shared::select --- program/include/rcube_shared.inc | 482 ++++++++++++++++++++++++++++++++-------------------- 1 files changed, 294 insertions(+), 188 deletions(-) diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index 400e345..ba63c82 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -5,7 +5,7 @@ | rcube_shared.inc | | | | This file is part of the RoundCube PHP suite | - | Copyright (C) 2005, RoundCube Dev. - Switzerland | + | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland | | Licensed under the GNU GPL | | | | CONTENTS: | @@ -28,12 +28,15 @@ var $scripts_path = ''; var $script_files = array(); + var $external_scripts = array(); var $scripts = array(); var $charset = 'ISO-8859-1'; var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n"; var $script_tag = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n"; - + var $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>"; + var $tag_format_external_script = "<script type=\"text/javascript\" src=\"%s\"></script>\n"; + var $title = ''; var $header = ''; var $footer = ''; @@ -68,43 +71,78 @@ $this->script_files[$position][] = $file; } - + function include_external_script($script_location, $position='head') + { + if (!is_array($this->external_scripts[$position])) + { + $this->external_scripts[$position] = array(); + } + + $this->external_scripts[$position][] = $script_location; + } + function add_script($script, $position='head') { if (!isset($this->scripts[$position])) - $this->scripts[$position] = ''; - - $this->scripts[$position] .= "\n$script"; + $this->scripts[$position] = "\n$script"; + else + $this->scripts[$position] .= "\n$script"; } - function set_title() + function set_title($t) { - + $this->title = $t; } + function set_charset($charset) { + global $MBSTRING; + $this->charset = $charset; + + if ($MBSTRING && function_exists("mb_internal_encoding")) + { + if(!@mb_internal_encoding($charset)) + $MBSTRING = FALSE; + } + } + + function get_charset() + { + return $this->charset; + } + + + function reset() + { + $this->css = new rcube_css(); + $this->script_files = array(); + $this->scripts = array(); + $this->title = ''; } function write($templ='', $base_path='') { - $output = trim($templ); - + $output = empty($templ) ? $this->default_template : trim($templ); + // set default page title - if (!strlen($this->title)) - $this->title = 'RoundCube|Mail'; + if (empty($this->title)) + $this->title = 'RoundCube Mail'; // replace specialchars in content - $__page_title = rep_specialchars_output($this->title, 'html', 'show', FALSE); + $__page_title = Q($this->title, 'show', FALSE); $__page_header = $__page_body = $__page_footer = ''; // include meta tag with charset if (!empty($this->charset)) - $__page_header = '<meta http-equiv="content-type" content="text/html; charset='.$this->charset.'" />'."\n";; + { + header('Content-Type: text/html; charset='.$this->charset); + $__page_header = '<meta http-equiv="content-type" content="text/html; charset='.$this->charset.'" />'."\n"; + } // definition of the code to be placed in the document header and footer @@ -112,28 +150,39 @@ foreach ($this->script_files['head'] as $file) $__page_header .= sprintf($this->script_tag_file, $this->scripts_path, $file); - if (strlen($this->scripts['head'])) + if (is_array($this->external_scripts['head'])) + { + foreach ($this->external_scripts['head'] as $xscript) + { + $__page_header .= sprintf($this->tag_format_external_script, $xscript); + } + } + + if (!empty($this->scripts['head'])) $__page_header .= sprintf($this->script_tag, $this->scripts['head']); if (is_array($this->script_files['foot'])) + { foreach ($this->script_files['foot'] as $file) $__page_footer .= sprintf($this->script_tag_file, $this->scripts_path, $file); + } - if (strlen($this->scripts['foot'])) + if (!empty($this->scripts['foot'])) $__page_footer .= sprintf($this->script_tag, $this->scripts['foot']); - + + if ($this->footer) + $__page_footer .= "\n" . $this->footer; $__page_header .= $this->css->show(); - // find page header - if($hpos = strpos(strtolower($output), '</head>')) + if($hpos = rc_strpos(rc_strtolower($output), '</head>')) $__page_header .= "\n"; else { if (!is_numeric($hpos)) - $hpos = strpos(strtolower($output), '<body'); - if (!is_numeric($hpos) && ($hpos = strpos(strtolower($output), '<html'))) + $hpos = rc_strpos(rc_strtolower($output), '<body'); + if (!is_numeric($hpos) && ($hpos = rc_strpos(rc_strtolower($output), '<html'))) { while($output[$hpos]!='>') $hpos++; @@ -145,28 +194,30 @@ // add page hader if($hpos) - $output = substr($output,0,$hpos) . $__page_header . substr($output,$hpos,strlen($output)); + $output = rc_substr($output,0,$hpos) . $__page_header . rc_substr($output,$hpos,rc_strlen($output)); else $output = $__page_header . $output; // find page body - if($bpos = strpos(strtolower($output), '<body')) + if($bpos = rc_strpos(rc_strtolower($output), '<body')) { while($output[$bpos]!='>') $bpos++; $bpos++; } else - $bpos = strpos(strtolower($output), '</head>')+7; + $bpos = rc_strpos(rc_strtolower($output), '</head>')+7; // add page body if($bpos && $__page_body) - $output = substr($output,0,$bpos) . "\n$__page_body\n" . substr($output,$bpos,strlen($output)); + $output = rc_substr($output,0,$bpos) . "\n$__page_body\n" . rc_substr($output,$bpos,rc_strlen($output)); // find and add page footer - if(($fpos = strpos(strtolower($output), '</body>')) || ($fpos = strpos(strtolower($output), '</html>'))) - $output = substr($output,0,$fpos) . "$__page_footer\n" . substr($output,$fpos,strlen($output)); + $output_lc = rc_strtolower($output); + if(($fpos = strrstr($output_lc, '</body>')) || + ($fpos = strrstr($output_lc, '</html>'))) + $output = substr($output, 0, $fpos) . "$__page_footer\n" . substr($output, $fpos); else $output .= "\n$__page_footer"; @@ -175,10 +226,11 @@ $__page_header = $__page_footer = ''; - // correct absolute pathes in images and other tags + // correct absolute paths in images and other tags $output = preg_replace('/(src|href|background)=(["\']?)(\/[a-z0-9_\-]+)/Ui', "\\1=\\2$base_path\\3", $output); + $output = str_replace('$__skin_path', $base_path, $output); - print $output; + print rcube_charset_convert($output, 'UTF-8', $this->charset); } @@ -673,7 +725,7 @@ // encode textarea content if ($key=='value') - $value = rep_specialchars_output($value, 'html', 'replace', FALSE); + $value = Q($value, 'strict', FALSE); // attributes with no value if (in_array($key, array('checked', 'multiple', 'disabled', 'selected'))) @@ -826,9 +878,9 @@ if (isset($this->attrib['value'])) unset($this->attrib['value']); - if (strlen($value)) - $value = rep_specialchars_output($value, 'html', 'replace', FALSE); - + if (!empty($value) && !isset($this->attrib['mce_editable'])) + $value = Q($value, 'strict', FALSE); + // return final tag return sprintf('<%s%s>%s</%s>%s', $this->_conv_case('textarea', 'tag'), @@ -957,20 +1009,22 @@ if (!is_array($select)) $select = array((string)$select); - + foreach ($this->options as $option) { - $selected = ((strlen($option['value']) && in_array($option['value'], $select, TRUE)) || - (in_array($option['text'], $select, TRUE))) ? $this->_conv_case(' selected', 'attrib') : ''; + $selected = ((isset($option['value']) && + in_array($option['value'], $select, TRUE)) || + (in_array($option['text'], $select, TRUE))) ? + $this->_conv_case(' selected', 'attrib') : ''; $options_str .= sprintf("<%s%s%s>%s</%s>\n", $this->_conv_case('option', 'tag'), - strlen($option['value']) ? sprintf($value_str, $option['value']) : '', + isset($option['value']) ? sprintf($value_str, $option['value']) : '', $selected, - rep_specialchars_output($option['text'], 'html', 'replace', FALSE), + Q($option['text'], 'strict', FALSE), $this->_conv_case('option', 'tag')); } - + // return final tag return sprintf('<%s%s>%s</%s>%s', $this->_conv_case('select', 'tag'), @@ -1052,7 +1106,7 @@ $nr = is_numeric($attrib['nr']) ? $attrib['nr'] : 1; $vars = isset($attrib['vars']) ? $attrib['vars'] : ''; - $command_name = strlen($attrib['command']) ? $attrib['command'] : NULL; + $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] : ''); @@ -1062,8 +1116,8 @@ $sa_text_data = array(); // get english labels (these should be complete) - @include($INSTALL_PATH.'program/localization/en/labels.inc'); - @include($INSTALL_PATH.'program/localization/en/messages.inc'); + @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; @@ -1075,17 +1129,11 @@ { 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); - } - - if (isset($utf8_decoding) && $utf8_decoding==TRUE) - { - @include_once('lib/utf8.inc'); - $utf8_decode = TRUE; } $s_language = $sess_user_lang; @@ -1142,14 +1190,6 @@ EOF; "); - - // perform utf-8 decoding - if ($utf8_decode && function_exists('utf8ToUnicodeEntities')) - $text = utf8ToUnicodeEntities($text); - else if ($utf8_decode) - $OUTPUT->set_charset('UTF-8'); - - // format output if (($attrib['uppercase'] && strtolower($attrib['uppercase']=='first')) || $attrib['ucfirst']) return ucfirst($text); @@ -1157,8 +1197,6 @@ return strtoupper($text); else if ($attrib['lowercase']) return strtolower($text); - else - return $text; return $text; } @@ -1180,126 +1218,13 @@ // send header with expire date 30 days in future function send_future_expire_header() { - if (!headers_sent()) - header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT"); + if (headers_sent()) + return; + + header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT"); + header("Cache-Control: "); + header("Pragma: "); } - - -// replace specials characters to a specific encoding type -function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE) - { - global $OUTPUT_TYPE, $CHARSET; - static $html_encode_arr, $js_rep_table, $rtf_rep_table, $xml_rep_table; - - if (!$enctype) - $enctype = $GLOBALS['OUTPUT_TYPE']; - - // convert nbsps back to normal spaces if not html - if ($enctype!='html') - $str = str_replace(chr(160), ' ', $str); - - - // encode for plaintext - if ($enctype=='text') - return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str); - - // encode for HTML output - if ($enctype=='html') - { - if (!$html_encode_arr) - { - if ($CHARSET=='ISO-8859-1') - { - $html_encode_arr = get_html_translation_table(HTML_ENTITIES); - $html_encode_arr[chr(128)] = '€'; - } - else - $html_encode_arr = get_html_translation_table(HTML_SPECIALCHARS); - - unset($html_encode_arr['?']); - unset($html_encode_arr['&']); - } - - $ltpos = strpos($str, '<'); - $encode_arr = $html_encode_arr; - - // don't replace quotes and html tags - if (($mode=='show' || $mode=='') && $ltpos!==false && strpos($str, '>', $ltpos)!==false) - { - unset($encode_arr['"']); - unset($encode_arr['<']); - unset($encode_arr['>']); - } - else if ($mode=='remove') - $str = strip_tags($str); - - $out = strtr($str, $encode_arr); - - return $newlines ? nl2br($out) : $out; - } - - - if ($enctype=='url') - return rawurlencode($str); - - - // if the replace tables for RTF, XML and JS are not yet defined - if (!$js_rep_table) - { - $js_rep_table = $rtf_rep_table = $xml_rep_table = array(); - - for ($c=160; $c<256; $c++) // can be increased to support more charsets - { - $hex = dechex($c); - $rtf_rep_table[Chr($c)] = "\\'$hex"; - $xml_rep_table[Chr($c)] = "&#$c;"; - - if ($CHARSET=='ISO-8859-1') - $js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex); - } - - $js_rep_table['"'] = sprintf("\u%s%s", str_repeat('0', 4-strlen(dechex(34))), dechex(34)); - $xml_rep_table['"'] = '"'; - } - - // encode for RTF - if ($enctype=='xml') - return strtr($str, $xml_rep_table); - - // encode for javascript use - if ($enctype=='js') - return preg_replace(array("/\r\n/", '/"/', "/([^\\\])'/"), array('\n', '\"', "$1\'"), strtr($str, $js_rep_table)); - - // encode for RTF - if ($enctype=='rtf') - return preg_replace("/\r\n/", "\par ", strtr($str, $rtf_rep_table)); - - // no encoding given -> return original string - return $str; - } - - -function decode_specialchars($input, $charset='') - { - $charset = strtolower($charset); - - if ($charset=='utf-8') - { - require_once('lib/utf8.inc'); - return utf8ToUnicodeEntities($input); - } - else if ($charset=="koi8-r") - return convert_cyr_string($input, 'k', 'w'); - else if ($charset=="iso8859-5") - return convert_cyr_string($input, 'i', 'w'); - else if ($charset=="x-cp866") - return convert_cyr_string($input, 'a', 'w'); - else if ($charset=="x-mac-cyrillic") - return convert_cyr_string($input, 'm', 'w'); - - return $input; - } - // function to convert an array to a javascript array @@ -1336,7 +1261,7 @@ if (!ereg("^[_a-zA-Z]{1}[_a-zA-Z0-9]*$", $key) /* || is_js_reserved_word($key) */) $key = "'$key'"; - if (!is_array($value)) + if (!is_array($value) && is_string($value)) { $value = str_replace("\r\n", '\n', $value); $value = str_replace("\n", '\n', $value); @@ -1347,7 +1272,12 @@ { if ($type=='string') $is_string = true; - else if ((($type=='mixed' && is_numeric($value)) || $type=='int') && strlen($value)<16) // js interprets numbers with digits >15 as ...e+... + else if (($type == 'mixed' && is_bool($value)) || $type == 'bool') + { + $is_string = false; + $value = $value ? "true" : "false"; + } + else if ((($type=='mixed' && is_numeric($value)) || $type=='int') && rc_strlen($value)<16) // js interprets numbers with digits >15 as ...e+... $is_string = FALSE; else $is_string = TRUE; @@ -1373,7 +1303,9 @@ } } else + { return $arr; + } } @@ -1402,12 +1334,51 @@ } -function show_bytes($numbytes) +// parse a human readable string for a number of bytes +function parse_bytes($str) { - if ($numbytes > 1024) - return sprintf('%d KB', round($numbytes/1024)); + if (is_numeric($str)) + return intval($str); + + if (preg_match('/([0-9]+)([a-z])/i', $str, $regs)) + { + $bytes = floatval($regs[1]); + switch (strtolower($regs[2])) + { + case 'g': + $bytes *= 1073741824; + break; + case 'm': + $bytes *= 1048576; + break; + case 'k': + $bytes *= 1024; + break; + } + } + + return intval($bytes); + } + +// create a human readable string for a number of bytes +function show_bytes($bytes) + { + if ($bytes > 1073741824) + { + $gb = $bytes/1073741824; + $str = sprintf($gb>=10 ? "%d GB" : "%.1f GB", $gb); + } + else if ($bytes > 1048576) + { + $mb = $bytes/1048576; + $str = sprintf($mb>=10 ? "%d MB" : "%.1f MB", $mb); + } + else if ($bytes > 1024) + $str = sprintf("%d KB", round($bytes/1024)); else - return sprintf('%d B', $numbytes); + $str = sprintf('%d B', $bytes); + + return $str; } @@ -1448,21 +1419,156 @@ } +// wrapper function for strlen +function rc_strlen($str) + { + if (function_exists('mb_strlen')) + return mb_strlen($str); + else + return strlen($str); + } + +// wrapper function for strtolower +function rc_strtolower($str) + { + if (function_exists('mb_strtolower')) + return mb_strtolower($str); + else + return strtolower($str); + } +// wrapper function for substr +function rc_substr($str, $start, $len) + { + if (function_exists('mb_substr')) + return mb_substr($str, $start, $len); + else + return substr($str, $start, $len); + } + +// wrapper function for strpos +function rc_strpos($haystack, $needle, $offset=0) + { + if (function_exists('mb_strpos')) + return mb_strpos($haystack, $needle, $offset); + else + return strpos($haystack, $needle, $offset); + } + +// wrapper function for strrpos +function rc_strrpos($haystack, $needle, $offset=0) + { + if (function_exists('mb_strrpos')) + return mb_strrpos($haystack, $needle, $offset); + else + return strrpos($haystack, $needle, $offset); + } + + +// replace the middle part of a string with ... +// if it is longer than the allowed length function abbrevate_string($str, $maxlength, $place_holder='...') { - $length = strlen($str); - $first_part_length = floor($maxlength/2) - strlen($place_holder); + $length = rc_strlen($str); + $first_part_length = floor($maxlength/2) - rc_strlen($place_holder); if ($length > $maxlength) { $second_starting_location = $length - $maxlength + $first_part_length + 1; - $str = substr($str, 0, $first_part_length) . $place_holder . substr($str, $second_starting_location, $length); + $str = rc_substr($str, 0, $first_part_length) . $place_holder . rc_substr($str, $second_starting_location, $length); } return $str; } + + +// make sure the string ends with a slash +function slashify($str) + { + return unslashify($str).'/'; + } + + +// remove slash at the end of the string +function unslashify($str) + { + return preg_replace('/\/$/', '', $str); + } +// delete all files within a folder +function clear_directory($dir_path) + { + $dir = @opendir($dir_path); + if(!$dir) return FALSE; -?> \ No newline at end of file + while ($file = readdir($dir)) + if (strlen($file)>2) + unlink("$dir_path/$file"); + + closedir($dir); + return TRUE; + } + + +// create a unix timestamp with a specified offset from now +function get_offset_time($offset_str, $factor=1) + { + if (preg_match('/^([0-9]+)\s*([smhdw])/i', $offset_str, $regs)) + { + $amount = (int)$regs[1]; + $unit = strtolower($regs[2]); + } + else + { + $amount = (int)$offset_str; + $unit = 's'; + } + + $ts = mktime(); + switch ($unit) + { + case 'w': + $amount *= 7; + case 'd': + $amount *= 24; + case 'h': + $amount *= 60; + case 'h': + $amount *= 60; + case 's': + $ts += $amount * $factor; + } + + return $ts; + } + + +/** + * strrstr + * + * return the last occurence of a string in another string + * @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 + */ +function strrstr($haystack, $needle) + { + $pver = phpversion(); + if ($pver[0] >= 5) + { + return strrpos($haystack, $needle); + } + else + { + $index = strpos(strrev($haystack), strrev($needle)); + if($index === false) { + return false; + } + $index = strlen($haystack) - strlen($needle) - $index; + return $index; + } + } + + +?> -- Gitblit v1.9.1