yllar
2011-05-17 74bc4acd2776ba2f63976897be58a18549a4b2d2
program/include/rcmail.php
@@ -5,7 +5,7 @@
 | program/include/rcmail.php                                            |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2008-2010, The Roundcube Dev Team                       |
 | Copyright (C) 2008-2011, The Roundcube Dev Team                       |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
@@ -570,13 +570,12 @@
    if (session_id())
      return;
    $lifetime = $this->config->get('session_lifetime', 0) * 60;
    // set session domain
    if ($domain = $this->config->get('session_domain')) {
      ini_set('session.cookie_domain', $domain);
    }
    // set session garbage collecting time according to session_lifetime
    $lifetime = $this->config->get('session_lifetime', 0) * 60;
    if ($lifetime) {
      ini_set('session.gc_maxlifetime', $lifetime * 2);
    }
@@ -588,7 +587,7 @@
    ini_set('session.serialize_handler', 'php');
    // use database for storing session data
    $this->session = new rcube_session($this->get_dbh(), $lifetime);
    $this->session = new rcube_session($this->get_dbh(), $this->config);
    $this->session->register_gc_handler('rcmail_temp_gc');
    if ($this->config->get('enable_caching'))
@@ -736,9 +735,13 @@
    // user already registered -> update user's record
    if (is_object($user)) {
      // fix some old settings according to namespace prefix
      $this->fix_namespace_settings($user);
      // create default folders on first login
      if (!$user->data['last_login'] && $config['create_default_folders'])
        $this->imap->create_default_folders();
      // update last login timestamp
      $user->touch();
    }
    // create new system user
@@ -1454,4 +1457,104 @@
    return strtr($this->action, '-', '_') . '.inc';
  }
  /**
   * Fixes some user preferences according to namespace handling change.
   * Old Roundcube versions were using folder names with removed namespace prefix.
   * Now we need to add the prefix on servers where personal namespace has prefix.
   *
   * @param rcube_user $user User object
   */
  private function fix_namespace_settings($user)
  {
    $prefix     = $this->imap->get_namespace('prefix');
    $prefix_len = strlen($prefix);
    if (!$prefix_len)
      return;
    $prefs = $user->get_prefs();
    if (empty($prefs) || $prefs['namespace_fixed'])
      return;
    // Build namespace prefix regexp
    $ns     = $this->imap->get_namespace();
    $regexp = array();
    foreach ($ns as $entry) {
      if (!empty($entry)) {
        foreach ($entry as $item) {
          if (strlen($item[0])) {
            $regexp[] = preg_quote($item[0], '/');
          }
        }
      }
    }
    $regexp = '/^('. implode('|', $regexp).')/';
    // Fix preferences
    $opts = array('drafts_mbox', 'junk_mbox', 'sent_mbox', 'trash_mbox', 'archive_mbox');
    foreach ($opts as $opt) {
      if ($value = $prefs[$opt]) {
        if ($value != 'INBOX' && !preg_match($regexp, $value)) {
          $prefs[$opt] = $prefix.$value;
        }
      }
    }
    if (!empty($prefs['default_imap_folders'])) {
      foreach ($prefs['default_imap_folders'] as $idx => $name) {
        if ($name != 'INBOX' && !preg_match($regexp, $name)) {
          $prefs['default_imap_folders'][$idx] = $prefix.$name;
        }
      }
    }
    if (!empty($prefs['search_mods'])) {
      $folders = array();
      foreach ($prefs['search_mods'] as $idx => $value) {
        if ($idx != 'INBOX' && $idx != '*' && !preg_match($regexp, $idx)) {
          $idx = $prefix.$idx;
        }
        $folders[$idx] = $value;
      }
      $prefs['search_mods'] = $folders;
    }
    if (!empty($prefs['message_threading'])) {
      $folders = array();
      foreach ($prefs['message_threading'] as $idx => $value) {
        if ($idx != 'INBOX' && !preg_match($regexp, $idx)) {
          $idx = $prefix.$idx;
        }
        $folders[$prefix.$idx] = $value;
      }
      $prefs['message_threading'] = $folders;
    }
    if (!empty($prefs['collapsed_folders'])) {
      $folders     = explode('&&', $prefs['collapsed_folders']);
      $count       = count($folders);
      $folders_str = '';
      if ($count) {
          $folders[0]        = substr($folders[0], 1);
          $folders[$count-1] = substr($folders[$count-1], 0, -1);
      }
      foreach ($folders as $value) {
        if ($value != 'INBOX' && !preg_match($regexp, $value)) {
          $value = $prefix.$value;
        }
        $folders_str .= '&'.$value.'&';
      }
      $prefs['collapsed_folders'] = $folders_str;
    }
    $prefs['namespace_fixed'] = true;
    // save updated preferences and reset imap settings (default folders)
    $user->save_prefs($prefs);
    $this->set_imap_prop();
  }
}