mirror of
https://github.com/nextcloud/server.git
synced 2026-06-08 16:26:59 -04:00
Merge pull request #56132 from nextcloud/backport/56039/stable32
[stable32] fix(theming): use IAppConfig for all ThemingDefaults
This commit is contained in:
commit
65b625c0bb
7 changed files with 436 additions and 313 deletions
|
|
@ -10,6 +10,7 @@ return array(
|
|||
'OCA\\Theming\\AppInfo\\Application' => $baseDir . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\Theming\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
|
||||
'OCA\\Theming\\Command\\UpdateConfig' => $baseDir . '/../lib/Command/UpdateConfig.php',
|
||||
'OCA\\Theming\\ConfigLexicon' => $baseDir . '/../lib/ConfigLexicon.php',
|
||||
'OCA\\Theming\\Controller\\IconController' => $baseDir . '/../lib/Controller/IconController.php',
|
||||
'OCA\\Theming\\Controller\\ThemingController' => $baseDir . '/../lib/Controller/ThemingController.php',
|
||||
'OCA\\Theming\\Controller\\UserThemeController' => $baseDir . '/../lib/Controller/UserThemeController.php',
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ class ComposerStaticInitTheming
|
|||
'OCA\\Theming\\AppInfo\\Application' => __DIR__ . '/..' . '/../lib/AppInfo/Application.php',
|
||||
'OCA\\Theming\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
|
||||
'OCA\\Theming\\Command\\UpdateConfig' => __DIR__ . '/..' . '/../lib/Command/UpdateConfig.php',
|
||||
'OCA\\Theming\\ConfigLexicon' => __DIR__ . '/..' . '/../lib/ConfigLexicon.php',
|
||||
'OCA\\Theming\\Controller\\IconController' => __DIR__ . '/..' . '/../lib/Controller/IconController.php',
|
||||
'OCA\\Theming\\Controller\\ThemingController' => __DIR__ . '/..' . '/../lib/Controller/ThemingController.php',
|
||||
'OCA\\Theming\\Controller\\UserThemeController' => __DIR__ . '/..' . '/../lib/Controller/UserThemeController.php',
|
||||
|
|
|
|||
116
apps/theming/lib/ConfigLexicon.php
Normal file
116
apps/theming/lib/ConfigLexicon.php
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
*/
|
||||
|
||||
namespace OCA\Theming;
|
||||
|
||||
use OCP\Config\Lexicon\Entry;
|
||||
use OCP\Config\Lexicon\ILexicon;
|
||||
use OCP\Config\Lexicon\Strictness;
|
||||
use OCP\Config\ValueType;
|
||||
|
||||
/**
|
||||
* Config Lexicon for theming.
|
||||
*
|
||||
* Please Add & Manage your Config Keys in that file and keep the Lexicon up to date!
|
||||
*
|
||||
* {@see ILexicon}
|
||||
*/
|
||||
class ConfigLexicon implements ILexicon {
|
||||
/** The cache buster index */
|
||||
public const CACHE_BUSTER = 'cachebuster';
|
||||
public const USER_THEMING_DISABLED = 'disable-user-theming';
|
||||
|
||||
/** Name of the software running on this instance (usually "Nextcloud") */
|
||||
public const PRODUCT_NAME = 'productName';
|
||||
/** Short name of this instance */
|
||||
public const INSTANCE_NAME = 'name';
|
||||
/** Slogan of this instance */
|
||||
public const INSTANCE_SLOGAN = 'slogan';
|
||||
/** Imprint URL of this instance */
|
||||
public const INSTANCE_IMPRINT_URL = 'imprintUrl';
|
||||
/** Privacy URL of this instance */
|
||||
public const INSTANCE_PRIVACY_URL = 'privacyUrl';
|
||||
|
||||
// legacy theming
|
||||
/** Base URL of this instance */
|
||||
public const BASE_URL = 'url';
|
||||
/** Base URL for documentation */
|
||||
public const DOC_BASE_URL = 'docBaseUrl';
|
||||
|
||||
public function getStrictness(): Strictness {
|
||||
return Strictness::NOTICE;
|
||||
}
|
||||
|
||||
public function getAppConfigs(): array {
|
||||
return [
|
||||
// internals
|
||||
new Entry(
|
||||
self::CACHE_BUSTER,
|
||||
ValueType::INT,
|
||||
defaultRaw: 0,
|
||||
definition: 'The current cache buster key for theming assets.',
|
||||
),
|
||||
new Entry(
|
||||
self::USER_THEMING_DISABLED,
|
||||
ValueType::BOOL,
|
||||
defaultRaw: false,
|
||||
definition: 'Whether user theming is disabled.',
|
||||
),
|
||||
|
||||
// instance theming
|
||||
new Entry(
|
||||
self::PRODUCT_NAME,
|
||||
ValueType::STRING,
|
||||
defaultRaw: 'Nextcloud',
|
||||
definition: 'The name of the software running on this instance (usually "Nextcloud").',
|
||||
),
|
||||
new Entry(
|
||||
self::INSTANCE_NAME,
|
||||
ValueType::STRING,
|
||||
defaultRaw: '',
|
||||
definition: 'Short name of this instance.',
|
||||
),
|
||||
new Entry(
|
||||
self::INSTANCE_SLOGAN,
|
||||
ValueType::STRING,
|
||||
defaultRaw: '',
|
||||
definition: 'Slogan of this instance.',
|
||||
),
|
||||
new Entry(
|
||||
self::INSTANCE_IMPRINT_URL,
|
||||
ValueType::STRING,
|
||||
defaultRaw: '',
|
||||
definition: 'Imprint URL of this instance.',
|
||||
),
|
||||
new Entry(
|
||||
self::INSTANCE_PRIVACY_URL,
|
||||
ValueType::STRING,
|
||||
defaultRaw: '',
|
||||
definition: 'Privacy URL of this instance.',
|
||||
),
|
||||
|
||||
// legacy theming
|
||||
new Entry(
|
||||
self::BASE_URL,
|
||||
ValueType::STRING,
|
||||
defaultRaw: '',
|
||||
definition: 'Base URL of this instance.',
|
||||
),
|
||||
new Entry(
|
||||
self::DOC_BASE_URL,
|
||||
ValueType::STRING,
|
||||
defaultRaw: '',
|
||||
definition: 'Base URL for documentation.',
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
public function getUserConfigs(): array {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
|
@ -10,9 +10,9 @@ use OCA\Theming\AppInfo\Application;
|
|||
use OCA\Theming\Service\BackgroundService;
|
||||
use OCP\App\AppPathNotFoundException;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\AppFramework\Services\IAppConfig;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\Files\SimpleFS\ISimpleFile;
|
||||
use OCP\IAppConfig;
|
||||
use OCP\ICacheFactory;
|
||||
use OCP\IConfig;
|
||||
use OCP\IL10N;
|
||||
|
|
@ -69,27 +69,27 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
}
|
||||
|
||||
public function getName() {
|
||||
return strip_tags($this->config->getAppValue('theming', 'name', $this->name));
|
||||
return strip_tags($this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_NAME, $this->name));
|
||||
}
|
||||
|
||||
public function getHTMLName() {
|
||||
return $this->config->getAppValue('theming', 'name', $this->name);
|
||||
return $this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_NAME, $this->name);
|
||||
}
|
||||
|
||||
public function getTitle() {
|
||||
return strip_tags($this->config->getAppValue('theming', 'name', $this->title));
|
||||
return strip_tags($this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_NAME, $this->title));
|
||||
}
|
||||
|
||||
public function getEntity() {
|
||||
return strip_tags($this->config->getAppValue('theming', 'name', $this->entity));
|
||||
return strip_tags($this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_NAME, $this->entity));
|
||||
}
|
||||
|
||||
public function getProductName() {
|
||||
return strip_tags($this->config->getAppValue('theming', 'productName', $this->productName));
|
||||
return strip_tags($this->appConfig->getAppValueString(ConfigLexicon::PRODUCT_NAME, $this->productName));
|
||||
}
|
||||
|
||||
public function getBaseUrl() {
|
||||
return $this->config->getAppValue('theming', 'url', $this->url);
|
||||
return $this->appConfig->getAppValueString(ConfigLexicon::BASE_URL, $this->url);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -97,20 +97,20 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* @psalm-suppress InvalidReturnStatement
|
||||
* @psalm-suppress InvalidReturnType
|
||||
*/
|
||||
public function getSlogan(?string $lang = null) {
|
||||
return \OCP\Util::sanitizeHTML($this->config->getAppValue('theming', 'slogan', parent::getSlogan($lang)));
|
||||
public function getSlogan(?string $lang = null): string {
|
||||
return \OCP\Util::sanitizeHTML($this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_SLOGAN, parent::getSlogan($lang)));
|
||||
}
|
||||
|
||||
public function getImprintUrl() {
|
||||
return (string)$this->config->getAppValue('theming', 'imprintUrl', '');
|
||||
public function getImprintUrl(): string {
|
||||
return $this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_IMPRINT_URL, '');
|
||||
}
|
||||
|
||||
public function getPrivacyUrl() {
|
||||
return (string)$this->config->getAppValue('theming', 'privacyUrl', '');
|
||||
public function getPrivacyUrl(): string {
|
||||
return $this->appConfig->getAppValueString(ConfigLexicon::INSTANCE_PRIVACY_URL, '');
|
||||
}
|
||||
|
||||
public function getDocBaseUrl() {
|
||||
return (string)$this->config->getAppValue('theming', 'docBaseUrl', $this->docBaseUrl);
|
||||
public function getDocBaseUrl(): string {
|
||||
return $this->appConfig->getAppValueString(ConfigLexicon::DOC_BASE_URL, $this->docBaseUrl);
|
||||
}
|
||||
|
||||
public function getShortFooter() {
|
||||
|
|
@ -132,11 +132,11 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
$links = [
|
||||
[
|
||||
'text' => $this->l->t('Legal notice'),
|
||||
'url' => (string)$this->getImprintUrl()
|
||||
'url' => $this->getImprintUrl()
|
||||
],
|
||||
[
|
||||
'text' => $this->l->t('Privacy policy'),
|
||||
'url' => (string)$this->getPrivacyUrl()
|
||||
'url' => $this->getPrivacyUrl()
|
||||
],
|
||||
];
|
||||
|
||||
|
|
@ -224,7 +224,7 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
*/
|
||||
public function getDefaultColorPrimary(): string {
|
||||
// try admin color
|
||||
$defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'primary_color', '');
|
||||
$defaultColor = $this->appConfig->getAppValueString('primary_color', '');
|
||||
if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) {
|
||||
return $defaultColor;
|
||||
}
|
||||
|
|
@ -237,7 +237,7 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* Default background color only taking admin setting into account
|
||||
*/
|
||||
public function getDefaultColorBackground(): string {
|
||||
$defaultColor = $this->appConfig->getValueString(Application::APP_ID, 'background_color');
|
||||
$defaultColor = $this->appConfig->getAppValueString('background_color');
|
||||
if (preg_match('/^\#([0-9a-f]{3}|[0-9a-f]{6})$/i', $defaultColor)) {
|
||||
return $defaultColor;
|
||||
}
|
||||
|
|
@ -252,14 +252,14 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* @return string
|
||||
*/
|
||||
public function getLogo($useSvg = true): string {
|
||||
$logo = $this->config->getAppValue('theming', 'logoMime', '');
|
||||
$logo = $this->appConfig->getAppValueString('logoMime', '');
|
||||
|
||||
// short cut to avoid setting up the filesystem just to check if the logo is there
|
||||
//
|
||||
// explanation: if an SVG is requested and the app config value for logoMime is set then the logo is there.
|
||||
// otherwise we need to check it and maybe also generate a PNG from the SVG (that's done in getImage() which
|
||||
// needs to be called then)
|
||||
if ($useSvg === true && $logo !== false) {
|
||||
if ($useSvg === true && $logo !== '') {
|
||||
$logoExists = true;
|
||||
} else {
|
||||
try {
|
||||
|
|
@ -270,8 +270,7 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
}
|
||||
}
|
||||
|
||||
$cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0');
|
||||
|
||||
$cacheBusterCounter = (string)$this->appConfig->getAppValueInt(ConfigLexicon::CACHE_BUSTER);
|
||||
if (!$logo || !$logoExists) {
|
||||
if ($useSvg) {
|
||||
$logo = $this->urlGenerator->imagePath('core', 'logo/logo.svg');
|
||||
|
|
@ -298,28 +297,28 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* @return string
|
||||
*/
|
||||
public function getiTunesAppId() {
|
||||
return $this->config->getAppValue('theming', 'iTunesAppId', $this->iTunesAppId);
|
||||
return $this->appConfig->getAppValueString('iTunesAppId', $this->iTunesAppId);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getiOSClientUrl() {
|
||||
return $this->config->getAppValue('theming', 'iOSClientUrl', $this->iOSClientUrl);
|
||||
return $this->appConfig->getAppValueString('iOSClientUrl', $this->iOSClientUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAndroidClientUrl() {
|
||||
return $this->config->getAppValue('theming', 'AndroidClientUrl', $this->AndroidClientUrl);
|
||||
return $this->appConfig->getAppValueString('AndroidClientUrl', $this->AndroidClientUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getFDroidClientUrl() {
|
||||
return $this->config->getAppValue('theming', 'FDroidClientUrl', $this->FDroidClientUrl);
|
||||
return $this->appConfig->getAppValueString('FDroidClientUrl', $this->FDroidClientUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -327,18 +326,18 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* @deprecated since Nextcloud 22 - https://github.com/nextcloud/server/issues/9940
|
||||
*/
|
||||
public function getScssVariables() {
|
||||
$cacheBuster = $this->config->getAppValue('theming', 'cachebuster', '0');
|
||||
$cache = $this->cacheFactory->createDistributed('theming-' . $cacheBuster . '-' . $this->urlGenerator->getBaseUrl());
|
||||
$cacheBuster = $this->appConfig->getAppValueInt(ConfigLexicon::CACHE_BUSTER);
|
||||
$cache = $this->cacheFactory->createDistributed('theming-' . (string)$cacheBuster . '-' . $this->urlGenerator->getBaseUrl());
|
||||
if ($value = $cache->get('getScssVariables')) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
$variables = [
|
||||
'theming-cachebuster' => "'" . $cacheBuster . "'",
|
||||
'theming-logo-mime' => "'" . $this->config->getAppValue('theming', 'logoMime') . "'",
|
||||
'theming-background-mime' => "'" . $this->config->getAppValue('theming', 'backgroundMime') . "'",
|
||||
'theming-logoheader-mime' => "'" . $this->config->getAppValue('theming', 'logoheaderMime') . "'",
|
||||
'theming-favicon-mime' => "'" . $this->config->getAppValue('theming', 'faviconMime') . "'"
|
||||
'theming-logo-mime' => "'" . $this->appConfig->getAppValueString('logoMime') . "'",
|
||||
'theming-background-mime' => "'" . $this->appConfig->getAppValueString('backgroundMime') . "'",
|
||||
'theming-logoheader-mime' => "'" . $this->appConfig->getAppValueString('logoheaderMime') . "'",
|
||||
'theming-favicon-mime' => "'" . $this->appConfig->getAppValueString('faviconMime') . "'"
|
||||
];
|
||||
|
||||
$variables['image-logo'] = "url('" . $this->imageManager->getImageUrl('logo') . "')";
|
||||
|
|
@ -347,13 +346,13 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
$variables['image-login-background'] = "url('" . $this->imageManager->getImageUrl('background') . "')";
|
||||
$variables['image-login-plain'] = 'false';
|
||||
|
||||
if ($this->appConfig->getValueString(Application::APP_ID, 'primary_color', '') !== '') {
|
||||
if ($this->appConfig->getAppValueString('primary_color', '') !== '') {
|
||||
$variables['color-primary'] = $this->getColorPrimary();
|
||||
$variables['color-primary-text'] = $this->getTextColorPrimary();
|
||||
$variables['color-primary-element'] = $this->util->elementColor($this->getColorPrimary());
|
||||
}
|
||||
|
||||
if ($this->config->getAppValue('theming', 'backgroundMime', '') === 'backgroundColor') {
|
||||
if ($this->appConfig->getAppValueString('backgroundMime', '') === 'backgroundColor') {
|
||||
$variables['image-login-plain'] = 'true';
|
||||
}
|
||||
|
||||
|
|
@ -378,7 +377,6 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
if ($app === '' || $app === 'files_sharing') {
|
||||
$app = 'core';
|
||||
}
|
||||
$cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0');
|
||||
|
||||
$route = false;
|
||||
if ($image === 'favicon.ico' && ($this->imageManager->shouldReplaceIcons() || $this->getCustomFavicon() !== null)) {
|
||||
|
|
@ -420,8 +418,8 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* Increases the cache buster key
|
||||
*/
|
||||
public function increaseCacheBuster(): void {
|
||||
$cacheBusterKey = (int)$this->config->getAppValue('theming', 'cachebuster', '0');
|
||||
$this->config->setAppValue('theming', 'cachebuster', (string)($cacheBusterKey + 1));
|
||||
$cacheBusterKey = $this->appConfig->getAppValueInt(ConfigLexicon::CACHE_BUSTER);
|
||||
$this->appConfig->setAppValueInt(ConfigLexicon::CACHE_BUSTER, $cacheBusterKey + 1);
|
||||
$this->cacheFactory->createDistributed('theming-')->clear();
|
||||
$this->cacheFactory->createDistributed('imagePath')->clear();
|
||||
}
|
||||
|
|
@ -433,7 +431,18 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* @param string $value
|
||||
*/
|
||||
public function set($setting, $value): void {
|
||||
$this->appConfig->setValueString('theming', $setting, $value);
|
||||
switch ($value) {
|
||||
case ConfigLexicon::CACHE_BUSTER:
|
||||
$this->appConfig->setAppValueInt(ConfigLexicon::CACHE_BUSTER, (int)$value);
|
||||
break;
|
||||
case ConfigLexicon::USER_THEMING_DISABLED:
|
||||
$value = $value === 'true' || $value === 'yes' || $value === '1';
|
||||
$this->appConfig->setAppValueBool(ConfigLexicon::USER_THEMING_DISABLED, $value);
|
||||
break;
|
||||
default:
|
||||
$this->appConfig->setAppValueString($setting, $value);
|
||||
break;
|
||||
}
|
||||
$this->increaseCacheBuster();
|
||||
}
|
||||
|
||||
|
|
@ -443,9 +452,9 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
public function undoAll(): void {
|
||||
// Remember the current cachebuster value, as we do not want to reset this value
|
||||
// Otherwise this can lead to caching issues as the value might be known to a browser already
|
||||
$cacheBusterKey = $this->config->getAppValue('theming', 'cachebuster', '0');
|
||||
$this->config->deleteAppValues('theming');
|
||||
$this->config->setAppValue('theming', 'cachebuster', $cacheBusterKey);
|
||||
$cacheBusterKey = $this->appConfig->getAppValueInt(ConfigLexicon::CACHE_BUSTER);
|
||||
$this->appConfig->deleteAppValues();
|
||||
$this->appConfig->setAppValueInt(ConfigLexicon::CACHE_BUSTER, $cacheBusterKey);
|
||||
$this->increaseCacheBuster();
|
||||
}
|
||||
|
||||
|
|
@ -456,7 +465,7 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* @return string default value
|
||||
*/
|
||||
public function undo($setting): string {
|
||||
$this->config->deleteAppValue('theming', $setting);
|
||||
$this->appConfig->deleteAppValue($setting);
|
||||
$this->increaseCacheBuster();
|
||||
|
||||
$returnValue = '';
|
||||
|
|
@ -485,7 +494,7 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
case 'background':
|
||||
case 'favicon':
|
||||
$this->imageManager->delete($setting);
|
||||
$this->config->deleteAppValue('theming', $setting . 'Mime');
|
||||
$this->appConfig->deleteAppValue($setting . 'Mime');
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -523,6 +532,6 @@ class ThemingDefaults extends \OC_Defaults {
|
|||
* Has the admin disabled user customization
|
||||
*/
|
||||
public function isUserThemingDisabled(): bool {
|
||||
return $this->appConfig->getValueBool(Application::APP_ID, 'disable-user-theming');
|
||||
return $this->appConfig->getAppValueBool(ConfigLexicon::USER_THEMING_DISABLED, false);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,8 +12,8 @@ use OCA\Theming\Service\BackgroundService;
|
|||
use OCA\Theming\ThemingDefaults;
|
||||
use OCA\Theming\Util;
|
||||
use OCP\App\IAppManager;
|
||||
use OCP\AppFramework\Services\IAppConfig;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\IAppConfig;
|
||||
use OCP\ICache;
|
||||
use OCP\ICacheFactory;
|
||||
use OCP\IConfig;
|
||||
|
|
@ -28,8 +28,7 @@ use Test\TestCase;
|
|||
class ThemingDefaultsTest extends TestCase {
|
||||
private IAppConfig&MockObject $appConfig;
|
||||
private IConfig&MockObject $config;
|
||||
private \OC_Defaults $defaults;
|
||||
private IL10N|MockObject $l10n;
|
||||
private IL10N&MockObject $l10n;
|
||||
private IUserSession&MockObject $userSession;
|
||||
private IURLGenerator&MockObject $urlGenerator;
|
||||
private ICacheFactory&MockObject $cacheFactory;
|
||||
|
|
@ -39,6 +38,8 @@ class ThemingDefaultsTest extends TestCase {
|
|||
private ImageManager&MockObject $imageManager;
|
||||
private INavigationManager&MockObject $navigationManager;
|
||||
private BackgroundService&MockObject $backgroundService;
|
||||
|
||||
private \OC_Defaults $defaults;
|
||||
private ThemingDefaults $template;
|
||||
|
||||
protected function setUp(): void {
|
||||
|
|
@ -76,60 +77,60 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testGetNameWithDefault(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('Nextcloud');
|
||||
|
||||
$this->assertEquals('Nextcloud', $this->template->getName());
|
||||
}
|
||||
|
||||
public function testGetNameWithCustom(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('MyCustomCloud');
|
||||
|
||||
$this->assertEquals('MyCustomCloud', $this->template->getName());
|
||||
}
|
||||
|
||||
public function testGetHTMLNameWithDefault(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('Nextcloud');
|
||||
|
||||
$this->assertEquals('Nextcloud', $this->template->getHTMLName());
|
||||
}
|
||||
|
||||
public function testGetHTMLNameWithCustom(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('MyCustomCloud');
|
||||
|
||||
$this->assertEquals('MyCustomCloud', $this->template->getHTMLName());
|
||||
}
|
||||
|
||||
public function testGetTitleWithDefault(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('Nextcloud');
|
||||
|
||||
$this->assertEquals('Nextcloud', $this->template->getTitle());
|
||||
}
|
||||
|
||||
public function testGetTitleWithCustom(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('MyCustomCloud');
|
||||
|
||||
$this->assertEquals('MyCustomCloud', $this->template->getTitle());
|
||||
|
|
@ -137,40 +138,40 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
|
||||
public function testGetEntityWithDefault(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('Nextcloud');
|
||||
|
||||
$this->assertEquals('Nextcloud', $this->template->getEntity());
|
||||
}
|
||||
|
||||
public function testGetEntityWithCustom(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'name', 'Nextcloud')
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('MyCustomCloud');
|
||||
|
||||
$this->assertEquals('MyCustomCloud', $this->template->getEntity());
|
||||
}
|
||||
|
||||
public function testGetBaseUrlWithDefault(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'url', $this->defaults->getBaseUrl())
|
||||
->method('getAppValueString')
|
||||
->with('url', $this->defaults->getBaseUrl())
|
||||
->willReturn($this->defaults->getBaseUrl());
|
||||
|
||||
$this->assertEquals($this->defaults->getBaseUrl(), $this->template->getBaseUrl());
|
||||
}
|
||||
|
||||
public function testGetBaseUrlWithCustom(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'url', $this->defaults->getBaseUrl())
|
||||
->method('getAppValueString')
|
||||
->with('url', $this->defaults->getBaseUrl())
|
||||
->willReturn('https://example.com/');
|
||||
|
||||
$this->assertEquals('https://example.com/', $this->template->getBaseUrl());
|
||||
|
|
@ -185,10 +186,10 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('legalUrlProvider')]
|
||||
public function testGetImprintURL(string $imprintUrl): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'imprintUrl', '')
|
||||
->method('getAppValueString')
|
||||
->with('imprintUrl', '')
|
||||
->willReturn($imprintUrl);
|
||||
|
||||
$this->assertEquals($imprintUrl, $this->template->getImprintUrl());
|
||||
|
|
@ -196,45 +197,45 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
#[\PHPUnit\Framework\Attributes\DataProvider('legalUrlProvider')]
|
||||
public function testGetPrivacyURL(string $privacyUrl): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'privacyUrl', '')
|
||||
->method('getAppValueString')
|
||||
->with('privacyUrl', '')
|
||||
->willReturn($privacyUrl);
|
||||
|
||||
$this->assertEquals($privacyUrl, $this->template->getPrivacyUrl());
|
||||
}
|
||||
|
||||
public function testGetSloganWithDefault(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'slogan', $this->defaults->getSlogan())
|
||||
->method('getAppValueString')
|
||||
->with('slogan', $this->defaults->getSlogan())
|
||||
->willReturn($this->defaults->getSlogan());
|
||||
|
||||
$this->assertEquals($this->defaults->getSlogan(), $this->template->getSlogan());
|
||||
}
|
||||
|
||||
public function testGetSloganWithCustom(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'slogan', $this->defaults->getSlogan())
|
||||
->method('getAppValueString')
|
||||
->with('slogan', $this->defaults->getSlogan())
|
||||
->willReturn('My custom Slogan');
|
||||
|
||||
$this->assertEquals('My custom Slogan', $this->template->getSlogan());
|
||||
}
|
||||
|
||||
public function testGetShortFooter(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', ''],
|
||||
['theming', 'privacyUrl', '', ''],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', ''],
|
||||
['privacyUrl', '', ''],
|
||||
]);
|
||||
|
||||
$this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter());
|
||||
|
|
@ -242,15 +243,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
public function testGetShortFooterEmptyUrl(): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), ''],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', ''],
|
||||
['theming', 'privacyUrl', '', ''],
|
||||
['url', $this->defaults->getBaseUrl(), ''],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', ''],
|
||||
['privacyUrl', '', ''],
|
||||
]);
|
||||
|
||||
$this->assertEquals('<span class="entity-name">Name</span> – Slogan', $this->template->getShortFooter());
|
||||
|
|
@ -258,15 +259,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
public function testGetShortFooterEmptySlogan(): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), ''],
|
||||
['theming', 'imprintUrl', '', ''],
|
||||
['theming', 'privacyUrl', '', ''],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), ''],
|
||||
['imprintUrl', '', ''],
|
||||
['privacyUrl', '', ''],
|
||||
]);
|
||||
|
||||
$this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a>', $this->template->getShortFooter());
|
||||
|
|
@ -274,15 +275,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
public function testGetShortFooterImprint(): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', 'https://example.com/imprint'],
|
||||
['theming', 'privacyUrl', '', ''],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', 'https://example.com/imprint'],
|
||||
['privacyUrl', '', ''],
|
||||
]);
|
||||
|
||||
$this->l10n
|
||||
|
|
@ -295,15 +296,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
public function testGetShortFooterPrivacy(): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', ''],
|
||||
['theming', 'privacyUrl', '', 'https://example.com/privacy'],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', ''],
|
||||
['privacyUrl', '', 'https://example.com/privacy'],
|
||||
]);
|
||||
|
||||
$this->l10n
|
||||
|
|
@ -316,15 +317,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
|
||||
public function testGetShortFooterAllLegalLinks(): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', 'https://example.com/imprint'],
|
||||
['theming', 'privacyUrl', '', 'https://example.com/privacy'],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', 'https://example.com/imprint'],
|
||||
['privacyUrl', '', 'https://example.com/privacy'],
|
||||
]);
|
||||
|
||||
$this->l10n
|
||||
|
|
@ -345,15 +346,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
#[\PHPUnit\Framework\Attributes\DataProvider('invalidLegalUrlProvider')]
|
||||
public function testGetShortFooterInvalidImprint(string $invalidImprintUrl): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', $invalidImprintUrl],
|
||||
['theming', 'privacyUrl', '', ''],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', $invalidImprintUrl],
|
||||
['privacyUrl', '', ''],
|
||||
]);
|
||||
|
||||
$this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter());
|
||||
|
|
@ -362,15 +363,15 @@ class ThemingDefaultsTest extends TestCase {
|
|||
#[\PHPUnit\Framework\Attributes\DataProvider('invalidLegalUrlProvider')]
|
||||
public function testGetShortFooterInvalidPrivacy(string $invalidPrivacyUrl): void {
|
||||
$this->navigationManager->expects($this->once())->method('getAll')->with(INavigationManager::TYPE_GUEST)->willReturn([]);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->exactly(5))
|
||||
->method('getAppValue')
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['theming', 'name', 'Nextcloud', 'Name'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['theming', 'imprintUrl', '', ''],
|
||||
['theming', 'privacyUrl', '', $invalidPrivacyUrl],
|
||||
['url', $this->defaults->getBaseUrl(), 'url'],
|
||||
['name', 'Nextcloud', 'Name'],
|
||||
['slogan', $this->defaults->getSlogan(), 'Slogan'],
|
||||
['imprintUrl', '', ''],
|
||||
['privacyUrl', '', $invalidPrivacyUrl],
|
||||
]);
|
||||
|
||||
$this->assertEquals('<a href="url" target="_blank" rel="noreferrer noopener" class="entity-name">Name</a> – Slogan', $this->template->getShortFooter());
|
||||
|
|
@ -379,13 +380,13 @@ class ThemingDefaultsTest extends TestCase {
|
|||
public function testGetColorPrimaryWithDefault(): void {
|
||||
$this->appConfig
|
||||
->expects(self::once())
|
||||
->method('getValueBool')
|
||||
->with('theming', 'disable-user-theming')
|
||||
->method('getAppValueBool')
|
||||
->with('disable-user-theming')
|
||||
->willReturn(false);
|
||||
$this->appConfig
|
||||
->expects(self::once())
|
||||
->method('getValueString')
|
||||
->with('theming', 'primary_color', '')
|
||||
->method('getAppValueString')
|
||||
->with('primary_color', '')
|
||||
->willReturn($this->defaults->getColorPrimary());
|
||||
|
||||
$this->assertEquals($this->defaults->getColorPrimary(), $this->template->getColorPrimary());
|
||||
|
|
@ -394,13 +395,13 @@ class ThemingDefaultsTest extends TestCase {
|
|||
public function testGetColorPrimaryWithCustom(): void {
|
||||
$this->appConfig
|
||||
->expects(self::once())
|
||||
->method('getValueBool')
|
||||
->with('theming', 'disable-user-theming')
|
||||
->method('getAppValueBool')
|
||||
->with('disable-user-theming')
|
||||
->willReturn(false);
|
||||
$this->appConfig
|
||||
->expects(self::once())
|
||||
->method('getValueString')
|
||||
->with('theming', 'primary_color', '')
|
||||
->method('getAppValueString')
|
||||
->with('primary_color', '')
|
||||
->willReturn('#fff');
|
||||
|
||||
$this->assertEquals('#fff', $this->template->getColorPrimary());
|
||||
|
|
@ -458,13 +459,13 @@ class ThemingDefaultsTest extends TestCase {
|
|||
->willReturn('user');
|
||||
$this->appConfig
|
||||
->expects(self::any())
|
||||
->method('getValueBool')
|
||||
->with('theming', 'disable-user-theming')
|
||||
->method('getAppValueBool')
|
||||
->with('disable-user-theming')
|
||||
->willReturn($disableTheming);
|
||||
$this->appConfig
|
||||
->expects(self::any())
|
||||
->method('getValueString')
|
||||
->with('theming', 'primary_color', '')
|
||||
->method('getAppValueString')
|
||||
->with('primary_color', '')
|
||||
->willReturn($primaryColor);
|
||||
$this->config
|
||||
->expects($this->any())
|
||||
|
|
@ -476,19 +477,19 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testSet(): void {
|
||||
$this->config
|
||||
->expects($this->once())
|
||||
->method('setAppValue')
|
||||
->with('theming', 'cachebuster', 16);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setValueString')
|
||||
->with('theming', 'MySetting', 'MyValue');
|
||||
$this->config
|
||||
->method('setAppValueInt')
|
||||
->with('cachebuster', 16);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'cachebuster', '0')
|
||||
->willReturn('15');
|
||||
->method('setAppValueString')
|
||||
->with('MySetting', 'MyValue');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(15);
|
||||
$this->cacheFactory
|
||||
->expects($this->exactly(2))
|
||||
->method('createDistributed')
|
||||
|
|
@ -504,97 +505,106 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testUndoName(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('deleteAppValue')
|
||||
->with('theming', 'name');
|
||||
$this->config
|
||||
->expects($this->exactly(2))
|
||||
->method('getAppValue')
|
||||
->willReturnMap([
|
||||
['theming', 'cachebuster', '0', '15'],
|
||||
['theming', 'name', 'Nextcloud', 'Nextcloud'],
|
||||
]);
|
||||
$this->config
|
||||
->with('name');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValue')
|
||||
->with('theming', 'cachebuster', 16);
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(15);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueString')
|
||||
->with('name', 'Nextcloud')
|
||||
->willReturn('Nextcloud');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValueInt')
|
||||
->with('cachebuster', 16);
|
||||
|
||||
$this->assertSame('Nextcloud', $this->template->undo('name'));
|
||||
}
|
||||
|
||||
public function testUndoBaseUrl(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('deleteAppValue')
|
||||
->with('theming', 'url');
|
||||
$this->config
|
||||
->expects($this->exactly(2))
|
||||
->method('getAppValue')
|
||||
->willReturnMap([
|
||||
['theming', 'cachebuster', '0', '15'],
|
||||
['theming', 'url', $this->defaults->getBaseUrl(), $this->defaults->getBaseUrl()],
|
||||
]);
|
||||
$this->config
|
||||
->with('url');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValue')
|
||||
->with('theming', 'cachebuster', 16);
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(15);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueString')
|
||||
->with('url', $this->defaults->getBaseUrl())
|
||||
->willReturn($this->defaults->getBaseUrl());
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValueInt')
|
||||
->with('cachebuster', 16);
|
||||
|
||||
$this->assertSame($this->defaults->getBaseUrl(), $this->template->undo('url'));
|
||||
}
|
||||
|
||||
public function testUndoSlogan(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('deleteAppValue')
|
||||
->with('theming', 'slogan');
|
||||
$this->config
|
||||
->expects($this->exactly(2))
|
||||
->method('getAppValue')
|
||||
->willReturnMap([
|
||||
['theming', 'cachebuster', '0', '15'],
|
||||
['theming', 'slogan', $this->defaults->getSlogan(), $this->defaults->getSlogan()],
|
||||
]);
|
||||
$this->config
|
||||
->with('slogan');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValue')
|
||||
->with('theming', 'cachebuster', 16);
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(15);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueString')
|
||||
->with('slogan', $this->defaults->getSlogan())
|
||||
->willReturn($this->defaults->getSlogan());
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValueInt')
|
||||
->with('cachebuster', 16);
|
||||
|
||||
$this->assertSame($this->defaults->getSlogan(), $this->template->undo('slogan'));
|
||||
}
|
||||
|
||||
public function testUndoPrimaryColor(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('deleteAppValue')
|
||||
->with('theming', 'primary_color');
|
||||
$this->config
|
||||
->with('primary_color');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'cachebuster', '0')
|
||||
->willReturn('15');
|
||||
$this->config
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(15);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValue')
|
||||
->with('theming', 'cachebuster', 16);
|
||||
->method('setAppValueInt')
|
||||
->with('cachebuster', 16);
|
||||
|
||||
$this->assertSame($this->defaults->getColorPrimary(), $this->template->undo('primary_color'));
|
||||
}
|
||||
|
||||
public function testUndoDefaultAction(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('deleteAppValue')
|
||||
->with('theming', 'defaultitem');
|
||||
$this->config
|
||||
->with('defaultitem');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'cachebuster', '0')
|
||||
->willReturn('15');
|
||||
$this->config
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster', '0')
|
||||
->willReturn(15);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('setAppValue')
|
||||
->with('theming', 'cachebuster', 16);
|
||||
->method('setAppValueInt')
|
||||
->with('cachebuster', 16);
|
||||
|
||||
$this->assertSame('', $this->template->undo('defaultitem'));
|
||||
}
|
||||
|
|
@ -613,13 +623,16 @@ class ThemingDefaultsTest extends TestCase {
|
|||
->method('getImage')
|
||||
->with('logo')
|
||||
->willThrowException(new NotFoundException());
|
||||
$this->config
|
||||
->expects($this->exactly(2))
|
||||
->method('getAppValue')
|
||||
->willReturnMap([
|
||||
['theming', 'logoMime', '', ''],
|
||||
['theming', 'cachebuster', '0', '0'],
|
||||
]);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueString')
|
||||
->with('logoMime', '')
|
||||
->willReturn('');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(0);
|
||||
$this->urlGenerator->expects($this->once())
|
||||
->method('imagePath')
|
||||
->with('core', $withName)
|
||||
|
|
@ -636,13 +649,16 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testGetLogoCustom(): void {
|
||||
$this->config
|
||||
->expects($this->exactly(2))
|
||||
->method('getAppValue')
|
||||
->willReturnMap([
|
||||
['theming', 'logoMime', '', 'image/svg+xml'],
|
||||
['theming', 'cachebuster', '0', '0'],
|
||||
]);
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueString')
|
||||
->with('logoMime', '')
|
||||
->willReturn('image/svg+xml');
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(0);
|
||||
$this->urlGenerator->expects($this->once())
|
||||
->method('linkToRoute')
|
||||
->with('theming.Theming.getImage')
|
||||
|
|
@ -651,7 +667,10 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testGetScssVariablesCached(): void {
|
||||
$this->config->expects($this->any())->method('getAppValue')->with('theming', 'cachebuster', '0')->willReturn('1');
|
||||
$this->appConfig->expects($this->any())
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(1);
|
||||
$this->cacheFactory->expects($this->once())
|
||||
->method('createDistributed')
|
||||
->with('theming-1-')
|
||||
|
|
@ -661,23 +680,22 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testGetScssVariables(): void {
|
||||
$this->config
|
||||
->expects($this->any())
|
||||
->method('getAppValue')
|
||||
->willReturnMap([
|
||||
['theming', 'cachebuster', '0', '0'],
|
||||
['theming', 'logoMime', '', 'jpeg'],
|
||||
['theming', 'backgroundMime', '', 'jpeg'],
|
||||
['theming', 'logoheaderMime', '', 'jpeg'],
|
||||
['theming', 'faviconMime', '', 'jpeg'],
|
||||
]);
|
||||
|
||||
$this->appConfig->expects($this->any())
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(0);
|
||||
$this->appConfig
|
||||
->expects(self::atLeastOnce())
|
||||
->method('getValueString')
|
||||
->expects($this->any())
|
||||
->method('getAppValueString')
|
||||
->willReturnMap([
|
||||
['theming', 'primary_color', '', false, $this->defaults->getColorPrimary()],
|
||||
['theming', 'primary_color', $this->defaults->getColorPrimary(), false, $this->defaults->getColorPrimary()],
|
||||
['imprintUrl', '', ''],
|
||||
['privacyUrl', '', ''],
|
||||
['logoMime', '', 'jpeg'],
|
||||
['backgroundMime', '', 'jpeg'],
|
||||
['logoheaderMime', '', 'jpeg'],
|
||||
['faviconMime', '', 'jpeg'],
|
||||
['primary_color', '', false, $this->defaults->getColorPrimary()],
|
||||
['primary_color', $this->defaults->getColorPrimary(), false, $this->defaults->getColorPrimary()],
|
||||
]);
|
||||
|
||||
$this->util->expects($this->any())->method('invertTextColor')->with($this->defaults->getColorPrimary())->willReturn(false);
|
||||
|
|
@ -716,60 +734,60 @@ class ThemingDefaultsTest extends TestCase {
|
|||
}
|
||||
|
||||
public function testGetDefaultAndroidURL(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'AndroidClientUrl', 'https://play.google.com/store/apps/details?id=com.nextcloud.client')
|
||||
->method('getAppValueString')
|
||||
->with('AndroidClientUrl', 'https://play.google.com/store/apps/details?id=com.nextcloud.client')
|
||||
->willReturn('https://play.google.com/store/apps/details?id=com.nextcloud.client');
|
||||
|
||||
$this->assertEquals('https://play.google.com/store/apps/details?id=com.nextcloud.client', $this->template->getAndroidClientUrl());
|
||||
}
|
||||
|
||||
public function testGetCustomAndroidURL(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'AndroidClientUrl', 'https://play.google.com/store/apps/details?id=com.nextcloud.client')
|
||||
->method('getAppValueString')
|
||||
->with('AndroidClientUrl', 'https://play.google.com/store/apps/details?id=com.nextcloud.client')
|
||||
->willReturn('https://play.google.com/store/apps/details?id=com.mycloud.client');
|
||||
|
||||
$this->assertEquals('https://play.google.com/store/apps/details?id=com.mycloud.client', $this->template->getAndroidClientUrl());
|
||||
}
|
||||
|
||||
public function testGetDefaultiOSURL(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'iOSClientUrl', 'https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8')
|
||||
->method('getAppValueString')
|
||||
->with('iOSClientUrl', 'https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8')
|
||||
->willReturn('https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8');
|
||||
|
||||
$this->assertEquals('https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8', $this->template->getiOSClientUrl());
|
||||
}
|
||||
|
||||
public function testGetCustomiOSURL(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'iOSClientUrl', 'https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8')
|
||||
->method('getAppValueString')
|
||||
->with('iOSClientUrl', 'https://geo.itunes.apple.com/us/app/nextcloud/id1125420102?mt=8')
|
||||
->willReturn('https://geo.itunes.apple.com/us/app/nextcloud/id1234567890?mt=8');
|
||||
|
||||
$this->assertEquals('https://geo.itunes.apple.com/us/app/nextcloud/id1234567890?mt=8', $this->template->getiOSClientUrl());
|
||||
}
|
||||
|
||||
public function testGetDefaultiTunesAppId(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'iTunesAppId', '1125420102')
|
||||
->method('getAppValueString')
|
||||
->with('iTunesAppId', '1125420102')
|
||||
->willReturn('1125420102');
|
||||
|
||||
$this->assertEquals('1125420102', $this->template->getiTunesAppId());
|
||||
}
|
||||
|
||||
public function testGetCustomiTunesAppId(): void {
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->once())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'iTunesAppId', '1125420102')
|
||||
->method('getAppValueString')
|
||||
->with('iTunesAppId', '1125420102')
|
||||
->willReturn('1234567890');
|
||||
|
||||
$this->assertEquals('1234567890', $this->template->getiTunesAppId());
|
||||
|
|
@ -790,11 +808,11 @@ class ThemingDefaultsTest extends TestCase {
|
|||
->method('get')
|
||||
->with('shouldReplaceIcons')
|
||||
->willReturn(true);
|
||||
$this->config
|
||||
$this->appConfig
|
||||
->expects($this->any())
|
||||
->method('getAppValue')
|
||||
->with('theming', 'cachebuster', '0')
|
||||
->willReturn('0');
|
||||
->method('getAppValueInt')
|
||||
->with('cachebuster')
|
||||
->willReturn(0);
|
||||
$this->urlGenerator
|
||||
->expects($this->any())
|
||||
->method('linkToRoute')
|
||||
|
|
|
|||
|
|
@ -2366,40 +2366,6 @@
|
|||
<code><![CDATA[getAppValue]]></code>
|
||||
</DeprecatedMethod>
|
||||
</file>
|
||||
<file src="apps/theming/lib/ThemingDefaults.php">
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[deleteAppValue]]></code>
|
||||
<code><![CDATA[deleteAppValue]]></code>
|
||||
<code><![CDATA[deleteAppValues]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
<code><![CDATA[setAppValue]]></code>
|
||||
<code><![CDATA[setAppValue]]></code>
|
||||
</DeprecatedMethod>
|
||||
</file>
|
||||
<file src="apps/theming/lib/Util.php">
|
||||
<DeprecatedMethod>
|
||||
<code><![CDATA[getAppValue]]></code>
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ use OC\App\AppStore\Bundles\BundleFetcher;
|
|||
use OC\AppFramework\Bootstrap\Coordinator;
|
||||
use OC\AppFramework\Http\Request;
|
||||
use OC\AppFramework\Http\RequestId;
|
||||
use OC\AppFramework\Services\AppConfig;
|
||||
use OC\AppFramework\Utility\TimeFactory;
|
||||
use OC\Authentication\Events\LoginFailed;
|
||||
use OC\Authentication\Listeners\LoginFailedListener;
|
||||
|
|
@ -149,6 +150,7 @@ use OCP\EventDispatcher\IEventDispatcher;
|
|||
use OCP\Federation\ICloudFederationFactory;
|
||||
use OCP\Federation\ICloudFederationProviderManager;
|
||||
use OCP\Federation\ICloudIdManager;
|
||||
use OCP\Files\AppData\IAppDataFactory;
|
||||
use OCP\Files\Cache\IFileAccess;
|
||||
use OCP\Files\Config\IMountProviderCollection;
|
||||
use OCP\Files\Config\IUserMountCache;
|
||||
|
|
@ -1013,14 +1015,14 @@ class Server extends ServerContainer implements IServerContainer {
|
|||
if ($classExists && $c->get(\OCP\IConfig::class)->getSystemValueBool('installed', false) && $c->get(IAppManager::class)->isEnabledForAnyone('theming') && $c->get(TrustedDomainHelper::class)->isTrustedDomain($c->getRequest()->getInsecureServerHost())) {
|
||||
$backgroundService = new BackgroundService(
|
||||
$c->get(IRootFolder::class),
|
||||
$c->getAppDataDir('theming'),
|
||||
$c->get(IAppDataFactory::class)->get('theming'),
|
||||
$c->get(IAppConfig::class),
|
||||
$c->get(\OCP\IConfig::class),
|
||||
$c->get(ISession::class)->get('user_id'),
|
||||
);
|
||||
$imageManager = new ImageManager(
|
||||
$c->get(\OCP\IConfig::class),
|
||||
$c->getAppDataDir('theming'),
|
||||
$c->get(IAppDataFactory::class)->get('theming'),
|
||||
$c->get(IURLGenerator::class),
|
||||
$c->get(ICacheFactory::class),
|
||||
$c->get(LoggerInterface::class),
|
||||
|
|
@ -1029,12 +1031,22 @@ class Server extends ServerContainer implements IServerContainer {
|
|||
);
|
||||
return new ThemingDefaults(
|
||||
$c->get(\OCP\IConfig::class),
|
||||
$c->get(\OCP\IAppConfig::class),
|
||||
$c->getL10N('theming'),
|
||||
new AppConfig(
|
||||
$c->get(\OCP\IConfig::class),
|
||||
$c->get(\OCP\IAppConfig::class),
|
||||
'theming',
|
||||
),
|
||||
$c->get(IFactory::class)->get('theming'),
|
||||
$c->get(IUserSession::class),
|
||||
$c->get(IURLGenerator::class),
|
||||
$c->get(ICacheFactory::class),
|
||||
new Util($c->get(ServerVersion::class), $c->get(\OCP\IConfig::class), $this->get(IAppManager::class), $c->getAppDataDir('theming'), $imageManager),
|
||||
new Util(
|
||||
$c->get(ServerVersion::class),
|
||||
$c->get(\OCP\IConfig::class),
|
||||
$this->get(IAppManager::class),
|
||||
$c->get(IAppDataFactory::class)->get('theming'),
|
||||
$imageManager,
|
||||
),
|
||||
$imageManager,
|
||||
$c->get(IAppManager::class),
|
||||
$c->get(INavigationManager::class),
|
||||
|
|
|
|||
Loading…
Reference in a new issue