From 1511a42da78bc4fbc2c202112bf10d249e3dc92f Mon Sep 17 00:00:00 2001
From: Robin McCorkell <rmccorkell@karoshi.org.uk>
Date: Fri, 27 Mar 2015 23:27:21 +0000
Subject: [PATCH] Check for relative datadirectory path

---
 lib/private/util.php | 16 +++++++++++-----
 tests/lib/util.php   | 19 +++++++++++++++++++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/lib/private/util.php b/lib/private/util.php
index a0ef491d9d..5aa65401b9 100644
--- a/lib/private/util.php
+++ b/lib/private/util.php
@@ -886,17 +886,23 @@ class OC_Util {
 	 * checking the existence of the ".ocdata" file.
 	 *
 	 * @param string $dataDirectory data directory path
-	 * @return bool true if the data directory is valid, false otherwise
+	 * @return array errors found
 	 */
 	public static function checkDataDirectoryValidity($dataDirectory) {
 		$l = \OC::$server->getL10N('lib');
-		$errors = array();
+		$errors = [];
+		if (!self::runningOnWindows() && $dataDirectory[0] !== '/') {
+			$errors[] = [
+				'error' => $l->t('Data directory (%s) must be an absolute path', [$dataDirectory]),
+				'hint' => $l->t('Check the value of "datadirectory" in your configuration')
+			];
+		}
 		if (!file_exists($dataDirectory . '/.ocdata')) {
-			$errors[] = array(
-				'error' => $l->t('Data directory (%s) is invalid', array($dataDirectory)),
+			$errors[] = [
+				'error' => $l->t('Data directory (%s) is invalid', [$dataDirectory]),
 				'hint' => $l->t('Please check that the data directory contains a file' .
 					' ".ocdata" in its root.')
-			);
+			];
 		}
 		return $errors;
 	}
diff --git a/tests/lib/util.php b/tests/lib/util.php
index 4082c28f05..7d9064e0a2 100644
--- a/tests/lib/util.php
+++ b/tests/lib/util.php
@@ -419,6 +419,25 @@ class Test_Util extends \Test\TestCase {
 
 		$this->assertFalse(\OCP\Util::needUpgrade());
 	}
+
+	public function testCheckDataDirectoryValidity() {
+		$dataDir = \OCP\Files::tmpFolder();
+		touch($dataDir . '/.ocdata');
+		$errors = \OC_Util::checkDataDirectoryValidity($dataDir);
+		$this->assertEmpty($errors);
+		\OCP\Files::rmdirr($dataDir);
+
+		$dataDir = \OCP\Files::tmpFolder();
+		// no touch
+		$errors = \OC_Util::checkDataDirectoryValidity($dataDir);
+		$this->assertNotEmpty($errors);
+		\OCP\Files::rmdirr($dataDir);
+
+		if (!\OC_Util::runningOnWindows()) {
+			$errors = \OC_Util::checkDataDirectoryValidity('relative/path');
+			$this->assertNotEmpty($errors);
+		}
+	}
 }
 
 /**
-- 
GitLab