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 @@ -545,19 +545,23 @@ } 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)) { + // Report not found folders as such. + // Outlook refuses to remove some folders, and keeps requesting them. + // If we instead reported a folder hierarchy change, 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; + $collection = $collections->appendChild($this->_outputDom->createElementNS('uri:AirSync', 'Collection')); + $collection->appendChild($this->_outputDom->createElementNS('uri:AirSync', 'SyncKey', $collectionData->syncKey)); + $collection->appendChild($this->_outputDom->createElementNS('uri:AirSync', 'CollectionId', $collectionData->collectionId)); + $collection->appendChild($this->_outputDom->createElementNS('uri:AirSync', 'Status', self::STATUS_OBJECT_NOT_FOUND)); + + continue; } - } - foreach($this->_collections as $collectionData) { $collectionChanges = 0; /**