summaryrefslogtreecommitdiff
path: root/program/include/rcmail.php
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2011-05-05 12:46:54 +0000
committeralecpl <alec@alec.pl>2011-05-05 12:46:54 +0000
commitd08333ea578e3b6c6ab42bed05f808a2b7b93cf1 (patch)
tree58aa053d41963c5f452b614497d06aaf73c5a76a /program/include/rcmail.php
parent4764079c6af092a6dfa18306601e1b33482fb756 (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.php104
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();
+ }
+
}