diff options
author | Ferdinand Thiessen <opensource@fthiessen.de> | 2025-06-02 16:14:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-02 16:14:25 +0200 |
commit | bbfd281ac550bbdb8e51722c7fff867dcc350a4e (patch) | |
tree | 02ccd1add2ab024ec36832557b8fc9638e5ff135 | |
parent | d2356d9d76c567a87411c96522d7c0b59b308611 (diff) | |
parent | 7c251e4f9662defbee9540da6675e994460e0d5b (diff) | |
download | nextcloud-server-bbfd281ac550bbdb8e51722c7fff867dcc350a4e.tar.gz nextcloud-server-bbfd281ac550bbdb8e51722c7fff867dcc350a4e.zip |
Merge pull request #52949 from nextcloud/fix/delete-legacy-autoloader
fix: Remove useless legacy autoloader
-rw-r--r-- | lib/autoloader.php | 163 | ||||
-rw-r--r-- | lib/base.php | 34 | ||||
-rw-r--r-- | tests/lib/AutoLoaderTest.php | 51 |
3 files changed, 2 insertions, 246 deletions
diff --git a/lib/autoloader.php b/lib/autoloader.php deleted file mode 100644 index 2a95f5944a3..00000000000 --- a/lib/autoloader.php +++ /dev/null @@ -1,163 +0,0 @@ -<?php - -declare(strict_types=1); -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2013-2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-only - */ -namespace OC; - -use OCP\App\AppPathNotFoundException; -use OCP\App\IAppManager; -use OCP\AutoloadNotAllowedException; -use OCP\ICache; -use Psr\Log\LoggerInterface; - -class Autoloader { - /** @var bool */ - private $useGlobalClassPath = true; - /** @var array */ - private $validRoots = []; - - /** - * Optional low-latency memory cache for class to path mapping. - */ - protected ?ICache $memoryCache = null; - - /** - * Autoloader constructor. - * - * @param string[] $validRoots - */ - public function __construct(array $validRoots) { - foreach ($validRoots as $root) { - $this->validRoots[$root] = true; - } - } - - /** - * Add a path to the list of valid php roots for auto loading - * - * @param string $root - */ - public function addValidRoot(string $root): void { - $root = stream_resolve_include_path($root); - $this->validRoots[$root] = true; - } - - /** - * disable the usage of the global classpath \OC::$CLASSPATH - */ - public function disableGlobalClassPath(): void { - $this->useGlobalClassPath = false; - } - - /** - * enable the usage of the global classpath \OC::$CLASSPATH - */ - public function enableGlobalClassPath(): void { - $this->useGlobalClassPath = true; - } - - /** - * get the possible paths for a class - * - * @param string $class - * @return array an array of possible paths - */ - public function findClass(string $class): array { - $class = trim($class, '\\'); - - $paths = []; - if ($this->useGlobalClassPath && array_key_exists($class, \OC::$CLASSPATH)) { - $paths[] = \OC::$CLASSPATH[$class]; - /** - * @TODO: Remove this when necessary - * Remove "apps/" from inclusion path for smooth migration to multi app dir - */ - if (strpos(\OC::$CLASSPATH[$class], 'apps/') === 0) { - \OCP\Server::get(LoggerInterface::class)->debug('include path for class "' . $class . '" starts with "apps/"', ['app' => 'core']); - $paths[] = str_replace('apps/', '', \OC::$CLASSPATH[$class]); - } - } elseif (strpos($class, 'OC_') === 0) { - $paths[] = \OC::$SERVERROOT . '/lib/private/legacy/' . strtolower(str_replace('_', '/', substr($class, 3)) . '.php'); - } elseif (strpos($class, 'OCA\\') === 0) { - [, $app, $rest] = explode('\\', $class, 3); - $app = strtolower($app); - try { - $appPath = \OCP\Server::get(IAppManager::class)->getAppPath($app); - if (stream_resolve_include_path($appPath)) { - $paths[] = $appPath . '/' . strtolower(str_replace('\\', '/', $rest) . '.php'); - // If not found in the root of the app directory, insert '/lib' after app id and try again. - $paths[] = $appPath . '/lib/' . strtolower(str_replace('\\', '/', $rest) . '.php'); - } - } catch (AppPathNotFoundException) { - // App not found, ignore - } - } - return $paths; - } - - /** - * @param string $fullPath - * @return bool - * @throws AutoloadNotAllowedException - */ - protected function isValidPath(string $fullPath): bool { - foreach ($this->validRoots as $root => $true) { - if (substr($fullPath, 0, strlen($root) + 1) === $root . '/') { - return true; - } - } - throw new AutoloadNotAllowedException($fullPath); - } - - /** - * Load the specified class - * - * @param string $class - * @return bool - * @throws AutoloadNotAllowedException - */ - public function load(string $class): bool { - if (class_exists($class, false)) { - return false; - } - - $pathsToRequire = null; - if ($this->memoryCache) { - $pathsToRequire = $this->memoryCache->get($class); - } - - if (!is_array($pathsToRequire)) { - // No cache or cache miss - $pathsToRequire = []; - foreach ($this->findClass($class) as $path) { - $fullPath = stream_resolve_include_path($path); - if ($fullPath && $this->isValidPath($fullPath)) { - $pathsToRequire[] = $fullPath; - } - } - - if ($this->memoryCache) { - $this->memoryCache->set($class, $pathsToRequire, 60); // cache 60 sec - } - } - - foreach ($pathsToRequire as $fullPath) { - require_once $fullPath; - } - - return false; - } - - /** - * Sets the optional low-latency cache for class to path mapping. - * - * @param ICache $memoryCache Instance of memory cache. - */ - public function setMemoryCache(?ICache $memoryCache = null): void { - $this->memoryCache = $memoryCache; - } -} diff --git a/lib/base.php b/lib/base.php index 75f5cfee3e8..440f84fa369 100644 --- a/lib/base.php +++ b/lib/base.php @@ -40,10 +40,6 @@ require_once 'public/Constants.php'; */ class OC { /** - * Associative array for autoloading. classname => filename - */ - public static array $CLASSPATH = []; - /** * The installation path for Nextcloud on the server (e.g. /srv/http/nextcloud) */ public static string $SERVERROOT = ''; @@ -73,8 +69,6 @@ class OC { */ public static bool $CLI = false; - public static \OC\Autoloader $loader; - public static \Composer\Autoload\ClassLoader $composerAutoloader; public static \OC\Server $server; @@ -597,12 +591,6 @@ class OC { // register autoloader $loaderStart = microtime(true); - require_once __DIR__ . '/autoloader.php'; - self::$loader = new \OC\Autoloader([ - OC::$SERVERROOT . '/lib/private/legacy', - ]); - spl_autoload_register([self::$loader, 'load']); - $loaderEnd = microtime(true); self::$CLI = (php_sapi_name() == 'cli'); @@ -628,6 +616,7 @@ class OC { print($e->getMessage()); exit(); } + $loaderEnd = microtime(true); // setup the basic server self::$server = new \OC\Server(\OC::$WEBROOT, self::$config); @@ -656,9 +645,6 @@ class OC { error_reporting(E_ALL); } - $systemConfig = Server::get(\OC\SystemConfig::class); - self::registerAutoloaderCache($systemConfig); - // initialize intl fallback if necessary OC_Util::isSetLocaleWorking(); @@ -692,6 +678,7 @@ class OC { throw new \OCP\HintException('The PHP SimpleXML/PHP-XML extension is not installed.', 'Install the extension or make sure it is enabled.'); } + $systemConfig = Server::get(\OC\SystemConfig::class); $appManager = Server::get(\OCP\App\IAppManager::class); if ($systemConfig->getValue('installed', false)) { $appManager->loadApps(['session']); @@ -975,23 +962,6 @@ class OC { } } - protected static function registerAutoloaderCache(\OC\SystemConfig $systemConfig): void { - // The class loader takes an optional low-latency cache, which MUST be - // namespaced. The instanceid is used for namespacing, but might be - // unavailable at this point. Furthermore, it might not be possible to - // generate an instanceid via \OC_Util::getInstanceId() because the - // config file may not be writable. As such, we only register a class - // loader cache if instanceid is available without trying to create one. - $instanceId = $systemConfig->getValue('instanceid', null); - if ($instanceId) { - try { - $memcacheFactory = Server::get(\OCP\ICacheFactory::class); - self::$loader->setMemoryCache($memcacheFactory->createLocal('Autoloader')); - } catch (\Exception $ex) { - } - } - } - /** * Handle the request */ diff --git a/tests/lib/AutoLoaderTest.php b/tests/lib/AutoLoaderTest.php deleted file mode 100644 index 9fef8f5280d..00000000000 --- a/tests/lib/AutoLoaderTest.php +++ /dev/null @@ -1,51 +0,0 @@ -<?php -/** - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2016 ownCloud, Inc. - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -namespace Test; - -class AutoLoaderTest extends TestCase { - /** - * @var \OC\Autoloader $loader - */ - private $loader; - - protected function setUp(): void { - parent::setUp(); - $this->loader = new \OC\AutoLoader([]); - } - - public function testLegacyPath(): void { - $this->assertEquals([ - \OC::$SERVERROOT . '/lib/private/legacy/json.php', - ], $this->loader->findClass('OC_JSON')); - } - - public function testLoadCore(): void { - $this->assertEquals([ - \OC::$SERVERROOT . '/lib/private/legacy/foo/bar.php', - ], $this->loader->findClass('OC_Foo_Bar')); - } - - public function testLoadPublicNamespace(): void { - $this->assertEquals([], $this->loader->findClass('OCP\Foo\Bar')); - } - - public function testLoadAppNamespace(): void { - $result = $this->loader->findClass('OCA\Files\Foobar'); - $this->assertEquals(2, count($result)); - $this->assertStringEndsWith('apps/files/foobar.php', $result[0]); - $this->assertStringEndsWith('apps/files/lib/foobar.php', $result[1]); - } - - public function testLoadCoreNamespaceCore(): void { - $this->assertEquals([], $this->loader->findClass('OC\Core\Foo\Bar')); - } - - public function testLoadCoreNamespaceSettings(): void { - $this->assertEquals([], $this->loader->findClass('OC\Settings\Foo\Bar')); - } -} |