diff --git a/CHANGELOG b/CHANGELOG index 0b56cd681..cd10b5cb8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -29,6 +29,7 @@ CHANGELOG Roundcube Webmail - Fix so *-request@ addresses in Sender: header are also ignored on reply-all (#1490452) - Update to TinyMCE 4.1.10 (#1490405) - Fix draft removal after a message is sent and storing sent message is disabled (#1490467) +- Fix so imap folder attribute comparisons are case-insensitive (#1490466) RELEASE 1.1.2 ------------- diff --git a/program/include/rcmail.php b/program/include/rcmail.php index 580ac59b3..f00101a6a 100644 --- a/program/include/rcmail.php +++ b/program/include/rcmail.php @@ -1586,7 +1586,7 @@ class rcmail extends rcube // skip folders in which it isn't possible to create subfolders if (!empty($opts['skip_noinferiors'])) { $attrs = $this->storage->folder_attributes($folder['id']); - if ($attrs && in_array('\\Noinferiors', $attrs)) { + if ($attrs && in_array_nocase('\\Noinferiors', $attrs)) { continue; } } diff --git a/program/lib/Roundcube/bootstrap.php b/program/lib/Roundcube/bootstrap.php index 2b7682b65..2e5d9e678 100644 --- a/program/lib/Roundcube/bootstrap.php +++ b/program/lib/Roundcube/bootstrap.php @@ -104,19 +104,29 @@ if (class_exists('PEAR')) { /** - * Similar function as in_array() but case-insensitive + * Similar function as in_array() but case-insensitive with multibyte support. * - * @param string $needle Needle value - * @param array $heystack Array to search in + * @param string $needle Needle value + * @param array $heystack Array to search in * * @return boolean True if found, False if not */ function in_array_nocase($needle, $haystack) { - $needle = mb_strtolower($needle); - foreach ((array)$haystack as $value) { - if ($needle === mb_strtolower($value)) { - return true; + // use much faster method for ascii + if (is_ascii($needle)) { + foreach ((array) $haystack as $value) { + if (strcasecmp($value, $needle) === 0) { + return true; + } + } + } + else { + $needle = mb_strtolower($needle); + foreach ((array) $haystack as $value) { + if ($needle === mb_strtolower($value)) { + return true; + } } } diff --git a/program/lib/Roundcube/rcube_imap.php b/program/lib/Roundcube/rcube_imap.php index 1421563e4..672539417 100644 --- a/program/lib/Roundcube/rcube_imap.php +++ b/program/lib/Roundcube/rcube_imap.php @@ -2826,7 +2826,7 @@ class rcube_imap extends rcube_storage if (is_array($a_folders) && $name == '*' && !empty($this->conn->data['LIST'])) { foreach ($a_folders as $idx => $folder) { if (($opts = $this->conn->data['LIST'][$folder]) - && in_array('\\NonExistent', $opts) + && in_array_nocase('\\NonExistent', $opts) ) { $this->conn->unsubscribe($folder); unset($a_folders[$idx]); @@ -3349,7 +3349,7 @@ class rcube_imap extends rcube_storage if ($subscription) { // It's possible we already called LIST command, check LIST data if (!empty($this->conn->data['LIST']) && !empty($this->conn->data['LIST'][$folder]) - && in_array('\\Subscribed', $this->conn->data['LIST'][$folder]) + && in_array_nocase('\\Subscribed', $this->conn->data['LIST'][$folder]) ) { $a_folders = array($folder); }