mirror of https://github.com/nextcloud/server.git
- 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 migrationremotes/origin/ldap_group_count
parent
ade6ed3797
commit
da3974bcb2
@ -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
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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'));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue