From ae1684c4143a2937798172762d60c6fdd71c182c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Thu, 25 Jan 2018 14:23:25 +0100 Subject: [PATCH 1/4] Allow binary values in parameters. --- .../Component/DependencyInjection/Dumper/PhpDumper.php | 7 ++++++- .../Component/DependencyInjection/Dumper/XmlDumper.php | 4 ++++ .../Component/DependencyInjection/Loader/XmlFileLoader.php | 6 ++++++ .../Loader/schema/dic/services/services-1.0.xsd | 1 + .../Tests/Fixtures/containers/container8.php | 2 ++ .../DependencyInjection/Tests/Fixtures/php/services8.php | 2 ++ .../DependencyInjection/Tests/Fixtures/xml/services8.xml | 2 ++ .../DependencyInjection/Tests/Fixtures/yaml/services8.yml | 2 ++ 8 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index 5ece0fa4a52e4..930222e35adc2 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -1811,7 +1811,12 @@ private function export($value) private function doExport($value, $resolveEnv = false) { - if (is_string($value) && false !== strpos($value, "\n")) { + if (is_string($value) && \in_array(preg_match('/[^\s\P{Cc}]/u', $value), array(false, 1), true)) { + $toHex = function (&$values, $char) { + return $values.sprintf('\\x%02x', ord($char)); + }; + $export = '"'.array_reduce(str_split($value), $toHex, '').'"'; + } elseif (is_string($value) && false !== strpos($value, "\n")) { $cleanParts = explode("\n", $value); $cleanParts = array_map(function ($part) { return var_export($part, true); }, $cleanParts); $export = implode('."\n".', $cleanParts); diff --git a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php index defbc7ae89da4..06916e2c57364 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php @@ -298,6 +298,10 @@ private function convertParameters(array $parameters, $type, \DOMElement $parent $element->setAttribute('type', 'expression'); $text = $this->document->createTextNode(self::phpToXml((string) $value)); $element->appendChild($text); + } elseif (is_string($value) && \in_array(preg_match('/[^\s\P{Cc}]/u', $value), array(false, 1), true)) { + $element->setAttribute('type', 'binary'); + $text = $this->document->createTextNode(self::phpToXml(base64_encode($value))); + $element->appendChild($text); } else { if (in_array($value, array('null', 'true', 'false'), true)) { $element->setAttribute('type', 'string'); diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index 71ddd2227b605..7c89984cefb70 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -511,6 +511,12 @@ private function getArgumentsAsPhp(\DOMElement $node, $name, $file, $lowercase = } $arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag')); break; + case 'binary': + if (false === $value = base64_decode($arg->nodeValue)) { + throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="binary" is not a valid base64 encoded string.', $name)); + } + $arguments[$key] = $value; + break; case 'string': $arguments[$key] = $arg->nodeValue; break; diff --git a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd index 99ac00567d915..60a01bd666aed 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd +++ b/src/Symfony/Component/DependencyInjection/Loader/schema/dic/services/services-1.0.xsd @@ -246,6 +246,7 @@ + diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php index 1a4e5ab5c8d8d..31e6baab32405 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/containers/container8.php @@ -9,6 +9,8 @@ 'bar' => 'foo is %%foo bar', 'escape' => '@escapeme', 'values' => array(true, false, null, 0, 1000.3, 'true', 'false', 'null'), + 'binary' => "\xf0\xf0\xf0\xf0", + 'binary-control-char' => "This is a Bell char \x07", ))); return $container; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php index dc7da1c274e5c..f4c4b52c0d63b 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php @@ -135,6 +135,8 @@ protected function getDefaultParameters() 6 => 'false', 7 => 'null', ), + 'binary' => "\xf0\xf0\xf0\xf0", + 'binary-control-char' => "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x42\x65\x6c\x6c\x20\x63\x68\x61\x72\x20\x07", ); } } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml index bc1186bd93ccf..5bd9d1127b978 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/services8.xml @@ -18,6 +18,8 @@ false null + 8PDw8A== + VGhpcyBpcyBhIEJlbGwgY2hhciAH diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml index 4e37bc9315c9b..a17a71cc8ecf5 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/yaml/services8.yml @@ -4,6 +4,8 @@ parameters: bar: 'foo is %%foo bar' escape: '@@escapeme' values: [true, false, null, 0, 1000.3, 'true', 'false', 'null'] + binary: !!binary 8PDw8A== + binary-control-char: !!binary VGhpcyBpcyBhIEJlbGwgY2hhciAH services: service_container: From 60436ac7972e030159aa79b50572913d9d3182d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Tue, 20 Mar 2018 18:16:43 +0100 Subject: [PATCH 2/4] Change regexp to Invalid Byte selection --- src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php | 2 +- src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index 930222e35adc2..d352df8ba5f7d 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -1811,7 +1811,7 @@ private function export($value) private function doExport($value, $resolveEnv = false) { - if (is_string($value) && \in_array(preg_match('/[^\s\P{Cc}]/u', $value), array(false, 1), true)) { + if (is_string($value) && \in_array(preg_match('/[\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]/u', $value), array(false, 1), true)) { $toHex = function (&$values, $char) { return $values.sprintf('\\x%02x', ord($char)); }; diff --git a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php index 06916e2c57364..10cc0cde8fb3c 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php @@ -298,7 +298,7 @@ private function convertParameters(array $parameters, $type, \DOMElement $parent $element->setAttribute('type', 'expression'); $text = $this->document->createTextNode(self::phpToXml((string) $value)); $element->appendChild($text); - } elseif (is_string($value) && \in_array(preg_match('/[^\s\P{Cc}]/u', $value), array(false, 1), true)) { + } elseif (is_string($value) && \in_array(preg_match('/[\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]/u', $value), array(false, 1), true)) { $element->setAttribute('type', 'binary'); $text = $this->document->createTextNode(self::phpToXml(base64_encode($value))); $element->appendChild($text); From 801e9b37cbcaf736c1ed228ae830141d0986fca1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Thu, 22 Mar 2018 18:17:10 +0100 Subject: [PATCH 3/4] Reverse regexp to avoid in_array() --- .../Component/DependencyInjection/Dumper/PhpDumper.php | 4 ++-- .../Component/DependencyInjection/Dumper/XmlDumper.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index d352df8ba5f7d..313708bd1cbcf 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -1811,12 +1811,12 @@ private function export($value) private function doExport($value, $resolveEnv = false) { - if (is_string($value) && \in_array(preg_match('/[\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]/u', $value), array(false, 1), true)) { + if (\is_string($value) && !preg_match('/^[^\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]*+$/u', $value)) { $toHex = function (&$values, $char) { return $values.sprintf('\\x%02x', ord($char)); }; $export = '"'.array_reduce(str_split($value), $toHex, '').'"'; - } elseif (is_string($value) && false !== strpos($value, "\n")) { + } elseif (\is_string($value) && false !== strpos($value, "\n")) { $cleanParts = explode("\n", $value); $cleanParts = array_map(function ($part) { return var_export($part, true); }, $cleanParts); $export = implode('."\n".', $cleanParts); diff --git a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php index 10cc0cde8fb3c..664e58aa87010 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/XmlDumper.php @@ -298,7 +298,7 @@ private function convertParameters(array $parameters, $type, \DOMElement $parent $element->setAttribute('type', 'expression'); $text = $this->document->createTextNode(self::phpToXml((string) $value)); $element->appendChild($text); - } elseif (is_string($value) && \in_array(preg_match('/[\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]/u', $value), array(false, 1), true)) { + } elseif (\is_string($value) && !preg_match('/^[^\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]*+$/u', $value)) { $element->setAttribute('type', 'binary'); $text = $this->document->createTextNode(self::phpToXml(base64_encode($value))); $element->appendChild($text); From 0e466987a1940703d307d65df354ca3e57dfcc89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Burnichon?= Date: Thu, 22 Mar 2018 18:39:08 +0100 Subject: [PATCH 4/4] Revert PhpDumper.php changes --- .../Component/DependencyInjection/Dumper/PhpDumper.php | 7 +------ .../DependencyInjection/Tests/Fixtures/php/services8.php | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index 313708bd1cbcf..5ece0fa4a52e4 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -1811,12 +1811,7 @@ private function export($value) private function doExport($value, $resolveEnv = false) { - if (\is_string($value) && !preg_match('/^[^\x00-\x08\x0B\x0E-\x1A\x1C-\x1F\x7F]*+$/u', $value)) { - $toHex = function (&$values, $char) { - return $values.sprintf('\\x%02x', ord($char)); - }; - $export = '"'.array_reduce(str_split($value), $toHex, '').'"'; - } elseif (\is_string($value) && false !== strpos($value, "\n")) { + if (is_string($value) && false !== strpos($value, "\n")) { $cleanParts = explode("\n", $value); $cleanParts = array_map(function ($part) { return var_export($part, true); }, $cleanParts); $export = implode('."\n".', $cleanParts); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php index f4c4b52c0d63b..eeeb37a07284e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services8.php @@ -135,8 +135,8 @@ protected function getDefaultParameters() 6 => 'false', 7 => 'null', ), - 'binary' => "\xf0\xf0\xf0\xf0", - 'binary-control-char' => "\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x42\x65\x6c\x6c\x20\x63\x68\x61\x72\x20\x07", + 'binary' => 'ננננ', + 'binary-control-char' => 'This is a Bell char ', ); } }