Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>tags/v26.0.0beta1
@@ -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, | |||
]); | |||
} | |||
} |
@@ -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'); | |||
} | |||
} | |||
} |
@@ -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( |
@@ -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); | |||
} | |||
} | |||
} |
@@ -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' |
@@ -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); | |||
} | |||
} |