summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Schießle <schiessle@owncloud.com>2013-05-29 13:10:26 +0200
committerBjörn Schießle <schiessle@owncloud.com>2013-05-29 13:10:26 +0200
commitb44192f3668ae2e8e9685479fa62a78cfc5500ba (patch)
tree151f131b64ad93db9a82e55021ac697a43620655
parent71a532fc4d45fafa66ce748e1296f03f57c2ea75 (diff)
downloadnextcloud-server-b44192f3668ae2e8e9685479fa62a78cfc5500ba.tar.gz
nextcloud-server-b44192f3668ae2e8e9685479fa62a78cfc5500ba.zip
check list of users with access to the file from the bottom to the top. This way we avoid calling getFileInfo() on every dir, which creates a lot of overhead, especially for external storages
-rw-r--r--apps/files_encryption/lib/util.php4
-rw-r--r--lib/public/share.php20
2 files changed, 15 insertions, 9 deletions
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index 2452f4c6ae3..0ff76e60580 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -1028,7 +1028,7 @@ class Util {
if ($sharingEnabled) {
// Find out who, if anyone, is sharing the file
- $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner, true, true, true);
+ $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner, true);
$userIds = $result['users'];
if ($result['public']) {
$userIds[] = $this->publicShareKeyId;
@@ -1457,7 +1457,7 @@ class Util {
// Find out who, if anyone, is sharing the file
if ($sharingEnabled) {
- $result = \OCP\Share::getUsersSharingFile($file, $this->userId, true, true, true);
+ $result = \OCP\Share::getUsersSharingFile($file, $this->userId, true);
$userIds = $result['users'];
$userIds[] = $this->recoveryKeyId;
if ($result['public']) {
diff --git a/lib/public/share.php b/lib/public/share.php
index 03d662676c6..58e6131af58 100644
--- a/lib/public/share.php
+++ b/lib/public/share.php
@@ -133,17 +133,16 @@ class Share {
* @note $path needs to be relative to user data dir, e.g. 'file.txt'
* not '/admin/data/file.txt'
*/
- public static function getUsersSharingFile($path, $user, $includeOwner = false, $removeDuplicates = true) {
+ public static function getUsersSharingFile($path, $user, $includeOwner = false) {
- $path_parts = explode(DIRECTORY_SEPARATOR, trim($path, DIRECTORY_SEPARATOR));
- $path = '';
$shares = array();
$publicShare = false;
$view = new \OC\Files\View('/' . $user . '/files/');
- foreach ($path_parts as $p) {
- $path .= '/' . $p;
- $meta = $view->getFileInfo(\OC_Filesystem::normalizePath($path));
- $source = $meta['fileid'];
+ $meta = $view->getFileInfo(\OC_Filesystem::normalizePath($path));
+ $source = $meta['fileid'];
+ $cache = new \OC\Files\Cache\Cache($meta['storage']);
+
+ while ($path !== 'files') {
// Fetch all shares of this file path from DB
$query = \OC_DB::prepare(
@@ -203,6 +202,13 @@ class Share {
if ($result->fetchRow()) {
$publicShare = true;
}
+
+ // let's get the parent for the next round
+ $meta = $cache->get((int)$source);
+ $parent = $meta['parent'];
+ $parentMeta = $cache->get((int)$parent);
+ $path = $parentMeta['path'];
+ $source = $parent;
}
// Include owner in list of users, if requested
if ($includeOwner) {