From 235517f111a6d570e43cff1cd3701553412fc1a3 Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
Date: Thu, 19 Sep 2013 21:37:52 +0200
Subject: [PATCH] clear permissions cache when scanning a file

---
 lib/files/cache/scanner.php           | 15 ++++++++++++---
 tests/lib/files/cache/permissions.php | 17 +++++++++++++++++
 2 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/lib/files/cache/scanner.php b/lib/files/cache/scanner.php
index a986c1ca72..af819c47c6 100644
--- a/lib/files/cache/scanner.php
+++ b/lib/files/cache/scanner.php
@@ -36,6 +36,11 @@ class Scanner extends BasicEmitter {
 	 */
 	private $cache;
 
+	/**
+	 * @var \OC\Files\Cache\Permissions $permissionsCache
+	 */
+	private $permissionsCache;
+
 	const SCAN_RECURSIVE = true;
 	const SCAN_SHALLOW = false;
 
@@ -46,6 +51,7 @@ class Scanner extends BasicEmitter {
 		$this->storage = $storage;
 		$this->storageId = $this->storage->getId();
 		$this->cache = $storage->getCache();
+		$this->permissionsCache = $storage->getPermissionsCache();
 	}
 
 	/**
@@ -96,7 +102,11 @@ class Scanner extends BasicEmitter {
 					}
 				}
 				$newData = $data;
-				if ($reuseExisting and $cacheData = $this->cache->get($file)) {
+				$cacheData = $this->cache->get($file);
+				if ($cacheData) {
+					$this->permissionsCache->remove($cacheData['fileid']);
+				}
+				if ($reuseExisting and $cacheData) {
 					// prevent empty etag
 					$etag = $cacheData['etag'];
 					$propagateETagChange = false;
@@ -104,7 +114,6 @@ class Scanner extends BasicEmitter {
 						$etag = $data['etag'];
 						$propagateETagChange = true;
 					}
-
 					// only reuse data if the file hasn't explicitly changed
 					if (isset($data['mtime']) && isset($cacheData['mtime']) && $data['mtime'] === $cacheData['mtime']) {
 						if (($reuseExisting & self::REUSE_SIZE) && ($data['size'] === -1)) {
@@ -182,7 +191,7 @@ class Scanner extends BasicEmitter {
 		$newChildren = array();
 		if ($this->storage->is_dir($path) && ($dh = $this->storage->opendir($path))) {
 			\OC_DB::beginTransaction();
-			if(is_resource($dh)) {
+			if (is_resource($dh)) {
 				while (($file = readdir($dh)) !== false) {
 					$child = ($path) ? $path . '/' . $file : $file;
 					if (!Filesystem::isIgnoredDir($file)) {
diff --git a/tests/lib/files/cache/permissions.php b/tests/lib/files/cache/permissions.php
index 7e6e11e2eb..4b284c2c8e 100644
--- a/tests/lib/files/cache/permissions.php
+++ b/tests/lib/files/cache/permissions.php
@@ -8,6 +8,8 @@
 
 namespace Test\Files\Cache;
 
+use OC\Files\Storage\Temporary;
+
 class Permissions extends \PHPUnit_Framework_TestCase {
 	/***
 	 * @var \OC\Files\Cache\Permissions $permissionsCache
@@ -55,4 +57,19 @@ class Permissions extends \PHPUnit_Framework_TestCase {
 
 		$this->permissionsCache->removeMultiple($ids, $user);
 	}
+
+	public function testUpdatePermissionsOnRescan() {
+		$storage = new Temporary(array());
+		$scanner = $storage->getScanner();
+		$cache = $storage->getCache();
+		$permissionsCache = $storage->getPermissionsCache();
+
+		$storage->file_put_contents('foo.txt', 'bar');
+		$scanner->scan('');
+		$id = $cache->getId('foo.txt');
+		$permissionsCache->set($id, 'test', 1);
+
+		$scanner->scan('');
+		$this->assertEquals(-1, $permissionsCache->get($id, 'test'));
+	}
 }
-- 
GitLab