Skip to content

Commit

Permalink
Fix bug where deleting folders with subfolders could fail in some cas…
Browse files Browse the repository at this point in the history
…es (#5466)
  • Loading branch information
alecpl committed Oct 14, 2016
1 parent 2008619 commit b8f9ba7
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 25 deletions.
1 change: 1 addition & 0 deletions CHANGELOG
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,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
-------------
Expand Down
49 changes: 24 additions & 25 deletions program/lib/Roundcube/rcube_imap.php
Original file line number Diff line number Diff line change
Expand Up @@ -3293,49 +3293,48 @@ public function rename_folder($folder, $new_name)
}

/**
* 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);

if ($result) {
// unsubscribe folder
$this->conn->unsubscribe($folder);
$delm = $this->get_hierarchy_delimiter();

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);
// 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 . '*');

// 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;
}

Expand Down

0 comments on commit b8f9ba7

Please sign in to comment.