From 295f0503d509e51e660762114bb4dd6f661ab417 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Fri, 8 Aug 2025 10:56:17 -0100 Subject: [PATCH 1/2] feat(lexicon): get value type from lexicon Signed-off-by: Maxence Lange --- .../lib/Controller/AppConfigController.php | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/apps/provisioning_api/lib/Controller/AppConfigController.php b/apps/provisioning_api/lib/Controller/AppConfigController.php index d8af1f38d9509..e4d8b8db1e5fe 100644 --- a/apps/provisioning_api/lib/Controller/AppConfigController.php +++ b/apps/provisioning_api/lib/Controller/AppConfigController.php @@ -16,6 +16,7 @@ use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; +use OCP\Config\ValueType; use OCP\Exceptions\AppConfigUnknownKeyException; use OCP\IAppConfig; use OCP\IGroupManager; @@ -130,19 +131,27 @@ public function setValue(string $app, string $key, string $value): DataResponse } $type = null; - try { - $configDetails = $this->appConfig->getDetails($app, $key); - $type = $configDetails['type']; - } catch (AppConfigUnknownKeyException) { + + // checking expected type from lexicon + $keyDetails = $this->appConfig->getKeyDetails($app, $key); + if (array_key_exists('valueType', $keyDetails)) { + $type = $keyDetails['valueType']; + } else { + // if no details from lexicon, get from eventual current value in database + try { + $configDetails = $this->appConfig->getDetails($app, $key); + $type = $configDetails['type']; + } catch (AppConfigUnknownKeyException) { + } } /** @psalm-suppress InternalMethod */ match ($type) { - IAppConfig::VALUE_BOOL => $this->appConfig->setValueBool($app, $key, (bool)$value), - IAppConfig::VALUE_FLOAT => $this->appConfig->setValueFloat($app, $key, (float)$value), - IAppConfig::VALUE_INT => $this->appConfig->setValueInt($app, $key, (int)$value), - IAppConfig::VALUE_STRING => $this->appConfig->setValueString($app, $key, $value), - IAppConfig::VALUE_ARRAY => $this->appConfig->setValueArray($app, $key, \json_decode($value, true)), + IAppConfig::VALUE_BOOL, ValueType::BOOL => $this->appConfig->setValueBool($app, $key, (bool)$value), + IAppConfig::VALUE_FLOAT, ValueType::FLOAT => $this->appConfig->setValueFloat($app, $key, (float)$value), + IAppConfig::VALUE_INT, ValueType::INT => $this->appConfig->setValueInt($app, $key, (int)$value), + IAppConfig::VALUE_STRING, ValueType::STRING => $this->appConfig->setValueString($app, $key, $value), + IAppConfig::VALUE_ARRAY, ValueType::ARRAY => $this->appConfig->setValueArray($app, $key, \json_decode($value, true)), default => $this->appConfig->setValueMixed($app, $key, $value), }; From 4f0d5634c73be5a16a1bd1ebd107e36bbaa8cbae Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Thu, 21 Aug 2025 13:05:21 -0100 Subject: [PATCH 2/2] fix(lexicon): convert instead of cast Signed-off-by: Maxence Lange --- .../lib/Controller/AppConfigController.php | 10 ++++++---- .../tests/Controller/AppConfigControllerTest.php | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/provisioning_api/lib/Controller/AppConfigController.php b/apps/provisioning_api/lib/Controller/AppConfigController.php index e4d8b8db1e5fe..0c53e3c009110 100644 --- a/apps/provisioning_api/lib/Controller/AppConfigController.php +++ b/apps/provisioning_api/lib/Controller/AppConfigController.php @@ -10,6 +10,7 @@ use OC\AppConfig; use OC\AppFramework\Middleware\Security\Exceptions\NotAdminException; +use OC\Config\ConfigManager; use OCP\App\IAppManager; use OCP\AppFramework\Http; use OCP\AppFramework\Http\Attribute\NoAdminRequired; @@ -38,6 +39,7 @@ public function __construct( private IGroupManager $groupManager, private IManager $settingManager, private IAppManager $appManager, + private readonly ConfigManager $configManager, ) { parent::__construct($appName, $request); } @@ -147,11 +149,11 @@ public function setValue(string $app, string $key, string $value): DataResponse /** @psalm-suppress InternalMethod */ match ($type) { - IAppConfig::VALUE_BOOL, ValueType::BOOL => $this->appConfig->setValueBool($app, $key, (bool)$value), - IAppConfig::VALUE_FLOAT, ValueType::FLOAT => $this->appConfig->setValueFloat($app, $key, (float)$value), - IAppConfig::VALUE_INT, ValueType::INT => $this->appConfig->setValueInt($app, $key, (int)$value), + IAppConfig::VALUE_BOOL, ValueType::BOOL => $this->appConfig->setValueBool($app, $key, $this->configManager->convertToBool($value)), + IAppConfig::VALUE_FLOAT, ValueType::FLOAT => $this->appConfig->setValueFloat($app, $key, $this->configManager->convertToFloat($value)), + IAppConfig::VALUE_INT, ValueType::INT => $this->appConfig->setValueInt($app, $key, $this->configManager->convertToInt($value)), IAppConfig::VALUE_STRING, ValueType::STRING => $this->appConfig->setValueString($app, $key, $value), - IAppConfig::VALUE_ARRAY, ValueType::ARRAY => $this->appConfig->setValueArray($app, $key, \json_decode($value, true)), + IAppConfig::VALUE_ARRAY, ValueType::ARRAY => $this->appConfig->setValueArray($app, $key, $this->configManager->convertToArray($value)), default => $this->appConfig->setValueMixed($app, $key, $value), }; diff --git a/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php b/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php index 1b09838cbc39e..2657f5c8bba23 100644 --- a/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php +++ b/apps/provisioning_api/tests/Controller/AppConfigControllerTest.php @@ -8,6 +8,7 @@ namespace OCA\Provisioning_API\Tests\Controller; use OC\AppConfig; +use OC\Config\ConfigManager; use OCA\Provisioning_API\Controller\AppConfigController; use OCP\App\IAppManager; use OCP\AppFramework\Http; @@ -38,6 +39,7 @@ class AppConfigControllerTest extends TestCase { private IManager&MockObject $settingManager; private IGroupManager&MockObject $groupManager; private IAppManager $appManager; + private ConfigManager $configManager; protected function setUp(): void { parent::setUp(); @@ -48,6 +50,7 @@ protected function setUp(): void { $this->settingManager = $this->createMock(IManager::class); $this->groupManager = $this->createMock(IGroupManager::class); $this->appManager = Server::get(IAppManager::class); + $this->configManager = Server::get(ConfigManager::class); } /** @@ -67,6 +70,7 @@ protected function getInstance(array $methods = []) { $this->groupManager, $this->settingManager, $this->appManager, + $this->configManager, ); } else { return $this->getMockBuilder(AppConfigController::class) @@ -79,6 +83,7 @@ protected function getInstance(array $methods = []) { $this->groupManager, $this->settingManager, $this->appManager, + $this->configManager, ]) ->onlyMethods($methods) ->getMock();