Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2022-03-17 18:05:52 +0300
committerRobin Appelman <robin@icewind.nl>2022-03-18 00:21:16 +0300
commit84f464550ad632ecbcd1dbe4b9796053047622a7 (patch)
treeac9435f94175ea927305cee49407d3527c6a6d97 /lib/private/Files/Storage
parentbf48c0b1b4bd3677a70aa0d7c8a50a5253c4cb5b (diff)
some file scanner performance improvements
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'lib/private/Files/Storage')
-rw-r--r--lib/private/Files/Storage/Common.php7
-rw-r--r--lib/private/Files/Storage/Local.php18
2 files changed, 20 insertions, 5 deletions
diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php
index 7239c58a8a1..8e7e56e6ca2 100644
--- a/lib/private/Files/Storage/Common.php
+++ b/lib/private/Files/Storage/Common.php
@@ -52,6 +52,7 @@ use OC\Files\Storage\Wrapper\Jail;
use OC\Files\Storage\Wrapper\Wrapper;
use OCP\Files\EmptyFileNameException;
use OCP\Files\FileNameTooLongException;
+use OCP\Files\ForbiddenException;
use OCP\Files\GenericFileException;
use OCP\Files\InvalidCharacterInPathException;
use OCP\Files\InvalidDirectoryException;
@@ -702,6 +703,10 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
* @inheritdoc
*/
public function getMetaData($path) {
+ if (Filesystem::isFileBlacklisted($path)) {
+ throw new ForbiddenException('Invalid path: ' . $path, false);
+ }
+
$permissions = $this->getPermissions($path);
if (!$permissions & \OCP\Constants::PERMISSION_READ) {
//can't read, nothing we can do
@@ -880,7 +885,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
if (is_resource($dh)) {
$basePath = rtrim($directory, '/');
while (($file = readdir($dh)) !== false) {
- if (!Filesystem::isIgnoredDir($file) && !Filesystem::isFileBlacklisted($file)) {
+ if (!Filesystem::isIgnoredDir($file)) {
$childPath = $basePath . '/' . trim($file, '/');
$metadata = $this->getMetaData($childPath);
if ($metadata !== null) {
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index 6406beaeebc..34ab9a5fc97 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -47,7 +47,9 @@ use OC\Files\Storage\Wrapper\Jail;
use OCP\Constants;
use OCP\Files\ForbiddenException;
use OCP\Files\GenericFileException;
+use OCP\Files\IMimeTypeDetector;
use OCP\Files\Storage\IStorage;
+use OCP\IConfig;
use OCP\ILogger;
/**
@@ -60,6 +62,10 @@ class Local extends \OC\Files\Storage\Common {
protected $realDataDir;
+ private IConfig $config;
+
+ private IMimeTypeDetector $mimeTypeDetector;
+
public function __construct($arguments) {
if (!isset($arguments['datadir']) || !is_string($arguments['datadir'])) {
throw new \InvalidArgumentException('No data directory set for local storage');
@@ -76,6 +82,8 @@ class Local extends \OC\Files\Storage\Common {
$this->datadir .= '/';
}
$this->dataDirLength = strlen($this->realDataDir);
+ $this->config = \OC::$server->get(IConfig::class);
+ $this->mimeTypeDetector = \OC::$server->get(IMimeTypeDetector::class);
}
public function __destruct() {
@@ -155,6 +163,9 @@ class Local extends \OC\Files\Storage\Common {
$statResult['size'] = $filesize;
$statResult[7] = $filesize;
}
+ if (is_array($statResult)) {
+ $statResult['full_path'] = $fullPath;
+ }
return $statResult;
}
@@ -181,15 +192,14 @@ class Local extends \OC\Files\Storage\Common {
}
if (!($path === '' || $path === '/')) { // deletable depends on the parents unix permissions
- $fullPath = $this->getSourcePath($path);
- $parent = dirname($fullPath);
+ $parent = dirname($stat['full_path']);
if (is_writable($parent)) {
$permissions += Constants::PERMISSION_DELETE;
}
}
$data = [];
- $data['mimetype'] = $isDir ? 'httpd/unix-directory' : \OC::$server->getMimeTypeDetector()->detectPath($path);
+ $data['mimetype'] = $isDir ? 'httpd/unix-directory' : $this->mimeTypeDetector->detectPath($path);
$data['mtime'] = $stat['mtime'];
if ($data['mtime'] === false) {
$data['mtime'] = time();
@@ -450,7 +460,7 @@ class Local extends \OC\Files\Storage\Common {
$fullPath = $this->datadir . $path;
$currentPath = $path;
- $allowSymlinks = \OC::$server->getConfig()->getSystemValue('localstorage.allowsymlinks', false);
+ $allowSymlinks = $this->config->getSystemValue('localstorage.allowsymlinks', false);
if ($allowSymlinks || $currentPath === '') {
return $fullPath;
}