| | |
| | | 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 |
| | | function rcmail_startup($task='mail') |
| | | { |
| | |
| | | // 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'); |
| | | |
| | | |
| | |
| | | $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); |
| | |
| | | $charset = $rcube_charsets[$lang]; |
| | | else |
| | | $charset = 'UTF-8'; |
| | | |
| | | |
| | | if ($prop=='charset') |
| | | return $charset; |
| | |
| | | $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'); |
| | |
| | | // 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')); |
| | | } |
| | | |
| | |
| | | $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']; |
| | | |
| | | // query if user already registered |
| | | $sql_result = $DB->query("SELECT user_id, username, language, preferences |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | |
| | | $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 |
| | | { |
| | |
| | | } |
| | | |
| | | |
| | | 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) |
| | |
| | | // 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) |
| | |
| | | } |
| | | |
| | | // send response code |
| | | print rcube_charset_convert($js_code, 'UTF-8', $GLOBALS['CHARSET']); |
| | | print rcube_charset_convert($js_code, $CHARSET, $OUTPUT->get_charset()); |
| | | |
| | | if ($flush) // flush the output buffer |
| | | flush(); |
| | |
| | | closedir($dh); |
| | | } |
| | | } |
| | | |
| | | return $sa_languages; |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | // 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) |
| | | { |
| | | global $MBSTRING, $MBSTRING_ENCODING; |
| | | |
| | | $from = strtoupper($from); |
| | | $to = $to==NULL ? strtoupper($GLOBALS['CHARSET']) : strtoupper($to); |
| | | |
| | | |
| | | if ($from==$to) |
| | | return $str; |
| | | |
| | | // convert charset using iconv module |
| | | if (function_exists('iconv') && $from!='UTF-7' && $to!='UTF-7') { |
| | | return iconv($from, $to, $str); |
| | | } |
| | | // 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'); |
| | |
| | | $str = utf8_encode($str); |
| | | else if ($from!='UTF-8') |
| | | { |
| | | $conv = new utf8($from); |
| | | $conv->loadCharset($from); |
| | | $str = $conv->strToUtf8($str); |
| | | } |
| | | |
| | |
| | | return utf8_decode($str); |
| | | else if ($to!='UTF-8') |
| | | { |
| | | $conv = new utf8($to); |
| | | $conv->loadCharset($to); |
| | | return $conv->utf8ToStr($str); |
| | | } |
| | | |
| | |
| | | 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 |
| | | { |
| | |
| | | |
| | | // 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') |
| | |
| | | // 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($_GET[$fname])) |
| | | $value = $_GET[$fname]; |
| | | else if (isset($_POST[$fname])) |
| | | $value = $_POST[$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 |
| | | return rcube_charset_convert($value, $OUTPUT->get_charset(), $charset); |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | |
| | | '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', |
| | |
| | | 'composeattachment' => 'rcmail_compose_attachment_field', |
| | | 'priorityselector' => 'rcmail_priority_selector', |
| | | 'charsetselector' => 'rcmail_charset_selector', |
| | | 'searchform' => 'rcmail_search_form', |
| | | |
| | | // ADDRESS BOOK |
| | | 'addresslist' => 'rcmail_contacts_list', |
| | |
| | | // 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=='pagetitle') |
| | | { |
| | | $task = $GLOBALS['_task']; |
| | |
| | | // 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; |
| | | |
| | |
| | | |
| | | // 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, |
| | |
| | | $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']) |
| | |
| | | { |
| | | 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']); |
| | | |
| | |
| | | $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(); |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | 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) |
| | |
| | | |
| | | $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)', |
| | |
| | | $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()); |