Fix bug where deleting folders with subfolders could fail in some cases (#5466)

pull/5754/head
Aleksander Machniak 8 years ago
parent 57c59e7756
commit 4480b2615f

@ -7,6 +7,7 @@ CHANGELOG Roundcube Webmail
- Fix regression where creation of default folders wasn't functioning without prefix (#5460)
- Enigma: Fix bug where last records on keys list were hidden (#5461)
- Enigma: Fix key search with keyword containing non-ascii characters (#5459)
- Fix bug where deleting folders with subfolders could fail in some cases (#5466)
RELEASE 1.2.2
-------------

@ -3286,49 +3286,48 @@ class rcube_imap extends rcube_storage
}
/**
* Remove folder from server
* Remove folder (with subfolders) from the server
*
* @param string $folder Folder name
*
* @return boolean True on success
* @return boolean True on success, False on failure
*/
function delete_folder($folder)
{
$delm = $this->get_hierarchy_delimiter();
if (!$this->check_connection()) {
return false;
}
// get list of folders
if ((strpos($folder, '%') === false) && (strpos($folder, '*') === false)) {
$sub_mboxes = $this->list_folders('', $folder . $delm . '*');
}
else {
$sub_mboxes = $this->list_folders();
}
// send delete command to server
$result = $this->conn->deleteFolder($folder);
$delm = $this->get_hierarchy_delimiter();
if ($result) {
// unsubscribe folder
$this->conn->unsubscribe($folder);
// get list of sub-folders or all folders
// if folder name contains special characters
$path = strspn($folder, '%*') > 0 ? ($folder . $delm) : '';
$sub_mboxes = $this->list_folders('', $path . '*');
foreach ($sub_mboxes as $c_mbox) {
if (strpos($c_mbox, $folder.$delm) === 0) {
$this->conn->unsubscribe($c_mbox);
if ($this->conn->deleteFolder($c_mbox)) {
$this->clear_message_cache($c_mbox);
// According to RFC3501 deleting a \Noselect folder
// with subfolders may fail. To workaround this we delete
// subfolders first (in reverse order) (#5466)
if (!empty($sub_mboxes)) {
foreach (array_reverse($sub_mboxes) as $mbox) {
if (strpos($mbox, $folder . $delm) === 0) {
if ($this->conn->deleteFolder($mbox)) {
$this->conn->unsubscribe($mbox);
$this->clear_message_cache($mbox);
}
}
}
}
// clear folder-related cache
// delete the folder
if ($result = $this->conn->deleteFolder($folder)) {
// and unsubscribe it
$this->conn->unsubscribe($folder);
$this->clear_message_cache($folder);
$this->clear_cache('mailboxes', true);
}
$this->clear_cache('mailboxes', true);
return $result;
}

Loading…
Cancel
Save