From 64aba49461114b986952ece89ea9467618a0ab19 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sun, 8 Dec 2019 17:20:50 +0100 Subject: [PATCH] Ensure that we don't merge broken json. Signed-off-by: Daniel Kesselberg --- lib/private/Files/Type/Detection.php | 31 +++++++++++++++++++++----- lib/private/Server.php | 1 + tests/lib/Files/Type/DetectionTest.php | 22 +++++++++++------- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/lib/private/Files/Type/Detection.php b/lib/private/Files/Type/Detection.php index 20758a71f8..f58431efee 100644 --- a/lib/private/Files/Type/Detection.php +++ b/lib/private/Files/Type/Detection.php @@ -35,6 +35,7 @@ namespace OC\Files\Type; use OCP\Files\IMimeTypeDetector; +use OCP\ILogger; use OCP\IURLGenerator; /** @@ -45,6 +46,10 @@ use OCP\IURLGenerator; * @package OC\Files\Type */ class Detection implements IMimeTypeDetector { + + public const CUSTOM_MIMETYPEMAPPING = 'mimetypemapping.json'; + public const CUSTOM_MIMETYPEALIASES = 'mimetypealiases.json'; + protected $mimetypes = []; protected $secureMimeTypes = []; @@ -55,6 +60,9 @@ class Detection implements IMimeTypeDetector { /** @var IURLGenerator */ private $urlGenerator; + /** @var ILogger */ + private $logger; + /** @var string */ private $customConfigDir; @@ -63,13 +71,16 @@ class Detection implements IMimeTypeDetector { /** * @param IURLGenerator $urlGenerator + * @param ILogger $logger * @param string $customConfigDir * @param string $defaultConfigDir */ public function __construct(IURLGenerator $urlGenerator, + ILogger $logger, $customConfigDir, $defaultConfigDir) { $this->urlGenerator = $urlGenerator; + $this->logger = $logger; $this->customConfigDir = $customConfigDir; $this->defaultConfigDir = $defaultConfigDir; } @@ -120,9 +131,13 @@ class Detection implements IMimeTypeDetector { $this->mimeTypeAlias = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypealiases.dist.json'), true); - if (file_exists($this->customConfigDir . '/mimetypealiases.json')) { - $custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypealiases.json'), true); - $this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom); + if (file_exists($this->customConfigDir . '/' . self::CUSTOM_MIMETYPEALIASES)) { + $custom = json_decode(file_get_contents($this->customConfigDir . '/' . self::CUSTOM_MIMETYPEALIASES), true); + if (json_last_error() === JSON_ERROR_NONE) { + $this->mimeTypeAlias = array_merge($this->mimeTypeAlias, $custom); + } else { + $this->logger->warning('Failed to parse ' . self::CUSTOM_MIMETYPEALIASES . ': ' . json_last_error_msg()); + } } } @@ -151,9 +166,13 @@ class Detection implements IMimeTypeDetector { $mimetypeMapping = json_decode(file_get_contents($this->defaultConfigDir . '/mimetypemapping.dist.json'), true); //Check if need to load custom mappings - if (file_exists($this->customConfigDir . '/mimetypemapping.json')) { - $custom = json_decode(file_get_contents($this->customConfigDir . '/mimetypemapping.json'), true); - $mimetypeMapping = array_merge($mimetypeMapping, $custom); + if (file_exists($this->customConfigDir . '/' . self::CUSTOM_MIMETYPEMAPPING)) { + $custom = json_decode(file_get_contents($this->customConfigDir . '/' . self::CUSTOM_MIMETYPEMAPPING), true); + if (json_last_error() === JSON_ERROR_NONE) { + $mimetypeMapping = array_merge($mimetypeMapping, $custom); + } else { + $this->logger->warning('Failed to parse ' . self::CUSTOM_MIMETYPEMAPPING . ': ' . json_last_error_msg()); + } } $this->registerTypeArray($mimetypeMapping); diff --git a/lib/private/Server.php b/lib/private/Server.php index d16b55ac21..dcac72369e 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -882,6 +882,7 @@ class Server extends ServerContainer implements IServerContainer { $this->registerService(\OCP\Files\IMimeTypeDetector::class, function (Server $c) { return new \OC\Files\Type\Detection( $c->getURLGenerator(), + $c->getLogger(), \OC::$configDir, \OC::$SERVERROOT . '/resources/config/' ); diff --git a/tests/lib/Files/Type/DetectionTest.php b/tests/lib/Files/Type/DetectionTest.php index e522239f00..ea81234211 100644 --- a/tests/lib/Files/Type/DetectionTest.php +++ b/tests/lib/Files/Type/DetectionTest.php @@ -22,6 +22,7 @@ namespace Test\Files\Type; use OC\Files\Type\Detection; +use OCP\ILogger; use OCP\IURLGenerator; class DetectionTest extends \Test\TestCase { @@ -32,6 +33,7 @@ class DetectionTest extends \Test\TestCase { parent::setUp(); $this->detection = new Detection( \OC::$server->getURLGenerator(), + \OC::$server->getLogger(), \OC::$SERVERROOT . '/config/', \OC::$SERVERROOT . '/resources/config/' ); @@ -114,13 +116,17 @@ class DetectionTest extends \Test\TestCase { ->disableOriginalConstructor() ->getMock(); + $logger = $this->getMockBuilder(ILogger::class) + ->disableOriginalConstructor() + ->getMock(); + //Only call the url generator once $urlGenerator->expects($this->once()) ->method('imagePath') ->with($this->equalTo('core'), $this->equalTo('filetypes/folder.png')) ->willReturn('folder.svg'); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('dir'); $this->assertEquals('folder.svg', $mimeType); @@ -139,7 +145,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-shared.png')) ->willReturn('folder-shared.svg'); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('dir-shared'); $this->assertEquals('folder-shared.svg', $mimeType); @@ -159,7 +165,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/folder-external.png')) ->willReturn('folder-external.svg'); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('dir-external'); $this->assertEquals('folder-external.svg', $mimeType); @@ -179,7 +185,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/my-type.png')) ->willReturn('my-type.svg'); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('my-type'); $this->assertEquals('my-type.svg', $mimeType); @@ -209,7 +215,7 @@ class DetectionTest extends \Test\TestCase { } )); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('my-type'); $this->assertEquals('my.svg', $mimeType); @@ -240,7 +246,7 @@ class DetectionTest extends \Test\TestCase { } )); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('foo-bar'); $this->assertEquals('file.svg', $mimeType); @@ -259,7 +265,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/foo-bar.png')) ->willReturn('foo-bar.svg'); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('foo-bar'); $this->assertEquals('foo-bar.svg', $mimeType); $mimeType = $detection->mimeTypeIcon('foo-bar'); @@ -285,7 +291,7 @@ class DetectionTest extends \Test\TestCase { ->with($this->equalTo('core'), $this->equalTo('filetypes/foobar-baz.png')) ->willReturn('foobar-baz.svg'); - $detection = new Detection($urlGenerator, $confDir->url(), $confDir->url()); + $detection = new Detection($urlGenerator, $logger, $confDir->url(), $confDir->url()); $mimeType = $detection->mimeTypeIcon('foo'); $this->assertEquals('foobar-baz.svg', $mimeType); }