From 20e251599fa595102188bffb9fc5ffc4a1ca0166 Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Wed, 16 Sep 2009 02:35:49 -0400 Subject: [PATCH] - return true after abort from write_log hook --- program/include/main.inc | 222 +++++++++++++++++++++++++++++++++---------------------- 1 files changed, 134 insertions(+), 88 deletions(-) diff --git a/program/include/main.inc b/program/include/main.inc index 6f1be85..a99504c 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -128,7 +128,9 @@ */ function rcmail_temp_gc() { - $tmp = unslashify($CONFIG['temp_dir']); + $rcmail = rcmail::get_instance(); + + $tmp = unslashify($rcmail->config->get('temp_dir')); $expire = mktime() - 172800; // expire in 48 hours if ($dir = opendir($tmp)) @@ -181,9 +183,9 @@ static $mbstring_loaded = null; static $mbstring_list = null; static $convert_warning = false; - + static $conv = null; + $error = false; - $conv = null; $to = empty($to) ? $to = strtoupper(RCMAIL_CHARSET) : rcube_parse_charset($to); $from = rcube_parse_charset($from); @@ -221,34 +223,29 @@ } } - # try to convert with custom classes - if (class_exists('utf8')) - $conv = new utf8(); - - // convert string to UTF-8 + // convert charset using bundled classes/functions if ($to == 'UTF-8') { if ($from == 'UTF7-IMAP') { if ($_str = utf7_to_utf8($str)) - $str = $_str; - else - $error = true; + return $_str; } else if ($from == 'UTF-7') { if ($_str = rcube_utf7_to_utf8($str)) - $str = $_str; - else - $error = true; + return $_str; } else if (($from == 'ISO-8859-1') && function_exists('utf8_encode')) { - $str = utf8_encode($str); + return utf8_encode($str); } - else if ($from != 'UTF-8' && $conv) { - $from = preg_replace(array('/^WINDOWS-*125([0-8])$/', '/^CP-/'), array('CP125\\1', 'CP'), $from); - $conv->loadCharset($from); - $str = $conv->strToUtf8($str); + else if (class_exists('utf8')) { + if (!$conv) + $conv = new utf8($from); + else + $conv->loadCharset($from); + + if($_str = $conv->strToUtf8($str)) + return $_str; } - else if ($from != 'UTF-8') - $error = true; + $error = true; } // encode string for output @@ -256,36 +253,37 @@ // @TODO: we need a function for UTF-7 (RFC2152) conversion if ($to == 'UTF7-IMAP' || $to == 'UTF-7') { if ($_str = utf8_to_utf7($str)) - $str = $_str; - else - $error = true; + return $_str; } else if ($to == 'ISO-8859-1' && function_exists('utf8_decode')) { return utf8_decode($str); } - else if ($to != 'UTF-8' && $conv) { - $to = preg_replace(array('/^WINDOWS-*125([0-8])$/', '/^CP-/'), array('CP125\\1', 'CP'), $to); - $conv->loadCharset($to); - return $conv->utf8ToStr($str); + else if (class_exists('utf8')) { + if (!$conv) + $conv = new utf8($to); + else + $conv->loadCharset($from); + + if ($_str = $conv->strToUtf8($str)) + return $_str; } - else if ($to != 'UTF-8') { - $error = true; - } + $error = true; } // report error - if ($error && !$convert_warning){ + if ($error && !$convert_warning) { raise_error(array( 'code' => 500, 'type' => 'php', 'file' => __FILE__, + 'line' => __LINE__, 'message' => "Could not convert string from $from to $to. Make sure iconv/mbstring is installed or lib/utf8.class is available." ), true, false); $convert_warning = true; } - // return UTF-8 string + // return UTF-8 or original string return $str; } @@ -311,20 +309,20 @@ 'ANSIX31101983' => 'WINDOWS-1252', 'ANSIX341968' => 'WINDOWS-1252', 'UNKNOWN8BIT' => 'ISO-8859-15', - 'XUNKNOWN' => 'ISO-8859-15', - 'XUSERDEFINED' => 'ISO-8859-15', + 'UNKNOWN' => 'ISO-8859-15', + 'USERDEFINED' => 'ISO-8859-15', 'KSC56011987' => 'EUC-KR', 'GB2312' => 'GBK', 'GB231280' => 'GBK', 'UNICODE' => 'UTF-8', 'UTF7IMAP' => 'UTF7-IMAP', - 'XXBIG5' => 'BIG5', 'TIS620' => 'WINDOWS-874', 'ISO88599' => 'WINDOWS-1254', 'ISO885911' => 'WINDOWS-874', ); - $str = preg_replace('/[^a-z0-9]/i', '', $charset); + // allow a-z and 0-9 only and remove X- prefix (e.g. X-ROMAN8 => ROMAN8) + $str = preg_replace(array('/[^a-z0-9]/i', '/^x+/i'), '', $charset); if (isset($aliases[$str])) return $aliases[$str]; @@ -477,17 +475,6 @@ return $newlines ? nl2br($out) : $out; } - // encode for javascript use - if ($enctype=='js') - return preg_replace(array("/\r?\n/", "/\r/", '/<\\//'), array('\n', '\n', '<\\/'), strtr($str, $js_rep_table)); - - // encode for plaintext - if ($enctype=='text') - return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str); - - if ($enctype=='url') - return rawurlencode($str); - // if the replace tables for XML and JS are not yet defined if ($js_rep_table===false) { @@ -502,6 +489,17 @@ $js_rep_table["'"] = "\\'"; $js_rep_table["\\"] = "\\\\"; } + + // encode for javascript use + if ($enctype=='js') + return preg_replace(array("/\r?\n/", "/\r/", '/<\\//'), array('\n', '\n', '<\\/'), strtr($str, $js_rep_table)); + + // encode for plaintext + if ($enctype=='text') + return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str); + + if ($enctype=='url') + return rawurlencode($str); // encode for XML if ($enctype=='xml') @@ -547,7 +545,7 @@ * @return string Field value or NULL if not available */ function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL) - { +{ global $OUTPUT; $value = NULL; @@ -564,7 +562,10 @@ else if (isset($_COOKIE[$fname])) $value = $_COOKIE[$fname]; } - + + if (empty($value)) + return $value; + // strip single quotes if magic_quotes_sybase is enabled if (ini_get('magic_quotes_sybase')) $value = str_replace("''", "'", $value); @@ -581,16 +582,35 @@ return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset); else return $value; +} + +/** + * Convert array of request parameters (prefixed with _) + * to a regular array with non-prefixed keys. + * + * @param int Source to get value from (GPC) + * @return array Hash array with all request parameters + */ +function request2param($mode = RCUBE_INPUT_GPC) +{ + $out = array(); + $src = $mode == RCUBE_INPUT_GET ? $_GET : ($mode == RCUBE_INPUT_POST ? $_POST : $_REQUEST); + foreach ($src as $key => $value) { + $fname = $key[0] == '_' ? substr($key, 1) : $key; + $out[$fname] = get_input_value($key, $mode); } + + return $out; +} /** * Remove all non-ascii and non-word chars - * except . and - + * except ., -, _ */ -function asciiwords($str, $css_id = false) +function asciiwords($str, $css_id = false, $replace_with = '') { $allowed = 'a-z0-9\_\-' . (!$css_id ? '\.' : ''); - return preg_replace("/[^$allowed]/i", '', $str); + return preg_replace("/[^$allowed]/i", $replace_with, $str); } /** @@ -643,7 +663,7 @@ while ($table_data && ($sql_arr = $db->fetch_assoc($table_data))) { $zebra_class = $c % 2 ? 'even' : 'odd'; - $table->add_row(array('id' => 'rcmrow' . $sql_arr[$id_col], 'class' => "contact $zebra_class")); + $table->add_row(array('id' => 'rcmrow' . $sql_arr[$id_col], 'class' => $zebra_class)); // format each col foreach ($a_show_cols as $col) @@ -657,7 +677,7 @@ foreach ($table_data as $row_data) { $zebra_class = $c % 2 ? 'even' : 'odd'; - $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => "contact $zebra_class")); + $table->add_row(array('id' => 'rcmrow' . $row_data[$id_col], 'class' => $zebra_class)); // format each col foreach ($a_show_cols as $col) @@ -723,7 +743,7 @@ $replacements = new rcube_string_replacer; // ignore the whole block if evil styles are detected - $stripped = preg_replace('/[^a-z\(:]/', '', rcmail_xss_entitiy_decode($source)); + $stripped = preg_replace('/[^a-z\(:]/', '', rcmail_xss_entity_decode($source)); if (preg_match('/expression|behavior|url\(|import/', $stripped)) return '/* evil! */'; @@ -764,22 +784,22 @@ * @param string CSS content to decode * @return string Decoded string */ -function rcmail_xss_entitiy_decode($content) +function rcmail_xss_entity_decode($content) { $out = html_entity_decode(html_entity_decode($content)); - $out = preg_replace_callback('/\\\([0-9a-f]{4})/i', 'rcmail_xss_entitiy_decode_callback', $out); + $out = preg_replace_callback('/\\\([0-9a-f]{4})/i', 'rcmail_xss_entity_decode_callback', $out); $out = preg_replace('#/\*.*\*/#Um', '', $out); return $out; } /** - * preg_replace_callback callback for rcmail_xss_entitiy_decode_callback + * preg_replace_callback callback for rcmail_xss_entity_decode_callback * * @param array matches result from preg_replace_callback * @return string decoded entity */ -function rcmail_xss_entitiy_decode_callback($matches) +function rcmail_xss_entity_decode_callback($matches) { return chr(hexdec($matches[1])); } @@ -888,6 +908,9 @@ else if (!$format) $format = $CONFIG['date_long'] ? $CONFIG['date_long'] : 'd.m.Y H:i'; + // strftime() format + if (preg_match('/%[a-z]+/i', $format)) + return strftime($format, $timestamp); // parse format string manually in order to provide localized weekday and month names // an alternative would be to convert the date() format string to fit with strftime() @@ -954,8 +977,11 @@ { $args = func_get_args(); - if (class_exists('rcmail', false)) - rcmail::get_instance()->plugins->exec_hook('console', $args); + if (class_exists('rcmail', false)) { + $rcmail = rcmail::get_instance(); + if (is_object($rcmail->plugins)) + $rcmail->plugins->exec_hook('console', $args); + } $msg = array(); foreach ($args as $arg) @@ -983,23 +1009,34 @@ */ function write_log($name, $line) { - global $CONFIG; + global $CONFIG, $RCMAIL; if (!is_string($line)) $line = var_export($line, true); if (empty($CONFIG['log_date_format'])) $CONFIG['log_date_format'] = 'd-M-Y H:i:s O'; + + $date = date($CONFIG['log_date_format']); + + // trigger logging hook + if (is_object($RCMAIL) && is_object($RCMAIL->plugins)) { + $log = $RCMAIL->plugins->exec_hook('write_log', array('name' => $name, 'date' => $date, 'line' => $line)); + $name = $log['name']; + $line = $log['line']; + $date = $log['date']; + if ($log['abort']) + return true; + } - $log_entry = sprintf("[%s]: %s\n", date($CONFIG['log_date_format']), $line); + $log_entry = sprintf("[%s]: %s\n", $date, $line); if ($CONFIG['log_driver'] == 'syslog') { - if ($name == 'errors') - $prio = LOG_ERR; - else - $prio = LOG_INFO; + $prio = $name == 'errors' ? LOG_ERR : LOG_INFO; syslog($prio, $log_entry); - } else { + return true; + } + else { // log_driver == 'file' is assumed here if (empty($CONFIG['log_dir'])) $CONFIG['log_dir'] = INSTALL_PATH.'logs'; @@ -1009,8 +1046,10 @@ fwrite($fp, $log_entry); fflush($fp); fclose($fp); + return true; } } + return false; } @@ -1018,17 +1057,16 @@ * @access private */ function rcube_timer() - { - list($usec, $sec) = explode(" ", microtime()); - return ((float)$usec + (float)$sec); - } +{ + return microtime(true); +} /** * @access private */ -function rcube_print_time($timer, $label='Timer') - { +function rcube_print_time($timer, $label='Timer', $dest='console') +{ static $print_count = 0; $print_count++; @@ -1038,8 +1076,8 @@ if (empty($label)) $label = 'Timer '.$print_count; - console(sprintf("%s: %0.4f sec", $label, $diff)); - } + write_log($dest, sprintf("%s: %0.4f sec", $label, $diff)); +} /** @@ -1077,6 +1115,9 @@ foreach ($a_folders as $folder) rcmail_build_folder_tree($a_mailboxes, $folder, $delimiter); } + + // allow plugins to alter the folder tree or to localize folder names + $hook = $RCMAIL->plugins->exec_hook('render_mailboxlist', array('list' => $a_mailboxes, 'delimiter' => $delimiter)); if ($type=='select') { $select = new html_select($attrib); @@ -1085,12 +1126,12 @@ if ($attrib['noselection']) $select->add(rcube_label($attrib['noselection']), '0'); - rcmail_render_folder_tree_select($a_mailboxes, $mbox_name, $attrib['maxlength'], $select, $attrib['realnames']); + rcmail_render_folder_tree_select($hook['list'], $mbox_name, $attrib['maxlength'], $select, $attrib['realnames']); $out = $select->show(); } else { $js_mailboxlist = array(); - $out = html::tag('ul', $attrib, rcmail_render_folder_tree_html($a_mailboxes, $mbox_name, $js_mailboxlist, $attrib), html::$common_attrib); + $out = html::tag('ul', $attrib, rcmail_render_folder_tree_html($hook['list'], $mbox_name, $js_mailboxlist, $attrib), html::$common_attrib); $RCMAIL->output->add_gui_object('mailboxlist', $attrib['id']); $RCMAIL->output->set_env('mailboxes', $js_mailboxlist); @@ -1197,7 +1238,7 @@ } // make folder name safe for ids and class names - $folder_id = asciiwords($folder['id'], true); + $folder_id = asciiwords($folder['id'], true, '_'); $classes = array('mailbox'); // set special class for Sent, Drafts, Trash and Junk @@ -1337,17 +1378,22 @@ */ function rcube_html_editor($mode='') { - global $OUTPUT, $CONFIG; + global $RCMAIL, $CONFIG; - $lang = $tinylang = strtolower(substr($_SESSION['language'], 0, 2)); - if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$tinylang.'.js')) - $tinylang = 'en'; + $hook = $RCMAIL->plugins->exec_hook('hmtl_editor', array('mode' => $mode)); - $OUTPUT->include_script('tiny_mce/tiny_mce.js'); - $OUTPUT->include_script('editor.js'); - $OUTPUT->add_script('rcmail_editor_init("$__skin_path", "'.JQ($tinylang).'", '.intval($CONFIG['enable_spellcheck']).', "'.$mode.'");'); + if ($hook['abort']) + return; + + $lang = strtolower(substr($_SESSION['language'], 0, 2)); + if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$lang.'.js')) + $lang = 'en'; + + $RCMAIL->output->include_script('tiny_mce/tiny_mce.js'); + $RCMAIL->output->include_script('editor.js'); + $RCMAIL->output->add_script('rcmail_editor_init("$__skin_path", + "'.JQ($lang).'", '.intval($CONFIG['enable_spellcheck']).', "'.$mode.'");'); } - /** -- Gitblit v1.9.1