From 02bfc867efd992c6b5b17bcdc76316cb1c970853 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?John=20Molakvo=C3=A6=20=28skjnldsv=29?=
 <skjnldsv@protonmail.com>
Date: Thu, 28 Dec 2017 13:32:45 +0100
Subject: [PATCH] Added tests for various installations types - With root
 installation  - Core css  - App inside server root  - Secondary apps
 directory outside server root - With an installation in a sub directory  -
 Core css  - App inside server root  - Secondary apps directory outside server
 root
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
---
 lib/private/Template/SCSSCacher.php   | 18 +++++++------
 tests/lib/Template/SCSSCacherTest.php | 37 +++++++++++++++++++++++++++
 2 files changed, 47 insertions(+), 8 deletions(-)

diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php
index 8d1eda99ee0..ddd0131eac2 100644
--- a/lib/private/Template/SCSSCacher.php
+++ b/lib/private/Template/SCSSCacher.php
@@ -102,7 +102,7 @@ class SCSSCacher {
 		$fileNameCSS = $this->prependBaseurlPrefix(str_replace('.scss', '.css', $fileNameSCSS));
 
 		$path = implode('/', $path);
-		$webDir = $this->getWebDir($path, $app);
+		$webDir = $this->getWebDir($path, $app, $this->serverRoot, \OC::$WEBROOT);
 
 		try {
 			$folder = $this->appData->getFolder($app);
@@ -187,7 +187,7 @@ class SCSSCacher {
 		$scss = new Compiler();
 		$scss->setImportPaths([
 			$path,
-			\OC::$SERVERROOT . '/core/css/',
+			$this->serverRoot . '/core/css/',
 		]);
 		// Continue after throw
 		$scss->setIgnoreErrors(true);
@@ -313,17 +313,19 @@ class SCSSCacher {
 	/**
 	 * Get WebDir root
 	 * @param string $path the css file path
-	 * @param string $app the app name
+	 * @param string $appName the app name
+	 * @param string $serverRoot the server root path
+	 * @param string $webRoot the nextcloud installation root path
 	 * @return string the webDir
 	 */
-	private function getWebDir($path, $app) {
+	private function getWebDir($path, $appName, $serverRoot, $webRoot) {
 		// Detect if path is within server root AND if path is within an app path
-		if ( strpos($path, $this->serverRoot) === -1 && $appWebPath = \OC_App::getAppWebPath($app) ) {
+		if ( !strpos($path, $serverRoot) && $appWebPath = \OC_App::getAppWebPath($appName) ) {
 			// Get the file path within the app directory
-			$appDirectoryPath = explode($app, $path)[1];
+			$appDirectoryPath = explode($appName, $path)[1];
 			// Remove the webroot
-			return str_replace(\OC::$WEBROOT, '', $appWebPath.$appDirectoryPath);
+			return str_replace($webRoot, '', $appWebPath.$appDirectoryPath);
 		}
-		return \OC::$WEBROOT.substr($path, strlen($this->serverRoot));
+		return $webRoot.substr($path, strlen($serverRoot));
 	}
 }
diff --git a/tests/lib/Template/SCSSCacherTest.php b/tests/lib/Template/SCSSCacherTest.php
index 27d427aa348..6ecfc0e7aa1 100644
--- a/tests/lib/Template/SCSSCacherTest.php
+++ b/tests/lib/Template/SCSSCacherTest.php
@@ -384,4 +384,41 @@ class SCSSCacherTest extends \Test\TestCase {
 		$this->assertEquals(substr($result, 1), $actual);
 	}
 
+	public function dataGetWebDir() {
+		return [
+			['/http/core/css', 'core', '', '/http', '/core/css'],
+			['/http/apps/test/css', 'test', '', '/http', '/apps/test/css'],
+			['/http/nextcloud/core/css', 'core', '/nextcloud', '/http/nextcloud', '/nextcloud/core/css'],
+			['/http/nextcloud/apps/test/css', 'test', '/nextcloud', '/http/nextcloud', '/nextcloud/apps/test/css'],
+			['/srv/apps2/test/css', 'test', '', '/http', '/apps2/test/css'],
+			['/srv/apps2/test/css', 'test', '/nextcloud', '/http/nextcloud', '/apps2/test/css']
+		];
+	}
+
+	private function randomString() {
+		return sha1(uniqid(mt_rand(), true));
+	}
+
+	/**
+	 * @param $path
+	 * @param $appName
+	 * @param $webRoot
+	 * @param $serverRoot
+	 * @dataProvider dataGetWebDir
+	 */
+	public function testgetWebDir($path, $appName, $webRoot, $serverRoot, $correctWebDir) {
+		$tmpDir = sys_get_temp_dir().'/'.$this->randomString();
+		// Adding fake apps folder and create fake app install
+		\OC::$APPSROOTS[] = [
+			'path' => $tmpDir.'/srv/apps2',
+			'url' => '/apps2',
+			'writable' => false
+		];
+		mkdir($tmpDir.$path, 0777, true);
+		$actual = self::invokePrivate($this->scssCacher, 'getWebDir', [$tmpDir.$path, $appName, $tmpDir.$serverRoot, $webRoot]);
+		$this->assertEquals($correctWebDir, $actual);
+		array_pop(\OC::$APPSROOTS);
+		rmdir($tmpDir.$path);
+	}
+
 }
-- 
GitLab