Fix so imap folder attribute comparisons are case-insensitive (#1490466)

+ make in_array_nocase() much faster for ASCII strings
pull/289/head
Aleksander Machniak 9 years ago
parent 8b0d817919
commit 9d78c68cbf

@ -29,6 +29,7 @@ CHANGELOG Roundcube Webmail
- Fix so *-request@ addresses in Sender: header are also ignored on reply-all (#1490452) - Fix so *-request@ addresses in Sender: header are also ignored on reply-all (#1490452)
- Update to TinyMCE 4.1.10 (#1490405) - Update to TinyMCE 4.1.10 (#1490405)
- Fix draft removal after a message is sent and storing sent message is disabled (#1490467) - 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 RELEASE 1.1.2
------------- -------------

@ -1586,7 +1586,7 @@ class rcmail extends rcube
// skip folders in which it isn't possible to create subfolders // skip folders in which it isn't possible to create subfolders
if (!empty($opts['skip_noinferiors'])) { if (!empty($opts['skip_noinferiors'])) {
$attrs = $this->storage->folder_attributes($folder['id']); $attrs = $this->storage->folder_attributes($folder['id']);
if ($attrs && in_array('\\Noinferiors', $attrs)) { if ($attrs && in_array_nocase('\\Noinferiors', $attrs)) {
continue; continue;
} }
} }

@ -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 string $needle Needle value
* @param array $heystack Array to search in * @param array $heystack Array to search in
* *
* @return boolean True if found, False if not * @return boolean True if found, False if not
*/ */
function in_array_nocase($needle, $haystack) function in_array_nocase($needle, $haystack)
{ {
$needle = mb_strtolower($needle); // use much faster method for ascii
foreach ((array)$haystack as $value) { if (is_ascii($needle)) {
if ($needle === mb_strtolower($value)) { foreach ((array) $haystack as $value) {
return true; if (strcasecmp($value, $needle) === 0) {
return true;
}
}
}
else {
$needle = mb_strtolower($needle);
foreach ((array) $haystack as $value) {
if ($needle === mb_strtolower($value)) {
return true;
}
} }
} }

@ -2826,7 +2826,7 @@ class rcube_imap extends rcube_storage
if (is_array($a_folders) && $name == '*' && !empty($this->conn->data['LIST'])) { if (is_array($a_folders) && $name == '*' && !empty($this->conn->data['LIST'])) {
foreach ($a_folders as $idx => $folder) { foreach ($a_folders as $idx => $folder) {
if (($opts = $this->conn->data['LIST'][$folder]) if (($opts = $this->conn->data['LIST'][$folder])
&& in_array('\\NonExistent', $opts) && in_array_nocase('\\NonExistent', $opts)
) { ) {
$this->conn->unsubscribe($folder); $this->conn->unsubscribe($folder);
unset($a_folders[$idx]); unset($a_folders[$idx]);
@ -3349,7 +3349,7 @@ class rcube_imap extends rcube_storage
if ($subscription) { if ($subscription) {
// It's possible we already called LIST command, check LIST data // It's possible we already called LIST command, check LIST data
if (!empty($this->conn->data['LIST']) && !empty($this->conn->data['LIST'][$folder]) 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); $a_folders = array($folder);
} }

Loading…
Cancel
Save