alecpl
2008-04-13 875a482d3c47218b8d191bb07fdb16373a80b1d4
program/include/main.inc
@@ -5,7 +5,7 @@
 | program/include/main.inc                                              |
 |                                                                       |
 | This file is part of the RoundCube Webmail client                     |
 | Copyright (C) 2005-2007, RoundCube Dev, - Switzerland                 |
 | Copyright (C) 2005-2008, RoundCube Dev, - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
@@ -26,12 +26,12 @@
 * @author Thomas Bruederli <roundcube@gmail.com>
 */
require_once('lib/des.inc');
require_once('lib/utf7.inc');
require_once('lib/utf8.class.php');
require_once('include/rcube_shared.inc');
require_once('include/rcmail_template.inc');
// fallback if not PHP modules are available
@include_once('lib/des.inc');
@include_once('lib/utf8.class.php');
// define constannts for input reading
define('RCUBE_INPUT_GET', 0x0101);
@@ -48,13 +48,19 @@
function rcmail_startup($task='mail')
  {
  global $sess_id, $sess_user_lang;
  global $CONFIG, $INSTALL_PATH, $BROWSER, $OUTPUT, $_SESSION, $IMAP, $DB;
  global $CONFIG, $OUTPUT, $IMAP, $DB, $USER;
  // check client
  $BROWSER = rcube_browser();
  // start output buffering, we don't need any output yet,
  // it'll be cleared after reading of config files, etc.
  ob_start();
  // load configuration
  $CONFIG = rcmail_load_config();
  // set session domain
  if (isset($CONFIG['session_domain']) && !empty($CONFIG['session_domain'])) {
    ini_set('session.cookie_domain', $CONFIG['session_domain']);
  }
  // set session garbage collecting time according to session_lifetime
  if (!empty($CONFIG['session_lifetime']))
@@ -63,14 +69,17 @@
  // prepare DB connection
  $dbwrapper = empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend'];
  $dbclass = "rcube_" . $dbwrapper;
  require_once("include/$dbclass.inc");
  
  $DB = new $dbclass($CONFIG['db_dsnw'], $CONFIG['db_dsnr'], $CONFIG['db_persistent']);
  $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql';
  $DB->sqlite_initials = INSTALL_PATH.'SQL/sqlite.initial.sql';
  $DB->set_debug((bool)$CONFIG['sql_debug']);
  $DB->db_connect('w');
  // use database for storing session data
  include_once('include/session.inc');
  // clear output buffer
  ob_end_clean();
  // init session
  session_start();
@@ -87,11 +96,11 @@
  // set session vars global
  $sess_user_lang = rcube_language_prop($_SESSION['user_lang']);
  // create user object
  $USER = new rcube_user($_SESSION['user_id']);
  // overwrite config with user preferences
  if (is_array($_SESSION['user_prefs']))
    $CONFIG = array_merge($CONFIG, $_SESSION['user_prefs']);
  $CONFIG = array_merge($CONFIG, (array)$USER->get_prefs());
  // reset some session parameters when changing task
  if ($_SESSION['task'] != $task)
@@ -104,13 +113,11 @@
  if ($task=='mail')
    rcmail_imap_init();
  // set localization
  if ($CONFIG['locale_string'])
    setlocale(LC_ALL, $CONFIG['locale_string']);
  else if ($sess_user_lang)
    setlocale(LC_ALL, $sess_user_lang);
  register_shutdown_function('rcmail_shutdown');
  }
@@ -123,8 +130,6 @@
 */
function rcmail_load_config()
  {
  global $INSTALL_PATH;
  // load config file
  include_once('config/main.inc.php');
  $conf = is_array($rcmail_config) ? $rcmail_config : array();
@@ -139,7 +144,7 @@
  $conf = array_merge($conf, $rcmail_config);
  if (empty($conf['log_dir']))
    $conf['log_dir'] = $INSTALL_PATH.'logs';
    $conf['log_dir'] = INSTALL_PATH.'logs';
  else
    $conf['log_dir'] = unslashify($conf['log_dir']);
@@ -233,7 +238,8 @@
    $valid = $CONFIG['ip_check'] ? $_SERVER['REMOTE_ADDR'] == $SESS_CLIENT_IP : true;
  
  // check session filetime
  if (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED) && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < time())
  if (!empty($CONFIG['session_lifetime']) && isset($SESS_CHANGED)
      && $SESS_CHANGED + $CONFIG['session_lifetime']*60 < time())
    $valid = false;
  
  return $valid;
@@ -280,6 +286,9 @@
function rcmail_set_imap_prop()
  {
  global $CONFIG, $IMAP;
  if (!empty($CONFIG['default_charset']))
    $IMAP->set_charset($CONFIG['default_charset']);
  // set root dir from config
  if (!empty($CONFIG['imap_root']))
@@ -321,21 +330,42 @@
 */
function rcmail_kill_session()
  {
  // save user preferences
  $a_user_prefs = $_SESSION['user_prefs'];
  if (!is_array($a_user_prefs))
    $a_user_prefs = array();
  global $USER;
  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);
    $a_user_prefs = array('message_sort_col' => $_SESSION['sort_col'], 'message_sort_order' => $_SESSION['sort_order']);
    $USER->save_prefs($a_user_prefs);
    }
  $_SESSION = array('user_lang' => $GLOBALS['sess_user_lang'], 'auth_time' => time(), 'temp' => true);
  setcookie('sessauth', '-del-', time()-60);
  $USER->reset();
  }
/**
 * Do server side actions on logout
 */
function rcmail_logout_actions()
  {
  global $CONFIG, $IMAP;
  // on logout action we're not connected to imap server
  if (($CONFIG['logout_purge'] && !empty($CONFIG['trash_mbox']))
      || $CONFIG['logout_expunge'])
    {
      if (!rcmail_authenticate_session())
        return;
      rcmail_imap_init(true);
    }
  if ($CONFIG['logout_purge'] && !empty($CONFIG['trash_mbox']))
    $IMAP->clear_mailbox($CONFIG['trash_mbox']);
  if ($CONFIG['logout_expunge'])
    $IMAP->expunge('INBOX');
  }
@@ -376,7 +406,7 @@
  if (strlen($CONFIG[$config_key]))
    return $CONFIG[$config_key];
  
  return $table;
  return $sequence;
  }
@@ -389,11 +419,10 @@
 */
function rcube_language_prop($lang, $prop='lang')
  {
  global $INSTALL_PATH;
  static $rcube_languages, $rcube_language_aliases, $rcube_charsets;
  if (empty($rcube_languages))
    @include($INSTALL_PATH.'program/localization/index.inc');
    @include(INSTALL_PATH.'program/localization/index.inc');
    
  // check if we have an alias for that language
  if (!isset($rcube_languages[$lang]) && isset($rcube_language_aliases[$lang]))
@@ -413,7 +442,7 @@
  if (isset($rcube_charsets[$lang]))
    $charset = $rcube_charsets[$lang];
  else
    $charset = 'UTF-8';
    $charset = 'UTF-8';
  if ($prop=='charset')
@@ -429,18 +458,15 @@
 * environment vars according to the current session and configuration
 */
function rcmail_load_gui()
  {
{
  global $CONFIG, $OUTPUT, $sess_user_lang;
  // init output page
  $OUTPUT = new rcmail_template($CONFIG, $GLOBALS['_task']);
  $OUTPUT = new rcube_template($CONFIG, $GLOBALS['_task']);
  $OUTPUT->set_env('comm_path', $GLOBALS['COMM_PATH']);
  if (is_array($CONFIG['javascript_config']))
  {
    foreach ($CONFIG['javascript_config'] as $js_config_var)
      $OUTPUT->set_env($js_config_var, $CONFIG[$js_config_var]);
  }
  foreach (array('flag_for_deletion') as $js_config_var)
    $OUTPUT->set_env($js_config_var, $CONFIG[$js_config_var]);
  if (!empty($GLOBALS['_framed']))
    $OUTPUT->set_env('framed', true);
@@ -452,19 +478,23 @@
  if (!empty($CONFIG['charset']))
    $OUTPUT->set_charset($CONFIG['charset']);
    
  // register common UI objects
  $OUTPUT->add_handlers(array(
    'loginform' => 'rcmail_login_form',
    'username'  => 'rcmail_current_username',
    'message' => 'rcmail_message_container',
    'charsetselector' => 'rcmail_charset_selector',
  ));
  // add some basic label to client
  if (!$OUTPUT->ajax_call)
    rcube_add_label('loading', 'movingmessage');
  }
  $OUTPUT->add_label('loading', 'movingmessage');
}
/**
 * Create an output object for JSON responses
 */
function rcmail_init_json()
{
  global $CONFIG, $OUTPUT;
  // init output object
  $OUTPUT = new rcube_json_output($CONFIG, $GLOBALS['_task']);
  // set locale setting
  rcmail_set_locale($sess_user_lang);
}
/**
 * Set localization charset based on the given language.
@@ -531,7 +561,7 @@
 */
function rcmail_login($user, $pass, $host=NULL)
  {
  global $CONFIG, $IMAP, $DB, $sess_user_lang;
  global $CONFIG, $IMAP, $DB, $USER, $sess_user_lang;
  $user_id = NULL;
  
  if (!$host)
@@ -562,7 +592,7 @@
  if ($a_host['host'])
    {
    $host = $a_host['host'];
    $imap_ssl = (isset($a_host['scheme']) && in_array($a_host['scheme'], array('ssl','imaps','tls'))) ? TRUE : FALSE;
    $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']);
    }
  else
@@ -583,58 +613,50 @@
  // try to resolve email address from virtuser table    
  if (!empty($CONFIG['virtuser_file']) && strpos($user, '@'))
    $user = rcmail_email2user($user);
    $user = rcube_user::email2user($user);
  // lowercase username if it's an e-mail address (#1484473)
  if (strpos($user, '@'))
    $user = strtolower($user);
  // query if user already registered
  $sql_result = $DB->query(
    "SELECT user_id, username, language, preferences
     FROM ".get_table_name('users')."
     WHERE  mail_host=? AND (username=? OR alias=?)",
    $host,
    $user,
    $user);
  if ($existing = rcube_user::query($user, $host))
    $USER = $existing;
  // user already registered -> overwrite username
  if ($sql_arr = $DB->fetch_assoc($sql_result))
  if ($USER->ID)
    {
    $user_id = $sql_arr['user_id'];
    $user = $sql_arr['username'];
    $user_id = $USER->ID;
    $user = $USER->data['username'];
    }
  // exit if IMAP login failed
  if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl)))
    return FALSE;
    return false;
  // user already registered
  if ($user_id && !empty($sql_arr))
  if ($USER->ID)
    {
    // get user prefs
    if (strlen($sql_arr['preferences']))
      {
      $user_prefs = unserialize($sql_arr['preferences']);
      $_SESSION['user_prefs'] = $user_prefs;
      array_merge($CONFIG, $user_prefs);
      }
    $CONFIG = array_merge($CONFIG, (array)$USER->get_prefs());
    // set user specific language
    if (strlen($sql_arr['language']))
      $sess_user_lang = $_SESSION['user_lang'] = $sql_arr['language'];
    if (!empty($USER->data['language']))
      $sess_user_lang = $_SESSION['user_lang'] = $USER->data['language'];
      
    // update user's record
    $DB->query("UPDATE ".get_table_name('users')."
                SET    last_login=".$DB->now()."
                WHERE  user_id=?",
                $user_id);
    $USER->touch();
    }
  // create new system user
  else if ($CONFIG['auto_create_user'])
    {
    $user_id = rcmail_create_user($user, $host);
    if ($created = rcube_user::create($user, $host))
    {
      $USER = $created;
      // get existing mailboxes
      $a_mailboxes = $IMAP->list_mailboxes();
    }
    }
  else
    {
@@ -646,13 +668,13 @@
      ), true, false);
    }
  if ($user_id)
  if ($USER->ID)
    {
    $_SESSION['user_id']   = $user_id;
    $_SESSION['user_id']   = $USER->ID;
    $_SESSION['username']  = $USER->data['username'];
    $_SESSION['imap_host'] = $host;
    $_SESSION['imap_port'] = $imap_port;
    $_SESSION['imap_ssl']  = $imap_ssl;
    $_SESSION['username']  = $user;
    $_SESSION['user_lang'] = $sess_user_lang;
    $_SESSION['password']  = encrypt_passwd($pass);
    $_SESSION['login_time'] = mktime();
@@ -660,90 +682,15 @@
    // force reloading complete list of subscribed mailboxes
    rcmail_set_imap_prop();
    $IMAP->clear_cache('mailboxes');
    $IMAP->create_default_folders();
    if ($CONFIG['create_default_folders'])
        $IMAP->create_default_folders();
    return TRUE;
    }
  return FALSE;
  }
/**
 * Create new entry in users and identities table
 *
 * @param string User name
 * @param string IMAP host
 * @return mixed New user ID or False on failure
 */
function rcmail_create_user($user, $host)
{
  global $DB, $CONFIG, $IMAP;
  $user_email = '';
  // try to resolve user in virtusertable
  if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
    $user_email = rcmail_user2email($user);
  $DB->query("INSERT INTO ".get_table_name('users')."
              (created, last_login, username, mail_host, alias, language)
              VALUES (".$DB->now().", ".$DB->now().", ?, ?, ?, ?)",
              strip_newlines($user),
              strip_newlines($host),
              strip_newlines($user_email),
              $_SESSION['user_lang']);
  if ($user_id = $DB->insert_id(get_sequence_name('users')))
  {
    $mail_domain = rcmail_mail_domain($host);
    if ($user_email=='')
      $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
    $user_name = $user!=$user_email ? $user : '';
    // try to resolve the e-mail address from the virtuser table
    if (!empty($CONFIG['virtuser_query']) &&
        ($sql_result = $DB->query(preg_replace('/%u/', $DB->quote($user), $CONFIG['virtuser_query']))) &&
        ($DB->num_rows()>0))
    {
      while ($sql_arr = $DB->fetch_array($sql_result))
      {
        $DB->query("INSERT INTO ".get_table_name('identities')."
                   (user_id, del, standard, name, email)
                   VALUES (?, 0, 1, ?, ?)",
                   $user_id,
                   strip_newlines($user_name),
                   preg_replace('/^@/', $user . '@', $sql_arr[0]));
      }
    }
    else
    {
      // also create new identity records
      $DB->query("INSERT INTO ".get_table_name('identities')."
                  (user_id, del, standard, name, email)
                  VALUES (?, 0, 1, ?, ?)",
                  $user_id,
                  strip_newlines($user_name),
                  strip_newlines($user_email));
    }
    // get existing mailboxes
    $a_mailboxes = $IMAP->list_mailboxes();
  }
  else
  {
    raise_error(array(
      'code' => 500,
      'type' => 'php',
      'line' => __LINE__,
      'file' => __FILE__,
      'message' => "Failed to create new user"), TRUE, FALSE);
  }
  return $user_id;
}
/**
@@ -788,90 +735,6 @@
    }
  return $result;
  }
/**
 * Resolve username using a virtuser table
 *
 * @param string E-mail address to resolve
 * @return string Resolved IMAP username
 */
function rcmail_email2user($email)
  {
  $user = $email;
  $r = rcmail_findinvirtual("^$email");
  for ($i=0; $i<count($r); $i++)
    {
    $data = $r[$i];
    $arr = preg_split('/\s+/', $data);
    if(count($arr)>0)
      {
      $user = trim($arr[count($arr)-1]);
      break;
      }
    }
  return $user;
  }
/**
 * Resolve e-mail address from virtuser table
 *
 * @param string User name
 * @return string Resolved e-mail address
 */
function rcmail_user2email($user)
  {
  $email = "";
  $r = rcmail_findinvirtual("$user$");
  for ($i=0; $i<count($r); $i++)
    {
    $data=$r[$i];
    $arr = preg_split('/\s+/', $data);
    if (count($arr)>0)
      {
      $email = trim($arr[0]);
      break;
      }
    }
  return $email;
  }
/**
 * Write the given user prefs to the user's record
 *
 * @param mixed User prefs to save
 * @return boolean True on success, False on failure
 */
function rcmail_save_user_prefs($a_user_prefs)
  {
  global $DB, $CONFIG, $sess_user_lang;
  // merge (partial) prefs array with existing settings
  $a_user_prefs += (array)$_SESSION['user_prefs'];
  $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;
  }
@@ -928,10 +791,30 @@
 * @return string Encryprted string
 */
function encrypt_passwd($pass)
  {
  $cypher = des(get_des_key(), $pass, 1, 0, NULL);
  return base64_encode($cypher);
{
  if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, get_des_key(), $iv);
    $cypher = mcrypt_generic($td, $pass);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
  }
  else if (function_exists('des')) {
    $cypher = des(get_des_key(), $pass, 1, 0, NULL);
  }
  else {
    $cypher = $pass;
    raise_error(array(
      'code' => 500,
      'type' => 'php',
      'file' => __FILE__,
      'message' => "Could not convert encrypt password. Make sure Mcrypt is installed or lib/des.inc is available"
      ), true, false);
  }
  return base64_encode($cypher);
}
/**
@@ -941,8 +824,21 @@
 * @return string Plain password
 */
function decrypt_passwd($cypher)
  {
  $pass = des(get_des_key(), base64_decode($cypher), 0, 0, NULL);
{
  if (function_exists('mcrypt_module_open') && ($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_ECB, ""))) {
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, get_des_key(), $iv);
    $pass = mdecrypt_generic($td, base64_decode($cypher));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
  }
  else if (function_exists('des')) {
    $pass = des(get_des_key(), base64_decode($cypher), 0, 0, NULL);
  }
  else {
    $pass = base64_decode($cypher);
  }
  return preg_replace('/\x00/', '', $pass);
  }
@@ -974,18 +870,18 @@
 */
function rcube_list_languages()
  {
  global $CONFIG, $INSTALL_PATH;
  global $CONFIG;
  static $sa_languages = array();
  if (!sizeof($sa_languages))
    {
    @include($INSTALL_PATH.'program/localization/index.inc');
    @include(INSTALL_PATH.'program/localization/index.inc');
    if ($dh = @opendir($INSTALL_PATH.'program/localization'))
    if ($dh = @opendir(INSTALL_PATH.'program/localization'))
      {
      while (($name = readdir($dh)) !== false)
        {
        if ($name{0}=='.' || !is_dir($INSTALL_PATH.'program/localization/'.$name))
        if ($name{0}=='.' || !is_dir(INSTALL_PATH.'program/localization/'.$name))
          continue;
        if ($label = $rcube_languages[$name])
@@ -1000,6 +896,7 @@
/**
 * Add a localized label to the client environment
 * @deprecated
 */
function rcube_add_label()
  {
@@ -1007,7 +904,7 @@
  
  $arg_list = func_get_args();
  foreach ($arg_list as $i => $name)
    $OUTPUT->command('add_label', $name, rcube_label($name));
    $OUTPUT->add_label($name);
  }
@@ -1068,52 +965,84 @@
function rcube_charset_convert($str, $from, $to=NULL)
  {
  global $MBSTRING;
  static $convert_warning = false;
  $from = strtoupper($from);
  $to = $to==NULL ? strtoupper(RCMAIL_CHARSET) : strtoupper($to);
  $error = false; $conv = null;
  if ($from==$to || $str=='' || empty($from))
    return $str;
  $aliases = array(
    'UNKNOWN-8BIT'   => 'ISO-8859-15',
    'X-UNKNOWN'      => 'ISO-8859-15',
    'X-USER-DEFINED' => 'ISO-8859-15',
    'ISO-8859-8-I'   => 'ISO-8859-8',
    'KS_C_5601-1987' => 'EUC-KR',
  );
  // convert charset using iconv module  
  if (function_exists('iconv') && $from != 'UTF-7' && $to != 'UTF-7')
    return iconv($from, $to . "//IGNORE", $str);
    {
    $aliases['GB2312'] = 'GB18030';
    return iconv(($aliases[$from] ? $aliases[$from] : $from), ($aliases[$to] ? $aliases[$to] : $to) . "//IGNORE", $str);
    }
  // convert charset using mbstring module  
  if ($MBSTRING)
    {
    $to = $to=="UTF-7" ? "UTF7-IMAP" : $to;
    $from = $from=="UTF-7" ? "UTF7-IMAP": $from;
    $aliases['UTF-7'] = 'UTF7-IMAP';
    $aliases['WINDOWS-1257'] = 'ISO-8859-13';
    
    // return if convert succeeded
    if (($out = mb_convert_encoding($str, $to, $from)) != '')
    if (($out = mb_convert_encoding($str, ($aliases[$to] ? $aliases[$to] : $to), ($aliases[$from] ? $aliases[$from] : $from))) != '')
      return $out;
    }
  $conv = new utf8();
  if (class_exists('utf8'))
    $conv = new utf8();
  // convert string to UTF-8
  if ($from=='UTF-7')
  if ($from == 'UTF-7')
    $str = utf7_to_utf8($str);
  else if (($from=='ISO-8859-1') && function_exists('utf8_encode'))
  else if (($from == 'ISO-8859-1') && function_exists('utf8_encode'))
    $str = utf8_encode($str);
  else if ($from!='UTF-8')
  else if ($from != 'UTF-8' && $conv)
    {
    $conv->loadCharset($from);
    $str = $conv->strToUtf8($str);
    }
  else if ($from != 'UTF-8')
    $error = true;
  // encode string for output
  if ($to=='UTF-7')
  if ($to == 'UTF-7')
    return utf8_to_utf7($str);
  else if ($to=='ISO-8859-1' && function_exists('utf8_decode'))
  else if ($to == 'ISO-8859-1' && function_exists('utf8_decode'))
    return utf8_decode($str);
  else if ($to!='UTF-8')
  else if ($to != 'UTF-8' && $conv)
    {
    $conv->loadCharset($to);
    return $conv->utf8ToStr($str);
    }
  else if ($to != 'UTF-8')
    $error = true;
  // report error
  if ($error && !$convert_warning)
    {
    raise_error(array(
      'code' => 500,
      'type' => 'php',
      'file' => __FILE__,
      'message' => "Could not convert string charset. Make sure iconv is installed or lib/utf8.class is available"
      ), true, false);
    $convert_warning = true;
    }
  // return UTF-8 string
  return $str;
  }
@@ -1199,7 +1128,7 @@
    if ($OUTPUT->get_charset()!='UTF-8')
      $str = rcube_charset_convert($str, RCMAIL_CHARSET, $OUTPUT->get_charset());
      
    return preg_replace(array("/\r?\n/", "/\r/"), array('\n', '\n'), addslashes(strtr($str, $js_rep_table)));
    return preg_replace(array("/\r?\n/", "/\r/", '/<\\//'), array('\n', '\n', '<\\/'), addslashes(strtr($str, $js_rep_table)));
    }
  // no encoding given -> return original string
@@ -1275,6 +1204,14 @@
    return $value;
  }
/**
 * Remove all non-ascii and non-word chars
 * except . and -
 */
function asciiwords($str)
{
  return preg_replace('/[^a-z0-9.-_]/i', '', $str);
}
/**
 * Remove single and double quotes from given string
@@ -1313,16 +1250,6 @@
  // check template file
  return is_file("$skin_path/templates/$name.html");
  }
/**
 * Wrapper for rcmail_template::parse()
 * @deprecated
 */
function parse_template($name='main', $exit=true)
  {
  $GLOBALS['OUTPUT']->parse($name, $exit);
  }
@@ -1416,19 +1343,19 @@
  if ($type=='checkbox')
    {
    $attrib['value'] = '1';
    $input = new checkbox($attrib);
    $input = new html_checkbox($attrib);
    }
  else if ($type=='textarea')
    {
    $attrib['cols'] = $attrib['size'];
    $input = new textarea($attrib);
    $input = new html_textarea($attrib);
    }
  else
    $input = new textfield($attrib);
    $input = new html_inputfield($attrib);
  // use value from post
  if (!empty($_POST[$fname]))
    $value = $_POST[$fname];
    $value = get_input_value($fname, RCUBE_INPUT_POST);
  $out = $input->show($value);
         
@@ -1461,6 +1388,7 @@
/**
 * Replace all css definitions with #container [def]
 * and remove css-inlined scripting
 *
 * @param string CSS source code
 * @param string Container ID to use as prefix
@@ -1470,6 +1398,10 @@
  {
  $a_css_values = array();
  $last_pos = 0;
  // ignore the whole block if evil styles are detected
  if (stristr($source, 'expression') || stristr($source, 'behavior'))
    return '';
  // cut out all contents between { and }
  while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos)))
@@ -1480,7 +1412,7 @@
    $last_pos = $pos+2;
  }
  // remove html commends and add #container to each tag selector.
  // remove html comments and add #container to each tag selector.
  // also replace body definition because we also stripped off the <body> tag
  $styles = preg_replace(
    array(
@@ -1501,6 +1433,26 @@
  return $styles;
  }
/**
 * Try to autodetect operating system and find the correct line endings
 *
 * @return string The appropriate mail header delimiter
 */
function rcmail_header_delm()
{
  global $CONFIG;
  // use the configured delimiter for headers
  if (!empty($CONFIG['mail_header_delimiter']))
    return $CONFIG['mail_header_delimiter'];
  else if (strtolower(substr(PHP_OS, 0, 3)=='win'))
    return "\r\n";
  else if (strtolower(substr(PHP_OS, 0, 3)=='mac'))
    return "\r\n";
  else
    return "\n";
}
/**
@@ -1612,7 +1564,7 @@
      $out .= rcube_label(strtolower(date('M', $timestamp)));
    // month name (long)
    else if ($format{$i}=='F')
      $out .= rcube_label(strtolower(date('F', $timestamp)));
      $out .= rcube_label('long'.strtolower(date('M', $timestamp)));
    else
      $out .= date($format{$i}, $timestamp);
    }
@@ -1631,7 +1583,10 @@
function format_email_recipient($email, $name='')
  {
  if ($name && $name != $email)
    return sprintf('%s <%s>', strpos($name, ",") ? '"'.$name.'"' : $name, $email);
    {
    // Special chars as defined by RFC 822 need to in quoted string (or escaped).
    return sprintf('%s <%s>', preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $name) ? '"'.addcslashes($name, '"').'"' : $name, $email);
    }
  else
    return $email;
  }
@@ -1673,7 +1628,7 @@
 */
function write_log($name, $line)
  {
  global $CONFIG, $INSTALL_PATH;
  global $CONFIG;
  if (!is_string($line))
    $line = var_export($line, true);
@@ -1683,7 +1638,7 @@
                 $line);
                 
  if (empty($CONFIG['log_dir']))
    $CONFIG['log_dir'] = $INSTALL_PATH.'logs';
    $CONFIG['log_dir'] = INSTALL_PATH.'logs';
      
  // try to open specific log file for writing
  if ($fp = @fopen($CONFIG['log_dir'].'/'.$name, 'a'))    
@@ -1760,10 +1715,6 @@
  // get mailbox list
  $mbox_name = $IMAP->get_mailbox_name();
  
  // for these mailboxes we have localized labels
  $special_mailboxes = array('inbox', 'sent', 'drafts', 'trash', 'junk');
  // build the folders tree
  if (empty($a_mailboxes))
    {
@@ -1781,9 +1732,9 @@
// var_dump($a_mailboxes);
  if ($type=='select')
    $out .= rcmail_render_folder_tree_select($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
    $out .= rcmail_render_folder_tree_select($a_mailboxes, $mbox_name, $attrib['maxlength']);
   else
    $out .= rcmail_render_folder_tree_html($a_mailboxes, $special_mailboxes, $mbox_name, $attrib['maxlength']);
    $out .= rcmail_render_folder_tree_html($a_mailboxes, $mbox_name, $attrib['maxlength']);
// rcube_print_time($mboxlist_start, 'render_folder_tree()');
@@ -1833,7 +1784,7 @@
 * Return html for a structured list &lt;ul&gt; for the mailbox tree
 * @access private
 */
function rcmail_render_folder_tree_html(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
function rcmail_render_folder_tree_html(&$arrFolders, &$mbox_name, $maxlength, $nestLevel=0)
  {
  global $COMM_PATH, $IMAP, $CONFIG, $OUTPUT;
@@ -1844,9 +1795,8 @@
    $zebra_class = ($nestLevel*$idx)%2 ? 'even' : 'odd';
    $title = '';
    $folder_lc = strtolower($folder['id']);
    if (in_array($folder_lc, $special))
      $foldername = rcube_label($folder_lc);
    if ($folder_class = rcmail_folder_classname($folder['id']))
      $foldername = rcube_label($folder_class);
    else
      {
      $foldername = $folder['name'];
@@ -1854,20 +1804,16 @@
      // shorten the folder name to a given length
      if ($maxlength && $maxlength>1)
        {
        $fname = abbrevate_string($foldername, $maxlength);
        $fname = abbreviate_string($foldername, $maxlength);
        if ($fname != $foldername)
          $title = ' title="'.Q($foldername).'"';
        $foldername = $fname;
        }
      }
    // add unread message count display
    if ($unread_count = $IMAP->messagecount($folder['id'], 'RECENT', ($folder['id']==$mbox_name)))
      $foldername .= sprintf(' (%d)', $unread_count);
    // make folder name safe for ids and class names
    $folder_id = preg_replace('/[^A-Za-z0-9\-_]/', '', $folder['id']);
    $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_lc);
    $class_name = preg_replace('/[^a-z0-9\-_]/', '', $folder_class ? $folder_class : strtolower($folder['id']));
    // set special class for Sent, Drafts, Trash and Junk
    if ($folder['id']==$CONFIG['sent_mbox'])
@@ -1903,7 +1849,7 @@
                    Q($foldername));
    if (!empty($folder['folders']))
      $out .= "\n<ul>\n" . rcmail_render_folder_tree_html($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1) . "</ul>\n";
      $out .= "\n<ul>\n" . rcmail_render_folder_tree_html($folder['folders'], $mbox_name, $maxlength, $nestLevel+1) . "</ul>\n";
    $out .= "</li>\n";
    $idx++;
@@ -1917,7 +1863,7 @@
 * Return html for a flat list <select> for the mailbox tree
 * @access private
 */
function rcmail_render_folder_tree_select(&$arrFolders, &$special, &$mbox_name, $maxlength, $nestLevel=0)
function rcmail_render_folder_tree_select(&$arrFolders, &$mbox_name, $maxlength, $nestLevel=0)
  {
  global $IMAP, $OUTPUT;
@@ -1925,16 +1871,15 @@
  $out = '';
  foreach ($arrFolders as $key=>$folder)
    {
    $folder_lc = strtolower($folder['id']);
    if (in_array($folder_lc, $special))
      $foldername = rcube_label($folder_lc);
    if ($folder_class = rcmail_folder_classname($folder['id']))
      $foldername = rcube_label($folder_class);
    else
      {
      $foldername = $folder['name'];
      
      // shorten the folder name to a given length
      if ($maxlength && $maxlength>1)
        $foldername = abbrevate_string($foldername, $maxlength);
        $foldername = abbreviate_string($foldername, $maxlength);
      }
    $out .= sprintf('<option value="%s">%s%s</option>'."\n",
@@ -1943,7 +1888,7 @@
                    Q($foldername));
    if (!empty($folder['folders']))
      $out .= rcmail_render_folder_tree_select($folder['folders'], $special, $mbox_name, $maxlength, $nestLevel+1);
      $out .= rcmail_render_folder_tree_select($folder['folders'], $mbox_name, $maxlength, $nestLevel+1);
    $idx++;
    }
@@ -1951,4 +1896,43 @@
  return $out;
  }
/**
 * Return internal name for the given folder if it matches the configured special folders
 * @access private
 */
function rcmail_folder_classname($folder_id)
{
  global $CONFIG;
  $cname = null;
  $folder_lc = strtolower($folder_id);
  // for these mailboxes we have localized labels and css classes
  foreach (array('inbox', 'sent', 'drafts', 'trash', 'junk') as $smbx)
  {
    if ($folder_lc == $smbx || $folder_id == $CONFIG[$smbx.'_mbox'])
      $cname = $smbx;
  }
  return $cname;
}
/**
 * Try to localize the given IMAP folder name.
 * UTF-7 decode it in case no localized text was found
 *
 * @param string Folder name
 * @return string Localized folder name in UTF-8 encoding
 */
function rcmail_localize_foldername($name)
{
  if ($folder_class = rcmail_folder_classname($name))
    return rcube_label($folder_class);
  else
    return rcube_charset_convert($name, 'UTF-7');
}
?>