diff options
author | blizzz <blizzz@arthur-schiwon.de> | 2022-06-13 12:28:19 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-13 12:28:19 +0300 |
commit | 0cf31c277e32f3f8cff71f5eeb7a5485fb40fc23 (patch) | |
tree | b3f8fb8ae828b96f679969d5e9d832c292f02bc5 | |
parent | 8188ad59288193e68b4b02add5f030d57864aac7 (diff) | |
parent | dd27f9b8164f7abe060552aac812edcace38f33d (diff) |
Merge pull request #32848 from nextcloud/backport/32806/stable24
[stable24] Revert "Remove inefficient fed share scanner"
-rw-r--r-- | apps/files_sharing/lib/External/Scanner.php | 70 | ||||
-rw-r--r-- | apps/files_sharing/tests/External/ScannerTest.php | 12 |
2 files changed, 82 insertions, 0 deletions
diff --git a/apps/files_sharing/lib/External/Scanner.php b/apps/files_sharing/lib/External/Scanner.php index 009e206b959..cfde56103da 100644 --- a/apps/files_sharing/lib/External/Scanner.php +++ b/apps/files_sharing/lib/External/Scanner.php @@ -29,11 +29,29 @@ use OC\ForbiddenException; use OCP\Files\NotFoundException; use OCP\Files\StorageInvalidException; use OCP\Files\StorageNotAvailableException; +use OCP\Http\Client\LocalServerException; +use Psr\Log\LoggerInterface; class Scanner extends \OC\Files\Cache\Scanner { /** @var \OCA\Files_Sharing\External\Storage */ protected $storage; + /** {@inheritDoc} */ + public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1, $lock = true) { + try { + if (!$this->storage->remoteIsOwnCloud()) { + return parent::scan($path, $recursive, $reuse, $lock); + } + } catch (LocalServerException $e) { + // Scanner doesn't have dependency injection + \OC::$server->get(LoggerInterface::class) + ->warning('Trying to scan files inside invalid external storage: ' . $this->storage->getRemote() . ' for mountpoint ' . $this->storage->getMountPoint() . ' and id ' . $this->storage->getId()); + return; + } + + $this->scanAll(); + } + /** * Scan a single file and store it in the cache. * If an exception happened while accessing the external storage, @@ -63,4 +81,56 @@ class Scanner extends \OC\Files\Cache\Scanner { $this->storage->checkStorageAvailability(); } } + + /** + * Checks the remote share for changes. + * If changes are available, scan them and update + * the cache. + * @throws NotFoundException + * @throws StorageInvalidException + * @throws \Exception + */ + public function scanAll() { + try { + $data = $this->storage->getShareInfo(); + } catch (\Exception $e) { + $this->storage->checkStorageAvailability(); + throw new \Exception( + 'Error while scanning remote share: "' . + $this->storage->getRemote() . '" ' . + $e->getMessage() + ); + } + if ($data['status'] === 'success') { + $this->addResult($data['data'], ''); + } else { + throw new \Exception( + 'Error while scanning remote share: "' . + $this->storage->getRemote() . '"' + ); + } + } + + /** + * @param array $data + * @param string $path + */ + private function addResult($data, $path) { + $id = $this->cache->put($path, $data); + if (isset($data['children'])) { + $children = []; + foreach ($data['children'] as $child) { + $children[$child['name']] = true; + $this->addResult($child, ltrim($path . '/' . $child['name'], '/')); + } + + $existingCache = $this->cache->getFolderContentsById($id); + foreach ($existingCache as $existingChild) { + // if an existing child is not in the new data, remove it + if (!isset($children[$existingChild['name']])) { + $this->cache->remove(ltrim($path . '/' . $existingChild['name'], '/')); + } + } + } + } } diff --git a/apps/files_sharing/tests/External/ScannerTest.php b/apps/files_sharing/tests/External/ScannerTest.php index 2d2486737dc..57696a697eb 100644 --- a/apps/files_sharing/tests/External/ScannerTest.php +++ b/apps/files_sharing/tests/External/ScannerTest.php @@ -50,6 +50,18 @@ class ScannerTest extends TestCase { $this->scanner = new Scanner($this->storage); } + public function testScanAll() { + $this->storage->expects($this->any()) + ->method('getShareInfo') + ->willReturn(['status' => 'success', 'data' => []]); + + // FIXME add real tests, we are currently only checking for + // Declaration of OCA\Files_Sharing\External\Scanner::*() should be + // compatible with OC\Files\Cache\Scanner::*() + $this->scanner->scanAll(); + $this->addToAssertionCount(1); + } + public function testScan() { $this->storage->expects($this->any()) ->method('getShareInfo') |