From: Michael M Slusarz Date: Fri, 16 Oct 2009 09:27:12 +0000 (-0600) Subject: Better IMAP error handling if connection unexpectedly dies. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=41950bcd7f9754c58c12fd4db22011f66c5773ca;p=horde.git Better IMAP error handling if connection unexpectedly dies. --- diff --git a/imp/ajax.php b/imp/ajax.php index b37a55785..8a543ba32 100644 --- a/imp/ajax.php +++ b/imp/ajax.php @@ -52,7 +52,8 @@ function _changed($mbox, $compare, $rw = null) try { $GLOBALS['imp_imap']->ob()->openMailbox($mbox, $rw ? Horde_Imap_Client::OPEN_READWRITE : Horde_Imap_Client::OPEN_AUTO); } catch (Horde_Imap_Client_Exception $e) { - return false; + $GLOBALS['notification']->push($e, 'horde.error'); + return null; } } @@ -336,13 +337,19 @@ case 'Poll': } } - if (!empty($mbox) && _changed($mbox, $cacheid)) { - $result->ViewPort = _getListMessages($mbox, true); + $changed = false; + if (!empty($mbox)) { + $changed =_changed($mbox, $cacheid); + if ($changed) { + $result->ViewPort = _getListMessages($mbox, true); + } } - $quota = _getQuota(); - if (!is_null($quota)) { - $result->quota = $quota; + if (!is_null($changed)) { + $quota = _getQuota(); + if (!is_null($quota)) { + $result->quota = $quota; + } } break; @@ -367,12 +374,12 @@ case 'ViewPort': IMP::setSort($sortby, $sortdir, $mbox); } - $result = new stdClass; $changed = _changed($mbox, $cacheid, false); - if (Horde_Util::getPost('rangeslice') || - !Horde_Util::getPost('checkcache') || - $changed) { + if ($changed || + Horde_Util::getPost('rangeslice') || + !Horde_Util::getPost('checkcache')) { + $result = new stdClass; $result->ViewPort = _getListMessages($mbox, $changed); } break; @@ -384,34 +391,36 @@ case 'CopyMessage': break; } - if ($action == 'MoveMessage') { - $change = _changed($mbox, $cacheid, true); - } + $change = ($action == 'MoveMessage') + ? _changed($mbox, $cacheid, true) + : false; - $imp_message = IMP_Message::singleton(); + if (!is_null($change)) { + $imp_message = IMP_Message::singleton(); - $result = $imp_message->copy($to, ($action == 'MoveMessage') ? 'move' : 'copy', $indices); + $result = $imp_message->copy($to, ($action == 'MoveMessage') ? 'move' : 'copy', $indices); - if ($result) { - if ($action == 'MoveMessage') { - $result = _generateDeleteResult($mbox, $indices, $change); - // Need to manually set remove to true since we want to remove - // message from the list no matter the current pref settings. - $result->remove = 1; - } + if ($result) { + if ($action == 'MoveMessage') { + $result = _generateDeleteResult($mbox, $indices, $change); + // Need to manually set remove to true since we want to remove + // message from the list no matter the current pref settings. + $result->remove = 1; + } - // Update poll information for destination folder if necessary. - // Poll information for current folder will be added by - // _generateDeleteResult() call above. - $poll = _getPollInformation($to); - if (!empty($poll)) { - if (!isset($result->poll)) { - $result->poll = array(); + // Update poll information for destination folder if necessary. + // Poll information for current folder will be added by + // _generateDeleteResult() call above. + $poll = _getPollInformation($to); + if (!empty($poll)) { + if (!isset($result->poll)) { + $result->poll = array(); + } + $result->poll = array_merge($result->poll, $poll); } - $result->poll = array_merge($result->poll, $poll); + } else { + $check_uidvalidity = true; } - } else { - $check_uidvalidity = true; } break; @@ -456,7 +465,7 @@ case 'DeleteMessage': if ($imp_message->delete($indices)) { $result = _generateDeleteResult($mbox, $indices, $change, !$prefs->getValue('hide_deleted') && !$prefs->getValue('use_trash')); - } else { + } elseif (!is_null($change)) { $check_uidvalidity = true; } break; @@ -487,7 +496,7 @@ case 'ReportSpam': // If result is non-zero, then we know the message has been removed // from the current mailbox. $result->remove = 1; - } else { + } elseif (!is_null($change)) { $check_uidvalidity = true; } break; @@ -500,12 +509,14 @@ case 'Blacklist': $imp_filter = new IMP_Filter(); if (Horde_Util::getPost('blacklist')) { $change = _changed($mbox, $cacheid, false); - try { - if ($imp_filter->blacklistMessage($indices, false)) { - $result = _generateDeleteResult($mbox, $indices, $change); + if (!is_null($change)) { + try { + if ($imp_filter->blacklistMessage($indices, false)) { + $result = _generateDeleteResult($mbox, $indices, $change); + } + } catch (Horde_Exception $e) { + $check_uidvalidity = true; } - } catch (Horde_Exception $e) { - $check_uidvalidity = true; } } else { try { @@ -692,24 +703,26 @@ case 'chunkContent': case 'PurgeDeleted': $change = _changed($mbox, $cacheid, $indices); - if (!$change) { - $sort = IMP::getSort($mbox); - $change = ($sort['by'] == Horde_Imap_Client::SORT_THREAD); - } - $imp_message = IMP_Message::singleton(); - $expunged = $imp_message->expungeMailbox(array($mbox => 1), array('list' => true)); - if (!empty($expunged[$mbox])) { - $expunge_count = count($expunged[$mbox]); - $display_folder = IMP::displayFolder($mbox); - if ($expunge_count == 1) { - $notification->push(sprintf(_("1 message was purged from \"%s\"."), $display_folder), 'horde.success'); - } else { - $notification->push(sprintf(_("%s messages were purged from \"%s\"."), $expunge_count, $display_folder), 'horde.success'); + if (!is_null($change)) { + if (!$change) { + $sort = IMP::getSort($mbox); + $change = ($sort['by'] == Horde_Imap_Client::SORT_THREAD); + } + $imp_message = IMP_Message::singleton(); + $expunged = $imp_message->expungeMailbox(array($mbox => 1), array('list' => true)); + if (!empty($expunged[$mbox])) { + $expunge_count = count($expunged[$mbox]); + $display_folder = IMP::displayFolder($mbox); + if ($expunge_count == 1) { + $notification->push(sprintf(_("1 message was purged from \"%s\"."), $display_folder), 'horde.success'); + } else { + $notification->push(sprintf(_("%s messages were purged from \"%s\"."), $expunge_count, $display_folder), 'horde.success'); + } + $result = _generateDeleteResult($mbox, $expunged, $change); + // Need to manually set remove to true since we want to remove + // message from the list no matter the current pref settings. + $result->remove = 1; } - $result = _generateDeleteResult($mbox, $expunged, $change); - // Need to manually set remove to true since we want to remove - // message from the list no matter the current pref settings. - $result->remove = 1; } break; diff --git a/imp/lib/IMP.php b/imp/lib/IMP.php index 4d3a76e43..372040fa6 100644 --- a/imp/lib/IMP.php +++ b/imp/lib/IMP.php @@ -1042,7 +1042,8 @@ class IMP !empty($GLOBALS['conf']['server']['sort_limit'])) { try { $status = $GLOBALS['imp_imap']->ob()->status($mbox, Horde_Imap_Client::STATUS_MESSAGES); - if ($status['messages'] > $GLOBALS['conf']['server']['sort_limit']) { + if (isset($status['messages']) && + ($status['messages'] > $GLOBALS['conf']['server']['sort_limit'])) { $ob['limit'] = true; $ob['by'] = Horde_Imap_Client::SORT_ARRIVAL; } diff --git a/imp/lib/Mailbox.php b/imp/lib/Mailbox.php index 42ddcf9d9..995a777ac 100644 --- a/imp/lib/Mailbox.php +++ b/imp/lib/Mailbox.php @@ -671,6 +671,7 @@ class IMP_Mailbox $this->_threadob = $GLOBALS['imp_imap']->ob()->thread($this->_mailbox); $ref_errcode = null; } catch (Horde_Imap_Client_Exception $e) { + $error = $e; $ref_errcode = $e->getCode(); } @@ -681,6 +682,9 @@ class IMP_Mailbox $GLOBALS['notification']->push(_("Server does not support thread sorting."), 'horde.error'); return new Horde_Imap_Client_Thread(array(), 'uid'); } + } elseif (!is_null($ref_errcode)) { + $GLOBALS['notification']->push($error, 'horde.error'); + return new Horde_Imap_Client_Thread(array(), 'uid'); } }