diff options
author | provokateurin <kate@provokateurin.de> | 2025-03-24 11:34:45 +0100 |
---|---|---|
committer | provokateurin <kate@provokateurin.de> | 2025-03-24 15:00:07 +0100 |
commit | f206c606feaa888a935a16e3607cd173177877ac (patch) | |
tree | b17a4308307fbe1ddb0315182085b0a4692ecb47 /apps/settings/lib/Controller/AppSettingsController.php | |
parent | 75b59b91d13d70dba8c2d0460bfd2b849fcbbff1 (diff) | |
download | nextcloud-server-fix/settings/read-only-apps-root.tar.gz nextcloud-server-fix/settings/read-only-apps-root.zip |
fix(settings): Rework download/install/update/remove app handling and respect read-only app rootsfix/settings/read-only-apps-root
Signed-off-by: provokateurin <kate@provokateurin.de>
Diffstat (limited to 'apps/settings/lib/Controller/AppSettingsController.php')
-rw-r--r-- | apps/settings/lib/Controller/AppSettingsController.php | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/apps/settings/lib/Controller/AppSettingsController.php b/apps/settings/lib/Controller/AppSettingsController.php index df563ac46b7..0281ca8b43b 100644 --- a/apps/settings/lib/Controller/AppSettingsController.php +++ b/apps/settings/lib/Controller/AppSettingsController.php @@ -347,7 +347,6 @@ class AppSettingsController extends Controller { } } $appData['groups'] = $groups; - $appData['canUnInstall'] = !$appData['active'] && $appData['removable']; // fix licence vs license if (isset($appData['license']) && !isset($appData['licence'])) { @@ -381,6 +380,14 @@ class AppSettingsController extends Controller { * @throws \Exception */ private function getAppsForCategory($requestedCategory = ''): array { + $anyAppsRootWritable = false; + foreach (\OC::$APPSROOTS as $appsRoot) { + if ($appsRoot['writable'] ?? false) { + $anyAppsRootWritable = true; + break; + } + } + $versionParser = new VersionParser(); $formattedApps = []; $apps = $this->appFetcher->get(); @@ -411,11 +418,23 @@ class AppSettingsController extends Controller { } $phpVersion = $versionParser->getVersion($app['releases'][0]['rawPhpVersionSpec']); + $needsDownload = true; + $canUpdate = false; + $canUnInstall = false; + try { - $this->appManager->getAppPath($app['id']); - $existsLocally = true; + $appPath = $this->appManager->getAppPath($app['id']); + $needsDownload = false; + + $appRootPath = dirname($appPath); + foreach (\OC::$APPSROOTS as $appsRoot) { + if ($appsRoot['path'] === $appRootPath) { + $appsRootWritable = $appsRoot['writable'] ?? false; + $canUpdate = $appsRootWritable; + $canUnInstall = $appsRootWritable; + } + } } catch (AppPathNotFoundException) { - $existsLocally = false; } $phpDependencies = []; @@ -482,9 +501,11 @@ class AppSettingsController extends Controller { 'score' => $app['ratingOverall'], 'ratingNumOverall' => $app['ratingNumOverall'], 'ratingNumThresholdReached' => $app['ratingNumOverall'] > 5, - 'removable' => $existsLocally, - 'active' => $this->appManager->isEnabledForUser($app['id']), - 'needsDownload' => !$existsLocally, + 'canDownload' => $anyAppsRootWritable, + 'canUpdate' => $canUpdate, + 'canUnInstall' => $canUnInstall && !$this->appManager->isShipped($app['id']), + 'active' => $this->appManager->isEnabledForAnyone($app['id']), + 'needsDownload' => $needsDownload, 'groups' => $groups, 'fromAppStore' => true, 'appstoreData' => $app, |