- 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