From c6be1ba8d35ceb398fdbd0bd7b9e4491119092a0 Mon Sep 17 00:00:00 2001
From: Bjoern Schiessle <schiessle@owncloud.com>
Date: Fri, 27 Mar 2015 11:46:07 +0100
Subject: [PATCH] fix check if a file is excluded from encryption or not

---
 lib/private/encryption/util.php               | 19 ++++++++--
 .../files/storage/wrapper/encryption.php      |  2 +-
 tests/lib/encryption/utiltest.php             | 35 +++++++++++++++++++
 3 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/lib/private/encryption/util.php b/lib/private/encryption/util.php
index 2c6ff26684..85e852ec2c 100644
--- a/lib/private/encryption/util.php
+++ b/lib/private/encryption/util.php
@@ -389,9 +389,22 @@ class Util {
 	 * @return boolean
 	 */
 	public function isExcluded($path) {
-		$root = explode('/', $path, 2);
-		if (isset($root[0])) {
-			if (in_array($root[0], $this->excludedPaths)) {
+		$normalizedPath = \OC\Files\Filesystem::normalizePath($path);
+		$root = explode('/', $normalizedPath, 4);
+		if (count($root) > 2) {
+
+			//detect system wide folders
+			if (in_array($root[1], $this->excludedPaths)) {
+				return true;
+			}
+
+			$v1 = $this->userManager->userExists($root[1]);
+			$v2 = in_array($root[2], $this->excludedPaths);
+
+			// detect user specific folders
+			if ($this->userManager->userExists($root[1])
+				&& in_array($root[2], $this->excludedPaths)) {
+
 				return true;
 			}
 		}
diff --git a/lib/private/files/storage/wrapper/encryption.php b/lib/private/files/storage/wrapper/encryption.php
index 44fc2124f7..0e70c99c8d 100644
--- a/lib/private/files/storage/wrapper/encryption.php
+++ b/lib/private/files/storage/wrapper/encryption.php
@@ -254,7 +254,7 @@ class Encryption extends Wrapper {
 				'" not found, file will be stored unencrypted');
 		}
 
-		if($shouldEncrypt === true && !$this->util->isExcluded($path) && $encryptionModule !== null) {
+		if($shouldEncrypt === true && !$this->util->isExcluded($fullPath) && $encryptionModule !== null) {
 			$source = $this->storage->fopen($path, $mode);
 			$handle = \OC\Files\Stream\Encryption::wrap($source, $path, $fullPath, $header,
 				$this->uid, $encryptionModule, $this->storage, $this, $this->util, $mode,
diff --git a/tests/lib/encryption/utiltest.php b/tests/lib/encryption/utiltest.php
index 00a9ab9c57..672f9ff5e9 100644
--- a/tests/lib/encryption/utiltest.php
+++ b/tests/lib/encryption/utiltest.php
@@ -98,4 +98,39 @@ class UtilTest extends TestCase {
 		$u->createHeader($header, $em);
 	}
 
+	/**
+	 * @dataProvider providePathsForTestIsExcluded
+	 */
+	public function testIsEcluded($path, $expected) {
+		$this->userManager
+			->expects($this->any())
+			->method('userExists')
+			->will($this->returnCallback(array($this, 'isExcludedCallback')));
+
+		$u = new Util($this->view, $this->userManager);
+
+		$this->assertSame($expected,
+			$u->isExcluded($path)
+		);
+	}
+
+	public function providePathsForTestIsExcluded() {
+		return array(
+			array('files_encryption/foo.txt', true),
+			array('test/foo.txt', false),
+			array('/user1/files_encryption/foo.txt', true),
+			array('/user1/files/foo.txt', false),
+
+		);
+	}
+
+	public function isExcludedCallback() {
+		$args = func_get_args();
+		if ($args[0] === 'user1') {
+			return true;
+		}
+
+		return false;
+	}
+
 }
-- 
GitLab