summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2024-04-04 17:40:31 -0100
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2024-04-17 15:12:22 +0000
commitf1612d4eb9f90487e52e245ba4b03d1e882a39e6 (patch)
tree057a2e15f6ccfaf103f1da3e9942f1855c91d362
parent9040bcb3b9294d7dd04afb905b93636b9accbd04 (diff)
fix(appconfig): only convert single entry on searchValues()backport/44644/stable29
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
-rw-r--r--lib/private/AppConfig.php64
-rw-r--r--lib/private/AppFramework/Services/AppConfig.php2
-rw-r--r--lib/public/AppFramework/Services/IAppConfig.php2
-rw-r--r--lib/public/IAppConfig.php5
4 files changed, 42 insertions, 31 deletions
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index 3c6993201b5..c72a4073832 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -211,7 +211,7 @@ class AppConfig implements IAppConfig {
* @param string $prefix config keys prefix to search
* @param bool $filtered TRUE to hide sensitive config values. Value are replaced by {@see IConfig::SENSITIVE_VALUE}
*
- * @return array<string, string> [configKey => configValue]
+ * @return array<string, string|int|float|bool|array> [configKey => configValue]
* @since 29.0.0
*/
public function getAllValues(string $app, string $prefix = '', bool $filtered = false): array {
@@ -254,14 +254,14 @@ class AppConfig implements IAppConfig {
*
* @param string $key config key
* @param bool $lazy search within lazy loaded config
+ * @param int|null $typedAs enforce type for the returned values ({@see self::VALUE_STRING} and others)
*
- * @return array<string, string> [appId => configValue]
+ * @return array<string, string|int|float|bool|array> [appId => configValue]
* @since 29.0.0
*/
- public function searchValues(string $key, bool $lazy = false): array {
+ public function searchValues(string $key, bool $lazy = false, ?int $typedAs = null): array {
$this->assertParams('', $key, true);
$this->loadConfig($lazy);
- $values = [];
/** @var array<array-key, array<array-key, mixed>> $cache */
if ($lazy) {
@@ -270,10 +270,10 @@ class AppConfig implements IAppConfig {
$cache = $this->fastCache;
}
+ $values = [];
foreach (array_keys($cache) as $app) {
if (isset($cache[$app][$key])) {
- $appCache = $this->formatAppValues((string)$app, $cache[$app], $lazy);
- $values[$app] = $appCache[$key];
+ $values[$app] = $this->convertTypedValue($cache[$app][$key], $typedAs ?? $this->getValueType((string)$app, $key, $lazy));
}
}
@@ -1371,7 +1371,7 @@ class AppConfig implements IAppConfig {
$key = ($key === false) ? '' : $key;
if (!$app) {
- return $this->searchValues($key);
+ return $this->searchValues($key, false, self::VALUE_MIXED);
} else {
return $this->getAllValues($app, $key);
}
@@ -1395,10 +1395,10 @@ class AppConfig implements IAppConfig {
* load all lazy values from the database
*
* @param string $app
- * @param array $values
+ * @param array<string, string> $values ['key' => 'value']
* @param bool|null $lazy
*
- * @return array
+ * @return array<string, string|int|float|bool|array>
*/
private function formatAppValues(string $app, array $values, ?bool $lazy = null): array {
foreach($values as $key => $value) {
@@ -1408,30 +1408,40 @@ class AppConfig implements IAppConfig {
continue;
}
- switch ($type) {
- case self::VALUE_INT:
- $values[$key] = (int)$value;
- break;
- case self::VALUE_FLOAT:
- $values[$key] = (float)$value;
- break;
- case self::VALUE_BOOL:
- $values[$key] = in_array(strtolower($value), ['1', 'true', 'yes', 'on']);
- break;
- case self::VALUE_ARRAY:
- try {
- $values[$key] = json_decode($value, true, flags: JSON_THROW_ON_ERROR);
- } catch (JsonException $e) {
- // ignoreable
- }
- break;
- }
+ $values[$key] = $this->convertTypedValue($value, $type);
}
return $values;
}
/**
+ * convert string value to the expected type
+ *
+ * @param string $value
+ * @param int $type
+ *
+ * @return string|int|float|bool|array
+ */
+ private function convertTypedValue(string $value, int $type): string|int|float|bool|array {
+ switch ($type) {
+ case self::VALUE_INT:
+ return (int)$value;
+ case self::VALUE_FLOAT:
+ return (float)$value;
+ case self::VALUE_BOOL:
+ return in_array(strtolower($value), ['1', 'true', 'yes', 'on']);
+ case self::VALUE_ARRAY:
+ try {
+ return json_decode($value, true, flags: JSON_THROW_ON_ERROR);
+ } catch (JsonException $e) {
+ // ignoreable
+ }
+ break;
+ }
+ return $value;
+ }
+
+ /**
* @param string $app
*
* @return string[]
diff --git a/lib/private/AppFramework/Services/AppConfig.php b/lib/private/AppFramework/Services/AppConfig.php
index 1d18baef9ed..d3dfd3d362b 100644
--- a/lib/private/AppFramework/Services/AppConfig.php
+++ b/lib/private/AppFramework/Services/AppConfig.php
@@ -97,7 +97,7 @@ class AppConfig implements IAppConfig {
* @param string $key config keys prefix to search
* @param bool $filtered TRUE to hide sensitive config values. Value are replaced by {@see IConfig::SENSITIVE_VALUE}
*
- * @return array<string, string> [configKey => configValue]
+ * @return array<string, string|int|float|bool|array> [configKey => configValue]
* @since 29.0.0
*/
public function getAllAppValues(string $key = '', bool $filtered = false): array {
diff --git a/lib/public/AppFramework/Services/IAppConfig.php b/lib/public/AppFramework/Services/IAppConfig.php
index 9340fdd3c32..74588ef2c99 100644
--- a/lib/pub