Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions core/Command/Config/Preset.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,17 @@
*/
namespace OC\Core\Command\Config;

use OC\Config\ConfigManager;
use OC\Config\PresetManager;
use OC\Core\Command\Base;
use OCP\Config\Lexicon\Preset as ConfigLexiconPreset;
use OCP\IConfig;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class Preset extends Base {
public function __construct(
private readonly IConfig $config,
private readonly ConfigManager $configManager,
private readonly PresetManager $presetManager,
) {
parent::__construct();
}
Expand Down Expand Up @@ -49,10 +47,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
return self::INVALID;
}

$this->configManager->setLexiconPreset($preset);
$this->presetManager->setLexiconPreset($preset);
}

$current = ConfigLexiconPreset::tryFrom($this->config->getSystemValueInt(ConfigManager::PRESET_CONFIGKEY, 0)) ?? ConfigLexiconPreset::NONE;
$current = $this->presetManager->getLexiconPreset();
$this->writeArrayInOutputFormat($input, $output, [$current->name], 'current preset: ');
return self::SUCCESS;
}
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -1219,6 +1219,7 @@
'OC\\Comments\\ManagerFactory' => $baseDir . '/lib/private/Comments/ManagerFactory.php',
'OC\\Config' => $baseDir . '/lib/private/Config.php',
'OC\\Config\\ConfigManager' => $baseDir . '/lib/private/Config/ConfigManager.php',
'OC\\Config\\PresetManager' => $baseDir . '/lib/private/Config/PresetManager.php',
'OC\\Config\\UserConfig' => $baseDir . '/lib/private/Config/UserConfig.php',
'OC\\Console\\Application' => $baseDir . '/lib/private/Console/Application.php',
'OC\\Console\\TimestampFormatter' => $baseDir . '/lib/private/Console/TimestampFormatter.php',
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -1260,6 +1260,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Comments\\ManagerFactory' => __DIR__ . '/../../..' . '/lib/private/Comments/ManagerFactory.php',
'OC\\Config' => __DIR__ . '/../../..' . '/lib/private/Config.php',
'OC\\Config\\ConfigManager' => __DIR__ . '/../../..' . '/lib/private/Config/ConfigManager.php',
'OC\\Config\\PresetManager' => __DIR__ . '/../../..' . '/lib/private/Config/PresetManager.php',
'OC\\Config\\UserConfig' => __DIR__ . '/../../..' . '/lib/private/Config/UserConfig.php',
'OC\\Console\\Application' => __DIR__ . '/../../..' . '/lib/private/Console/Application.php',
'OC\\Console\\TimestampFormatter' => __DIR__ . '/../../..' . '/lib/private/Console/TimestampFormatter.php',
Expand Down
26 changes: 8 additions & 18 deletions lib/private/AppConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
use JsonException;
use OC\AppFramework\Bootstrap\Coordinator;
use OC\Config\ConfigManager;
use OC\Config\PresetManager;
use OCP\Config\Lexicon\Entry;
use OCP\Config\Lexicon\ILexicon;
use OCP\Config\Lexicon\Preset;
use OCP\Config\Lexicon\Strictness;
use OCP\Config\ValueType;
use OCP\DB\Exception as DBException;
Expand All @@ -27,7 +27,6 @@
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Security\ICrypto;
use OCP\Server;
use Psr\Log\LoggerInterface;

/**
Expand Down Expand Up @@ -66,13 +65,14 @@ class AppConfig implements IAppConfig {
/** @var array<string, array{entries: array<string, Entry>, aliases: array<string, string>, strictness: Strictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */
private array $configLexiconDetails = [];
private bool $ignoreLexiconAliases = false;
private ?Preset $configLexiconPreset = null;
/** @var ?array<string, string> */
private ?array $appVersionsCache = null;

public function __construct(
protected IDBConnection $connection,
protected IConfig $config,
private readonly ConfigManager $configManager,
private readonly PresetManager $presetManager,
protected LoggerInterface $logger,
protected ICrypto $crypto,
) {
Expand Down Expand Up @@ -520,8 +520,7 @@ private function getTypedValue(
// interested to check options in case a modification of the value is needed
// ie inverting value from previous key when using lexicon option RENAME_INVERT_BOOLEAN
if ($origKey !== $key && $type === self::VALUE_BOOL) {
$configManager = Server::get(ConfigManager::class);
$value = ($configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0';
$value = ($this->configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0';
}

return $value;
Expand Down Expand Up @@ -1108,7 +1107,7 @@ public function getKeyDetails(string $app, string $key): array {
$this->assertParams($app, $key);
try {
$details = $this->getDetails($app, $key);
} catch (AppConfigUnknownKeyException $e) {
} catch (AppConfigUnknownKeyException) {
$details = [
'app' => $app,
'key' => $key
Expand All @@ -1129,13 +1128,13 @@ public function getKeyDetails(string $app, string $key): array {
'valueType' => $lexiconEntry->getValueType(),
'valueTypeName' => $lexiconEntry->getValueType()->name,
'sensitive' => $lexiconEntry->isFlagged(self::FLAG_SENSITIVE),
'default' => $lexiconEntry->getDefault($this->getLexiconPreset()),
'default' => $lexiconEntry->getDefault($this->presetManager->getLexiconPreset()),
'definition' => $lexiconEntry->getDefinition(),
'note' => $lexiconEntry->getNote(),
]);
}

return array_filter($details);
return array_filter($details, static fn ($v): bool => ($v !== null));
}

/**
Expand Down Expand Up @@ -1228,7 +1227,6 @@ public function deleteApp(string $app): void {
public function clearCache(bool $reload = false): void {
$this->lazyLoaded = $this->fastLoaded = false;
$this->lazyCache = $this->fastCache = $this->valueTypes = $this->configLexiconDetails = [];
$this->configLexiconPreset = null;

if (!$reload) {
return;
Expand Down Expand Up @@ -1714,7 +1712,7 @@ private function matchAndApplyLexiconDefinition(
$lazy = $lexiconEntry->isLazy();
// only look for default if needed, default from Lexicon got priority
if ($default !== null) {
$default = $lexiconEntry->getDefault($this->getLexiconPreset()) ?? $default;
$default = $lexiconEntry->getDefault($this->presetManager->getLexiconPreset()) ?? $default;
}

if ($lexiconEntry->isFlagged(self::FLAG_SENSITIVE)) {
Expand Down Expand Up @@ -1802,14 +1800,6 @@ public function ignoreLexiconAliases(bool $ignore): void {
$this->ignoreLexiconAliases = $ignore;
}

private function getLexiconPreset(): Preset {
if ($this->configLexiconPreset === null) {
$this->configLexiconPreset = Preset::tryFrom($this->config->getSystemValueInt(ConfigManager::PRESET_CONFIGKEY, 0)) ?? Preset::NONE;
}

return $this->configLexiconPreset;
}

/**
* Returns the installed versions of all apps
*
Expand Down
24 changes: 7 additions & 17 deletions lib/private/Config/ConfigManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,8 @@
use OCP\Config\Exceptions\TypeConflictException;
use OCP\Config\IUserConfig;
use OCP\Config\Lexicon\Entry;
use OCP\Config\Lexicon\Preset;
use OCP\Config\ValueType;
use OCP\IAppConfig;
use OCP\IConfig;
use OCP\Server;
use Psr\Log\LoggerInterface;

Expand All @@ -27,20 +25,23 @@
* @since 32.0.0
*/
class ConfigManager {
/** @since 32.0.0 */
public const PRESET_CONFIGKEY = 'config_preset';

/** @var AppConfig|null $appConfig */
private ?IAppConfig $appConfig = null;
/** @var UserConfig|null $userConfig */
private ?IUserConfig $userConfig = null;

public function __construct(
private readonly IConfig $config,
private readonly LoggerInterface $logger,
) {
}

public function clearConfigCaches(): void {
$this->loadConfigServices();
$this->appConfig->clearCache();
$this->userConfig->clearCacheAll();
}


/**
* Use the rename values from the list of ConfigLexiconEntry defined in each app ConfigLexicon
* to migrate config value to a new config key.
Expand Down Expand Up @@ -81,17 +82,6 @@ public function migrateConfigLexiconKeys(?string $appId = null): void {
$this->userConfig->ignoreLexiconAliases(false);
}

/**
* store in config.php the new preset
* refresh cached preset
*/
public function setLexiconPreset(Preset $preset): void {
$this->config->setSystemValue(self::PRESET_CONFIGKEY, $preset->value);
$this->loadConfigServices();
$this->appConfig->clearCache();
$this->userConfig->clearCacheAll();
}

/**
* config services cannot be load at __construct() or install will fail
*/
Expand Down
48 changes: 48 additions & 0 deletions lib/private/Config/PresetManager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OC\Config;

use OCP\Config\Lexicon\Preset;
use OCP\IConfig;

/**
* tools to maintains configurations
*/
class PresetManager {
private const PRESET_CONFIGKEY = 'config_preset';

private ?Preset $configLexiconPreset = null;

public function __construct(
private readonly IConfig $config,
private readonly ConfigManager $configManager,
) {
}

/**
* store in config.php the new preset
* refresh cached preset
*/
public function setLexiconPreset(Preset $preset): void {
$this->config->setSystemValue(self::PRESET_CONFIGKEY, $preset->value);
$this->configLexiconPreset = $preset;
$this->configManager->clearConfigCaches();
}

/**
* returns currently selected Preset
*/
public function getLexiconPreset(): Preset {
if ($this->configLexiconPreset === null) {
$this->configLexiconPreset = Preset::tryFrom($this->config->getSystemValueInt(self::PRESET_CONFIGKEY, 0)) ?? Preset::NONE;
}

return $this->configLexiconPreset;
}
}
19 changes: 4 additions & 15 deletions lib/private/Config/UserConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
use OCP\Config\IUserConfig;
use OCP\Config\Lexicon\Entry;
use OCP\Config\Lexicon\ILexicon;
use OCP\Config\Lexicon\Preset;
use OCP\Config\Lexicon\Strictness;
use OCP\Config\ValueType;
use OCP\DB\Exception as DBException;
Expand All @@ -27,7 +26,6 @@
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Security\ICrypto;
use OCP\Server;
use Psr\Log\LoggerInterface;

/**
Expand Down Expand Up @@ -68,11 +66,12 @@ class UserConfig implements IUserConfig {
/** @var array<string, array{entries: array<string, Entry>, aliases: array<string, string>, strictness: Strictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */
private array $configLexiconDetails = [];
private bool $ignoreLexiconAliases = false;
private ?Preset $configLexiconPreset = null;

public function __construct(
protected IDBConnection $connection,
protected IConfig $config,
private readonly ConfigManager $configManager,
private readonly PresetManager $presetManager,
protected LoggerInterface $logger,
protected ICrypto $crypto,
) {
Expand Down Expand Up @@ -772,8 +771,7 @@ private function getTypedValue(
// interested to check options in case a modification of the value is needed
// ie inverting value from previous key when using lexicon option RENAME_INVERT_BOOLEAN
if ($origKey !== $key && $type === ValueType::BOOL) {
$configManager = Server::get(ConfigManager::class);
$value = ($configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0';
$value = ($this->configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0';
}

return $value;
Expand Down Expand Up @@ -1636,7 +1634,6 @@ public function clearCache(string $userId, bool $reload = false): void {
public function clearCacheAll(): void {
$this->lazyLoaded = $this->fastLoaded = [];
$this->lazyCache = $this->fastCache = $this->valueDetails = $this->configLexiconDetails = [];
$this->configLexiconPreset = null;
}

/**
Expand Down Expand Up @@ -1937,7 +1934,7 @@ private function matchAndApplyLexiconDefinition(

// only look for default if needed, default from Lexicon got priority if not overwritten by admin
if ($default !== null) {
$default = $this->getSystemDefault($app, $configValue) ?? $configValue->getDefault($this->getLexiconPreset()) ?? $default;
$default = $this->getSystemDefault($app, $configValue) ?? $configValue->getDefault($this->presetManager->getLexiconPreset()) ?? $default;
}

// returning false will make get() returning $default and set() not changing value in database
Expand Down Expand Up @@ -2039,12 +2036,4 @@ private function getLexiconEntry(string $appId, string $key): ?Entry {
public function ignoreLexiconAliases(bool $ignore): void {
$this->ignoreLexiconAliases = $ignore;
}

private function getLexiconPreset(): Preset {
if ($this->configLexiconPreset === null) {
$this->configLexiconPreset = Preset::tryFrom($this->config->getSystemValueInt(ConfigManager::PRESET_CONFIGKEY, 0)) ?? Preset::NONE;
}

return $this->configLexiconPreset;
}
}
29 changes: 29 additions & 0 deletions lib/private/Profile/ProfileManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace OC\Profile;

use OC\AppFramework\Bootstrap\Coordinator;
use OC\Config\PresetManager;
use OC\Core\Db\ProfileConfig;
use OC\Core\Db\ProfileConfigMapper;
use OC\Core\ResponseDefinitions;
Expand All @@ -25,6 +26,7 @@
use OCP\App\IAppManager;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\Cache\CappedMemoryCache;
use OCP\Config\Lexicon\Preset;
use OCP\IConfig;
use OCP\IUser;
use OCP\L10N\IFactory;
Expand Down Expand Up @@ -85,6 +87,7 @@ public function __construct(
private IFactory $l10nFactory,
private LoggerInterface $logger,
private Coordinator $coordinator,
private readonly PresetManager $presetManager,
) {
$this->configCache = new CappedMemoryCache();
}
Expand Down Expand Up @@ -315,12 +318,38 @@ private function getDefaultProfileConfig(IUser $targetUser, ?IUser $visitingUser
// Construct the default config for account properties
$propertiesConfig = [];
foreach (self::DEFAULT_PROPERTY_VISIBILITY as $property => $visibility) {
$this->applyDefaultProfilePreset($property, $visibility);
$propertiesConfig[$property] = ['visibility' => $visibility];
}

return array_merge($actionsConfig, $propertiesConfig);
}

/**
* modify property visibility, based on current Preset
*
* @psalm-suppress UnhandledMatchCondition if conditions are not met, we do not change $visibility
*/
private function applyDefaultProfilePreset(string $property, string &$visibility): void {
try {
$overwrite = match ($this->presetManager->getLexiconPreset()) {
Preset::SHARED, Preset::SCHOOL, Preset::UNIVERSITY => match ($property) {
IAccountManager::PROPERTY_ADDRESS, IAccountManager::PROPERTY_EMAIL, IAccountManager::PROPERTY_PHONE => self::VISIBILITY_HIDE,
},
Preset::PRIVATE, Preset::FAMILY, Preset::CLUB => match ($property) {
IAccountManager::PROPERTY_EMAIL => self::VISIBILITY_SHOW,
},
Preset::SMALL, Preset::MEDIUM, Preset::LARGE => match ($property) {
IAccountManager::PROPERTY_EMAIL, IAccountManager::PROPERTY_PHONE => self::VISIBILITY_SHOW,
},
};
} catch (\UnhandledMatchError) {
return;
}

$visibility = $overwrite;
}

/**
* Return the profile config of the target user,
* if a config does not already exist a default config is created and returned
Expand Down
Loading
Loading