From da3974bcb210a6580c974e1b2efebcae26ccf708 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20M=C3=BCller?= <thomas.mueller@tmit.eu>
Date: Tue, 3 Jun 2014 17:57:56 +0200
Subject: [PATCH] - drop permissions table and related code - the file/folder's
 permission is now stored in the file cache - BackGroundWatcher has been
 removed - this has meanwhile be replaced by occ files:scan which can be
 executed in a cron jobs - increase version to trigger database migration

---
 apps/files/appinfo/app.php                    |   2 -
 apps/files_sharing/lib/api.php                |   2 +-
 apps/files_sharing/lib/cache.php              |   3 +-
 apps/files_sharing/lib/permissions.php        | 112 ------------
 apps/files_sharing/lib/sharedstorage.php      |   4 -
 db_structure.xml                              |  63 ++-----
 lib/private/files/cache/backgroundwatcher.php | 107 -----------
 lib/private/files/cache/cache.php             |  17 +-
 lib/private/files/cache/permissions.php       | 170 ------------------
 lib/private/files/cache/scanner.php           |  10 +-
 lib/private/files/node/folder.php             |   5 -
 lib/private/files/storage/common.php          |   7 -
 lib/private/files/storage/storage.php         |   8 -
 lib/private/files/storage/wrapper/wrapper.php |  10 --
 lib/private/files/view.php                    |  19 +-
 lib/private/share/share.php                   |   8 +-
 tests/lib/files/cache/permissions.php         |  75 --------
 tests/lib/files/cache/scanner.php             |   2 -
 tests/lib/files/cache/updater.php             |  31 ----
 tests/lib/files/cache/watcher.php             |   2 -
 tests/lib/files/node/folder.php               |   8 -
 tests/lib/files/view.php                      |   2 -
 version.php                                   |   2 +-
 23 files changed, 29 insertions(+), 640 deletions(-)
 delete mode 100644 apps/files_sharing/lib/permissions.php
 delete mode 100644 lib/private/files/cache/backgroundwatcher.php
 delete mode 100644 lib/private/files/cache/permissions.php
 delete mode 100644 tests/lib/files/cache/permissions.php

diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php
index 4b0db457ada..43e6cffa335 100644
--- a/apps/files/appinfo/app.php
+++ b/apps/files/appinfo/app.php
@@ -12,8 +12,6 @@ OCP\App::addNavigationEntry(array("id" => "files_index",
 
 OC_Search::registerProvider('OC_Search_Provider_File');
 
-\OCP\BackgroundJob::addRegularTask('\OC\Files\Cache\BackgroundWatcher', 'checkNext');
-
 $templateManager = OC_Helper::getFileTemplateManager();
 $templateManager->registerTemplate('text/html', 'core/templates/filetemplates/template.html');
 $templateManager->registerTemplate('application/vnd.oasis.opendocument.presentation', 'core/templates/filetemplates/template.odp');
diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/lib/api.php
index dc4e5cf6c49..4dddbec26b1 100644
--- a/apps/files_sharing/lib/api.php
+++ b/apps/files_sharing/lib/api.php
@@ -156,7 +156,7 @@ class Api {
 			return $shares;
 		}
 
-		$select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path` , `permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`, `mail_send`';
+		$select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path` , `*PREFIX*share`.`permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`, `mail_send`';
 		$getReshares = \OC_DB::prepare('SELECT ' . $select . ' FROM `*PREFIX*share` INNER JOIN `*PREFIX*filecache` ON `file_source` = `*PREFIX*filecache`.`fileid` WHERE `*PREFIX*share`.`file_source` = ? AND `*PREFIX*share`.`item_type` IN (\'file\', \'folder\') AND `uid_owner` != ?');
 		$reshares = $getReshares->execute(array($itemSource, \OCP\User::getUser()))->fetchAll();
 
diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php
index 9d83ed13b87..f6c42e930d1 100644
--- a/apps/files_sharing/lib/cache.php
+++ b/apps/files_sharing/lib/cache.php
@@ -105,7 +105,7 @@ class Shared_Cache extends Cache {
 			}
 			$query = \OC_DB::prepare(
 				'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`,'
-				. ' `size`, `mtime`, `encrypted`, `unencrypted_size`, `storage_mtime`, `etag`'
+				. ' `size`, `mtime`, `encrypted`, `unencrypted_size`, `storage_mtime`, `etag`, `permissions`'
 				. ' FROM `*PREFIX*filecache` WHERE `fileid` = ?');
 			$result = $query->execute(array($sourceId));
 			$data = $result->fetchRow();
@@ -124,6 +124,7 @@ class Shared_Cache extends Cache {
 			} else {
 				$data['size'] = (int)$data['size'];
 			}
+			$data['permissions'] = (int)$data['permissions'];
 			if (!is_int($file) || $file === 0) {
 				$data['path'] = '';
 				$data['name'] = basename($this->storage->getMountPoint());
diff --git a/apps/files_sharing/lib/permissions.php b/apps/files_sharing/lib/permissions.php
deleted file mode 100644
index 2c4dce36332..00000000000
--- a/apps/files_sharing/lib/permissions.php
+++ /dev/null
@@ -1,112 +0,0 @@
-<?php
-/**
-* ownCloud
-*
-* @author Michael Gapczynski
-* @copyright 2012 Michael Gapczynski mtgap@owncloud.com
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
-* License as published by the Free Software Foundation; either
-* version 3 of the License, or any later version.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
-*
-* You should have received a copy of the GNU Affero General Public
-* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
-*/
-namespace OC\Files\Cache;
-
-class Shared_Permissions extends Permissions {
-
-	/**
-	 * get the permissions for a single file
-	 *
-	 * @param int $fileId
-	 * @param string $user
-	 * @return int permissions
-	 */
-	public function get($fileId, $user) {
-
-		$permissions = $this->storage->getPermissions();
-
-		return $this->updatePermissions($permissions);
-	}
-
-	/**
-	 * @param integer $fileId
-	 * @param string $user
-	 */
-	private function getFile($fileId, $user) {
-		return $this->get($fileId, $user);
-	}
-
-	/**
-	 * set the permissions of a file
-	 *
-	 * @param int $fileId
-	 * @param string $user
-	 * @param int $permissions
-	 */
-	public function set($fileId, $user, $permissions) {
-		// Not a valid action for Shared Permissions
-	}
-
-	/**
-	 * get the permissions of multiply files
-	 *
-	 * @param int[] $fileIds
-	 * @param string $user
-	 * @return int[]
-	 */
-	public function getMultiple($fileIds, $user) {
-		$filePermissions = array();
-		foreach ($fileIds as $fileId) {
-			$filePermissions[$fileId] = $this->get($fileId, $user);
-		}
-		return $filePermissions;
-	}
-
-	/**
-	 * get the permissions for all files in a folder
-	 *
-	 * @param int $parentId
-	 * @param string $user
-	 * @return int[]
-	 */
-	public function getDirectoryPermissions($parentId, $user) {
-
-		if ($parentId === -1 && $this->storage->instanceOfStorage('\OC\Files\Storage\Shared')) {
-			$fileCacheId =  $this->storage->getSourceId();
-		} else {
-			$fileCacheId = $parentId;
-		}
-
-		$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `parent` = ?');
-		$result = $query->execute(array($fileCacheId));
-		$permissions = $this->get($parentId, $user);
-		$filePermissions = array();
-		while ($row = $result->fetchRow()) {
-			$filePermissions[$row['fileid']] = $permissions;
-		}
-		return $filePermissions;
-	}
-
-	/**
-	 * remove the permissions for a file
-	 *
-	 * @param int $fileId
-	 * @param string $user
-	 */
-	public function remove($fileId, $user = null) {
-		// Not a valid action for Shared Permissions
-	}
-
-	public function removeMultiple($fileIds, $user) {
-		// Not a valid action for Shared Permissions
-	}
-
-}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 6d661dfd8af..f93982ee857 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -578,10 +578,6 @@ class Shared extends \OC\Files\Storage\Common {
 		return new \OC\Files\Cache\Scanner($this);
 	}
 
-	public function getPermissionsCache($path = '') {
-		return new \OC\Files\Cache\Shared_Permissions($this);
-	}
-
 	public function getWatcher($path = '') {
 		return new \OC\Files\Cache\Shared_Watcher($this);
 	}
diff --git a/db_structure.xml b/db_structure.xml
index ed4954c02b2..0791270a4b9 100644
--- a/db_structure.xml
+++ b/db_structure.xml
@@ -351,7 +351,16 @@
 				<length>40</length>
 			</field>
 
-			<index>
+            <field>
+                <name>permissions</name>
+                <type>integer</type>
+                <default>0</default>
+                <notnull>false</notnull>
+                <length>4</length>
+            </field>
+
+
+            <index>
 				<name>fs_storage_path_hash</name>
 				<unique>true</unique>
 				<field>
@@ -419,58 +428,6 @@
 
 	</table>
 
-	<table>
-
-		<!--
-		Maps (fileid, user) to an integer which is a permission bitfield.
-		 - E.g. (4, admin) -> 27
-		-->
-		<name>*dbprefix*permissions</name>
-
-		<declaration>
-
-			<!-- Foreign Key filecache::fileid -->
-			<field>
-				<name>fileid</name>
-				<type>integer</type>
-				<default>0</default>
-				<notnull>true</notnull>
-				<length>4</length>
-			</field>
-
-			<!-- Foreign Key users::uid -->
-			<field>
-				<name>user</name>
-				<type>text</type>
-				<default></default>
-				<notnull>false</notnull>
-				<length>64</length>
-			</field>
-
-			<field>
-				<name>permissions</name>
-				<type>integer</type>
-				<default>0</default>
-				<notnull>true</notnull>
-				<length>4</length>
-			</field>
-
-			<index>
-				<name>id_user_index</name>
-				<field>
-					<name>fileid</name>
-					<sorting>ascending</sorting>
-				</field>
-				<field>
-					<name>user</name>
-					<sorting>ascending</sorting>
-				</field>
-			</index>
-
-		</declaration>
-
-	</table>
-
 	<table>
 
 		<!--
diff --git a/lib/private/files/cache/backgroundwatcher.php b/lib/private/files/cache/backgroundwatcher.php
deleted file mode 100644
index 2194651233d..00000000000
--- a/lib/private/files/cache/backgroundwatcher.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-/**
- * Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-namespace OC\Files\Cache;
-
-use \OC\Files\Mount;
-use \OC\Files\Filesystem;
-
-class BackgroundWatcher {
-	static $folderMimetype = null;
-
-	static private function getFolderMimetype() {
-		if (!is_null(self::$folderMimetype)) {
-			return self::$folderMimetype;
-		}
-		$sql = 'SELECT `id` FROM `*PREFIX*mimetypes` WHERE `mimetype` = ?';
-		$result = \OC_DB::executeAudited($sql, array('httpd/unix-directory'));
-		$row = $result->fetchRow();
-		return $row['id'];
-	}
-
-	/**
-	 * @param integer $id
-	 */
-	static private function checkUpdate($id) {
-		$cacheItem = Cache::getById($id);
-		if (is_null($cacheItem)) {
-			return;
-		}
-		list($storageId, $internalPath) = $cacheItem;
-		$mounts = Filesystem::getMountByStorageId($storageId);
-
-		if (count($mounts) === 0) {
-			//if the storage we need isn't mounted on default, try to find a user that has access to the storage
-			$permissionsCache = new Permissions($storageId);
-			$users = $permissionsCache->getUsers($id);
-			if (count($users) === 0) {
-				return;
-			}
-			Filesystem::initMountPoints($users[0]);
-			$mounts = Filesystem::getMountByStorageId($storageId);
-			if (count($mounts) === 0) {
-				return;
-			}
-		}
-		$storage = $mounts[0]->getStorage();
-		$watcher = new Watcher($storage);
-		$watcher->checkUpdate($internalPath);
-	}
-
-	/**
-	 * get the next fileid in the cache
-	 *
-	 * @param int $previous
-	 * @param bool $folder
-	 * @return int
-	 */
-	static private function getNextFileId($previous, $folder) {
-		if ($folder) {
-			$stmt = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `fileid` > ? AND `mimetype` = ? ORDER BY `fileid` ASC', 1);
-		} else {
-			$stmt = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `fileid` > ? AND `mimetype` != ? ORDER BY `fileid` ASC', 1);
-		}
-		$result = \OC_DB::executeAudited($stmt, array($previous,self::getFolderMimetype()));
-		if ($row = $result->fetchRow()) {
-			return $row['fileid'];
-		} else {
-			return 0;
-		}
-	}
-
-	static public function checkNext() {
-		// check both 1 file and 1 folder, this way new files are detected quicker because there are less folders than files usually
-		$previousFile = \OC_Appconfig::getValue('files', 'backgroundwatcher_previous_file', 0);
-		$previousFolder = \OC_Appconfig::getValue('files', 'backgroundwatcher_previous_folder', 0);
-		$nextFile = self::getNextFileId($previousFile, false);
-		$nextFolder = self::getNextFileId($previousFolder, true);
-		\OC_Appconfig::setValue('files', 'backgroundwatcher_previous_file', $nextFile);
-		\OC_Appconfig::setValue('files', 'backgroundwatcher_previous_folder', $nextFolder);
-		if ($nextFile > 0) {
-			self::checkUpdate($nextFile);
-		}
-		if ($nextFolder > 0) {
-			self::checkUpdate($nextFolder);
-		}
-	}
-
-	static public function checkAll() {
-		$previous = 0;
-		$next = 1;
-		while ($next != 0) {
-			$next = self::getNextFileId($previous, true);
-			self::checkUpdate($next);
-		}
-		$previous = 0;
-		$next = 1;
-		while ($next != 0) {
-			$next = self::getNextFileId($previous, false);
-			self::checkUpdate($next);
-		}
-	}
-}
diff --git a/lib/private/files/cache/cache.php b/lib/private/files/cache/cache.php
index 59963f41e3d..bfd280a91a1 100644
--- a/lib/private/files/cache/cache.php
+++ b/lib/private/files/cache/cache.php
@@ -123,7 +123,7 @@ class Cache {
 			$params = array($file);
 		}
 		$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
-					   `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`
+					   `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
 				FROM `*PREFIX*filecache` ' . $where;
 		$result = \OC_DB::executeAudited($sql, $params);
 		$data = $result->fetchRow();
@@ -153,6 +153,7 @@ class Cache {
 			if ($data['storage_mtime'] == 0) {
 				$data['storage_mtime'] = $data['mtime'];
 			}
+			$data['permissions'] = (int)$data['permissions'];
 		}
 
 		return $data;
@@ -178,7 +179,7 @@ class Cache {
 	public function getFolderContentsById($fileId) {
 		if ($fileId > -1) {
 			$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`,
-						   `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`
+						   `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
 					FROM `*PREFIX*filecache` WHERE `parent` = ? ORDER BY `name` ASC';
 			$result = \OC_DB::executeAudited($sql,array($fileId));
 			$files = $result->fetchAll();
@@ -192,6 +193,7 @@ class Cache {
 					$file['encrypted_size'] = $file['size'];
 					$file['size'] = $file['unencrypted_size'];
 				}
+				$file['permissions'] = (int)$file['permissions'];
 			}
 			return $files;
 		} else {
@@ -277,7 +279,9 @@ class Cache {
 	 * @return array
 	 */
 	function buildParts(array $data) {
-		$fields = array('path', 'parent', 'name', 'mimetype', 'size', 'mtime', 'storage_mtime', 'encrypted', 'unencrypted_size', 'etag');
+		$fields = array(
+			'path', 'parent', 'name', 'mimetype', 'size', 'mtime', 'storage_mtime', 'encrypted', 'unencrypted_size',
+			'etag', 'permissions');
 		$params = array();
 		$queryParts = array();
 		foreach ($data as $name => $value) {
@@ -370,9 +374,6 @@ class Cache {
 		
 		$sql = 'DELETE FROM `*PREFIX*filecache` WHERE `fileid` = ?';
 		\OC_DB::executeAudited($sql, array($entry['fileid']));
-
-		$permissionsCache = new Permissions($this->storageId);
-		$permissionsCache->remove($entry['fileid']);
 	}
 
 	/**
@@ -457,7 +458,7 @@ class Cache {
 		// normalize pattern
 		$pattern = $this->normalize($pattern);
 
-		$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`
+		$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
 				FROM `*PREFIX*filecache` WHERE `name` LIKE ? AND `storage` = ?';
 		$result = \OC_DB::executeAudited($sql, array($pattern, $this->getNumericStorageId()));
 		$files = array();
@@ -481,7 +482,7 @@ class Cache {
 		} else {
 			$where = '`mimepart` = ?';
 		}
-		$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`
+		$sql = 'SELECT `fileid`, `storage`, `path`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`
 				FROM `*PREFIX*filecache` WHERE ' . $where . ' AND `storage` = ?';
 		$mimetype = $this->getMimetypeId($mimetype);
 		$result = \OC_DB::executeAudited($sql, array($mimetype, $this->getNumericStorageId()));
diff --git a/lib/private/files/cache/permissions.php b/lib/private/files/cache/permissions.php
deleted file mode 100644
index a2a614ca0b1..00000000000
--- a/lib/private/files/cache/permissions.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-namespace OC\Files\Cache;
-
-class Permissions {
-	/**
-	 * @var string $storageId
-	 */
-	private $storageId;
-
-	/**
-	 * @var \OC\Files\Storage\Storage $storage
-	 */
-	protected $storage;
-
-	/**
-	 * @param \OC\Files\Storage\Storage|string $storage
-	 */
-	public function __construct($storage) {
-		if ($storage instanceof \OC\Files\Storage\Storage) {
-			$this->storageId = $storage->getId();
-			$this->storage = $storage;
-		} else {
-			$this->storageId = $storage;
-			$mountManager = \OC\Files\Filesystem::getMountManager();
-			$mount = $mountManager->findByStorageId($this->storageId);
-			$firstMountPoint = reset($mount);
-			if ($firstMountPoint instanceof \OC\Files\Storage\Storage) {
-				$storage = $firstMountPoint->getStorage();
-				$this->storage = $storage;
-			}
-		}
-
-	}
-
-	/**
-	 * get the permissions for a single file
-	 *
-	 * @param int $fileId
-	 * @param string $user
-	 * @return int (-1 if file no permissions set)
-	 */
-	public function get($fileId, $user) {
-		$sql = 'SELECT `permissions` FROM `*PREFIX*permissions` WHERE `user` = ? AND `fileid` = ?';
-		$result = \OC_DB::executeAudited($sql, array($user, $fileId));
-		if ($row = $result->fetchRow()) {
-			return $this->updatePermissions($row['permissions']);
-		} else {
-			return -1;
-		}
-	}
-
-	/**
-	 * set the permissions of a file
-	 *
-	 * @param int $fileId
-	 * @param string $user
-	 * @param int $permissions
-	 */
-	public function set($fileId, $user, $permissions) {
-		if (self::get($fileId, $user) !== -1) {
-			$sql = 'UPDATE `*PREFIX*permissions` SET `permissions` = ? WHERE `user` = ? AND `fileid` = ?';
-		} else {
-			$sql = 'INSERT INTO `*PREFIX*permissions`(`permissions`, `user`, `fileid`) VALUES(?, ?,? )';
-		}
-		\OC_DB::executeAudited($sql, array($permissions, $user, $fileId));
-	}
-
-	/**
-	 * get the permissions of multiply files
-	 *
-	 * @param int[] $fileIds
-	 * @param string $user
-	 * @return int[]
-	 */
-	public function getMultiple($fileIds, $user) {
-		if (count($fileIds) === 0) {
-			return array();
-		}
-		$params = $fileIds;
-		$params[] = $user;
-		$inPart = implode(', ', array_fill(0, count($fileIds), '?'));
-
-		$sql = 'SELECT `fileid`, `permissions` FROM `*PREFIX*permissions`'
-			. ' WHERE `fileid` IN (' . $inPart . ') AND `user` = ?';
-		$result = \OC_DB::executeAudited($sql, $params);
-		$filePermissions = array();
-		while ($row = $result->fetchRow()) {
-			$filePermissions[$row['fileid']] = $this->updatePermissions($row['permissions']);
-		}
-		return $filePermissions;
-	}
-
-	/**
-	 * get the permissions for all files in a folder
-	 *
-	 * @param int $parentId
-	 * @param string $user
-	 * @return int[]
-	 */
-	public function getDirectoryPermissions($parentId, $user) {
-		$sql = 'SELECT `*PREFIX*permissions`.`fileid`, `permissions`
-			FROM `*PREFIX*permissions`
-			INNER JOIN `*PREFIX*filecache` ON `*PREFIX*permissions`.`fileid` = `*PREFIX*filecache`.`fileid`
-			WHERE `*PREFIX*filecache`.`parent` = ? AND `*PREFIX*permissions`.`user` = ?';
-
-		$result = \OC_DB::executeAudited($sql, array($parentId, $user));
-		$filePermissions = array();
-		while ($row = $result->fetchRow()) {
-			$filePermissions[$row['fileid']] = $this->updatePermissions($row['permissions']);
-		}
-		return $filePermissions;
-	}
-
-	/**
-	 * remove the permissions for a file
-	 *
-	 * @param int $fileId
-	 * @param string $user
-	 */
-	public function remove($fileId, $user = null) {
-		if (is_null($user)) {
-			\OC_DB::executeAudited('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ?', array($fileId));
-		} else {
-			$sql = 'DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?';
-			\OC_DB::executeAudited($sql, array($fileId, $user));
-		}
-	}
-
-	public function removeMultiple($fileIds, $user) {
-		$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
-		foreach ($fileIds as $fileId) {
-			\OC_DB::executeAudited($query, array($fileId, $user));
-		}
-	}
-
-	/**
-	 * get the list of users which have permissions stored for a file
-	 *
-	 * @param int $fileId
-	 */
-	public function getUsers($fileId) {
-		$sql = 'SELECT `user` FROM `*PREFIX*permissions` WHERE `fileid` = ?';
-		$result = \OC_DB::executeAudited($sql, array($fileId));
-		$users = array();
-		while ($row = $result->fetchRow()) {
-			$users[] = $row['user'];
-		}
-		return $users;
-	}
-
-	/**
-	 * check if admin removed the share permission for the user and update the permissions
-	 *
-	 * @param int $permissions
-	 * @return int
-	 */
-	protected function updatePermissions($permissions) {
-		if (\OCP\Util::isSharingDisabledForUser()) {
-			$permissions &= ~\OCP\PERMISSION_SHARE;
-		}
-		return $permissions;
-	}
-}
diff --git a/lib/private/files/cache/scanner.php b/lib/private/files/cache/scanner.php
index b97070fcdf0..f4ff8c85fac 100644
--- a/lib/private/files/cache/scanner.php
+++ b/lib/private/files/cache/scanner.php
@@ -39,11 +39,6 @@ class Scanner extends BasicEmitter {
 	 */
 	protected $cache;
 
-	/**
-	 * @var \OC\Files\Cache\Permissions $permissionsCache
-	 */
-	protected $permissionsCache;
-
 	/**
 	 * @var boolean $cacheActive If true, perform cache operations, if false, do not affect cache
 	 */
@@ -59,7 +54,6 @@ class Scanner extends BasicEmitter {
 		$this->storage = $storage;
 		$this->storageId = $this->storage->getId();
 		$this->cache = $storage->getCache();
-		$this->permissionsCache = $storage->getPermissionsCache();
 		$this->cacheActive = !Config::getSystemValue('filesystem_cache_readonly', false);
 	}
 
@@ -86,6 +80,7 @@ class Scanner extends BasicEmitter {
 		}
 		$data['etag'] = $this->storage->getETag($path);
 		$data['storage_mtime'] = $data['mtime'];
+		$data['permissions'] = $this->storage->getPermissions($path);
 		return $data;
 	}
 
@@ -117,9 +112,6 @@ class Scanner extends BasicEmitter {
 				$newData = $data;
 				$cacheData = $this->cache->get($file);
 				if ($cacheData) {
-					if (isset($cacheData['fileid'])) {
-						$this->permissionsCache->remove($cacheData['fileid']);
-					}
 					if ($reuseExisting) {
 						// prevent empty etag
 						if (empty($cacheData['etag'])) {
diff --git a/lib/private/files/node/folder.php b/lib/private/files/node/folder.php
index 1af34fc2be6..3e23f5c2c94 100644
--- a/lib/private/files/node/folder.php
+++ b/lib/private/files/node/folder.php
@@ -71,13 +71,11 @@ class Folder extends Node implements \OCP\Files\Folder {
 		list($storage, $internalPath) = $this->view->resolvePath($this->path);
 		if ($storage) {
 			$cache = $storage->getCache($internalPath);
-			$permissionsCache = $storage->getPermissionsCache($internalPath);
 
 			//trigger cache update check
 			$this->view->getFileInfo($this->path);
 
 			$files = $cache->getFolderContents($internalPath);
-			$permissions = $permissionsCache->getDirectoryPermissions($this->getId(), $this->root->getUser()->getUID());
 		} else {
 			$files = array();
 		}
@@ -129,9 +127,6 @@ class Folder extends Node implements \OCP\Files\Folder {
 
 		foreach ($files as $file) {
 			if ($file) {
-				if (isset($permissions[$file['fileid']])) {
-					$file['permissions'] = $permissions[$file['fileid']];
-				}
 				$node = $this->createNode($this->path . '/' . $file['name'], $file);
 				$result[] = $node;
 			}
diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php
index 6b11603323a..4d5a2078ef7 100644
--- a/lib/private/files/storage/common.php
+++ b/lib/private/files/storage/common.php
@@ -301,13 +301,6 @@ abstract class Common implements \OC\Files\Storage\Storage {
 		return $this->scanner;
 	}
 
-	public function getPermissionsCache($path = '') {
-		if (!isset($this->permissioncache)) {
-			$this->permissioncache = new \OC\Files\Cache\Permissions($this);
-		}
-		return $this->permissioncache;
-	}
-
 	public function getWatcher($path = '') {
 		if (!isset($this->watcher)) {
 			$this->watcher = new \OC\Files\Cache\Watcher($this);
diff --git a/lib/private/files/storage/storage.php b/lib/private/files/storage/storage.php
index 5be90f24756..f085a0590b4 100644
--- a/lib/private/files/storage/storage.php
+++ b/lib/private/files/storage/storage.php
@@ -40,14 +40,6 @@ interface Storage extends \OCP\Files\Storage {
 	 */
 	public function getOwner($path);
 
-	/**
-	 * get a permissions cache instance for the cache
-	 *
-	 * @param string $path
-	 * @return \OC\Files\Cache\Permissions
-	 */
-	public function getPermissionsCache($path = '');
-
 	/**
 	 * get a watcher instance for the cache
 	 *
diff --git a/lib/private/files/storage/wrapper/wrapper.php b/lib/private/files/storage/wrapper/wrapper.php
index 364475a68e0..057c31c3cd8 100644
--- a/lib/private/files/storage/wrapper/wrapper.php
+++ b/lib/private/files/storage/wrapper/wrapper.php
@@ -388,16 +388,6 @@ class Wrapper implements \OC\Files\Storage\Storage {
 		return $this->storage->getOwner($path);
 	}
 
-	/**
-	 * get a permissions cache instance for the cache
-	 *
-	 * @param string $path
-	 * @return \OC\Files\Cache\Permissions
-	 */
-	public function getPermissionsCache($path = '') {
-		return $this->storage->getPermissionsCache($path);
-	}
-
 	/**
 	 * get a watcher instance for the cache
 	 *
diff --git a/lib/private/files/view.php b/lib/private/files/view.php
index 0b8d336f260..71c4980db2d 100644
--- a/lib/private/files/view.php
+++ b/lib/private/files/view.php
@@ -826,8 +826,6 @@ class View {
 		$data = null;
 		if ($storage) {
 			$cache = $storage->getCache($internalPath);
-			$permissionsCache = $storage->getPermissionsCache($internalPath);
-			$user = \OC_User::getUser();
 
 			if (!$cache->inCache($internalPath)) {
 				if (!$storage->file_exists($internalPath)) {
@@ -857,13 +855,6 @@ class View {
 						}
 					}
 				}
-
-				$permissions = $permissionsCache->get($data['fileid'], $user);
-				if ($permissions === -1) {
-					$permissions = $storage->getPermissions($internalPath);
-					$permissionsCache->set($data['fileid'], $user, $permissions);
-				}
-				$data['permissions'] = $permissions;
 			}
 		}
 		if (!$data) {
@@ -896,7 +887,6 @@ class View {
 		list($storage, $internalPath) = Filesystem::resolvePath($path);
 		if ($storage) {
 			$cache = $storage->getCache($internalPath);
-			$permissionsCache = $storage->getPermissionsCache($internalPath);
 			$user = \OC_User::getUser();
 
 			if ($cache->getStatus($internalPath) < Cache\Cache::COMPLETE) {
@@ -913,7 +903,6 @@ class View {
 			foreach ($contents as $content) {
 				$files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content);
 			}
-			$permissions = $permissionsCache->getDirectoryPermissions($folderId, $user);
 
 			$ids = array();
 			foreach ($files as $i => $file) {
@@ -922,7 +911,6 @@ class View {
 
 				if (!isset($permissions[$file['fileid']])) {
 					$permissions[$file['fileid']] = $storage->getPermissions($file['path']);
-					$permissionsCache->set($file['fileid'], $user, $permissions[$file['fileid']]);
 				}
 				$files[$i]['permissions'] = $permissions[$file['fileid']];
 			}
@@ -954,12 +942,7 @@ class View {
 						} else { //mountpoint in this folder, add an entry for it
 							$rootEntry['name'] = $relativePath;
 							$rootEntry['type'] = $rootEntry['mimetype'] === 'httpd/unix-directory' ? 'dir' : 'file';
-							$subPermissionsCache = $subStorage->getPermissionsCache('');
-							$permissions = $subPermissionsCache->get($rootEntry['fileid'], $user);
-							if ($permissions === -1) {
-								$permissions = $subStorage->getPermissions($rootEntry['path']);
-								$subPermissionsCache->set($rootEntry['fileid'], $user, $permissions);
-							}
+							$permissions = $rootEntry['permissions'];
 							// do not allow renaming/deleting the mount point if they are not shared files/folders
 							// for shared files/folders we use the permissions given by the owner
 							if ($subStorage instanceof \OC\Files\Storage\Shared) {
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 46796c26370..189be2363ea 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -1744,10 +1744,10 @@ class Share extends \OC\Share\Constants {
 			if (isset($uidOwner)) {
 				if ($fileDependent) {
 					$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `*PREFIX*share`.`parent`,'
-							. ' `share_type`, `share_with`, `file_source`, `path`, `permissions`, `stime`,'
+							. ' `share_type`, `share_with`, `file_source`, `path`, `*PREFIX*share`.`permissions`, `stime`,'
 							. ' `expiration`, `token`, `storage`, `mail_send`, `uid_owner`';
 				} else {
-					$select = '`id`, `item_type`, `item_source`, `parent`, `share_type`, `share_with`, `permissions`,'
+					$select = '`id`, `item_type`, `item_source`, `parent`, `share_type`, `share_with`, `*PREFIX*share`.`permissions`,'
 							. ' `stime`, `file_source`, `expiration`, `token`, `mail_send`, `uid_owner`';
 				}
 			} else {
@@ -1755,12 +1755,12 @@ class Share extends \OC\Share\Constants {
 					if ($format == \OC_Share_Backend_File::FORMAT_GET_FOLDER_CONTENTS || $format == \OC_Share_Backend_File::FORMAT_FILE_APP_ROOT) {
 						$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `*PREFIX*share`.`parent`, `uid_owner`, '
 								. '`share_type`, `share_with`, `file_source`, `path`, `file_target`, `stime`, '
-								. '`permissions`, `expiration`, `storage`, `*PREFIX*filecache`.`parent` as `file_parent`, '
+								. '`*PREFIX*share`.`permissions`, `expiration`, `storage`, `*PREFIX*filecache`.`parent` as `file_parent`, '
 								. '`name`, `mtime`, `mimetype`, `mimepart`, `size`, `unencrypted_size`, `encrypted`, `etag`, `mail_send`';
 					} else {
 						$select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`,
 							`*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`,
-							`file_source`, `path`, `file_target`, `permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`';
+							`file_source`, `path`, `file_target`, `*PREFIX*share`.`permissions`, `stime`, `expiration`, `token`, `storage`, `mail_send`';
 					}
 				}
 			}
diff --git a/tests/lib/files/cache/permissions.php b/tests/lib/files/cache/permissions.php
deleted file mode 100644
index 4b284c2c8e2..00000000000
--- a/tests/lib/files/cache/permissions.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com>
- * This file is licensed under the Affero General Public License version 3 or
- * later.
- * See the COPYING-README file.
- */
-
-namespace Test\Files\Cache;
-
-use OC\Files\Storage\Temporary;
-
-class Permissions extends \PHPUnit_Framework_TestCase {
-	/***
-	 * @var \OC\Files\Cache\Permissions $permissionsCache
-	 */
-	private $permissionsCache;
-
-	function setUp() {
-		$this->permissionsCache = new \OC\Files\Cache\Permissions('dummy');
-	}
-
-	function testSimple() {
-		$ids = range(1, 10);
-		$user = uniqid();
-
-		$this->assertEquals(-1, $this->permissionsCache->get(1, $user));
-		$this->assertNotContains($user, $this->permissionsCache->getUsers(1));
-		$this->permissionsCache->set(1, $user, 1);
-		$this->assertEquals(1, $this->permissionsCache->get(1, $user));
-		$this->assertContains($user, $this->permissionsCache->getUsers(1));
-		$this->assertEquals(-1, $this->permissionsCache->get(2, $user));
-		$this->assertEquals(-1, $this->permissionsCache->get(1, $user . '2'));
-
-		$this->permissionsCache->set(1, $user, 2);
-		$this->assertEquals(2, $this->permissionsCache->get(1, $user));
-
-		$this->permissionsCache->set(2, $user, 1);
-		$this->assertEquals(1, $this->permissionsCache->get(2, $user));
-
-		$this->permissionsCache->remove(1, $user);
-		$this->assertEquals(-1, $this->permissionsCache->get(1, $user));
-		$this->permissionsCache->remove(1, $user . '2');
-		$this->assertEquals(1, $this->permissionsCache->get(2, $user));
-
-		$expected = array();
-		foreach ($ids as $id) {
-			$this->permissionsCache->set($id, $user, 10 + $id);
-			$expected[$id] = 10 + $id;
-		}
-		$this->assertEquals($expected, $this->permissionsCache->getMultiple($ids, $user));
-
-		$this->permissionsCache->removeMultiple(array(10, 9), $user);
-		unset($expected[9]);
-		unset($expected[10]);
-		$this->assertEquals($expected, $this->permissionsCache->getMultiple($ids, $user));
-
-		$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'));
-	}
-}
diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php
index fb06f2dff3d..1a42e656409 100644
--- a/tests/lib/files/cache/scanner.php
+++ b/tests/lib/files/cache/scanner.php
@@ -33,8 +33,6 @@ class Scanner extends \PHPUnit_Framework_TestCase {
 	function tearDown() {
 		if ($this->cache) {
 			$ids = $this->cache->getAll();
-			$permissionsCache = $this->storage->getPermissionsCache();
-			$permissionsCache->removeMultiple($ids, \OC_User::getUser());
 			$this->cache->clear();
 		}
 	}
diff --git a/tests/lib/files/cache/updater.php b/tests/lib/files/cache/updater.php
index e2fae0ae57f..b874e418100 100644
--- a/tests/lib/files/cache/updater.php
+++ b/tests/lib/files/cache/updater.php
@@ -328,35 +328,4 @@ class Updater extends \PHPUnit_Framework_TestCase {
 		$this->assertEquals($time, $cachedData['mtime']);
 	}
 
-	public function testUpdatePermissionsOnRescanOnlyForUpdatedFile() {
-		$permissionsCache = $this->storage->getPermissionsCache();
-		$scanner = $this->storage->getScanner();
-		$scanner->scan('');
-		$cache = $this->storage->getCache();
-		$loggedInUser = \OC_User::getUser();
-		\OC_User::setUserId(self::$user);
-		FileSystem::getDirectoryContent('/');
-		$past = time() - 600;
-		$cache->put('', array('storage_mtime' => $past));
-
-		$this->assertNotEquals(-1, $permissionsCache->get($cache->getId('foo.txt'), self::$user));
-		$this->assertNotEquals(-1, $permissionsCache->get($cache->getId('foo.png'), self::$user));
-
-		$permissionsCache->set($cache->getId('foo.png'), self::$user, 15);
-		FileSystem::file_put_contents('/foo.txt', 'asd');
-
-		$this->assertEquals(-1, $permissionsCache->get($cache->getId('foo.txt'), self::$user));
-		$this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
-
-		FileSystem::getDirectoryContent('/');
-
-		$this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
-
-		FileSystem::file_put_contents('/qwerty.txt', 'asd');
-		FileSystem::getDirectoryContent('/');
-
-		$this->assertEquals(15, $permissionsCache->get($cache->getId('foo.png'), self::$user));
-
-		\OC_User::setUserId($loggedInUser);
-	}
 }
diff --git a/tests/lib/files/cache/watcher.php b/tests/lib/files/cache/watcher.php
index 7f4f3c5ee98..22c11b9a4e0 100644
--- a/tests/lib/files/cache/watcher.php
+++ b/tests/lib/files/cache/watcher.php
@@ -23,8 +23,6 @@ class Watcher extends \PHPUnit_Framework_TestCase {
 		foreach ($this->storages as $storage) {
 			$cache = $storage->getCache();
 			$ids = $cache->getAll();
-			$permissionsCache = $storage->getPermissionsCache();
-			$permissionsCache->removeMultiple($ids, \OC_User::getUser());
 			$cache->clear();
 		}
 	}
diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php
index b1589a276ba..08200f35f57 100644
--- a/tests/lib/files/node/folder.php
+++ b/tests/lib/files/node/folder.php
@@ -155,19 +155,11 @@ class Folder extends \PHPUnit_Framework_TestCase {
 				array('fileid' => 3, 'path' => '/bar/foo/qwerty', 'name' => 'qwerty', 'size' => 200, 'mtime' => 55, 'mimetype' => 'httpd/unix-directory')
 			)));
 
-		$permissionsCache = $this->getMock('\OC\Files\Cache\Permissions', array(), array('/'));
-		$permissionsCache->expects($this->once())
-			->method('getDirectoryPermissions')
-			->will($this->returnValue(array(2 => \OCP\PERMISSION_ALL)));
-
 		$root->expects($this->once())
 			->method('getMountsIn')
 			->with('/bar/foo')
 			->will($this->returnValue(array()));
 
-		$storage->expects($this->any())
-			->method('getPermissionsCache')
-			->will($this->returnValue($permissionsCache));
 		$storage->expects($this->any())
 			->method('getCache')
 			->will($this->returnValue($cache));
diff --git a/tests/lib/files/view.php b/tests/lib/files/view.php
index b5e4d792350..f86aa633e74 100644
--- a/tests/lib/files/view.php
+++ b/tests/lib/files/view.php
@@ -39,8 +39,6 @@ class View extends \PHPUnit_Framework_TestCase {
 		foreach ($this->storages as $storage) {
 			$cache = $storage->getCache();
 			$ids = $cache->getAll();
-			$permissionsCache = $storage->getPermissionsCache();
-			$permissionsCache->removeMultiple($ids, \OC_User::getUser());
 			$cache->clear();
 		}
 	}
diff --git a/version.php b/version.php
index 28ef5ea72d0..39676d0189f 100644
--- a/version.php
+++ b/version.php
@@ -3,7 +3,7 @@
 // We only can count up. The 4. digit is only for the internal patchlevel to trigger DB upgrades
 // between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
 // when updating major/minor version number.
-$OC_Version=array(6, 90, 0, 3);
+$OC_Version=array(6, 90, 0, 4);
 
 // The human readable string
 $OC_VersionString='7.0 pre alpha';
-- 
GitLab