From f3704e18d89e4065cede8509256d7fbf483b7fe6 Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Tue, 04 Apr 2006 17:46:27 -0400 Subject: [PATCH] Added labels for nextpage/previouspage --- program/include/main.inc | 288 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 231 insertions(+), 57 deletions(-) diff --git a/program/include/main.inc b/program/include/main.inc index ab11911..a3a3913 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -21,6 +21,13 @@ require_once('lib/des.inc'); require_once('lib/utf7.inc'); +require_once('lib/utf8.class.php'); + + +// define constannts for input reading +define('RCUBE_INPUT_GET', 0x0101); +define('RCUBE_INPUT_POST', 0x0102); +define('RCUBE_INPUT_GPC', 0x0103); // register session and connect to server @@ -65,12 +72,14 @@ // prepare DB connection require_once('include/rcube_'.(empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend']).'.inc'); - $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr']); + $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']); $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql'; + $DB->db_connect('w'); + // we can use the database for storing session data // session queries do not work with MDB2 - if ($CONFIG['db_backend']!='mdb2' && is_object($DB) /* && $DB->db_provider!='sqlite' */) + if ($CONFIG['db_backend']!='mdb2' && !$DB->is_error()) include_once('include/session.inc'); @@ -264,7 +273,7 @@ $lang = $rcube_language_aliases[$lang]; // try the first two chars - if (!isset($rcube_languages[$lang]) && strlen($lang>2)) + if (!isset($rcube_languages[$lang]) && strlen($lang)>2) { $lang = substr($lang, 0, 2); $lang = rcube_language_prop($lang); @@ -278,6 +287,7 @@ $charset = $rcube_charsets[$lang]; else $charset = 'UTF-8'; + if ($prop=='charset') return $charset; @@ -305,11 +315,12 @@ $OUTPUT->include_script('program/js/common.js'); $OUTPUT->include_script('program/js/app.js'); + // set locale setting + rcmail_set_locale($sess_user_lang); + // set user-selected charset if (!empty($CONFIG['charset'])) $OUTPUT->set_charset($CONFIG['charset']); - else - rcmail_set_locale($sess_user_lang); // add some basic label to client rcube_add_label('loading'); @@ -319,7 +330,39 @@ // set localization charset based on the given language function rcmail_set_locale($lang) { - global $OUTPUT; + global $OUTPUT, $MBSTRING, $MBSTRING_ENCODING; + static $s_mbstring_loaded = NULL; + + // settings for mbstring module (by Tadashi Jokagi) + if ($s_mbstring_loaded===NULL) + { + if ($s_mbstring_loaded = extension_loaded("mbstring")) + { + $MBSTRING = TRUE; + if (function_exists("mb_mbstring_encodings")) + $MBSTRING_ENCODING = mb_mbstring_encodings(); + else + $MBSTRING_ENCODING = array("ISO-8859-1", "UTF-7", "UTF7-IMAP", "UTF-8", + "ISO-2022-JP", "EUC-JP", "EUCJP-WIN", + "SJIS", "SJIS-WIN"); + + $MBSTRING_ENCODING = array_map("strtoupper", $MBSTRING_ENCODING); + if (in_array("SJIS", $MBSTRING_ENCODING)) + $MBSTRING_ENCODING[] = "SHIFT_JIS"; + } + else + { + $MBSTRING = FALSE; + $MBSTRING_ENCODING = array(); + } + } + + if ($MBSTRING && function_exists("mb_language")) + { + if (!@mb_language(strtok($lang, "_"))) + $MBSTRING = FALSE; // unsupport language + } + $OUTPUT->set_charset(rcube_language_prop($lang, 'charset')); } @@ -341,6 +384,22 @@ $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE; $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $CONFIG['default_port']); } + else + $imap_port = $CONFIG['default_port']; + + + /* Modify username with domain if required + Inspired by Marco <P0L0_notspam_binware.org> + */ + // Check if we need to add domain + if ($CONFIG['username_domain'] && !strstr($user, '@')) + { + if (is_array($CONFIG['username_domain']) && isset($CONFIG['username_domain'][$host])) + $user .= '@'.$CONFIG['username_domain'][$host]; + else if (!empty($CONFIG['username_domain'])) + $user .= '@'.$CONFIG['username_domain']; + } + // query if user already registered $sql_result = $DB->query("SELECT user_id, username, language, preferences @@ -435,10 +494,10 @@ if ($user_id = $DB->insert_id(get_sequence_name('users'))) { - if (is_string($CONFIG['mail_domain'])) - $mail_domain = $CONFIG['mail_domain']; - else if (is_array($CONFIG['mail_domain']) && isset($CONFIG['mail_domain'][$host])) + if (is_array($CONFIG['mail_domain']) && isset($CONFIG['mail_domain'][$host])) $mail_domain = $CONFIG['mail_domain'][$host]; + else if (!empty($CONFIG['mail_domain'])) + $mail_domain = $CONFIG['mail_domain']; else $mail_domain = $host; @@ -447,24 +506,25 @@ $user_name = $user!=$user_email ? $user : ''; - // also create a new identity record + // try to resolve the e-mail address from the virtuser table + if (!empty($CONFIG['virtuser_query'])) + { + $sql_result = $DB->query(preg_replace('/%u/', $user, $CONFIG['virtuser_query'])); + if ($sql_arr = $DB->fetch_array($sql_result)) + $user_email = $sql_arr[0]; + } + + // also create new identity records $DB->query("INSERT INTO ".get_table_name('identities')." (user_id, del, standard, name, email) VALUES (?, 0, 1, ?, ?)", $user_id, $user_name, $user_email); + // get existing mailboxes $a_mailboxes = $IMAP->list_mailboxes(); - - // check if the configured mailbox for sent messages exists - if ($CONFIG['sent_mbox'] && !in_array_nocase($CONFIG['sent_mbox'], $a_mailboxes)) - $IMAP->create_mailbox($CONFIG['sent_mbox'], TRUE); - - // check if the configured mailbox for sent messages exists - if ($CONFIG['trash_mbox'] && !in_array_nocase($CONFIG['trash_mbox'], $a_mailboxes)) - $IMAP->create_mailbox($CONFIG['trash_mbox'], TRUE); } else { @@ -567,13 +627,13 @@ } -function show_message($message, $type='notice') +function show_message($message, $type='notice', $vars=NULL) { global $OUTPUT, $JS_OBJECT_NAME, $REMOTE_REQUEST; - + $framed = $GLOBALS['_framed']; $command = sprintf("display_message('%s', '%s');", - addslashes(rep_specialchars_output(rcube_label($message))), + addslashes(rep_specialchars_output(rcube_label(array('name' => $message, 'vars' => $vars)))), $type); if ($REMOTE_REQUEST) @@ -618,6 +678,7 @@ // send correct response on a remote request function rcube_remote_response($js_code, $flush=FALSE) { + global $OUTPUT, $CHARSET; static $s_header_sent = FALSE; if (!$s_header_sent) @@ -629,7 +690,7 @@ } // send response code - print $js_code; + print rcube_charset_convert($js_code, $CHARSET, $OUTPUT->get_charset()); if ($flush) // flush the output buffer flush(); @@ -661,7 +722,6 @@ closedir($dh); } } - return $sa_languages; } @@ -696,38 +756,74 @@ } +// remove all expired message cache records +function rcmail_message_cache_gc() + { + global $DB, $CONFIG; + + // no cache lifetime configured + if (empty($CONFIG['message_cache_lifetime'])) + return; + + // get target timestamp + $ts = get_offset_time($CONFIG['message_cache_lifetime'], -1); + + $DB->query("DELETE FROM ".get_table_name('messages')." + WHERE created < ".$DB->fromunixtime($ts)); + } + // convert a string from one charset to another // this function is not complete and not tested well function rcube_charset_convert($str, $from, $to=NULL) { - $from = strtolower($from); - $to = $to==NULL ? strtolower($GLOBALS['CHARSET']) : strtolower($to); - + global $MBSTRING, $MBSTRING_ENCODING; + + $from = strtoupper($from); + $to = $to==NULL ? strtoupper($GLOBALS['CHARSET']) : strtoupper($to); + if ($from==$to) return $str; - - // decode characters - if ($from=='utf-7') - $str = UTF7DecodeString($str); - else if ($from=='utf-8' && function_exists('utf8_decode')) - $str = utf8_decode($str); - else if ($from=="koi8-r") - $str = convert_cyr_string($str, 'k', 'i'); - else if ($from=="windows-1251" || $from=="win-1251") - $str = convert_cyr_string($str, 'w', 'i'); - else if ($from=="x-cp866") - $str = convert_cyr_string($str, 'a', 'i'); - else if ($from=="x-mac-cyrillic") - $str = convert_cyr_string($str, 'm', 'i'); + + // convert charset using mbstring module + if ($MBSTRING) + { + $to = $to=="UTF-7" ? "UTF7-IMAP" : $to; + $from = $from=="UTF-7" ? "UTF7-IMAP": $from; + + if (in_array($to, $MBSTRING_ENCODING) && in_array($from, $MBSTRING_ENCODING)) + return mb_convert_encoding($str, $to, $from); + } + + // convert charset using iconv module + if (function_exists('iconv') && $from!='UTF-7' && $to!='UTF-7') + return iconv($from, $to, $str); + + $conv = new utf8(); + + // convert string to UTF-8 + if ($from=='UTF-7') + $str = rcube_charset_convert(UTF7DecodeString($str), 'ISO-8859-1'); + else if ($from=='ISO-8859-1' && function_exists('utf8_encode')) + $str = utf8_encode($str); + else if ($from!='UTF-8') + { + $conv->loadCharset($from); + $str = $conv->strToUtf8($str); + } // encode string for output - if ($to=='utf-8' && function_exists('utf8_encode')) - return utf8_encode($str); - else if ($to=='utf-7') + if ($to=='UTF-7') return UTF7EncodeString($str); + else if ($to=='ISO-8859-1' && function_exists('utf8_decode')) + return utf8_decode($str); + else if ($to!='UTF-8') + { + $conv->loadCharset($to); + return $conv->utf8ToStr($str); + } - // return raw string + // return UTF-8 string return $str; } @@ -787,6 +883,7 @@ if (!$js_rep_table) { $js_rep_table = $rtf_rep_table = $xml_rep_table = array(); + $xml_rep_table['&'] = '&'; for ($c=160; $c<256; $c++) // can be increased to support more charsets { @@ -808,7 +905,12 @@ // encode for javascript use if ($enctype=='js') + { + if ($OUTPUT->get_charset()!='UTF-8') + $str = rcube_charset_convert($str, $GLOBALS['CHARSET'], $OUTPUT->get_charset()); + return preg_replace(array("/\r\n/", '/"/', "/([^\\\])'/"), array('\n', '\"', "$1\'"), strtr($str, $js_rep_table)); + } // encode for RTF if ($enctype=='rtf') @@ -817,6 +919,52 @@ // no encoding given -> return original string return $str; } + + +/** + * Read input value and convert it for internal use + * Performs stripslashes() and charset conversion if necessary + * + * @param string Field name to read + * @param int Source to get value from (GPC) + * @param boolean Allow HTML tags in field value + * @param string Charset to convert into + * @return string Field value or NULL if not available + */ +function get_input_value($fname, $source, $allow_html=FALSE, $charset=NULL) + { + global $OUTPUT; + $value = NULL; + + if ($source==RCUBE_INPUT_GET && isset($_GET[$fname])) + $value = $_GET[$fname]; + else if ($source==RCUBE_INPUT_POST && isset($_POST[$fname])) + $value = $_POST[$fname]; + else if ($source==RCUBE_INPUT_GPC) + { + if (isset($_POST[$fname])) + $value = $_POST[$fname]; + else if (isset($_GET[$fname])) + $value = $_GET[$fname]; + else if (isset($_COOKIE[$fname])) + $value = $_COOKIE[$fname]; + } + + // strip slashes if magic_quotes enabled + if ((bool)get_magic_quotes_gpc()) + $value = stripslashes($value); + + // remove HTML tags if not allowed + if (!$allow_html) + $value = strip_tags($value); + + // convert to internal charset + if (is_object($OUTPUT)) + return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset); + else + return $value; + } + @@ -952,6 +1100,7 @@ 'message' => 'rcmail_message_container', 'messages' => 'rcmail_message_list', 'messagecountdisplay' => 'rcmail_messagecount_display', + 'quotadisplay' => 'rcmail_quota_display', 'messageheaders' => 'rcmail_message_headers', 'messagebody' => 'rcmail_message_body', 'messageattachments' => 'rcmail_message_attachments', @@ -967,6 +1116,7 @@ 'composeattachment' => 'rcmail_compose_attachment_field', 'priorityselector' => 'rcmail_priority_selector', 'charsetselector' => 'rcmail_charset_selector', + 'searchform' => 'rcmail_search_form', // ADDRESS BOOK 'addresslist' => 'rcmail_contacts_list', @@ -991,7 +1141,16 @@ // execute object handler function if ($object_handlers[$object] && function_exists($object_handlers[$object])) return call_user_func($object_handlers[$object], $attrib); - + + else if ($object=='productname') + { + $name = !empty($CONFIG['product_name']) ? $CONFIG['product_name'] : 'RoundCube Webmail'; + return rep_specialchars_output($name, 'html', 'all'); + } + else if ($object=='version') + { + return (string)RCMAIL_VERSION; + } else if ($object=='pagetitle') { $task = $GLOBALS['_task']; @@ -1019,7 +1178,7 @@ // create and register a button function rcube_button($attrib) { - global $CONFIG, $OUTPUT, $JS_OBJECT_NAME, $BROWSER; + global $CONFIG, $OUTPUT, $JS_OBJECT_NAME, $BROWSER, $COMM_PATH, $MAIN_TASKS; static $sa_buttons = array(); static $s_button_count = 100; @@ -1091,6 +1250,7 @@ // register button in the system if ($attrib['command']) + { $OUTPUT->add_script(sprintf("%s.register_button('%s', '%s', '%s', '%s', '%s', '%s');", $JS_OBJECT_NAME, $command, @@ -1099,6 +1259,11 @@ $attrib['imageact'] ? $skin_path.$attrib['imageact'] : $attrib['classact'], $attirb['imagesel'] ? $skin_path.$attirb['imagesel'] : $attrib['classsel'], $attrib['imageover'] ? $skin_path.$attrib['imageover'] : '')); + + // make valid href to task buttons + if (in_array($attrib['command'], $MAIN_TASKS)) + $attrib['href'] = ereg_replace('_task=[a-z]+', '_task='.$attrib['command'], $COMM_PATH); + } // overwrite attributes if (!$attrib['href']) @@ -1273,25 +1438,30 @@ { global $CONFIG, $sess_user_lang; + $ts = NULL; + if (is_numeric($date)) $ts = $date; else if (!empty($date)) - $ts = strtotime($date); - else + $ts = @strtotime($date); + + if (empty($ts)) return ''; + + // get user's timezone + $tz = $CONFIG['timezone']; + if ($CONFIG['dst_active']) + $tz++; // convert time to user's timezone - $timestamp = $ts - date('Z', $ts) + ($CONFIG['timezone'] * 3600); + $timestamp = $ts - date('Z', $ts) + ($tz * 3600); // get current timestamp in user's timezone $now = time(); // local time $now -= (int)date('Z'); // make GMT time - $now += ($CONFIG['timezone'] * 3600); // user's time + $now += ($tz * 3600); // user's time $now_date = getdate(); - //$day_secs = 60*((int)date('H', $now)*60 + (int)date('i', $now)); - //$week_secs = 60 * 60 * 24 * 7; - //$diff = $now - $timestamp; $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']); @@ -1403,7 +1573,7 @@ $input_action = new hiddenfield(array('name' => '_action', 'value' => 'login')); $fields = array(); - $fields['user'] = $input_user->show($_POST['_user']); + $fields['user'] = $input_user->show(get_input_value('_user', RCUBE_INPUT_POST)); $fields['pass'] = $input_pass->show(); $fields['action'] = $input_action->show(); @@ -1460,9 +1630,10 @@ } - function rcmail_charset_selector($attrib) { + global $OUTPUT; + // pass the following attributes to the form class $field_attrib = array('name' => '_charset'); foreach ($attrib as $attr => $value) @@ -1471,10 +1642,11 @@ $charsets = array( 'US-ASCII' => 'ASCII (English)', - 'X-EUC-JP' => 'EUC-JP (Japanese)', + 'EUC-JP' => 'EUC-JP (Japanese)', 'EUC-KR' => 'EUC-KR (Korean)', 'BIG5' => 'BIG5 (Chinese)', 'GB2312' => 'GB2312 (Chinese)', + 'ISO-2022-JP' => 'ISO-2022-JP (Japanese)', 'ISO-8859-1' => 'ISO-8859-1 (Latin-1)', 'ISO-8859-2' => 'ISO-8895-2 (Central European)', 'ISO-8859-7' => 'ISO-8859-7 (Greek)', @@ -1490,11 +1662,13 @@ $select = new select($field_attrib); $select->add(array_values($charsets), array_keys($charsets)); - $set = $_POST['_charset'] ? $_POST['_charset'] : $GLOBALS['CHARSET']; + $set = $_POST['_charset'] ? $_POST['_charset'] : $OUTPUT->get_charset(); return $select->show($set); } +/****** debugging function ********/ + function rcube_timer() { list($usec, $sec) = explode(" ", microtime()); -- Gitblit v1.9.1