| | |
| | | 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)) |
| | | if ($CONFIG['db_backend']!='mdb2' && !$DB->is_error()) |
| | | include_once('include/session.inc'); |
| | | |
| | | |
| | | // init session |
| | | session_start(); |
| | | $sess_id = session_id(); |
| | | |
| | | $_SESSION['user_lang'] = rcube_language_prop($CONFIG['locale_string']); |
| | | |
| | | // create session and set session vars |
| | | if (!$_SESSION['client_id']) |
| | | { |
| | |
| | | |
| | | // set current task to session |
| | | $_SESSION['task'] = $task; |
| | | |
| | | |
| | | // create IMAP object |
| | | if ($task=='mail') |
| | |
| | | global $CONFIG, $IMAP; |
| | | |
| | | // set root dir from config |
| | | if (strlen($CONFIG['imap_root'])) |
| | | if (!empty($CONFIG['imap_root'])) |
| | | $IMAP->set_rootdir($CONFIG['imap_root']); |
| | | |
| | | if (strlen($_SESSION['mbox'])) |
| | | if (!empty($_SESSION['mbox'])) |
| | | $IMAP->set_mailbox($_SESSION['mbox']); |
| | | |
| | | if (isset($_SESSION['page'])) |
| | | $IMAP->set_page($_SESSION['page']); |
| | | } |
| | |
| | | // destroy session data and remove cookie |
| | | function rcmail_kill_session() |
| | | { |
| | | /* $sess_name = session_name(); |
| | | if (isset($_COOKIE[$sess_name])) |
| | | setcookie($sess_name, '', time()-42000, '/'); |
| | | */ |
| | | // save user preferences |
| | | $a_user_prefs = $_SESSION['user_prefs']; |
| | | if (!is_array($a_user_prefs)) |
| | | $a_user_prefs = array(); |
| | | |
| | | if ((isset($_SESSION['sort_col']) && $_SESSION['sort_col']!=$a_user_prefs['message_sort_col']) || |
| | | (isset($_SESSION['sort_order']) && $_SESSION['sort_order']!=$a_user_prefs['message_sort_order'])) |
| | | { |
| | | $a_user_prefs['message_sort_col'] = $_SESSION['sort_col']; |
| | | $a_user_prefs['message_sort_order'] = $_SESSION['sort_order']; |
| | | rcmail_save_user_prefs($a_user_prefs); |
| | | } |
| | | |
| | | $_SESSION = array(); |
| | | session_destroy(); |
| | | } |
| | |
| | | $javascript = "var $JS_OBJECT_NAME = new rcube_webmail();\n"; |
| | | $javascript .= "$JS_OBJECT_NAME.set_env('comm_path', '$COMM_PATH');\n"; |
| | | |
| | | if (isset($CONFIG['javascript_config'] )){ |
| | | foreach ($CONFIG['javascript_config'] as $js_config_var){ |
| | | $javascript .= "$JS_OBJECT_NAME.set_env('$js_config_var', '" . $CONFIG[$js_config_var] . "');\n"; |
| | | } |
| | | } |
| | | |
| | | if (!empty($GLOBALS['_framed'])) |
| | | $javascript .= "$JS_OBJECT_NAME.set_env('framed', true);\n"; |
| | | |
| | | $OUTPUT->add_script($javascript); |
| | | $OUTPUT->include_script('program/js/common.js'); |
| | | $OUTPUT->include_script('program/js/app.js'); |
| | | $OUTPUT->include_script('common.js'); |
| | | $OUTPUT->include_script('app.js'); |
| | | $OUTPUT->scripts_path = 'program/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'); |
| | |
| | | |
| | | if ($MBSTRING && function_exists("mb_language")) |
| | | { |
| | | if (!mb_language(strtok($lang, "_"))) |
| | | if (!@mb_language(strtok($lang, "_"))) |
| | | $MBSTRING = FALSE; // unsupport language |
| | | } |
| | | |
| | |
| | | $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 |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | |
| | | // 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 rcmail_save_user_prefs($a_user_prefs) |
| | | { |
| | | global $DB, $CONFIG, $sess_user_lang; |
| | | |
| | | $DB->query("UPDATE ".get_table_name('users')." |
| | | SET preferences=?, |
| | | language=? |
| | | WHERE user_id=?", |
| | | serialize($a_user_prefs), |
| | | $sess_user_lang, |
| | | $_SESSION['user_id']); |
| | | |
| | | if ($DB->affected_rows()) |
| | | { |
| | | $_SESSION['user_prefs'] = $a_user_prefs; |
| | | $CONFIG = array_merge($CONFIG, $a_user_prefs); |
| | | return TRUE; |
| | | } |
| | | |
| | | return FALSE; |
| | | } |
| | | |
| | | |
| | | // overwrite action variable |
| | | function rcmail_overwrite_action($action) |
| | | { |
| | |
| | | } |
| | | |
| | | |
| | | 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) |
| | | { |
| | | $s_header_sent = TRUE; |
| | | send_nocacheing_headers(); |
| | | header('Content-Type: application/x-javascript'); |
| | | header('Content-Type: application/x-javascript; charset='.$CHARSET); |
| | | print '/** remote response ['.date('d/M/Y h:i:s O')."] **/\n"; |
| | | } |
| | | |
| | | // 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(); |
| | |
| | | |
| | | // 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($_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; |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | |
| | | 'composeattachment' => 'rcmail_compose_attachment_field', |
| | | 'priorityselector' => 'rcmail_priority_selector', |
| | | 'charsetselector' => 'rcmail_charset_selector', |
| | | 'searchform' => 'rcmail_search_form', |
| | | 'receiptcheckbox' => 'rcmail_receipt_checkbox', |
| | | |
| | | // 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=='version') |
| | | { |
| | | return (string)RCMAIL_VERSION; |
| | | } |
| | | else if ($object=='pagetitle') |
| | | { |
| | | $task = $GLOBALS['_task']; |
| | | $title = !empty($CONFIG['product_name']) ? $CONFIG['product_name'].' :: ' : ''; |
| | | |
| | | if ($task=='mail' && isset($GLOBALS['MESSAGE']['subject'])) |
| | | if ($task=='login') |
| | | $title = rcube_label(array('name' => 'welcome', 'vars' => array('product' => $CONFIG['product_name']))); |
| | | else if ($task=='mail' && isset($GLOBALS['MESSAGE']['subject'])) |
| | | $title .= $GLOBALS['MESSAGE']['subject']; |
| | | else if (isset($GLOBALS['PAGE_TITLE'])) |
| | | $title .= $GLOBALS['PAGE_TITLE']; |
| | | else if ($task=='mail' && ($mbox_name = $IMAP->get_mailbox_name())) |
| | | $title .= rcube_charset_convert($mbox_name, 'UTF-7', 'UTF-8'); |
| | | else |
| | | $title .= $task; |
| | | $title .= ucfirst($task); |
| | | |
| | | return rep_specialchars_output($title, 'html', 'all'); |
| | | } |
| | |
| | | // 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) |
| | |
| | | $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); |
| | | } |
| | | |