Browse Source
- drop permissions table and related code
- 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
23 changed files with 29 additions and 640 deletions
-
2apps/files/appinfo/app.php
-
2apps/files_sharing/lib/api.php
-
3apps/files_sharing/lib/cache.php
-
112apps/files_sharing/lib/permissions.php
-
4apps/files_sharing/lib/sharedstorage.php
-
63db_structure.xml
-
107lib/private/files/cache/backgroundwatcher.php
-
17lib/private/files/cache/cache.php
-
170lib/private/files/cache/permissions.php
-
10lib/private/files/cache/scanner.php
-
5lib/private/files/node/folder.php
-
7lib/private/files/storage/common.php
-
8lib/private/files/storage/storage.php
-
10lib/private/files/storage/wrapper/wrapper.php
-
19lib/private/files/view.php
-
8lib/private/share/share.php
-
75tests/lib/files/cache/permissions.php
-
2tests/lib/files/cache/scanner.php
-
31tests/lib/files/cache/updater.php
-
2tests/lib/files/cache/watcher.php
-
8tests/lib/files/node/folder.php
-
2tests/lib/files/view.php
-
2version.php
@ -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')); |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue