| | |
| | | | program/include/rcmail.php | |
| | | | | |
| | | | This file is part of the RoundCube Webmail client | |
| | | | Copyright (C) 2008, RoundCube Dev. - Switzerland | |
| | | | Copyright (C) 2008-2009, RoundCube Dev. - Switzerland | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | PURPOSE: | |
| | |
| | | public $db; |
| | | public $imap; |
| | | public $output; |
| | | public $plugins; |
| | | public $task = 'mail'; |
| | | public $action = ''; |
| | | public $comm_path = './'; |
| | |
| | | /** |
| | | * This implements the 'singleton' design pattern |
| | | * |
| | | * @return object qvert The one and only instance |
| | | * @return object rcmail The one and only instance |
| | | */ |
| | | static function get_instance() |
| | | { |
| | |
| | | $syslog_facility = $this->config->get('syslog_facility', LOG_USER); |
| | | openlog($syslog_id, LOG_ODELAY, $syslog_facility); |
| | | } |
| | | |
| | | |
| | | // set task and action properties |
| | | $this->set_task(strip_quotes(get_input_value('_task', RCUBE_INPUT_GPC))); |
| | | $this->set_task(get_input_value('_task', RCUBE_INPUT_GPC)); |
| | | $this->action = asciiwords(get_input_value('_action', RCUBE_INPUT_GPC)); |
| | | |
| | | // connect to database |
| | |
| | | |
| | | // reset some session parameters when changing task |
| | | if ($_SESSION['task'] != $this->task) |
| | | unset($_SESSION['page']); |
| | | rcube_sess_unset('page'); |
| | | |
| | | // set current task to session |
| | | $_SESSION['task'] = $this->task; |
| | |
| | | // create IMAP object |
| | | if ($this->task == 'mail') |
| | | $this->imap_init(); |
| | | |
| | | // create plugin API and load plugins |
| | | $this->plugins = rcube_plugin_api::get_instance(); |
| | | } |
| | | |
| | | |
| | |
| | | */ |
| | | public function set_task($task) |
| | | { |
| | | if (!in_array($task, self::$main_tasks)) |
| | | $task = 'mail'; |
| | | |
| | | $this->task = $task; |
| | | $this->comm_path = $this->url(array('task' => $task)); |
| | | $task = asciiwords($task); |
| | | $this->task = $task ? $task : 'mail'; |
| | | $this->comm_path = $this->url(array('task' => $this->task)); |
| | | |
| | | if ($this->output) |
| | | $this->output->set_env('task', $task); |
| | | $this->output->set_env('task', $this->task); |
| | | } |
| | | |
| | | |
| | |
| | | |
| | | // set localization |
| | | setlocale(LC_ALL, $_SESSION['language'] . '.utf8', 'en_US.utf8'); |
| | | |
| | | // workaround for http://bugs.php.net/bug.php?id=18556 |
| | | if (in_array($_SESSION['language'], array('tr_TR', 'ku', 'az_AZ'))) |
| | | setlocale(LC_CTYPE, 'en_US' . '.utf8'); |
| | | } |
| | | |
| | | |
| | |
| | | $contacts = null; |
| | | $ldap_config = (array)$this->config->get('ldap_public'); |
| | | $abook_type = strtolower($this->config->get('address_book_type')); |
| | | |
| | | $plugin = $this->plugins->exec_hook('get_address_book', array('id' => $id, 'writeable' => $writeable)); |
| | | |
| | | if ($id && $ldap_config[$id]) { |
| | | // plugin returned instance of a rcube_addressbook |
| | | if ($plugin['instance'] instanceof rcube_addressbook) { |
| | | $contacts = $plugin['instance']; |
| | | } |
| | | else if ($id && $ldap_config[$id]) { |
| | | $contacts = new rcube_ldap($ldap_config[$id]); |
| | | } |
| | | else if ($id === '0') { |
| | | $contacts = new rcube_contacts($this->db, $this->user->ID); |
| | | } |
| | | else if ($abook_type == 'ldap') { |
| | | // Use the first writable LDAP address book. |
| | |
| | | |
| | | // set pagesize from config |
| | | $this->imap->set_pagesize($this->config->get('pagesize', 50)); |
| | | |
| | | // Setting root and delimiter before iil_Connect can save time detecting them |
| | | // using NAMESPACE and LIST |
| | | $options = array( |
| | | 'imap' => $this->config->get('imap_auth_type', 'check'), |
| | | 'delimiter' => isset($_SESSION['imap_delimiter']) ? $_SESSION['imap_delimiter'] : $this->config->get('imap_delimiter'), |
| | | 'rootdir' => isset($_SESSION['imap_root']) ? $_SESSION['imap_root'] : $this->config->get('imap_root'), |
| | | ); |
| | | |
| | | $this->imap->set_options($options); |
| | | |
| | | // set global object for backward compatibility |
| | | $GLOBALS['IMAP'] = $this->imap; |
| | |
| | | $conn = false; |
| | | |
| | | if ($_SESSION['imap_host'] && !$this->imap->conn) { |
| | | if (!($conn = $this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt_passwd($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl'], rcmail::get_instance()->config->get('imap_auth_type', 'check')))) { |
| | | if (!($conn = $this->imap->connect($_SESSION['imap_host'], $_SESSION['username'], $this->decrypt_passwd($_SESSION['password']), $_SESSION['imap_port'], $_SESSION['imap_ssl']))) { |
| | | if ($this->output) |
| | | $this->output->show_message($this->imap->error_code == -1 ? 'imaperror' : 'sessionerror', 'error'); |
| | | } |
| | |
| | | if ($a_host['host']) { |
| | | $host = $a_host['host']; |
| | | $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? $a_host['scheme'] : null; |
| | | $imap_port = isset($a_host['port']) ? $a_host['port'] : ($imap_ssl ? 993 : $config['default_port']); |
| | | if(!empty($a_host['port'])) |
| | | $imap_port = $a_host['port']; |
| | | else if ($imap_ssl && $imap_ssl != 'tls') |
| | | $imap_port = 993; |
| | | } |
| | | else |
| | | $imap_port = $config['default_port']; |
| | | |
| | | |
| | | $imap_port = $imap_port ? $imap_port : $config['default_port']; |
| | | |
| | | /* Modify username with domain if required |
| | | Inspired by Marco <P0L0_notspam_binware.org> |
| | |
| | | $username .= '@'.$config['username_domain']; |
| | | } |
| | | |
| | | // try to resolve email address from virtuser table |
| | | if (!empty($config['virtuser_file']) && strpos($username, '@')) |
| | | $username = rcube_user::email2user($username); |
| | | // try to resolve email address from virtuser table |
| | | if (strpos($username, '@')) |
| | | if ($virtuser = rcube_user::email2user($username)) |
| | | $username = $virtuser; |
| | | |
| | | // lowercase username if it's an e-mail address (#1484473) |
| | | if (strpos($username, '@')) |
| | |
| | | $username = $user->data['username']; |
| | | |
| | | // exit if IMAP login failed |
| | | if (!($imap_login = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl, $config['imap_auth_type']))) |
| | | if (!($imap_login = $this->imap->connect($host, $username, $pass, $imap_port, $imap_ssl))) |
| | | return false; |
| | | |
| | | // user already registered -> update user's record |
| | |
| | | { |
| | | $this->imap->set_charset($this->config->get('default_charset', RCMAIL_CHARSET)); |
| | | |
| | | // set root dir from config |
| | | if ($imap_root = $this->config->get('imap_root')) { |
| | | $this->imap->set_rootdir($imap_root); |
| | | } |
| | | if ($default_folders = $this->config->get('default_imap_folders')) { |
| | | $this->imap->set_default_mailboxes($default_folders); |
| | | } |
| | |
| | | if (isset($_SESSION['page'])) { |
| | | $this->imap->set_page($_SESSION['page']); |
| | | } |
| | | |
| | | // cache IMAP root and delimiter in session for performance reasons |
| | | $_SESSION['imap_root'] = $this->imap->root_dir; |
| | | $_SESSION['imap_delimiter'] = $this->imap->delimiter; |
| | | } |
| | | |
| | | |
| | |
| | | * @param mixed Named parameters array or label name |
| | | * @return string Localized text |
| | | */ |
| | | public function gettext($attrib) |
| | | public function gettext($attrib, $domain=null) |
| | | { |
| | | // load localization files if not done yet |
| | | if (empty($this->texts)) |
| | |
| | | |
| | | $command_name = !empty($attrib['command']) ? $attrib['command'] : NULL; |
| | | $alias = $attrib['name'] ? $attrib['name'] : ($command_name && $command_label_map[$command_name] ? $command_label_map[$command_name] : ''); |
| | | |
| | | |
| | | // check for text with domain |
| | | if ($domain && ($text_item = $this->texts[$domain.'.'.$alias])) |
| | | ; |
| | | // text does not exist |
| | | if (!($text_item = $this->texts[$alias])) { |
| | | else if (!($text_item = $this->texts[$alias])) { |
| | | /* |
| | | raise_error(array( |
| | | 'code' => 500, |
| | |
| | | * |
| | | * @param string Language ID |
| | | */ |
| | | public function load_language($lang = null) |
| | | public function load_language($lang = null, $add = array()) |
| | | { |
| | | $lang = $this->language_prop(($lang ? $lang : $_SESSION['language'])); |
| | | |
| | |
| | | |
| | | $_SESSION['language'] = $lang; |
| | | } |
| | | |
| | | // append additional texts (from plugin) |
| | | if (is_array($add) && !empty($add)) |
| | | $this->texts += $add; |
| | | } |
| | | |
| | | |
| | |
| | | */ |
| | | public function kill_session() |
| | | { |
| | | foreach (array_keys($_SESSION) as $var) |
| | | rcube_sess_unset($var); |
| | | $_SESSION = array('language' => $this->user->language, 'auth_time' => time(), 'temp' => true); |
| | | rcmail::setcookie('sessauth', '-del-', time() - 60); |
| | | $this->user->reset(); |
| | |
| | | { |
| | | if (!is_array($p)) |
| | | $p = array('_action' => @func_get_arg(0)); |
| | | |
| | | if (!$p['task'] || !in_array($p['task'], rcmail::$main_tasks)) |
| | | $p['task'] = $this->task; |
| | | |
| | | $p['_task'] = $p['task']; |
| | | |
| | | $task = $p['_task'] ? $p['_task'] : ($p['task'] ? $p['task'] : $this->task); |
| | | $p['_task'] = $task; |
| | | unset($p['task']); |
| | | |
| | | $url = './'; |
| | | $delm = '?'; |
| | | foreach (array_reverse($p) as $par => $val) |
| | | foreach (array_reverse($p) as $key => $val) |
| | | { |
| | | if (!empty($val)) { |
| | | $par = $key[0] == '_' ? $key : '_'.$key; |
| | | $url .= $delm.urlencode($par).'='.urlencode($val); |
| | | $delm = '&'; |
| | | } |