From acd3173c4a9af218d4a58288a4fc61859ce91f7b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 May 2020 16:39:23 +0200 Subject: [PATCH 1/3] Fix SoapFault when detail is nested object, fixes #1431, refs #1462 --- src/Monolog/Formatter/NormalizerFormatter.php | 8 +++++-- .../Formatter/NormalizerFormatterTest.php | 22 ++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Monolog/Formatter/NormalizerFormatter.php b/src/Monolog/Formatter/NormalizerFormatter.php index 61861c86..3a01f2ce 100644 --- a/src/Monolog/Formatter/NormalizerFormatter.php +++ b/src/Monolog/Formatter/NormalizerFormatter.php @@ -142,8 +142,12 @@ class NormalizerFormatter implements FormatterInterface $data['faultactor'] = $e->faultactor; } - if (isset($e->detail) && (is_string($e->detail) || is_object($e->detail) || is_array($e->detail))) { - $data['detail'] = is_string($e->detail) ? $e->detail : reset($e->detail); + if (isset($e->detail)) { + if (is_string($e->detail)) { + $data['detail'] = $e->detail; + } elseif (is_object($e->detail) || is_array($e->detail)) { + $data['detail'] = $this->toJson($e->detail, true); + } } } diff --git a/tests/Monolog/Formatter/NormalizerFormatterTest.php b/tests/Monolog/Formatter/NormalizerFormatterTest.php index 38c73170..b02a7f83 100644 --- a/tests/Monolog/Formatter/NormalizerFormatterTest.php +++ b/tests/Monolog/Formatter/NormalizerFormatterTest.php @@ -92,7 +92,7 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase } $formatter = new NormalizerFormatter('Y-m-d'); - $e = new \SoapFault('foo', 'bar', 'hello', (object) array('foo' => 'world')); + $e = new \SoapFault('foo', 'bar', 'hello', 'world'); $formatted = $formatter->format(array( 'exception' => $e, )); @@ -110,6 +110,26 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase 'detail' => 'world', ), ), $formatted); + + $formatter = new NormalizerFormatter('Y-m-d'); + $e = new \SoapFault('foo', 'bar', 'hello', (object) ['bar' => (object) ['biz' => 'baz'], 'foo' => 'world']); + $formatted = $formatter->format([ + 'exception' => $e, + ]); + + unset($formatted['exception']['trace']); + + $this->assertEquals([ + 'exception' => [ + 'class' => 'SoapFault', + 'message' => 'bar', + 'code' => 0, + 'file' => $e->getFile().':'.$e->getLine(), + 'faultcode' => 'foo', + 'faultactor' => 'hello', + 'detail' => '{"bar":{"biz":"baz"},"foo":"world"}', + ], + ], $formatted); } public function testFormatToStringExceptionHandle() From c50950d79e381a55d4f605bfe8137ad392e668c1 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 May 2020 16:54:57 +0200 Subject: [PATCH 2/3] Canonicalize paths when constructing RotatingFileHandler/StreamHandler, fixes #1326 --- src/Monolog/Handler/RotatingFileHandler.php | 3 ++- src/Monolog/Handler/StreamHandler.php | 3 ++- src/Monolog/Utils.php | 30 +++++++++++++++++++++ tests/Monolog/UtilsTest.php | 23 ++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/Monolog/Handler/RotatingFileHandler.php b/src/Monolog/Handler/RotatingFileHandler.php index ae2309f8..b8253ba0 100644 --- a/src/Monolog/Handler/RotatingFileHandler.php +++ b/src/Monolog/Handler/RotatingFileHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * Stores logs to files that are rotated every day and a limited number of files are kept. @@ -45,7 +46,7 @@ class RotatingFileHandler extends StreamHandler */ public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false) { - $this->filename = $filename; + $this->filename = Utils::canonicalizePath($filename); $this->maxFiles = (int) $maxFiles; $this->nextRotation = new \DateTime('tomorrow'); $this->filenameFormat = '{filename}-{date}'; diff --git a/src/Monolog/Handler/StreamHandler.php b/src/Monolog/Handler/StreamHandler.php index 27d90e06..7c0dfd22 100644 --- a/src/Monolog/Handler/StreamHandler.php +++ b/src/Monolog/Handler/StreamHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Utils; /** * Stores to any stream resource @@ -45,7 +46,7 @@ class StreamHandler extends AbstractProcessingHandler if (is_resource($stream)) { $this->stream = $stream; } elseif (is_string($stream)) { - $this->url = $stream; + $this->url = Utils::canonicalizePath($stream); } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } diff --git a/src/Monolog/Utils.php b/src/Monolog/Utils.php index 180a159d..712b1969 100644 --- a/src/Monolog/Utils.php +++ b/src/Monolog/Utils.php @@ -23,6 +23,36 @@ class Utils return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class; } + /** + * Makes sure if a relative path is passed in it is turned into an absolute path + * + * @param string $streamUrl stream URL or path without protocol + * + * @return string + */ + public static function canonicalizePath($streamUrl) + { + $prefix = ''; + if ('file://' === substr($streamUrl, 0, 7)) { + $streamUrl = substr($streamUrl, 7); + $prefix = 'file://'; + } + + // other type of stream, not supported + if (false !== strpos($streamUrl, '://')) { + return $streamUrl; + } + + // already absolute + if (substr($streamUrl, 0, 1) === '/' || substr($streamUrl, 1, 1) === ':' || substr($streamUrl, 0, 2) === '\\\\') { + return $prefix.$streamUrl; + } + + $streamUrl = getcwd() . '/' . $streamUrl; + + return $prefix.$streamUrl; + } + /** * Return the JSON representation of a value * diff --git a/tests/Monolog/UtilsTest.php b/tests/Monolog/UtilsTest.php index 1ffcc74b..428e02cc 100644 --- a/tests/Monolog/UtilsTest.php +++ b/tests/Monolog/UtilsTest.php @@ -13,6 +13,29 @@ namespace Monolog; class UtilsTest extends \PHPUnit_Framework_TestCase { + /** + * @param string $expected + * @param string $input + * @dataProvider providePathsToCanonicalize + */ + public function testCanonicalizePath($expected, $input) + { + $this->assertSame($expected, Utils::canonicalizePath($input)); + } + + public function providePathsToCanonicalize() + { + return array( + array('/foo/bar', '/foo/bar'), + array('file://'.getcwd().'/bla', 'file://bla'), + array(getcwd().'/bla', 'bla'), + array(getcwd().'/./bla', './bla'), + array('file:///foo/bar', 'file:///foo/bar'), + array('any://foo', 'any://foo'), + array('\\\\network\path', '\\\\network\path'), + ); + } + /** * @param int $code * @param string $msg From fa4a173f69736f3d58d3d4f742ac2534bce8c96b Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Thu, 21 May 2020 16:56:55 +0200 Subject: [PATCH 3/3] Fix 5.3 syntax --- .../Monolog/Formatter/NormalizerFormatterTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Monolog/Formatter/NormalizerFormatterTest.php b/tests/Monolog/Formatter/NormalizerFormatterTest.php index b02a7f83..32235dac 100644 --- a/tests/Monolog/Formatter/NormalizerFormatterTest.php +++ b/tests/Monolog/Formatter/NormalizerFormatterTest.php @@ -112,15 +112,15 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase ), $formatted); $formatter = new NormalizerFormatter('Y-m-d'); - $e = new \SoapFault('foo', 'bar', 'hello', (object) ['bar' => (object) ['biz' => 'baz'], 'foo' => 'world']); - $formatted = $formatter->format([ + $e = new \SoapFault('foo', 'bar', 'hello', (object) array('bar' => (object) array('biz' => 'baz'), 'foo' => 'world')); + $formatted = $formatter->format(array( 'exception' => $e, - ]); + )); unset($formatted['exception']['trace']); - $this->assertEquals([ - 'exception' => [ + $this->assertEquals(array( + 'exception' => array( 'class' => 'SoapFault', 'message' => 'bar', 'code' => 0, @@ -128,8 +128,8 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase 'faultcode' => 'foo', 'faultactor' => 'hello', 'detail' => '{"bar":{"biz":"baz"},"foo":"world"}', - ], - ], $formatted); + ), + ), $formatted); } public function testFormatToStringExceptionHandle()