thomascube
2007-10-10 352aefed85962adf6c6079b4a9ed7abf3ad8cd50
program/include/main.inc
@@ -29,6 +29,7 @@
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');
@@ -299,13 +300,16 @@
 */
function rcmail_shutdown()
  {
  global $IMAP;
  global $IMAP, $CONTACTS;
  
  if (is_object($IMAP))
    {
    $IMAP->close();
    $IMAP->write_cache();
    }
  if (is_object($CONTACTS))
    $CONTACTS->close();
    
  // before closing the database connection, write session data
  session_write_close();
@@ -458,7 +462,7 @@
  // add some basic label to client
  if (!$OUTPUT->ajax_call)
    rcube_add_label('loading');
    rcube_add_label('loading', 'movingmessage');
  }
@@ -472,19 +476,11 @@
  static $s_mbstring_loaded = NULL;
  
  // settings for mbstring module (by Tadashi Jokagi)
  if (is_null($s_mbstring_loaded) && ($s_mbstring_loaded = extension_loaded("mbstring")))
  {
    $MBSTRING = array();
    foreach (mb_list_encodings() as $charset)
      $MBSTRING[strtoupper($charset)] = strtoupper($charset);
    // add some alias charsets
    $MBSTRING['UTF-7'] = "UTF7-IMAP";
    $MBSTRING['WINDOWS-1257'] = "ISO-8859-13";
  }
  else if (is_null($s_mbstring_loaded))
  if (is_null($s_mbstring_loaded))
    $MBSTRING = $s_mbstring_loaded = extension_loaded("mbstring");
  else
    $MBSTRING = $s_mbstring_loaded = FALSE;
  if ($MBSTRING)
    mb_internal_encoding(RCMAIL_CHARSET);
@@ -577,7 +573,7 @@
     Inspired by Marco <P0L0_notspam_binware.org>
  */
  // Check if we need to add domain
  if (!empty($CONFIG['username_domain']) && !strstr($user, '@'))
  if (!empty($CONFIG['username_domain']) && !strpos($user, '@'))
    {
    if (is_array($CONFIG['username_domain']) && isset($CONFIG['username_domain'][$host]))
      $user .= '@'.$CONFIG['username_domain'][$host];
@@ -585,14 +581,22 @@
      $user .= '@'.$CONFIG['username_domain'];
    }
  // try to resolve email address from virtuser table
  if (!empty($CONFIG['virtuser_file']) && strpos($user, '@'))
    $user = rcmail_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);
  $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);
  // user already registered -> overwrite username
  if ($sql_arr = $DB->fetch_assoc($sql_result))
@@ -600,11 +604,6 @@
    $user_id = $sql_arr['user_id'];
    $user = $sql_arr['username'];
    }
  // try to resolve email address from virtuser table
  if (!empty($CONFIG['virtuser_file']) && strstr($user, '@'))
    $user = rcmail_email2user($user);
  // exit if IMAP login failed
  if (!($imap_login  = $IMAP->connect($host, $user, $pass, $imap_port, $imap_ssl)))
@@ -636,6 +635,15 @@
  else if ($CONFIG['auto_create_user'])
    {
    $user_id = rcmail_create_user($user, $host);
    }
  else
    {
    raise_error(array(
      'code' => 600,
      'type' => 'php',
      'file' => "config/main.inc.php",
      'message' => "Acces denied for new user $user. 'auto_create_user' is disabled"
      ), true, false);
    }
  if ($user_id)
@@ -675,7 +683,7 @@
  $user_email = '';
  // try to resolve user in virtusertable
  if (!empty($CONFIG['virtuser_file']) && strstr($user, '@')==FALSE)
  if (!empty($CONFIG['virtuser_file']) && !strpos($user, '@'))
    $user_email = rcmail_user2email($user);
  $DB->query("INSERT INTO ".get_table_name('users')."
@@ -691,7 +699,7 @@
    $mail_domain = rcmail_mail_domain($host);
   
    if ($user_email=='')
      $user_email = strstr($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
      $user_email = strpos($user, '@') ? $user : sprintf('%s@%s', $user, $mail_domain);
    $user_name = $user!=$user_email ? $user : '';
@@ -844,6 +852,9 @@
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=?,
@@ -1057,7 +1068,6 @@
function rcube_charset_convert($str, $from, $to=NULL)
  {
  global $MBSTRING;
  static $mb_encodings;
  $from = strtoupper($from);
  $to = $to==NULL ? strtoupper(RCMAIL_CHARSET) : strtoupper($to);
@@ -1070,10 +1080,13 @@
    return iconv($from, $to . "//IGNORE", $str);
  // convert charset using mbstring module  
  if ($MBSTRING && ($mbfrom = $MBSTRING[$from]) && ($mbto = $MBSTRING[$to]))
  if ($MBSTRING)
    {
    $to = $to=="UTF-7" ? "UTF7-IMAP" : $to;
    $from = $from=="UTF-7" ? "UTF7-IMAP": $from;
    // return if convert succeeded
    if (($out = mb_convert_encoding($str, $mbto, $mbfrom)) != '')
    if (($out = mb_convert_encoding($str, $to, $from)) != '')
      return $out;
    }
@@ -1123,10 +1136,6 @@
  if (!$enctype)
    $enctype = $GLOBALS['OUTPUT_TYPE'];
  // convert nbsps back to normal spaces if not html
  if ($enctype!='html')
    $str = str_replace(chr(160), ' ', $str);
  // encode for plaintext
  if ($enctype=='text')
    return str_replace("\r\n", "\n", $mode=='remove' ? strip_tags($str) : $str);
@@ -1171,11 +1180,10 @@
    for ($c=160; $c<256; $c++)  // can be increased to support more charsets
      {
      $hex = dechex($c);
      $xml_rep_table[Chr($c)] = "&#$c;";
      
      if ($OUTPUT->get_charset()=='ISO-8859-1')
        $js_rep_table[Chr($c)] = sprintf("\u%s%s", str_repeat('0', 4-strlen($hex)), $hex);
        $js_rep_table[Chr($c)] = sprintf("\\u%04x", $c);
      }
    $xml_rep_table['"'] = '&quot;';
@@ -1452,6 +1460,50 @@
/**
 * Replace all css definitions with #container [def]
 *
 * @param string CSS source code
 * @param string Container ID to use as prefix
 * @return string Modified CSS source
 */
function rcmail_mod_css_styles($source, $container_id, $base_url = '')
  {
  $a_css_values = array();
  $last_pos = 0;
  // cut out all contents between { and }
  while (($pos = strpos($source, '{', $last_pos)) && ($pos2 = strpos($source, '}', $pos)))
  {
    $key = sizeof($a_css_values);
    $a_css_values[$key] = substr($source, $pos+1, $pos2-($pos+1));
    $source = substr($source, 0, $pos+1) . "<<str_replacement[$key]>>" . substr($source, $pos2, strlen($source)-$pos2);
    $last_pos = $pos+2;
  }
  // remove html commends and add #container to each tag selector.
  // also replace body definition because we also stripped off the <body> tag
  $styles = preg_replace(
    array(
      '/(^\s*<!--)|(-->\s*$)/',
      '/(^\s*|,\s*|\}\s*)([a-z0-9\._#][a-z0-9\.\-_]*)/im',
      '/@import\s+(url\()?[\'"]?([^\)\'"]+)[\'"]?(\))?/ime',
      '/<<str_replacement\[([0-9]+)\]>>/e',
      "/$container_id\s+body/i"
    ),
    array(
      '',
      "\\1#$container_id \\2",
      "sprintf(\"@import url('./bin/modcss.php?u=%s&c=%s')\", urlencode(make_absolute_url('\\2','$base_url')), urlencode($container_id))",
      "\$a_css_values[\\1]",
      "$container_id div.rcmBody"
    ),
    $source);
  return $styles;
  }
/**
 * Compose a valid attribute string for HTML tags
 *
 * @param array Named tag attributes