| | |
| | | // set localization charset based on the given language |
| | | function rcmail_set_locale($lang) |
| | | { |
| | | global $OUTPUT, $MBSTRING; |
| | | global $OUTPUT, $CHARSET, $MBSTRING; |
| | | static $s_mbstring_loaded = NULL; |
| | | |
| | | // settings for mbstring module (by Tadashi Jokagi) |
| | |
| | | $MBSTRING = $s_mbstring_loaded = extension_loaded("mbstring"); |
| | | else |
| | | $MBSTRING = $s_mbstring_loaded = FALSE; |
| | | |
| | | if ($MBSTRING) |
| | | mb_internal_encoding($CHARSET); |
| | | |
| | | $OUTPUT->set_charset(rcube_language_prop($lang, 'charset')); |
| | | } |
| | |
| | | |
| | | if (!$host) |
| | | $host = $CONFIG['default_host']; |
| | | |
| | | // Validate that selected host is in the list of configured hosts |
| | | if (is_array($CONFIG['default_host'])) |
| | | { |
| | | $allowed = FALSE; |
| | | foreach ($CONFIG['default_host'] as $key => $host_allowed) |
| | | { |
| | | if (!is_numeric($key)) |
| | | $host_allowed = $key; |
| | | if ($host == $host_allowed) |
| | | { |
| | | $allowed = TRUE; |
| | | break; |
| | | } |
| | | } |
| | | if (!$allowed) |
| | | return FALSE; |
| | | } |
| | | else if (!empty($CONFIG['default_host']) && $host != $CONFIG['default_host']) |
| | | return FALSE; |
| | | |
| | | // parse $host URL |
| | | $a_host = parse_url($host); |
| | |
| | | |
| | | $framed = $GLOBALS['_framed']; |
| | | $command = sprintf("display_message('%s', '%s');", |
| | | rep_specialchars_output(rcube_label(array('name' => $message, 'vars' => $vars)), 'js'), |
| | | JQ(rcube_label(array('name' => $message, 'vars' => $vars))), |
| | | $type); |
| | | |
| | | if ($REMOTE_REQUEST) |
| | |
| | | $OUTPUT->add_script(sprintf("%s.add_label('%s', '%s');", |
| | | $JS_OBJECT_NAME, |
| | | $name, |
| | | rep_specialchars_output(rcube_label($name), 'js'))); |
| | | JQ(rcube_label($name)))); |
| | | } |
| | | |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | // convert a string from one charset to another |
| | | // this function is not complete and not tested well |
| | | /** |
| | | * 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 $GLOBALS['CHARSET'] |
| | | * @return Converted string |
| | | */ |
| | | function rcube_charset_convert($str, $from, $to=NULL) |
| | | { |
| | | global $MBSTRING; |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | // replace specials characters to a specific encoding type |
| | | /** |
| | | * Replacing specials characters to a specific encoding type |
| | | * |
| | | * @param string Input string |
| | | * @param string Encoding type: text|html|xml|js|url |
| | | * @param string Replace mode for tags: show|replace|remove |
| | | * @param boolean Convert newlines |
| | | * @return The quoted string |
| | | */ |
| | | function rep_specialchars_output($str, $enctype='', $mode='', $newlines=TRUE) |
| | | { |
| | | global $OUTPUT_TYPE, $OUTPUT; |
| | | static $html_encode_arr, $js_rep_table, $rtf_rep_table, $xml_rep_table; |
| | | static $html_encode_arr, $js_rep_table, $xml_rep_table; |
| | | |
| | | if (!$enctype) |
| | | $enctype = $GLOBALS['OUTPUT_TYPE']; |
| | |
| | | $str = strip_tags($str); |
| | | |
| | | // avoid douple quotation of & |
| | | $out = preg_replace('/&([a-z]{2,5});/', '&\\1;', strtr($str, $encode_arr)); |
| | | $out = preg_replace('/&([a-z]{2,5}|#[0-9]{2,4});/', '&\\1;', 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 the replace tables for XML and JS are not yet defined |
| | | if (!$js_rep_table) |
| | | { |
| | | $js_rep_table = $rtf_rep_table = $xml_rep_table = array(); |
| | | $js_rep_table = $xml_rep_table = array(); |
| | | $xml_rep_table['&'] = '&'; |
| | | |
| | | 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 ($OUTPUT->get_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 |
| | | // encode for XML |
| | | if ($enctype=='xml') |
| | | return strtr($str, $xml_rep_table); |
| | | |
| | |
| | | return addslashes(preg_replace(array("/\r\n/", "/\r/"), array('\n', '\n'), 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; |
| | | } |
| | | |
| | | /** |
| | | * Quote a given string. Alias function for rep_specialchars_output |
| | | * @see rep_specialchars_output |
| | | */ |
| | | function Q($str, $mode='strict', $newlines=TRUE) |
| | | { |
| | | return rep_specialchars_output($str, 'html', $mode, $newlines); |
| | | } |
| | | |
| | | /** |
| | | * Quote a given string. Alias function for rep_specialchars_output |
| | | * @see rep_specialchars_output |
| | | */ |
| | | function JQ($str) |
| | | { |
| | | return rep_specialchars_output($str, 'js'); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | |
| | | // parse for specialtags |
| | | $output = parse_rcube_xml($templ); |
| | | $output = parse_rcube_xml(parse_rcube_conditions($templ)); |
| | | |
| | | // add debug console |
| | | if ($CONFIG['debug_level'] & 8) |
| | | $OUTPUT->footer = '<div style="position:absolute;top:5px;left:5px;width:400px;opacity:0.8;z-index:9000;"><form name="debugform"><textarea name="console" rows="15" cols="40" style="width:400px;border:none;font-size:x-small"></textarea></form>'; |
| | | |
| | | $OUTPUT->write(trim(parse_with_globals($output)), $skin_path); |
| | | |
| | | if ($exit) |
| | |
| | | } |
| | | |
| | | |
| | | // parse conditional code |
| | | function parse_rcube_conditions($input) |
| | | { |
| | | if (($matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE)) && count($matches)==4) |
| | | { |
| | | if (preg_match('/^(else|endif)$/i', $matches[1])) |
| | | return $matches[0] . parse_rcube_conditions($matches[3]); |
| | | else |
| | | { |
| | | $attrib = parse_attrib_string($matches[2]); |
| | | if (isset($attrib['condition'])) |
| | | { |
| | | $condmet = rcube_xml_condition($attrib['condition']); |
| | | $submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE); |
| | | |
| | | if ($condmet) |
| | | $result = $submatches[0] . preg_replace('/.*<roundcube:endif\s+[^>]+>/is', '', $submatches[3]); |
| | | else |
| | | $result = "<roundcube:$submatches[1] $submatches[2]>" . $submatches[3]; |
| | | |
| | | return $matches[0] . parse_rcube_conditions($result); |
| | | } |
| | | else |
| | | { |
| | | raise_error(array('code' => 500, 'type' => 'php', 'line' => __LINE__, 'file' => __FILE__, |
| | | 'message' => "Unable to parse conditional tag " . $matches[2]), TRUE, FALSE); |
| | | } |
| | | } |
| | | } |
| | | |
| | | return $input; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Determines if a given condition is met |
| | | * |
| | | * @return True if condition is valid, False is not |
| | | */ |
| | | function rcube_xml_condition($condition) |
| | | { |
| | | $condition = preg_replace( |
| | | array('/session:([a-z0-9_]+)/i', '/config:([a-z0-9_]+)/i', '/request:([a-z0-9_]+)/ie'), |
| | | array("\$_SESSION['\\1']", "\$GLOBALS['CONFIG']['\\1']", "get_input_value('\\1', RCUBE_INPUT_GPC)"), |
| | | $condition); |
| | | |
| | | return @eval("return (".$condition.");"); |
| | | } |
| | | |
| | | |
| | | function parse_rcube_xml($input) |
| | | { |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Convert a xml command tag into real content |
| | | */ |
| | | function rcube_xml_command($command, $str_attrib, $add_attrib=array()) |
| | | { |
| | | global $IMAP, $CONFIG, $OUTPUT; |
| | | |
| | | $command = strtolower($command); |
| | | $attrib = parse_attrib_string($str_attrib) + $add_attrib; |
| | | |
| | | // empty output if required condition is not met |
| | | if (!empty($attrib['condition']) && !rcube_xml_condition($attrib['condition'])) |
| | | return ''; |
| | | |
| | | // execute command |
| | | switch ($command) |
| | |
| | | // show a label |
| | | case 'label': |
| | | if ($attrib['name'] || $attrib['command']) |
| | | return rep_specialchars_output(rcube_label($attrib)); |
| | | return Q(rcube_label($attrib)); |
| | | break; |
| | | |
| | | // create a menu item |
| | |
| | | else if ($object=='productname') |
| | | { |
| | | $name = !empty($CONFIG['product_name']) ? $CONFIG['product_name'] : 'RoundCube Webmail'; |
| | | return rep_specialchars_output($name, 'html', 'all'); |
| | | return Q($name); |
| | | } |
| | | else if ($object=='version') |
| | | { |
| | |
| | | else |
| | | $title .= ucfirst($task); |
| | | |
| | | return rep_specialchars_output($title, 'html', 'all'); |
| | | return Q($title); |
| | | } |
| | | |
| | | break; |
| | |
| | | |
| | | // get localized text for labels and titles |
| | | if ($attrib['title']) |
| | | $attrib['title'] = rep_specialchars_output(rcube_label($attrib['title'])); |
| | | $attrib['title'] = Q(rcube_label($attrib['title'])); |
| | | if ($attrib['label']) |
| | | $attrib['label'] = rep_specialchars_output(rcube_label($attrib['label'])); |
| | | $attrib['label'] = Q(rcube_label($attrib['label'])); |
| | | |
| | | if ($attrib['alt']) |
| | | $attrib['alt'] = rep_specialchars_output(rcube_label($attrib['alt'])); |
| | | $attrib['alt'] = Q(rcube_label($attrib['alt'])); |
| | | |
| | | // set title to alt attribute for IE browsers |
| | | if ($BROWSER['ie'] && $attrib['title'] && !$attrib['alt']) |
| | |
| | | $table .= "<thead><tr>\n"; |
| | | |
| | | foreach ($a_show_cols as $col) |
| | | $table .= '<td class="'.$col.'">' . rep_specialchars_output(rcube_label($col)) . "</td>\n"; |
| | | $table .= '<td class="'.$col.'">' . Q(rcube_label($col)) . "</td>\n"; |
| | | |
| | | $table .= "</tr></thead>\n<tbody>\n"; |
| | | |
| | | $c = 0; |
| | | |
| | | if (!is_array($table_data)) |
| | | { |
| | | while ($table_data && ($sql_arr = $DB->fetch_assoc($table_data))) |
| | |
| | | // format each col |
| | | foreach ($a_show_cols as $col) |
| | | { |
| | | $cont = rep_specialchars_output($sql_arr[$col]); |
| | | $table .= '<td class="'.$col.'">' . $cont . "</td>\n"; |
| | | $cont = Q($sql_arr[$col]); |
| | | $table .= '<td class="'.$col.'">' . $cont . "</td>\n"; |
| | | } |
| | | |
| | | $table .= "</tr>\n"; |
| | |
| | | // format each col |
| | | foreach ($a_show_cols as $col) |
| | | { |
| | | $cont = rep_specialchars_output($row_data[$col]); |
| | | $table .= '<td class="'.$col.'">' . $cont . "</td>\n"; |
| | | $cont = Q($row_data[$col]); |
| | | $table .= '<td class="'.$col.'">' . $cont . "</td>\n"; |
| | | } |
| | | |
| | | $table .= "</tr>\n"; |
| | |
| | | function parse_attrib_string($str) |
| | | { |
| | | $attrib = array(); |
| | | preg_match_all('/\s*([-_a-z]+)=["]([^"]+)["]?/i', stripslashes($str), $regs, PREG_SET_ORDER); |
| | | preg_match_all('/\s*([-_a-z]+)=(["\'])([^"]+)\2/Ui', stripslashes($str), $regs, PREG_SET_ORDER); |
| | | |
| | | // convert attributes to an associative array (name => value) |
| | | if ($regs) |
| | | foreach ($regs as $attr) |
| | | $attrib[strtolower($attr[1])] = $attr[2]; |
| | | $attrib[strtolower($attr[1])] = $attr[3]; |
| | | |
| | | return $attrib; |
| | | } |
| | |
| | | $now = time(); // local time |
| | | $now -= (int)date('Z'); // make GMT time |
| | | $now += ($tz * 3600); // user's time |
| | | $now_date = getdate(); |
| | | $now_date = getdate($now); |
| | | |
| | | $today_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday'], $now_date['year']); |
| | | $week_limit = mktime(0, 0, 0, $now_date['mon'], $now_date['mday']-6, $now_date['year']); |
| | | |
| | | // define date format depending on current time |
| | | if ($CONFIG['prettydate'] && !$format && $timestamp > $today_limit) |
| | | return sprintf('%s %s', rcube_label('today'), date('H:i', $timestamp)); |
| | | return sprintf('%s %s', rcube_label('today'), date($CONFIG['date_today'] ? $CONFIG['date_today'] : 'H:i', $timestamp)); |
| | | else if ($CONFIG['prettydate'] && !$format && $timestamp > $week_limit) |
| | | $format = $CONFIG['date_short'] ? $CONFIG['date_short'] : 'D H:i'; |
| | | else if (!$format) |