Merge pull request #8698 from owncloud/sharing_improve_permissions

get permissions directly from share storage to avoid additional db calls
This commit is contained in:
Thomas Müller 2014-06-03 19:13:51 +02:00
commit 6764d5b122
3 changed files with 30 additions and 36 deletions

View File

@ -27,25 +27,13 @@ class Shared_Permissions extends Permissions {
*
* @param int $fileId
* @param string $user
* @return int (-1 if file no permissions set)
* @return int permissions
*/
public function get($fileId, $user) {
if ($fileId == -1) {
// if we ask for the mount point return -1 so that we can get the correct
// permissions by the path, with the root fileId we have no idea which share is meant
return -1;
}
$source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
null, true);
$permissions = $this->storage->getPermissions();
$permission = -1;
if ($source) {
$permission = $this->updatePermissions($source['permissions']);
}
return $permission;
return $this->updatePermissions($permissions);
}
/**
@ -53,16 +41,7 @@ class Shared_Permissions extends Permissions {
* @param string $user
*/
private function getFile($fileId, $user) {
if ($fileId == -1) {
return \OCP\PERMISSION_READ;
}
$source = \OCP\Share::getItemSharedWithBySource('file', $fileId, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE,
null, false);
if ($source) {
return $this->updatePermissions($source['permissions']);
} else {
return -1;
}
return $this->get($fileId, $user);
}
/**
@ -84,11 +63,9 @@ class Shared_Permissions extends Permissions {
* @return int[]
*/
public function getMultiple($fileIds, $user) {
if (count($fileIds) === 0) {
return array();
}
$filePermissions = array();
foreach ($fileIds as $fileId) {
$filePermissions[$fileId] = self::get($fileId, $user);
$filePermissions[$fileId] = $this->get($fileId, $user);
}
return $filePermissions;
}
@ -101,16 +78,19 @@ class Shared_Permissions extends Permissions {
* @return int[]
*/
public function getDirectoryPermissions($parentId, $user) {
// Root of the Shared folder
if ($parentId === -1) {
return \OCP\Share::getItemsSharedWith('file', \OC_Share_Backend_File::FORMAT_PERMISSIONS);
if ($parentId === -1 && $this->storage->instanceOfStorage('\OC\Files\Storage\Shared')) {
$fileCacheId = $this->storage->getSourceId();
} else {
$fileCacheId = $parentId;
}
$permissions = $this->getFile($parentId, $user);
$query = \OC_DB::prepare('SELECT `fileid` FROM `*PREFIX*filecache` WHERE `parent` = ?');
$result = $query->execute(array($parentId));
$result = $query->execute(array($fileCacheId));
$permissions = $this->get($parentId, $user);
$filePermissions = array();
while ($row = $result->fetchRow()) {
$filePermissions[$row['fileid']] = $this->updatePermissions($permissions);
$filePermissions[$row['fileid']] = $permissions;
}
return $filePermissions;
}

View File

@ -102,7 +102,7 @@ class Shared extends \OC\Files\Storage\Common {
* @param string $target Shared target file path
* @return int CRUDS permissions granted
*/
public function getPermissions($target) {
public function getPermissions($target = '') {
$permissions = $this->share['permissions'];
// part file are always have delete permissions
if (pathinfo($target, PATHINFO_EXTENSION) === 'part') {

View File

@ -14,15 +14,29 @@ class Permissions {
*/
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;
}
}
}
/**