diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index f0839175ede..3fd595a24be 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1184,7 +1184,6 @@ return array( 'OC\\Blurhash\\Listener\\GenerateBlurhashMetadata' => $baseDir . '/lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php', 'OC\\Broadcast\\Events\\BroadcastEvent' => $baseDir . '/lib/private/Broadcast/Events/BroadcastEvent.php', 'OC\\Cache\\CappedMemoryCache' => $baseDir . '/lib/private/Cache/CappedMemoryCache.php', - 'OC\\Cache\\File' => $baseDir . '/lib/private/Cache/File.php', 'OC\\Calendar\\AvailabilityResult' => $baseDir . '/lib/private/Calendar/AvailabilityResult.php', 'OC\\Calendar\\CalendarEventBuilder' => $baseDir . '/lib/private/Calendar/CalendarEventBuilder.php', 'OC\\Calendar\\CalendarQuery' => $baseDir . '/lib/private/Calendar/CalendarQuery.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index c137e5539c5..b827158aba4 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1225,7 +1225,6 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Blurhash\\Listener\\GenerateBlurhashMetadata' => __DIR__ . '/../../..' . '/lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php', 'OC\\Broadcast\\Events\\BroadcastEvent' => __DIR__ . '/../../..' . '/lib/private/Broadcast/Events/BroadcastEvent.php', 'OC\\Cache\\CappedMemoryCache' => __DIR__ . '/../../..' . '/lib/private/Cache/CappedMemoryCache.php', - 'OC\\Cache\\File' => __DIR__ . '/../../..' . '/lib/private/Cache/File.php', 'OC\\Calendar\\AvailabilityResult' => __DIR__ . '/../../..' . '/lib/private/Calendar/AvailabilityResult.php', 'OC\\Calendar\\CalendarEventBuilder' => __DIR__ . '/../../..' . '/lib/private/Calendar/CalendarEventBuilder.php', 'OC\\Calendar\\CalendarQuery' => __DIR__ . '/../../..' . '/lib/private/Calendar/CalendarQuery.php', diff --git a/lib/private/Cache/File.php b/lib/private/Cache/File.php deleted file mode 100644 index ceddf472ebd..00000000000 --- a/lib/private/Cache/File.php +++ /dev/null @@ -1,190 +0,0 @@ -storage !== null) { - return $this->storage; - } - $session = Server::get(IUserSession::class); - if ($session->isLoggedIn()) { - $rootView = new View(); - $userId = $session->getUser()->getUID(); - Filesystem::initMountPoints($userId); - if (!$rootView->file_exists('/' . $userId . '/cache')) { - $rootView->mkdir('/' . $userId . '/cache'); - } - $this->storage = new View('/' . $userId . '/cache'); - return $this->storage; - } else { - Server::get(LoggerInterface::class)->error('Can\'t get cache storage, user not logged in', ['app' => 'core']); - throw new \OC\ForbiddenException('Can\t get cache storage, user not logged in'); - } - } - - /** - * @param string $key - * @return mixed|null - * @throws \OC\ForbiddenException - */ - public function get($key) { - $result = null; - if ($this->hasKey($key)) { - $storage = $this->getStorage(); - $result = $storage->file_get_contents($key); - } - return $result; - } - - /** - * Returns the size of the stored/cached data - * - * @param string $key - * @return int - */ - public function size($key) { - $result = 0; - if ($this->hasKey($key)) { - $storage = $this->getStorage(); - $result = $storage->filesize($key); - } - return $result; - } - - /** - * @param string $key - * @param mixed $value - * @param int $ttl - * @return bool|mixed - * @throws \OC\ForbiddenException - */ - public function set($key, $value, $ttl = 0) { - $storage = $this->getStorage(); - $result = false; - // unique id to avoid chunk collision, just in case - $uniqueId = Server::get(ISecureRandom::class)->generate( - 16, - ISecureRandom::CHAR_ALPHANUMERIC - ); - - // use part file to prevent hasKey() to find the key - // while it is being written - $keyPart = $key . '.' . $uniqueId . '.part'; - if ($storage && $storage->file_put_contents($keyPart, $value)) { - if ($ttl === 0) { - $ttl = 86400; // 60*60*24 - } - $result = $storage->touch($keyPart, time() + $ttl); - $result &= $storage->rename($keyPart, $key); - } - return $result; - } - - /** - * @param string $key - * @return bool - * @throws \OC\ForbiddenException - */ - public function hasKey($key) { - $storage = $this->getStorage(); - if ($storage && $storage->is_file($key) && $storage->isReadable($key)) { - return true; - } - return false; - } - - /** - * @param string $key - * @return bool|mixed - * @throws \OC\ForbiddenException - */ - public function remove($key) { - $storage = $this->getStorage(); - if (!$storage) { - return false; - } - return $storage->unlink($key); - } - - /** - * @param string $prefix - * @return bool - * @throws \OC\ForbiddenException - */ - public function clear($prefix = '') { - $storage = $this->getStorage(); - if ($storage && $storage->is_dir('/')) { - $dh = $storage->opendir('/'); - if (is_resource($dh)) { - while (($file = readdir($dh)) !== false) { - if ($file !== '.' && $file !== '..' && ($prefix === '' || str_starts_with($file, $prefix))) { - $storage->unlink('/' . $file); - } - } - } - } - return true; - } - - /** - * Runs GC - * @throws \OC\ForbiddenException - */ - public function gc() { - $storage = $this->getStorage(); - if ($storage) { - // extra hour safety, in case of stray part chunks that take longer to write, - // because touch() is only called after the chunk was finished - $now = time() - 3600; - $dh = $storage->opendir('/'); - if (!is_resource($dh)) { - return null; - } - while (($file = readdir($dh)) !== false) { - if ($file !== '.' && $file !== '..') { - try { - $mtime = $storage->filemtime('/' . $file); - if ($mtime < $now) { - $storage->unlink('/' . $file); - } - } catch (\OCP\Lock\LockedException $e) { - // ignore locked chunks - Server::get(LoggerInterface::class)->debug('Could not cleanup locked chunk "' . $file . '"', ['app' => 'core']); - } catch (\OCP\Files\ForbiddenException $e) { - Server::get(LoggerInterface::class)->debug('Could not cleanup forbidden chunk "' . $file . '"', ['app' => 'core']); - } catch (\OCP\Files\LockNotAcquiredException $e) { - Server::get(LoggerInterface::class)->debug('Could not cleanup locked chunk "' . $file . '"', ['app' => 'core']); - } - } - } - } - } - - public static function isAvailable(): bool { - return true; - } -} diff --git a/tests/lib/Cache/FileCacheTest.php b/tests/lib/Cache/FileCacheTest.php deleted file mode 100644 index 4daa8d3b7ef..00000000000 --- a/tests/lib/Cache/FileCacheTest.php +++ /dev/null @@ -1,160 +0,0 @@ -skipUnless(OC_User::isLoggedIn()); - } - - protected function setUp(): void { - parent::setUp(); - - //login - $this->createUser('test', 'test'); - - $this->user = \OC_User::getUser(); - \OC_User::setUserId('test'); - - //clear all proxies and hooks so we can do clean testing - \OC_Hook::clear('OC_Filesystem'); - - /** @var IMountManager $manager */ - $manager = Server::get(IMountManager::class); - $manager->removeMount('/test'); - - $storage = new Temporary([]); - Filesystem::mount($storage, [], '/test/cache'); - - //set up the users dir - $this->rootView = new View(''); - $this->rootView->mkdir('/test'); - - $this->instance = new File(); - - // forces creation of cache folder for subsequent tests - $this->instance->set('hack', 'hack'); - } - - protected function tearDown(): void { - if ($this->instance) { - $this->instance->remove('hack', 'hack'); - } - - \OC_User::setUserId($this->user); - - if ($this->instance) { - $this->instance->clear(); - $this->instance = null; - } - - parent::tearDown(); - } - - private function setupMockStorage() { - $mockStorage = $this->getMockBuilder(Local::class) - ->onlyMethods(['filemtime', 'unlink']) - ->setConstructorArgs([['datadir' => Server::get(ITempManager::class)->getTemporaryFolder()]]) - ->getMock(); - - Filesystem::mount($mockStorage, [], '/test/cache'); - - return $mockStorage; - } - - public function testGarbageCollectOldKeys(): void { - $mockStorage = $this->setupMockStorage(); - - $mockStorage->expects($this->atLeastOnce()) - ->method('filemtime') - ->willReturn(100); - $mockStorage->expects($this->once()) - ->method('unlink') - ->with('key1') - ->willReturn(true); - - $this->instance->set('key1', 'value1'); - $this->instance->gc(); - } - - public function testGarbageCollectLeaveRecentKeys(): void { - $mockStorage = $this->setupMockStorage(); - - $mockStorage->expects($this->atLeastOnce()) - ->method('filemtime') - ->willReturn(time() + 3600); - $mockStorage->expects($this->never()) - ->method('unlink') - ->with('key1'); - $this->instance->set('key1', 'value1'); - $this->instance->gc(); - } - - public static function lockExceptionProvider(): array { - return [ - [new LockedException('key1')], - [new LockNotAcquiredException('key1', 1)], - ]; - } - - #[\PHPUnit\Framework\Attributes\DataProvider('lockExceptionProvider')] - public function testGarbageCollectIgnoreLockedKeys($testException): void { - $mockStorage = $this->setupMockStorage(); - - $mockStorage->expects($this->atLeastOnce()) - ->method('filemtime') - ->willReturn(100); - $mockStorage->expects($this->atLeastOnce()) - ->method('unlink')->willReturnOnConsecutiveCalls($this->throwException($testException), $this->returnValue(true)); - - $this->instance->set('key1', 'value1'); - $this->instance->set('key2', 'value2'); - - $this->instance->gc(); - } -}