diff --git a/src/Core/Addon.php b/src/Core/Addon.php index 8d1a866915..06f6a12967 100644 --- a/src/Core/Addon.php +++ b/src/Core/Addon.php @@ -84,7 +84,7 @@ class Addon public static function getAdminList(): array { $addons_admin = []; - $addons = DI::config()->get('addons') ?? []; + $addons = array_filter(DI::config()->get('addons') ?? []); ksort($addons); foreach ($addons as $name => $data) { @@ -117,7 +117,7 @@ class Addon */ public static function loadAddons() { - self::$addons = array_keys(DI::config()->get('addons') ?? []); + self::$addons = array_keys(array_filter(DI::config()->get('addons') ?? [])); } /** @@ -192,7 +192,7 @@ class Addon */ public static function reload() { - $addons = DI::config()->get('addons') ?? []; + $addons = array_filter(DI::config()->get('addons') ?? []); foreach ($addons as $name => $data) { $addonname = Strings::sanitizeFilePathItem(trim($name)); @@ -315,7 +315,7 @@ class Addon public static function getVisibleList(): array { $visible_addons = []; - $addons = DI::config()->get('addons') ?? []; + $addons = array_filter(DI::config()->get('addons') ?? []); foreach ($addons as $name => $data) { $visible_addons[] = $name; diff --git a/src/Core/Config/Util/ConfigFileManager.php b/src/Core/Config/Util/ConfigFileManager.php index f3627cf477..011dbf0e48 100644 --- a/src/Core/Config/Util/ConfigFileManager.php +++ b/src/Core/Config/Util/ConfigFileManager.php @@ -177,7 +177,7 @@ class ConfigFileManager { $filename = $this->configDir . '/' . self::CONFIG_DATA_FILE; - if (file_exists($filename)) { + if (file_exists($filename) && (filesize($filename) > 0)) { // The fallback empty return content $content = 'config[$category][$key])) { + if (!key_exists($key, $this->config[$category] ?? [])) { $return[$category][$key] = $config[$category][$key]; } } @@ -311,6 +311,11 @@ class Cache if (is_array($cache->config[$category])) { $keys = array_keys($cache->config[$category]); + if (is_null($newConfig[$category] ?? null)) { + $newConfig[$category] = []; + $newSource[$category] = []; + } + foreach ($keys as $key) { $newConfig[$category][$key] = $cache->config[$category][$key]; $newSource[$category][$key] = $cache->source[$category][$key]; diff --git a/tests/src/Core/Config/Cache/CacheTest.php b/tests/src/Core/Config/Cache/CacheTest.php index dc9b62dc00..e14b7998c5 100644 --- a/tests/src/Core/Config/Cache/CacheTest.php +++ b/tests/src/Core/Config/Cache/CacheTest.php @@ -40,6 +40,7 @@ class CacheTest extends MockedTest 'int' => 235, 'dec' => 2.456, 'array' => ['1', 2, '3', true, false], + 'null' => null, ], 'config' => [ 'a' => 'value', @@ -503,6 +504,24 @@ class CacheTest extends MockedTest ], ], ], + /** @see https://github.com/friendica/friendica/issues/12486#issuecomment-1374609349 */ + 'test_with_null' => [ + 'data' => [ + 'test_with_null' => null, + 'config' => [ + 'register_policy' => 2, + 'register_text' => '', + 'sitename' => 'Friendica Social Network23', + 'hostname' => 'friendica.local', + 'private_addons' => false, + ], + 'system' => [ + 'dbclean_expire_conversation' => 90, + ], + ], + 'cat' => 'test_with_null', + 'assertion' => null, + ], ]; } @@ -511,10 +530,28 @@ class CacheTest extends MockedTest * * @dataProvider dataTestCat */ - public function testGetCategory(array $data, string $category, array $assertion) + public function testGetCategory($data, string $category, $assertion) { $cache = new Cache($data); self::assertEquals($assertion, $cache->get($category)); } + + /** + * Test that the cache can get merged with different categories + * + * @dataProvider dataTestCat + */ + public function testCatMerge($data, string $category) + { + $cache = new Cache($data); + + $newCache = $cache->merge(new Cache([ + $category => [ + 'new_key' => 'new_value', + ], + ])); + + self::assertEquals('new_value', $newCache->get($category, 'new_key')); + } } diff --git a/tests/src/Core/Config/Cache/ConfigFileManagerTest.php b/tests/src/Core/Config/Cache/ConfigFileManagerTest.php index 2adfc27ef7..6c2c41ef65 100644 --- a/tests/src/Core/Config/Cache/ConfigFileManagerTest.php +++ b/tests/src/Core/Config/Cache/ConfigFileManagerTest.php @@ -511,4 +511,23 @@ class ConfigFileManagerTest extends MockedTest self::assertNull($configCache->get('system', 'default_timezone')); } + + /** + * Test for empty node.config.php + */ + public function testEmptyFile() + { + $this->delConfigFile('node.config.php'); + + vfsStream::newFile('node.config.php') + ->at($this->root->getChild('config')) + ->setContent(''); + + $configFileManager = (new Config())->createConfigFileManager($this->root->url()); + $configCache = new Cache(); + + $configFileManager->setupCache($configCache); + + self::assertEquals(1,1); + } }