Ver código fonte

[HttpKernel] sanitized log context in the log data collector

Fabien Potencier 14 anos atrás
pai
commit
a1afb9961b

+ 4 - 4
src/Symfony/Bridge/Monolog/Handler/DebugHandler.php

@@ -30,11 +30,11 @@ class DebugHandler extends TestHandler implements DebugLoggerInterface
         $records = array();
         foreach ($this->records as $record) {
             $records[] = array(
-                'timestamp' => $record['datetime']->getTimestamp(),
-                'message' => $record['message'],
-                'priority' => $record['level'],
+                'timestamp'    => $record['datetime']->getTimestamp(),
+                'message'      => $record['message'],
+                'priority'     => $record['level'],
                 'priorityName' => $record['level_name'],
-                'context' => $record['context'],
+                'context'      => $record['context'],
             );
         }
 

+ 31 - 1
src/Symfony/Component/HttpKernel/DataCollector/LoggerDataCollector.php

@@ -39,7 +39,7 @@ class LoggerDataCollector extends DataCollector
         if (null !== $this->logger) {
             $this->data = array(
                 'error_count' => $this->logger->countErrors(),
-                'logs'        => $this->logger->getLogs(),
+                'logs'        => $this->sanitizeLogs($this->logger->getLogs()),
             );
         }
     }
@@ -73,4 +73,34 @@ class LoggerDataCollector extends DataCollector
     {
         return 'logger';
     }
+
+    private function sanitizeLogs($logs)
+    {
+        foreach ($logs as $i => $log) {
+            $logs[$i]['context'] = $this->sanitizeContext($log['context']);
+        }
+
+        return $logs;
+    }
+
+    private function sanitizeContext($context)
+    {
+        if (is_array($context)) {
+            foreach ($context as $key => $value) {
+                $context[$key] = $this->sanitizeContext($value);
+            }
+
+            return $context;
+        }
+
+        if (is_resource($context)) {
+            return 'Resource';
+        }
+
+        if (is_object($context)) {
+            return sprintf('Object(%s)', get_class($context));
+        }
+
+        return $context;
+    }
 }

+ 29 - 18
tests/Symfony/Tests/Component/HttpKernel/DataCollector/LoggerDataCollectorTest.php

@@ -14,34 +14,45 @@ namespace Symfony\Tests\Component\HttpKernel\DataCollector;
 use Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
 use Symfony\Tests\Component\HttpKernel\Logger;
 
 class LoggerDataCollectorTest extends \PHPUnit_Framework_TestCase
 {
-    public function testCollect()
+    /**
+     * @dataProvider getCollectTestData
+     */
+    public function testCollect($nb, $logs, $expected)
     {
-        $c = new LoggerDataCollector(new TestLogger());
+        $logger = $this->getMock('Symfony\Component\HttpKernel\Log\DebugLoggerInterface');
+        $logger->expects($this->once())->method('countErrors')->will($this->returnValue($nb));
+        $logger->expects($this->once())->method('getLogs')->will($this->returnValue($logs));
 
+        $c = new LoggerDataCollector($logger);
         $c->collect(new Request(), new Response());
 
-        $this->assertSame('logger',$c->getName());
-        $this->assertSame(1337,$c->countErrors());
-        $this->assertSame(array('foo'),$c->getLogs());
+        $this->assertSame('logger', $c->getName());
+        $this->assertSame($nb, $c->countErrors());
+        $this->assertSame($expected ? $expected : $logs, $c->getLogs());
     }
 
-}
-
-class TestLogger extends Logger implements DebugLoggerInterface
-{
-    public function countErrors()
+    public function getCollectTestData()
     {
-        return 1337;
-    }
-
-    public function getLogs($priority = false)
-    {
-        return array('foo');
+        return array(
+            array(
+                1,
+                array(array('message' => 'foo', 'context' => array())),
+                null,
+            ),
+            array(
+                1,
+                array(array('message' => 'foo', 'context' => array('foo' => fopen(__FILE__, 'r')))),
+                array(array('message' => 'foo', 'context' => array('foo' => 'Resource'))),
+            ),
+            array(
+                1,
+                array(array('message' => 'foo', 'context' => array('foo' => new \stdClass()))),
+                array(array('message' => 'foo', 'context' => array('foo' => 'Object(stdClass)'))),
+            ),
+        );
     }
 }
-