diff options
Diffstat (limited to 'lib/private')
-rw-r--r-- | lib/private/encryption/file.php | 27 | ||||
-rw-r--r-- | lib/private/files/cache/watcher.php | 59 | ||||
-rw-r--r-- | lib/private/files/view.php | 42 | ||||
-rw-r--r-- | lib/private/ocs/corecapabilities.php | 3 | ||||
-rw-r--r-- | lib/private/share/share.php | 5 | ||||
-rw-r--r-- | lib/private/template.php | 1 |
6 files changed, 92 insertions, 45 deletions
diff --git a/lib/private/encryption/file.php b/lib/private/encryption/file.php index 5a7357b9e28..6d261f46d0f 100644 --- a/lib/private/encryption/file.php +++ b/lib/private/encryption/file.php @@ -27,6 +27,13 @@ class File implements \OCP\Encryption\IFile { /** @var Util */ protected $util; + /** + * cache results of already checked folders + * + * @var array + */ + protected $cache; + public function __construct(Util $util) { $this->util = $util; } @@ -53,10 +60,24 @@ class File implements \OCP\Encryption\IFile { $ownerPath = substr($ownerPath, strlen('/files')); $ownerPath = $this->util->stripPartialFileExtension($ownerPath); + + // first get the shares for the parent and cache the result so that we don't + // need to check all parents for every file + $parent = dirname($ownerPath); + if (isset($this->cache[$parent])) { + $resultForParents = $this->cache[$parent]; + } else { + $resultForParents = \OCP\Share::getUsersSharingFile($parent, $owner); + $this->cache[$parent] = $resultForParents; + } + $userIds = \array_merge($userIds, $resultForParents['users']); + $public = $resultForParents['public'] || $resultForParents['remote']; + + // Find out who, if anyone, is sharing the file - $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner); - $userIds = \array_merge($userIds, $result['users']); - $public = $result['public'] || $result['remote']; + $resultForFile = \OCP\Share::getUsersSharingFile($ownerPath, $owner, false, false, false); + $userIds = \array_merge($userIds, $resultForFile['users']); + $public = $resultForFile['public'] || $resultForFile['remote'] || $public; // check if it is a group mount if (\OCP\App::isEnabled("files_external")) { diff --git a/lib/private/files/cache/watcher.php b/lib/private/files/cache/watcher.php index ff97a1f9c01..e660e56bfee 100644 --- a/lib/private/files/cache/watcher.php +++ b/lib/private/files/cache/watcher.php @@ -74,37 +74,58 @@ class Watcher { } /** - * check $path for updates + * check $path for updates and update if needed * * @param string $path * @param array $cachedEntry * @return boolean true if path was updated */ public function checkUpdate($path, $cachedEntry = null) { - if ($this->watchPolicy === self::CHECK_ALWAYS or ($this->watchPolicy === self::CHECK_ONCE and array_search($path, $this->checkedPaths) === false)) { - if (is_null($cachedEntry)) { - $cachedEntry = $this->cache->get($path); - } - $this->checkedPaths[] = $path; - if ($this->storage->hasUpdated($path, $cachedEntry['storage_mtime'])) { - if ($this->storage->is_dir($path)) { - $this->scanner->scan($path, Scanner::SCAN_SHALLOW); - } else { - $this->scanner->scanFile($path); - } - if ($cachedEntry['mimetype'] === 'httpd/unix-directory') { - $this->cleanFolder($path); - } - $this->cache->correctFolderSize($path); - return true; - } - return false; + if (is_null($cachedEntry)) { + $cachedEntry = $this->cache->get($path); + } + if ($this->needsUpdate($path, $cachedEntry)) { + $this->update($path, $cachedEntry); + return true; } else { return false; } } /** + * Update the cache for changes to $path + * + * @param string $path + * @param array $cachedData + */ + public function update($path, $cachedData) { + if ($this->storage->is_dir($path)) { + $this->scanner->scan($path, Scanner::SCAN_SHALLOW); + } else { + $this->scanner->scanFile($path); + } + if ($cachedData['mimetype'] === 'httpd/unix-directory') { + $this->cleanFolder($path); + } + $this->cache->correctFolderSize($path); + } + + /** + * Check if the cache for $path needs to be updated + * + * @param string $path + * @param array $cachedData + * @return bool + */ + public function needsUpdate($path, $cachedData) { + if ($this->watchPolicy === self::CHECK_ALWAYS or ($this->watchPolicy === self::CHECK_ONCE and array_search($path, $this->checkedPaths) === false)) { + $this->checkedPaths[] = $path; + return $this->storage->hasUpdated($path, $cachedData['storage_mtime']); + } + return false; + } + + /** * remove deleted files in $path from the cache * * @param string $path diff --git a/lib/private/files/view.php b/lib/private/files/view.php index a11df53705c..887b18530d7 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -1191,13 +1191,13 @@ class View { if ($storage) { $cache = $storage->getCache($internalPath); - try { - $this->lockFile($relativePath, ILockingProvider::LOCK_SHARED); - $data = $cache->get($internalPath); - $watcher = $storage->getWatcher($internalPath); + $data = $cache->get($internalPath); + $watcher = $storage->getWatcher($internalPath); + try { // if the file is not in the cache or needs to be updated, trigger the scanner and reload the data if (!$data) { + $this->lockFile($relativePath, ILockingProvider::LOCK_SHARED); if (!$storage->file_exists($internalPath)) { $this->unlockFile($relativePath, ILockingProvider::LOCK_SHARED); return false; @@ -1205,14 +1205,16 @@ class View { $scanner = $storage->getScanner($internalPath); $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW); $data = $cache->get($internalPath); - } else if (!Cache\Scanner::isPartialFile($internalPath) && $watcher->checkUpdate($internalPath, $data)) { + $this->unlockFile($relativePath, ILockingProvider::LOCK_SHARED); + } else if (!Cache\Scanner::isPartialFile($internalPath) && $watcher->needsUpdate($internalPath, $data)) { + $this->lockFile($relativePath, ILockingProvider::LOCK_SHARED); + $watcher->update($internalPath, $data); $this->updater->propagate($path); $data = $cache->get($internalPath); + $this->unlockFile($relativePath, ILockingProvider::LOCK_SHARED); } - $this->unlockFile($relativePath, ILockingProvider::LOCK_SHARED); } catch (LockedException $e) { - // dont try to update the cache when the file is locked - $data = $cache->get($internalPath); + // if the file is locked we just use the old cache info } if ($data and isset($data['fileid'])) { @@ -1278,12 +1280,11 @@ class View { */ $files = array(); + $data = $cache->get($internalPath); + $watcher = $storage->getWatcher($internalPath); try { - $this->lockFile($directory, ILockingProvider::LOCK_SHARED); - - $data = $cache->get($internalPath); - $watcher = $storage->getWatcher($internalPath); if (!$data or $data['size'] === -1) { + $this->lockFile($directory, ILockingProvider::LOCK_SHARED); if (!$storage->file_exists($internalPath)) { $this->unlockFile($directory, ILockingProvider::LOCK_SHARED); return array(); @@ -1291,20 +1292,21 @@ class View { $scanner = $storage->getScanner($internalPath); $scanner->scan($internalPath, Cache\Scanner::SCAN_SHALLOW); $data = $cache->get($internalPath); - } else if ($watcher->checkUpdate($internalPath, $data)) { + $this->unlockFile($directory, ILockingProvider::LOCK_SHARED); + } else if ($watcher->needsUpdate($internalPath, $data)) { + $this->lockFile($directory, ILockingProvider::LOCK_SHARED); + $watcher->update($internalPath, $data); $this->updater->propagate($path); $data = $cache->get($internalPath); + $this->unlockFile($directory, ILockingProvider::LOCK_SHARED); } - - $folderId = $data['fileid']; - $contents = $cache->getFolderContentsById($folderId); //TODO: mimetype_filter - - $this->unlockFile($directory, ILockingProvider::LOCK_SHARED); } catch (LockedException $e) { - // dont try to update the cache when the file is locked - $contents = $cache->getFolderContents($internalPath); + // if the file is locked we just use the old cache info } + $folderId = $data['fileid']; + $contents = $cache->getFolderContentsById($folderId); //TODO: mimetype_filter + foreach ($contents as $content) { if ($content['permissions'] === 0) { $content['permissions'] = $storage->getPermissions($content['path']); diff --git a/lib/private/ocs/corecapabilities.php b/lib/private/ocs/corecapabilities.php index 0fba7bfd7d7..f2d530a8419 100644 --- a/lib/private/ocs/corecapabilities.php +++ b/lib/private/ocs/corecapabilities.php @@ -49,7 +49,8 @@ class CoreCapabilities implements ICapability { public function getCapabilities() { return [ 'core' => [ - 'pollinterval' => $this->config->getSystemValue('pollinterval', 60) + 'pollinterval' => $this->config->getSystemValue('pollinterval', 60), + 'webdav-root' => $this->config->getSystemValue('webdav-root', 'remote.php/webdav'), ] ]; } diff --git a/lib/private/share/share.php b/lib/private/share/share.php index e79b2204a6f..0693a9c08fb 100644 --- a/lib/private/share/share.php +++ b/lib/private/share/share.php @@ -122,11 +122,12 @@ class Share extends Constants { * @param string $ownerUser owner of the file * @param boolean $includeOwner include owner to the list of users with access to the file * @param boolean $returnUserPaths Return an array with the user => path map + * @param boolean $recursive take all parent folders into account (default true) * @return array * @note $path needs to be relative to user data dir, e.g. 'file.txt' * not '/admin/data/file.txt' */ - public static function getUsersSharingFile($path, $ownerUser, $includeOwner = false, $returnUserPaths = false) { + public static function getUsersSharingFile($path, $ownerUser, $includeOwner = false, $returnUserPaths = false, $recursive = true) { Filesystem::initMountPoints($ownerUser); $shares = $sharePaths = $fileTargets = array(); @@ -252,7 +253,7 @@ class Share extends Constants { // let's get the parent for the next round $meta = $cache->get((int)$source); - if($meta !== false) { + if ($recursive === true && $meta !== false) { $source = (int)$meta['parent']; } else { $source = -1; diff --git a/lib/private/template.php b/lib/private/template.php index 5a08e15d95b..38527cdc461 100644 --- a/lib/private/template.php +++ b/lib/private/template.php @@ -108,6 +108,7 @@ class OC_Template extends \OC\Template\Base { OC_Util::addVendorStyle('jquery-ui/themes/base/jquery-ui',null,true); OC_Util::addStyle("multiselect",null,true); OC_Util::addStyle("fixes",null,true); + OC_Util::addStyle("global",null,true); OC_Util::addStyle("apps",null,true); OC_Util::addStyle("fonts",null,true); OC_Util::addStyle("icons",null,true); |