mirror of
https://github.com/nextcloud/server.git
synced 2026-02-03 20:41:22 -05:00
Local shares should only be scanned when doing it for the owner to avoid repeatedly rescanning the same shared storage over and over again for every recipient.
211 lines
5.6 KiB
PHP
211 lines
5.6 KiB
PHP
<?php
|
|
/**
|
|
* Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
|
|
* This file is licensed under the Affero General Public License version 3 or
|
|
* later.
|
|
* See the COPYING-README file.
|
|
*/
|
|
|
|
namespace Test\Files\Utils;
|
|
|
|
use OC\Files\Filesystem;
|
|
use OC\Files\Mount\MountPoint;
|
|
use OC\Files\Storage\Temporary;
|
|
use OCP\Files\Config\IMountProvider;
|
|
use OCP\Files\Storage\IStorageFactory;
|
|
use OCP\IUser;
|
|
|
|
class TestScanner extends \OC\Files\Utils\Scanner {
|
|
/**
|
|
* @var \OC\Files\Mount\MountPoint[] $mounts
|
|
*/
|
|
private $mounts = array();
|
|
|
|
/**
|
|
* @param \OC\Files\Mount\MountPoint $mount
|
|
*/
|
|
public function addMount($mount) {
|
|
$this->mounts[] = $mount;
|
|
}
|
|
|
|
protected function getMounts($dir) {
|
|
return $this->mounts;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Class ScannerTest
|
|
*
|
|
* @group DB
|
|
*
|
|
* @package Test\Files\Utils
|
|
*/
|
|
class ScannerTest extends \Test\TestCase {
|
|
/**
|
|
* @var \Test\Util\User\Dummy
|
|
*/
|
|
private $userBackend;
|
|
|
|
protected function setUp() {
|
|
parent::setUp();
|
|
|
|
$this->userBackend = new \Test\Util\User\Dummy();
|
|
\OC::$server->getUserManager()->registerBackend($this->userBackend);
|
|
$this->loginAsUser();
|
|
}
|
|
|
|
protected function tearDown() {
|
|
$this->logout();
|
|
\OC::$server->getUserManager()->removeBackend($this->userBackend);
|
|
parent::tearDown();
|
|
}
|
|
|
|
public function testReuseExistingRoot() {
|
|
$storage = new Temporary(array());
|
|
$mount = new MountPoint($storage, '');
|
|
Filesystem::getMountManager()->addMount($mount);
|
|
$cache = $storage->getCache();
|
|
|
|
$storage->mkdir('folder');
|
|
$storage->file_put_contents('foo.txt', 'qwerty');
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
|
|
$scanner->addMount($mount);
|
|
|
|
$scanner->scan('');
|
|
$this->assertTrue($cache->inCache('folder/bar.txt'));
|
|
$oldRoot = $cache->get('');
|
|
|
|
$scanner->scan('');
|
|
$newRoot = $cache->get('');
|
|
$this->assertEquals($oldRoot, $newRoot);
|
|
}
|
|
|
|
public function testReuseExistingFile() {
|
|
$storage = new Temporary(array());
|
|
$mount = new MountPoint($storage, '');
|
|
Filesystem::getMountManager()->addMount($mount);
|
|
$cache = $storage->getCache();
|
|
|
|
$storage->mkdir('folder');
|
|
$storage->file_put_contents('foo.txt', 'qwerty');
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
|
|
$scanner->addMount($mount);
|
|
|
|
$scanner->scan('');
|
|
$this->assertTrue($cache->inCache('folder/bar.txt'));
|
|
$old = $cache->get('folder/bar.txt');
|
|
|
|
$scanner->scan('');
|
|
$new = $cache->get('folder/bar.txt');
|
|
$this->assertEquals($old, $new);
|
|
}
|
|
|
|
public function testScanSubMount() {
|
|
$uid = $this->getUniqueID();
|
|
$this->userBackend->createUser($uid, 'test');
|
|
|
|
$mountProvider = $this->createMock(IMountProvider::class);
|
|
|
|
$storage = new Temporary(array());
|
|
$mount = new MountPoint($storage, '/' . $uid . '/files/foo');
|
|
|
|
$mountProvider->expects($this->any())
|
|
->method('getMountsForUser')
|
|
->will($this->returnCallback(function (IUser $user, IStorageFactory $storageFactory) use ($mount, $uid) {
|
|
if ($user->getUID() === $uid) {
|
|
return [$mount];
|
|
} else {
|
|
return [];
|
|
}
|
|
}));
|
|
|
|
\OC::$server->getMountProviderCollection()->registerProvider($mountProvider);
|
|
$cache = $storage->getCache();
|
|
|
|
$storage->mkdir('folder');
|
|
$storage->file_put_contents('foo.txt', 'qwerty');
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
|
|
$scanner = new \OC\Files\Utils\Scanner($uid, \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
|
|
|
|
$this->assertFalse($cache->inCache('folder/bar.txt'));
|
|
$scanner->scan('/' . $uid . '/files/foo');
|
|
$this->assertTrue($cache->inCache('folder/bar.txt'));
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function invalidPathProvider() {
|
|
return [
|
|
[
|
|
'../',
|
|
],
|
|
[
|
|
'..\\',
|
|
],
|
|
[
|
|
'../..\\../',
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider invalidPathProvider
|
|
* @expectedException \InvalidArgumentException
|
|
* @expectedExceptionMessage Invalid path to scan
|
|
* @param string $invalidPath
|
|
*/
|
|
public function testInvalidPathScanning($invalidPath) {
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
|
|
$scanner->scan($invalidPath);
|
|
}
|
|
|
|
public function testPropagateEtag() {
|
|
$storage = new Temporary(array());
|
|
$mount = new MountPoint($storage, '');
|
|
Filesystem::getMountManager()->addMount($mount);
|
|
$cache = $storage->getCache();
|
|
|
|
$storage->mkdir('folder');
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
$storage->touch('folder/bar.txt', time() - 200);
|
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
|
|
$scanner->addMount($mount);
|
|
|
|
$scanner->scan('');
|
|
$this->assertTrue($cache->inCache('folder/bar.txt'));
|
|
$oldRoot = $cache->get('');
|
|
|
|
$storage->file_put_contents('folder/bar.txt', 'qwerty');
|
|
$scanner->scan('');
|
|
$newRoot = $cache->get('');
|
|
|
|
$this->assertNotEquals($oldRoot->getEtag(), $newRoot->getEtag());
|
|
}
|
|
|
|
public function testSkipLocalShares() {
|
|
$sharedStorage = $this->createMock('OCA\Files_Sharing\SharedStorage');
|
|
$sharedMount = new MountPoint($sharedStorage, '/share');
|
|
Filesystem::getMountManager()->addMount($sharedMount);
|
|
|
|
$sharedStorage->expects($this->any())
|
|
->method('instanceOfStorage')
|
|
->will($this->returnValueMap([
|
|
['OCA\Files_Sharing\ISharedStorage', true],
|
|
]));
|
|
$sharedStorage->expects($this->never())
|
|
->method('getScanner');
|
|
|
|
$scanner = new TestScanner('', \OC::$server->getDatabaseConnection(), \OC::$server->getLogger());
|
|
$scanner->addMount($sharedMount);
|
|
$scanner->scan('');
|
|
|
|
$scanner->backgroundScan('');
|
|
}
|
|
}
|