diff --git a/src/Core/Config/Util/ConfigFileTransformer.php b/src/Core/Config/Util/ConfigFileTransformer.php index 45e7a5522b..f159721644 100644 --- a/src/Core/Config/Util/ConfigFileTransformer.php +++ b/src/Core/Config/Util/ConfigFileTransformer.php @@ -214,6 +214,17 @@ class ConfigFileTransformer case "NULL": return "null"; case "object": + if (method_exists($value, '__toString')) { + return sprintf('\'%s\'', $value); + } elseif ($value instanceof \Serializable) { + try { + return $value->serialize(); + } catch (\Exception $e) { + throw new \InvalidArgumentException(sprintf('Cannot serialize %s.', gettype($value)), $e); + } + } else { + throw new \InvalidArgumentException(sprintf('%s is an object without stringify.', gettype($value))); + } case "resource": case "resource (closed)": throw new \InvalidArgumentException(sprintf('%s in configs are not supported yet.', gettype($value))); diff --git a/tests/Util/SerializableObjectDouble.php b/tests/Util/SerializableObjectDouble.php new file mode 100644 index 0000000000..5c40a04d8b --- /dev/null +++ b/tests/Util/SerializableObjectDouble.php @@ -0,0 +1,35 @@ +. + * + */ + +namespace Friendica\Test\Util; + +class SerializableObjectDouble implements \Serializable# +{ + public function serialize() + { + return '\'serialized\''; + } + + public function unserialize($data) + { + return '\'unserialized\''; + } +} diff --git a/tests/datasets/config/transformer/object_valid.node.config.php b/tests/datasets/config/transformer/object_valid.node.config.php new file mode 100644 index 0000000000..bfe61f3c8d --- /dev/null +++ b/tests/datasets/config/transformer/object_valid.node.config.php @@ -0,0 +1,11 @@ + [ + 'toString' => new HiddenString('test'), + 'serializable' => new SerializableObjectDouble(), + ], +]; diff --git a/tests/src/Core/Config/Util/ConfigFileTransformerTest.php b/tests/src/Core/Config/Util/ConfigFileTransformerTest.php index bb156cf282..e7e8770b6a 100644 --- a/tests/src/Core/Config/Util/ConfigFileTransformerTest.php +++ b/tests/src/Core/Config/Util/ConfigFileTransformerTest.php @@ -23,6 +23,9 @@ namespace Friendica\Test\src\Core\Config\Util; use Friendica\Core\Config\Util\ConfigFileTransformer; use Friendica\Test\MockedTest; +use Friendica\Test\Util\SerializableObjectDouble; +use ParagonIE\HiddenString\HiddenString; +use function PHPUnit\Framework\assertEquals; class ConfigFileTransformerTest extends MockedTest { @@ -45,9 +48,34 @@ class ConfigFileTransformerTest extends MockedTest 'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/object.node.config.php'), 'assertException' => true, ], - 'ressource_invalid' => [ + 'ressource' => [ 'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/ressource.node.config.php'), - 'assertException' => true, + 'assertException' => false, + 'assertion' => << [ + 'ressources_not_allowed' => '', + ], +]; + +EOF, + ], + 'object_valid' => [ + 'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/object_valid.node.config.php'), + 'assertException' => false, + 'assertion' => << [ + 'toString' => 'test', + 'serializable' => 'serialized', + ], +]; + +EOF, ], 'test_types' => [ 'configFile' => (dirname(__DIR__, 4) . '/datasets/config/transformer/types.node.config.php'), @@ -63,7 +91,7 @@ class ConfigFileTransformerTest extends MockedTest * * @dataProvider dataTests */ - public function testConfigFile(string $configFile, bool $assertException = false) + public function testConfigFile(string $configFile, bool $assertException = false, $assertion = null) { $dataArray = include $configFile; @@ -73,6 +101,10 @@ class ConfigFileTransformerTest extends MockedTest $newConfig = ConfigFileTransformer::encode($dataArray); - self::assertEquals(file_get_contents($configFile), $newConfig); + if (empty($assertion)) { + self::assertEquals(file_get_contents($configFile), $newConfig); + } else { + self::assertEquals($assertion, $newConfig); + } } }