| | |
| | | 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); |
| | |
| | | } |
| | | } |
| | | |
| | | # 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 |
| | |
| | | // @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; |
| | | } |
| | | |
| | |
| | | '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]; |
| | |
| | | * @return string Field value or NULL if not available |
| | | */ |
| | | function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL) |
| | | { |
| | | { |
| | | global $OUTPUT; |
| | | $value = NULL; |
| | | |
| | |
| | | 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); |
| | | } |
| | | |
| | | /** |
| | |
| | | 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) |
| | |
| | | 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) |
| | |
| | | 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() |
| | |
| | | { |
| | | $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) |
| | |
| | | */ |
| | | 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; |
| | | } |
| | | |
| | | $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'; |
| | |
| | | fwrite($fp, $log_entry); |
| | | fflush($fp); |
| | | fclose($fp); |
| | | return true; |
| | | } |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | |
| | |
| | | /** |
| | | * @access private |
| | | */ |
| | | function rcube_print_time($timer, $label='Timer') |
| | | function rcube_print_time($timer, $label='Timer', $dest='console') |
| | | { |
| | | static $print_count = 0; |
| | | |
| | |
| | | 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)); |
| | | } |
| | | |
| | | |
| | |
| | | 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); |
| | |
| | | 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); |
| | |
| | | } |
| | | |
| | | // 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 |
| | |
| | | */ |
| | | 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'; |
| | | $lang = strtolower(substr($_SESSION['language'], 0, 2)); |
| | | if (!file_exists(INSTALL_PATH . 'program/js/tiny_mce/langs/'.$lang.'.js')) |
| | | $lang = 'en'; |
| | | |
| | | $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.'");'); |
| | | $hook = $RCMAIL->plugins->exec_hook('hmtl_editor', array('abort' => false, |
| | | 'mode' => $mode, 'lang' => $lang)); |
| | | |
| | | if ($hook['abort']) |
| | | return; |
| | | |
| | | $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($hook['lang']).'", '.intval($CONFIG['enable_spellcheck']).', "'.$hook['mode'].'");'); |
| | | } |
| | | |
| | | |
| | | |
| | | /** |