diff --git a/lib/ext/Syncroton/Command/Ping.php b/lib/ext/Syncroton/Command/Ping.php --- a/lib/ext/Syncroton/Command/Ping.php +++ b/lib/ext/Syncroton/Command/Ping.php @@ -82,8 +82,9 @@ } catch (Syncroton_Exception_NotFound $senf) { if ($this->_logger instanceof Zend_Log) $this->_logger->debug(__METHOD__ . '::' . __LINE__ . " " . $senf->getMessage()); - $status = self::STATUS_FOLDER_NOT_FOUND; - break; + // Outlook refuses to removed some folders, and keeps requesting them. + // Without this we end up in an endless loop: https://bifrost.kolabsystems.com/T399575 + continue; } } $this->_device->pingfolder = serialize(array_keys($folders)); diff --git a/lib/ext/Syncroton/Command/Sync.php b/lib/ext/Syncroton/Command/Sync.php --- a/lib/ext/Syncroton/Command/Sync.php +++ b/lib/ext/Syncroton/Command/Sync.php @@ -470,7 +470,10 @@ foreach($this->_collections as $collectionData) { // continue immediately if folder does not exist if (! ($collectionData->folder instanceof Syncroton_Model_IFolder)) { - break 2; + // Ignore the not found folder. + // Outlook refuses to remove some folders, and keeps requesting them. + // Without this we end up in an endless loop: https://bifrost.kolabsystems.com/T399575 + continue; // countinue immediately if syncstate is invalid } elseif (! ($collectionData->syncState instanceof Syncroton_Model_ISyncState)) { @@ -545,23 +548,21 @@ } while (Syncroton_Server::validateSession() && time() - $intervalStart < $this->_heartbeatInterval - (Syncroton_Registry::getPingTimeout() + 10)); } - // First check for folders hierarchy changes - foreach ($this->_collections as $collectionData) { - if (! ($collectionData->folder instanceof Syncroton_Model_IFolder)) { - // Without this Outlook will next do a FolderSync with the same syncKey, - // and thus not detect any changes. - $this->_syncStateBackend->resetState($this->_device, 'FolderSync'); + + + foreach($this->_collections as $collectionData) { + if (! ($collectionData->folder instanceof Syncroton_Model_IFolder)) { + // Ignore the not found folder. + // Outlook refuses to remove some folders, and keeps requesting them. + // Without this we end up in an endless loop: https://bifrost.kolabsystems.com/T399575 if ($this->_logger instanceof Zend_Log) - $this->_logger->warn(__METHOD__ . '::' . __LINE__ . " Detected a folder hierarchy change on {$collectionData->collectionId}."); + $this->_logger->warn(__METHOD__ . '::' . __LINE__ . " Detected an unknown folder, skipping {$collectionData->collectionId}."); - $sync->appendChild($this->_outputDom->createElementNS('uri:AirSync', 'Status', self::STATUS_FOLDER_HIERARCHY_HAS_CHANGED)); - return $this->_outputDom; + continue; } - } - foreach($this->_collections as $collectionData) { $collectionChanges = 0; /**