Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions apps/files_sharing/lib/Cache.php
Original file line number Diff line number Diff line change
Expand Up @@ -64,23 +64,29 @@ public function __construct($storage, ICacheEntry $sourceRootInfo) {
$this->sourceRootInfo = $sourceRootInfo;
$this->numericId = $sourceRootInfo->getStorageId();

$absoluteRoot = $this->sourceRootInfo->getPath();

// the sourceRootInfo path is the absolute path of the folder in the "real" storage
// in the case where a folder is shared from a Jail we need to ensure that the share Jail
// has it's root set relative to the source Jail
$currentStorage = $storage->getSourceStorage();
if ($currentStorage->instanceOfStorage(Jail::class)) {
/** @var Jail $currentStorage */
$absoluteRoot = $currentStorage->getJailedPath($absoluteRoot);
}

parent::__construct(
null,
$absoluteRoot
null
);
}

protected function getRoot() {
if (is_null($this->root)) {
$absoluteRoot = $this->sourceRootInfo->getPath();

// the sourceRootInfo path is the absolute path of the folder in the "real" storage
// in the case where a folder is shared from a Jail we need to ensure that the share Jail
// has it's root set relative to the source Jail
$currentStorage = $this->storage->getSourceStorage();
if ($currentStorage->instanceOfStorage(Jail::class)) {
/** @var Jail $currentStorage */
$absoluteRoot = $currentStorage->getJailedPath($absoluteRoot);
}
$this->root = $absoluteRoot;
}
return $this->root;
}

public function getCache() {
if (is_null($this->cache)) {
$sourceStorage = $this->storage->getSourceStorage();
Expand All @@ -104,7 +110,7 @@ public function getNumericStorageId() {

public function get($file) {
if ($this->rootUnchanged && ($file === '' || $file === $this->sourceRootInfo->getId())) {
return $this->formatCacheEntry(clone $this->sourceRootInfo);
return $this->formatCacheEntry(clone $this->sourceRootInfo, '');
}
return parent::get($file);
}
Expand All @@ -129,16 +135,20 @@ public function moveFromCache(\OCP\Files\Cache\ICache $sourceCache, $sourcePath,
return parent::moveFromCache($sourceCache, $sourcePath, $targetPath);
}

protected function formatCacheEntry($entry) {
$path = isset($entry['path']) ? $entry['path'] : '';
$entry = parent::formatCacheEntry($entry);
protected function formatCacheEntry($entry, $path = null) {
if (is_null($path)) {
$path = isset($entry['path']) ? $entry['path'] : '';
$entry['path'] = $this->getJailedPath($path);
} else {
$entry['path'] = $path;
}
$sharePermissions = $this->storage->getPermissions($path);
if (isset($entry['permissions'])) {
$entry['permissions'] &= $sharePermissions;
} else {
$entry['permissions'] = $sharePermissions;
}
$entry['uid_owner'] = $this->storage->getOwner($path);
$entry['uid_owner'] = $this->storage->getOwner('');
$entry['displayname_owner'] = $this->getOwnerDisplayName();
if ($path === '') {
$entry['is_share_mount_point'] = true;
Expand Down
23 changes: 14 additions & 9 deletions lib/private/Files/Cache/Wrapper/CacheJail.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
*/

namespace OC\Files\Cache\Wrapper;

use OC\Files\Cache\Cache;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Search\ISearchQuery;
Expand All @@ -49,11 +50,15 @@ public function __construct($cache, $root) {
$this->root = $root;
}

protected function getRoot() {
return $this->root;
}

protected function getSourcePath($path) {
if ($path === '') {
return $this->root;
return $this->getRoot();
} else {
return $this->root . '/' . ltrim($path, '/');
return $this->getRoot() . '/' . ltrim($path, '/');
}
}

Expand All @@ -62,13 +67,13 @@ protected function getSourcePath($path) {
* @return null|string the jailed path or null if the path is outside the jail
*/
protected function getJailedPath($path) {
if ($this->root === '') {
if ($this->getRoot() === '') {
return $path;
}
$rootLength = strlen($this->root) + 1;
if ($path === $this->root) {
$rootLength = strlen($this->getRoot()) + 1;
if ($path === $this->getRoot()) {
return '';
} else if (substr($path, 0, $rootLength) === $this->root . '/') {
} else if (substr($path, 0, $rootLength) === $this->getRoot() . '/') {
return substr($path, $rootLength);
} else {
return null;
Expand All @@ -87,8 +92,8 @@ protected function formatCacheEntry($entry) {
}

protected function filterCacheEntry($entry) {
$rootLength = strlen($this->root) + 1;
return ($entry['path'] === $this->root) or (substr($entry['path'], 0, $rootLength) === $this->root . '/');
$rootLength = strlen($this->getRoot()) + 1;
return ($entry['path'] === $this->getRoot()) or (substr($entry['path'], 0, $rootLength) === $this->getRoot() . '/');
}

/**
Expand Down Expand Up @@ -190,7 +195,7 @@ protected function getMoveInfo($path) {
* remove all entries for files that are stored on the storage from the cache
*/
public function clear() {
$this->getCache()->remove($this->root);
$this->getCache()->remove($this->getRoot());
}

/**
Expand Down