Add helper method in Wrapper

Signed-off-by: Carl Schwan <carl@carlschwan.eu>
This commit is contained in:
Carl Schwan 2022-01-10 11:36:51 +01:00 committed by backportbot[bot]
parent 3c060e54fa
commit c3fcb2c199
2 changed files with 25 additions and 13 deletions

View file

@ -73,11 +73,6 @@ class FileSystemTags implements ICheck, IFileCheck {
* @return bool
*/
public function executeCheck($operator, $value) {
if (str_starts_with($this->path, '__groupfolders')) {
// System tags are always empty in this case and executeCheck is called
// a second time with the jailedPath
return false;
}
$systemTags = $this->getSystemTags();
return ($operator === 'is') === in_array($value, $systemTags);
}
@ -143,13 +138,11 @@ class FileSystemTags implements ICheck, IFileCheck {
// Special implementation for groupfolder since all groupfolders share the same storage
// id so add the group folder id in the cache key too.
$groupFolderStorage = $this->storage;
$groupFolderStorageClass = \OCA\GroupFolders\Mount\GroupFolderStorage::class;
while ($groupFolderStorage->instanceOfStorage(Wrapper::class)) {
if ($groupFolderStorage instanceof $groupFolderStorageClass) {
break;
}
/** @var Wrapper $groupFolderStorage */
$groupFolderStorage = $groupFolderStorage->getWrapperStorage();
if ($this->storage instanceof Wrapper) {
$groupFolderStorage = $this->storage->getInstanceOfStorage(\OCA\GroupFolders\Mount\GroupFolderStorage::class);
}
if ($groupFolderStorage === null) {
throw new \LogicException('Should not happen: Storage is instance of GroupFolderStorage but no group folder storage found while unwrapping.');
}
/** @psalm-suppress UndefinedMethod */
$cacheId = $cache->getNumericStorageId() . '/' . $groupFolderStorage->getFolderId();

View file

@ -486,7 +486,7 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
/**
* Check if the storage is an instance of $class or is a wrapper for a storage that is an instance of $class
*
* @param string $class
* @param class-string<IStorage> $class
* @return bool
*/
public function instanceOfStorage($class) {
@ -497,6 +497,25 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return is_a($this, $class) or $this->getWrapperStorage()->instanceOfStorage($class);
}
/**
* @template T of IStorage
* @param class-string<T> $class
* @return ?T
*/
public function getInstanceOfStorage(string $class): ?IStorage {
$storage = $this;
while ($storage->instanceOfStorage(Wrapper::class)) {
if ($storage instanceof $class) {
break;
}
$storage = $storage->getWrapperStorage();
}
if (!is_a($storage, $class)) {
return null;
}
return $storage;
}
/**
* Pass any methods custom to specific storage implementations to the wrapped storage
*