diff options
author | alecpl <alec@alec.pl> | 2011-05-05 12:46:54 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2011-05-05 12:46:54 +0000 |
commit | d08333ea578e3b6c6ab42bed05f808a2b7b93cf1 (patch) | |
tree | 58aa053d41963c5f452b614497d06aaf73c5a76a /program/include/rcmail.php | |
parent | 4764079c6af092a6dfa18306601e1b33482fb756 (diff) |
- Fix problems with subfolders of INBOX folder on some IMAP servers (#1487725)
- Fix handling of folders that doesn't belong to any namespace (#1487637)
Diffstat (limited to 'program/include/rcmail.php')
-rw-r--r-- | program/include/rcmail.php | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 14fd7dd15..5567130e3 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -735,9 +735,13 @@ class rcmail // 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 @@ -1453,4 +1457,104 @@ class rcmail 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(); + } + } |