]> source.dussan.org Git - nextcloud-server.git/commitdiff
Scope the appdata theming storage for global and users
authorJohn Molakvoæ <skjnldsv@protonmail.com>
Fri, 14 Oct 2022 09:19:00 +0000 (11:19 +0200)
committerVincent Petry <vincent@nextcloud.com>
Fri, 14 Oct 2022 14:18:37 +0000 (16:18 +0200)
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
apps/theming/lib/Controller/UserThemeController.php
apps/theming/lib/ImageManager.php
apps/theming/lib/Listener/BeforeTemplateRenderedListener.php
apps/theming/lib/Service/BackgroundService.php
apps/theming/src/UserThemes.vue
lib/private/Files/SimpleFS/SimpleFolder.php

index 091331706a786e32f434d17d6cfb3fd3a7603331..31acfc1d97c210418a93c1f440421ec091ae81f9 100644 (file)
@@ -157,6 +157,7 @@ class UserThemeController extends OCSController {
         */
        public function setBackground(string $type = 'default', string $value = ''): JSONResponse {
                $currentVersion = (int)$this->config->getUserValue($this->userId, Application::APP_ID, 'backgroundVersion', '0');
+
                try {
                        switch ($type) {
                                case 'shipped':
@@ -179,14 +180,14 @@ class UserThemeController extends OCSController {
                } catch (\Throwable $e) {
                        return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_INTERNAL_SERVER_ERROR);
                }
+
                $currentVersion++;
                $this->config->setUserValue($this->userId, Application::APP_ID, 'backgroundVersion', (string)$currentVersion);
-               // FIXME replace with user-specific cachebuster increase https://github.com/nextcloud/server/issues/34472
-               $this->themingDefaults->increaseCacheBuster();
+
                return new JSONResponse([
                        'type' => $type,
                        'value' => $value,
-                       'version' => $this->config->getUserValue($this->userId, Application::APP_ID, 'backgroundVersion', $currentVersion)
+                       'version' => $currentVersion,
                ]);
        }
 }
index 6f9892af10e38d4eac4cce1b03fd8dd9a91609e0..8a84ed55302ee6ae3eb46111857d1928f68c4596 100644 (file)
@@ -66,14 +66,13 @@ class ImageManager {
                                                                IURLGenerator $urlGenerator,
                                                                ICacheFactory $cacheFactory,
                                                                ILogger $logger,
-                                                               ITempManager $tempManager
-       ) {
+                                                               ITempManager $tempManager) {
                $this->config = $config;
-               $this->appData = $appData;
                $this->urlGenerator = $urlGenerator;
                $this->cacheFactory = $cacheFactory;
                $this->logger = $logger;
                $this->tempManager = $tempManager;
+               $this->appData = $appData;
        }
 
        public function getImageUrl(string $key, bool $useSvg = true): string {
@@ -106,7 +105,7 @@ class ImageManager {
         */
        public function getImage(string $key, bool $useSvg = true): ISimpleFile {
                $logo = $this->config->getAppValue('theming', $key . 'Mime', '');
-               $folder = $this->appData->getFolder('images');
+               $folder = $this->getRootFolder()->getFolder('images');
                if ($logo === '' || !$folder->fileExists($key)) {
                        throw new NotFoundException();
                }
@@ -158,9 +157,9 @@ class ImageManager {
        public function getCacheFolder(): ISimpleFolder {
                $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0');
                try {
-                       $folder = $this->appData->getFolder($cacheBusterValue);
+                       $folder = $this->getRootFolder()->getFolder($cacheBusterValue);
                } catch (NotFoundException $e) {
-                       $folder = $this->appData->newFolder($cacheBusterValue);
+                       $folder = $this->getRootFolder()->newFolder($cacheBusterValue);
                        $this->cleanup();
                }
                return $folder;
@@ -202,13 +201,13 @@ class ImageManager {
        public function delete(string $key): void {
                /* ignore exceptions, since we don't want to fail hard if something goes wrong during cleanup */
                try {
-                       $file = $this->appData->getFolder('images')->getFile($key);
+                       $file = $this->getRootFolder()->getFolder('images')->getFile($key);
                        $file->delete();
                } catch (NotFoundException $e) {
                } catch (NotPermittedException $e) {
                }
                try {
-                       $file = $this->appData->getFolder('images')->getFile($key . '.png');
+                       $file = $this->getRootFolder()->getFolder('images')->getFile($key . '.png');
                        $file->delete();
                } catch (NotFoundException $e) {
                } catch (NotPermittedException $e) {
@@ -219,9 +218,9 @@ class ImageManager {
                $this->delete($key);
 
                try {
-                       $folder = $this->appData->getFolder('images');
+                       $folder = $this->getRootFolder()->getFolder('images');
                } catch (NotFoundException $e) {
-                       $folder = $this->appData->newFolder('images');
+                       $folder = $this->getRootFolder()->newFolder('images');
                }
 
                $target = $folder->newFile($key);
@@ -288,7 +287,7 @@ class ImageManager {
         */
        public function cleanup() {
                $currentFolder = $this->getCacheFolder();
-               $folders = $this->appData->getDirectoryListing();
+               $folders = $this->getRootFolder()->getDirectoryListing();
                foreach ($folders as $folder) {
                        if ($folder->getName() !== 'images' && $folder->getName() !== $currentFolder->getName()) {
                                $folder->delete();
@@ -316,4 +315,12 @@ class ImageManager {
                $cache->set('shouldReplaceIcons', $value);
                return $value;
        }
+
+       private function getRootFolder(): ISimpleFolder {
+               try {
+                       return $this->appData->getFolder('global');
+               } catch (NotFoundException $e) {
+                       return $this->appData->newFolder('global');
+               }
+       }
 }
index 1d28a1d4399a5c1dff55f8a96008fb73dc616518..bbe7963f99eb1613f608e69d17b938d9ecf6e4be 100644 (file)
@@ -91,7 +91,7 @@ class BeforeTemplateRenderedListener implements IEventListener {
 
                        $this->initialState->provideInitialState(
                                'backgroundVersion',
-                               $this->config->getUserValue($userId, Application::APP_ID, 'backgroundVersion', 0),
+                               (int)$this->config->getUserValue($userId, Application::APP_ID, 'backgroundVersion', '0'),
                        );
 
                        $this->initialState->provideInitialState(
index 36623735728ba85afa5c635cff94e802d71b6489..3daac7e7215dc8823629fb1fea6f7dba6e84fa63 100644 (file)
@@ -136,19 +136,19 @@ class BackgroundService {
        private string $userId;
        private IAppDataFactory $appDataFactory;
 
-       public function __construct(
-               IRootFolder     $rootFolder,
-               IAppDataFactory $appDataFactory,
-               IConfig         $config,
-               ?string         $userId
-       ) {
+       public function __construct(IRootFolder $rootFolder,
+                                                               IAppData $appData,
+                                                               IConfig $config,
+                                                               ?string $userId,
+                                                               IAppDataFactory $appDataFactory) {
                if ($userId === null) {
                        return;
                }
+
                $this->rootFolder = $rootFolder;
-               $this->appData = $appDataFactory->get(Application::APP_ID);
                $this->config = $config;
                $this->userId = $userId;
+               $this->appData = $appData;
                $this->appDataFactory = $appDataFactory;
        }
 
@@ -167,12 +167,15 @@ class BackgroundService {
        public function setFileBackground($path): void {
                $this->config->setUserValue($this->userId, Application::APP_ID, 'background', 'custom');
                $userFolder = $this->rootFolder->getUserFolder($this->userId);
+
                /** @var File $file */
                $file = $userFolder->get($path);
                $image = new \OCP\Image();
+
                if ($image->loadFromFileHandle($file->fopen('r')) === false) {
                        throw new InvalidArgumentException('Invalid image file');
                }
+
                $this->getAppDataFolder()->newFile('background.jpg', $file->fopen('r'));
        }
 
@@ -207,14 +210,21 @@ class BackgroundService {
        }
 
        /**
+        * Storing the data in appdata/theming/users/USERID
+        *
         * @return ISimpleFolder
         * @throws NotPermittedException
         */
        private function getAppDataFolder(): ISimpleFolder {
                try {
-                       return $this->appData->getFolder($this->userId);
+                       $rootFolder = $this->appData->getFolder('users');
+               } catch (NotFoundException $e) {
+                       $rootFolder = $this->appData->newFolder('users');
+               }
+               try {
+                       return $rootFolder->getFolder($this->userId);
                } catch (NotFoundException $e) {
-                       return $this->appData->newFolder($this->userId);
+                       return $rootFolder->newFolder($this->userId);
                }
        }
 }
index 1eeeb3c5b21588f692c208376959d01871f32b45..1f14d3bb8f468fce82462edb55961abf8c50fcd7 100644 (file)
@@ -173,6 +173,7 @@ export default {
                        this.updateGlobalStyles()
                        this.$emit('update:background')
                },
+
                updateGlobalStyles() {
                        // Override primary-invert-if-bright and color-primary-text if background is set
                        const isBackgroundBright = shippedBackgroundList[this.background]?.theming === 'dark'
index 263c25a88739f1e0c6186dbee9e24d16f3daf578..1f267119871a1a21bab6165fcd9612c5181d8210 100644 (file)
@@ -91,4 +91,19 @@ class SimpleFolder implements ISimpleFolder {
                        return new SimpleFile($file);
                }
        }
+
+       public function getFolder(string $name): ISimpleFolder {
+               $folder = $this->folder->get($name);
+
+               if (!($folder instanceof Folder)) {
+                       throw new NotFoundException();
+               }
+
+               return new SimpleFolder($folder);
+       }
+
+       public function newFolder(string $path): ISimpleFolder {
+               $folder = $this->folder->newFolder($path);
+               return new SimpleFolder($folder);
+       }
 }