From 2ebafb06fdef6aad4bc32316ece14faa60f9e9c4 Mon Sep 17 00:00:00 2001
From: Morris Jobke <hey@morrisjobke.de>
Date: Thu, 13 Jul 2017 22:31:07 +0200
Subject: [PATCH] Properly handle if the deps file if for some reason empty

Signed-off-by: Morris Jobke <hey@morrisjobke.de>
---
 lib/private/Template/JSCombiner.php   | 15 ++++++++++++++-
 lib/private/TemplateLayout.php        |  3 ++-
 tests/lib/Template/JSCombinerTest.php | 25 ++++++++++++++++++++++++-
 3 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/lib/private/Template/JSCombiner.php b/lib/private/Template/JSCombiner.php
index 8254174bfc0..8a9e7e747e0 100644
--- a/lib/private/Template/JSCombiner.php
+++ b/lib/private/Template/JSCombiner.php
@@ -28,6 +28,7 @@ use OCP\Files\IAppData;
 use OCP\Files\NotFoundException;
 use OCP\Files\NotPermittedException;
 use OCP\Files\SimpleFS\ISimpleFolder;
+use OCP\ILogger;
 use OCP\IURLGenerator;
 
 class JSCombiner {
@@ -44,20 +45,26 @@ class JSCombiner {
 	/** @var SystemConfig */
 	protected $config;
 
+	/** @var ILogger */
+	protected $logger;
+
 	/**
 	 * @param IAppData $appData
 	 * @param IURLGenerator $urlGenerator
 	 * @param ICache $depsCache
 	 * @param SystemConfig $config
+	 * @param ILogger $logger
 	 */
 	public function __construct(IAppData $appData,
 								IURLGenerator $urlGenerator,
 								ICache $depsCache,
-								SystemConfig $config) {
+								SystemConfig $config,
+								ILogger $logger) {
 		$this->appData = $appData;
 		$this->urlGenerator = $urlGenerator;
 		$this->depsCache = $depsCache;
 		$this->config = $config;
+		$this->logger = $logger;
 	}
 
 	/**
@@ -102,6 +109,12 @@ class JSCombiner {
 				$depFile = $folder->getFile($fileName);
 				$deps = $depFile->getContent();
 			}
+			// check again
+			if ($deps === null || $deps === '') {
+				$this->logger->info('JSCombiner: deps file empty: ' . $fileName);
+				return false;
+			}
+
 			$deps = json_decode($deps, true);
 
 			foreach ($deps as $file=>$mtime) {
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index f7bb23cd3de..9e9ec709cf5 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -243,7 +243,8 @@ class TemplateLayout extends \OC_Template {
 				\OC::$server->getAppDataDir('js'),
 				\OC::$server->getURLGenerator(),
 				\OC::$server->getMemCacheFactory()->create('JS'),
-				\OC::$server->getSystemConfig()
+				\OC::$server->getSystemConfig(),
+				\OC::$server->getLogger()
 			)
 			);
 		$locator->find($scripts);
diff --git a/tests/lib/Template/JSCombinerTest.php b/tests/lib/Template/JSCombinerTest.php
index 89bb13338c8..d6583d4a450 100644
--- a/tests/lib/Template/JSCombinerTest.php
+++ b/tests/lib/Template/JSCombinerTest.php
@@ -31,6 +31,7 @@ use OCP\Files\NotPermittedException;
 use OCP\Files\SimpleFS\ISimpleFile;
 use OCP\Files\SimpleFS\ISimpleFolder;
 use OCP\ICache;
+use OCP\ILogger;
 use OCP\IURLGenerator;
 
 class JSCombinerTest extends \Test\TestCase {
@@ -44,6 +45,8 @@ class JSCombinerTest extends \Test\TestCase {
 	protected $depsCache;
 	/** @var JSCombiner */
 	protected $jsCombiner;
+	/** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
+	protected $logger;
 
 	protected function setUp() {
 		parent::setUp();
@@ -52,11 +55,14 @@ class JSCombinerTest extends \Test\TestCase {
 		$this->urlGenerator = $this->createMock(IURLGenerator::class);
 		$this->config = $this->createMock(SystemConfig::class);
 		$this->depsCache = $this->createMock(ICache::class);
+		$this->logger = $this->createMock(ILogger::class);
 		$this->jsCombiner = new JSCombiner(
 			$this->appData,
 			$this->urlGenerator,
 			$this->depsCache,
-			$this->config);
+			$this->config,
+			$this->logger
+		);
 	}
 
 	public function testProcessDebugMode() {
@@ -284,6 +290,23 @@ class JSCombinerTest extends \Test\TestCase {
 		$this->assertFalse($actual);
 	}
 
+	public function testIsCachedWithoutContent() {
+		$fileName = 'combine.json';
+		$folder = $this->createMock(ISimpleFolder::class);
+		$file = $this->createMock(ISimpleFile::class);
+		$folder->method('getFile')
+			->with('combine.js.deps')
+			->willReturn($file);
+		$file->expects($this->once())
+			->method('getContent')
+			->willReturn('');
+		$this->logger->expects($this->once())
+			->method('info')
+			->with('JSCombiner: deps file empty: combine.js.deps');
+		$actual = self::invokePrivate($this->jsCombiner, 'isCached', [$fileName, $folder]);
+		$this->assertFalse($actual);
+	}
+
 	public function testCacheNoFile() {
 		$fileName = 'combine.js';
 
-- 
GitLab