From 31664b3edd38c4416945e30eaf14a9ab23492ae0 Mon Sep 17 00:00:00 2001 From: Ferdinand Thiessen Date: Fri, 24 Jan 2025 12:52:33 +0100 Subject: fix: Correctly return app id and app version for `core` styles and images Signed-off-by: Ferdinand Thiessen --- lib/private/App/AppManager.php | 10 +++- lib/private/Server.php | 1 + lib/private/TemplateLayout.php | 15 +++--- tests/lib/App/AppManagerTest.php | 103 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 118 insertions(+), 11 deletions(-) diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php index fe5d3e2faeb..b6f7f9b13b7 100644 --- a/lib/private/App/AppManager.php +++ b/lib/private/App/AppManager.php @@ -27,6 +27,7 @@ use OCP\INavigationManager; use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserSession; +use OCP\ServerVersion; use OCP\Settings\IManager as ISettingsManager; use Psr\Log\LoggerInterface; @@ -80,6 +81,7 @@ class AppManager implements IAppManager { private ICacheFactory $memCacheFactory, private IEventDispatcher $dispatcher, private LoggerInterface $logger, + private ServerVersion $serverVersion, ) { } @@ -786,8 +788,12 @@ class AppManager implements IAppManager { public function getAppVersion(string $appId, bool $useCache = true): string { if (!$useCache || !isset($this->appVersions[$appId])) { - $appInfo = $this->getAppInfo($appId); - $this->appVersions[$appId] = ($appInfo !== null && isset($appInfo['version'])) ? $appInfo['version'] : '0'; + if ($appId === 'core') { + $this->appVersions[$appId] = $this->serverVersion->getVersionString(); + } else { + $appInfo = $this->getAppInfo($appId); + $this->appVersions[$appId] = ($appInfo !== null && isset($appInfo['version'])) ? $appInfo['version'] : '0'; + } } return $this->appVersions[$appId]; } diff --git a/lib/private/Server.php b/lib/private/Server.php index f806c368eaf..be9d7595e42 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -791,6 +791,7 @@ class Server extends ServerContainer implements IServerContainer { $c->get(ICacheFactory::class), $c->get(IEventDispatcher::class), $c->get(LoggerInterface::class), + $c->get(ServerVersion::class), ); }); $this->registerAlias(IAppManager::class, AppManager::class); diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index e4978916ec3..001ef3afca5 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -304,12 +304,7 @@ class TemplateLayout extends \OC_Template { $this->assign('id-app-navigation', $renderAs === TemplateResponse::RENDER_AS_USER ? '#app-navigation' : null); } - /** - * @param string $path - * @param string $file - * @return string - */ - protected function getVersionHashSuffix($path = false, $file = false) { + protected function getVersionHashSuffix(string $path = '', string $file = ''): string { if ($this->config->getSystemValueBool('debug', false)) { // allows chrome workspace mapping in debug mode return ''; @@ -322,11 +317,11 @@ class TemplateLayout extends \OC_Template { $hash = false; // Try the web-root first - if (is_string($path) && $path !== '') { + if ($path !== '') { $hash = $this->getVersionHashByPath($path); } // If not found try the file - if ($hash === false && is_string($file) && $file !== '') { + if ($hash === false && $file !== '') { $hash = $this->getVersionHashByPath($file); } // As a last resort we use the server version hash @@ -376,7 +371,7 @@ class TemplateLayout extends \OC_Template { /** * @param string $path - * @return string|boolean + * @return string|false */ public function getAppNamefromPath($path) { if ($path !== '' && is_string($path)) { @@ -384,6 +379,8 @@ class TemplateLayout extends \OC_Template { if ($pathParts[0] === 'css') { // This is a scss request return $pathParts[1]; + } elseif ($pathParts[0] === 'core') { + return 'core'; } return end($pathParts); } diff --git a/tests/lib/App/AppManagerTest.php b/tests/lib/App/AppManagerTest.php index 8169c25c160..fd7a065d5b3 100644 --- a/tests/lib/App/AppManagerTest.php +++ b/tests/lib/App/AppManagerTest.php @@ -25,6 +25,7 @@ use OCP\IGroupManager; use OCP\IURLGenerator; use OCP\IUser; use OCP\IUserSession; +use OCP\ServerVersion; use PHPUnit\Framework\MockObject\MockObject; use Psr\Log\LoggerInterface; use Test\TestCase; @@ -100,6 +101,8 @@ class AppManagerTest extends TestCase { protected IURLGenerator&MockObject $urlGenerator; + protected ServerVersion&MockObject $serverVersion; + /** @var IAppManager */ protected $manager; @@ -115,6 +118,7 @@ class AppManagerTest extends TestCase { $this->eventDispatcher = $this->createMock(IEventDispatcher::class); $this->logger = $this->createMock(LoggerInterface::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->serverVersion = $this->createMock(ServerVersion::class); $this->overwriteService(AppConfig::class, $this->appConfig); $this->overwriteService(IURLGenerator::class, $this->urlGenerator); @@ -136,6 +140,7 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, + $this->serverVersion, ); } @@ -278,6 +283,7 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, + $this->serverVersion, ]) ->onlyMethods([ 'getAppPath', @@ -331,6 +337,7 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, + $this->serverVersion, ]) ->onlyMethods([ 'getAppPath', @@ -392,6 +399,7 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, + $this->serverVersion, ]) ->onlyMethods([ 'getAppPath', @@ -596,6 +604,7 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, + $this->serverVersion, ]) ->onlyMethods(['getAppInfo']) ->getMock(); @@ -655,6 +664,7 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, + $this->serverVersion, ]) ->onlyMethods(['getAppInfo']) ->getMock(); @@ -785,4 +795,97 @@ class AppManagerTest extends TestCase { $this->assertEquals($expected, $this->manager->isBackendRequired($backend)); } + + public function testGetAppVersion() { + $manager = $this->getMockBuilder(AppManager::class) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + ]) + ->onlyMethods([ + 'getAppInfo', + ]) + ->getMock(); + + $manager->expects(self::once()) + ->method('getAppInfo') + ->with('myapp') + ->willReturn(['version' => '99.99.99-rc.99']); + + $this->serverVersion + ->expects(self::never()) + ->method('getVersionString'); + + $this->assertEquals( + '99.99.99-rc.99', + $manager->getAppVersion('myapp'), + ); + } + + public function testGetAppVersionCore() { + $manager = $this->getMockBuilder(AppManager::class) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + ]) + ->onlyMethods([ + 'getAppInfo', + ]) + ->getMock(); + + $manager->expects(self::never()) + ->method('getAppInfo'); + + $this->serverVersion + ->expects(self::once()) + ->method('getVersionString') + ->willReturn('1.2.3-beta.4'); + + $this->assertEquals( + '1.2.3-beta.4', + $manager->getAppVersion('core'), + ); + } + + public function testGetAppVersionUnknown() { + $manager = $this->getMockBuilder(AppManager::class) + ->setConstructorArgs([ + $this->userSession, + $this->config, + $this->groupManager, + $this->cacheFactory, + $this->eventDispatcher, + $this->logger, + $this->serverVersion, + ]) + ->onlyMethods([ + 'getAppInfo', + ]) + ->getMock(); + + $manager->expects(self::once()) + ->method('getAppInfo') + ->with('unknown') + ->willReturn(null); + + $this->serverVersion + ->expects(self::never()) + ->method('getVersionString'); + + $this->assertEquals( + '0', + $manager->getAppVersion('unknown'), + ); + } + } -- cgit v1.2.3