allow storage backends to implement custom permission management
This commit is contained in:
parent
bf2ac9f113
commit
cbcd9ba84a
|
@ -9,6 +9,22 @@
|
|||
namespace OC\Files\Cache;
|
||||
|
||||
class Permissions {
|
||||
/**
|
||||
* @var string $storageId
|
||||
*/
|
||||
private $storageId;
|
||||
|
||||
/**
|
||||
* @param \OC\Files\Storage\Storage|string $storage
|
||||
*/
|
||||
public function __construct($storage){
|
||||
if($storage instanceof \OC\Files\Storage\Storage){
|
||||
$this->storageId = $storage->getId();
|
||||
}else{
|
||||
$this->storageId = $storage;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* get the permissions for a single file
|
||||
*
|
||||
|
@ -16,7 +32,7 @@ class Permissions {
|
|||
* @param string $user
|
||||
* @return int (-1 if file no permissions set)
|
||||
*/
|
||||
static public function get($fileId, $user) {
|
||||
public function get($fileId, $user) {
|
||||
$query = \OC_DB::prepare('SELECT `permissions` FROM `*PREFIX*permissions` WHERE `user` = ? AND `fileid` = ?');
|
||||
$result = $query->execute(array($user, $fileId));
|
||||
if ($row = $result->fetchRow()) {
|
||||
|
@ -33,7 +49,7 @@ class Permissions {
|
|||
* @param string $user
|
||||
* @param int $permissions
|
||||
*/
|
||||
static public function set($fileId, $user, $permissions) {
|
||||
public function set($fileId, $user, $permissions) {
|
||||
if (self::get($fileId, $user) !== -1) {
|
||||
$query = \OC_DB::prepare('UPDATE `*PREFIX*permissions` SET `permissions` = ? WHERE `user` = ? AND `fileid` = ?');
|
||||
} else {
|
||||
|
@ -49,7 +65,7 @@ class Permissions {
|
|||
* @param string $user
|
||||
* @return int[]
|
||||
*/
|
||||
static public function getMultiple($fileIds, $user) {
|
||||
public function getMultiple($fileIds, $user) {
|
||||
if (count($fileIds) === 0) {
|
||||
return array();
|
||||
}
|
||||
|
@ -72,17 +88,15 @@ class Permissions {
|
|||
* @param int $fileId
|
||||
* @param string $user
|
||||
*/
|
||||
static public function remove($fileId, $user) {
|
||||
public function remove($fileId, $user) {
|
||||
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
|
||||
$query->execute(array($fileId, $user));
|
||||
}
|
||||
|
||||
static public function removeMultiple($fileIds, $user) {
|
||||
$params = $fileIds;
|
||||
$params[] = $user;
|
||||
$inPart = implode(', ', array_fill(0, count($fileIds), '?'));
|
||||
|
||||
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` IN (' . $inPart . ') AND `user` = ?');
|
||||
$query->execute($params);
|
||||
public function removeMultiple($fileIds, $user) {
|
||||
$query = \OC_DB::prepare('DELETE FROM `*PREFIX*permissions` WHERE `fileid` = ? AND `user` = ?');
|
||||
foreach($fileIds as $fileId){
|
||||
$query->execute(array($fileId, $user));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,19 +57,19 @@ abstract class Common implements \OC\Files\Storage\Storage {
|
|||
public function getPermissions($path){
|
||||
$permissions = 0;
|
||||
if($this->isCreatable($path)){
|
||||
$permissions |= \OCP\Share::PERMISSION_CREATE;
|
||||
$permissions |= \OCP\PERMISSION_CREATE;
|
||||
}
|
||||
if($this->isReadable($path)){
|
||||
$permissions |= \OCP\Share::PERMISSION_READ;
|
||||
$permissions |= \OCP\PERMISSION_READ;
|
||||
}
|
||||
if($this->isUpdatable($path)){
|
||||
$permissions |= \OCP\Share::PERMISSION_UPDATE;
|
||||
$permissions |= \OCP\PERMISSION_UPDATE;
|
||||
}
|
||||
if($this->isDeletable($path)){
|
||||
$permissions |= \OCP\Share::PERMISSION_DELETE;
|
||||
$permissions |= \OCP\PERMISSION_DELETE;
|
||||
}
|
||||
if($this->isSharable($path)){
|
||||
$permissions |= \OCP\Share::PERMISSION_SHARE;
|
||||
$permissions |= \OCP\PERMISSION_SHARE;
|
||||
}
|
||||
return $permissions;
|
||||
}
|
||||
|
@ -259,6 +259,10 @@ abstract class Common implements \OC\Files\Storage\Storage {
|
|||
return new \OC\Files\Cache\Scanner($this);
|
||||
}
|
||||
|
||||
public function getPermissionsCache(){
|
||||
return new \OC\Files\Cache\Permissions($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* get the owner of a path
|
||||
* @param string $path The path to get the owner
|
||||
|
|
|
@ -64,6 +64,11 @@ interface Storage{
|
|||
|
||||
public function getOwner($path);
|
||||
|
||||
/**
|
||||
* @return \OC\Files\Cache\Permissions
|
||||
*/
|
||||
public function getPermissionsCache();
|
||||
|
||||
/**
|
||||
* get the ETag for a file or folder
|
||||
*
|
||||
|
|
|
@ -701,7 +701,8 @@ class View {
|
|||
}
|
||||
}
|
||||
|
||||
$data['permissions'] = Cache\Permissions::get($data['fileid'], \OC_User::getUser());
|
||||
$permissionsCache = $storage->getPermissionsCache();
|
||||
$data['permissions'] = $permissionsCache->get($data['fileid'], \OC_User::getUser());
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
@ -759,8 +760,9 @@ class View {
|
|||
$files[$i]['type'] = $file['mimetype'] === 'httpd/unix-directory' ? 'dir' : 'file';
|
||||
$ids[] = $file['fileid'];
|
||||
}
|
||||
$permissionsCache = $storage->getPermissionsCache();
|
||||
|
||||
$permissions = Cache\Permissions::getMultiple($ids, \OC_User::getUser());
|
||||
$permissions = $permissionsCache->getMultiple($ids, \OC_User::getUser());
|
||||
foreach ($files as $i => $file) {
|
||||
$files[$i]['permissions'] = $permissions[$file['fileid']];
|
||||
}
|
||||
|
|
|
@ -9,39 +9,48 @@
|
|||
namespace Test\Files\Cache;
|
||||
|
||||
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, \OC\Files\Cache\Permissions::get(1, $user));
|
||||
\OC\Files\Cache\Permissions::set(1, $user, 1);
|
||||
$this->assertEquals(1, \OC\Files\Cache\Permissions::get(1, $user));
|
||||
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(2, $user));
|
||||
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(1, $user . '2'));
|
||||
$this->assertEquals(-1, $this->permissionsCache->get(1, $user));
|
||||
$this->permissionsCache->set(1, $user, 1);
|
||||
$this->assertEquals(1, $this->permissionsCache->get(1, $user));
|
||||
$this->assertEquals(-1, $this->permissionsCache->get(2, $user));
|
||||
$this->assertEquals(-1, $this->permissionsCache->get(1, $user . '2'));
|
||||
|
||||
\OC\Files\Cache\Permissions::set(1, $user, 2);
|
||||
$this->assertEquals(2, \OC\Files\Cache\Permissions::get(1, $user));
|
||||
$this->permissionsCache->set(1, $user, 2);
|
||||
$this->assertEquals(2, $this->permissionsCache->get(1, $user));
|
||||
|
||||
\OC\Files\Cache\Permissions::set(2, $user, 1);
|
||||
$this->assertEquals(1, \OC\Files\Cache\Permissions::get(2, $user));
|
||||
$this->permissionsCache->set(2, $user, 1);
|
||||
$this->assertEquals(1, $this->permissionsCache->get(2, $user));
|
||||
|
||||
\OC\Files\Cache\Permissions::remove(1, $user);
|
||||
$this->assertEquals(-1, \OC\Files\Cache\Permissions::get(1, $user));
|
||||
\OC\Files\Cache\Permissions::remove(1, $user . '2');
|
||||
$this->assertEquals(1, \OC\Files\Cache\Permissions::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) {
|
||||
\OC\Files\Cache\Permissions::set($id, $user, 10 + $id);
|
||||
$this->permissionsCache->set($id, $user, 10 + $id);
|
||||
$expected[$id] = 10 + $id;
|
||||
}
|
||||
$this->assertEquals($expected, \OC\Files\Cache\Permissions::getMultiple($ids, $user));
|
||||
$this->assertEquals($expected, $this->permissionsCache->getMultiple($ids, $user));
|
||||
|
||||
\OC\Files\Cache\Permissions::removeMultiple(array(10, 9), $user);
|
||||
$this->permissionsCache->removeMultiple(array(10, 9), $user);
|
||||
unset($expected[9]);
|
||||
unset($expected[10]);
|
||||
$this->assertEquals($expected, \OC\Files\Cache\Permissions::getMultiple($ids, $user));
|
||||
$this->assertEquals($expected, $this->permissionsCache->getMultiple($ids, $user));
|
||||
|
||||
\OC\Files\Cache\Permissions::removeMultiple($ids, $user);
|
||||
$this->permissionsCache->removeMultiple($ids, $user);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -112,7 +112,8 @@ class Scanner extends \UnitTestCase {
|
|||
|
||||
function tearDown() {
|
||||
$ids = $this->cache->getAll();
|
||||
\OC\Files\Cache\Permissions::removeMultiple($ids, \OC_User::getUser());
|
||||
$permissionsCache = $this->storage->getPermissionsCache();
|
||||
$permissionsCache->removeMultiple($ids, \OC_User::getUser());
|
||||
$this->cache->clear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,8 @@ class Watcher extends \PHPUnit_Framework_TestCase {
|
|||
foreach ($this->storages as $storage) {
|
||||
$cache = $storage->getCache();
|
||||
$ids = $cache->getAll();
|
||||
\OC\Files\Cache\Permissions::removeMultiple($ids, \OC_User::getUser());
|
||||
$permissionsCache = $storage->getPermissionsCache();
|
||||
$permissionsCache->removeMultiple($ids, \OC_User::getUser());
|
||||
$cache->clear();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,7 +21,8 @@ class View extends \PHPUnit_Framework_TestCase {
|
|||
foreach ($this->storages as $storage) {
|
||||
$cache = $storage->getCache();
|
||||
$ids = $cache->getAll();
|
||||
\OC\Files\Cache\Permissions::removeMultiple($ids, \OC_User::getUser());
|
||||
$permissionsCache = $storage->getPermissionsCache();
|
||||
$permissionsCache->removeMultiple($ids, \OC_User::getUser());
|
||||
$cache->clear();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue