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:
authorVincent Petry <vincent@nextcloud.com>2021-11-17 11:19:10 +0300
committerVincent Petry <vincent@nextcloud.com>2021-11-17 11:43:25 +0300
commitc92a0e415260dccb9092b9312ccd727de81bd0f7 (patch)
treee44c698206ca82b7091cf1c272e4e6132a6ac9f7 /lib/private/Files/Storage
parent67ebe75d0ee02977b95e43a31516d936d18514a2 (diff)
Normalize directory entries in Encoding wrapper
Directory entry file names are now normalized in getMetaData(), getDirectoryContents() and opendir(). This makes the scanner work properly as it assumes pre-normalized names. In case the names were not normalized, the scanner will now skip the entries and display a warning when applicable. Signed-off-by: Vincent Petry <vincent@nextcloud.com>
Diffstat (limited to 'lib/private/Files/Storage')
-rw-r--r--lib/private/Files/Storage/Wrapper/Encoding.php14
-rw-r--r--lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php55
2 files changed, 66 insertions, 3 deletions
diff --git a/lib/private/Files/Storage/Wrapper/Encoding.php b/lib/private/Files/Storage/Wrapper/Encoding.php
index ac27697e68c..d6201dc8877 100644
--- a/lib/private/Files/Storage/Wrapper/Encoding.php
+++ b/lib/private/Files/Storage/Wrapper/Encoding.php
@@ -29,6 +29,7 @@
namespace OC\Files\Storage\Wrapper;
use OC\Cache\CappedMemoryCache;
+use OC\Files\Filesystem;
use OCP\Files\Storage\IStorage;
use OCP\ICache;
@@ -162,7 +163,8 @@ class Encoding extends Wrapper {
* @return resource|bool
*/
public function opendir($path) {
- return $this->storage->opendir($this->findPathToUse($path));
+ $handle = $this->storage->opendir($this->findPathToUse($path));
+ return EncodingDirectoryWrapper::wrap($handle);
}
/**
@@ -532,10 +534,16 @@ class Encoding extends Wrapper {
}
public function getMetaData($path) {
- return $this->storage->getMetaData($this->findPathToUse($path));
+ $entry = $this->storage->getMetaData($this->findPathToUse($path));
+ $entry['name'] = trim(Filesystem::normalizePath($entry['name']), '/');
+ return $entry;
}
public function getDirectoryContent($directory): \Traversable {
- return $this->storage->getDirectoryContent($this->findPathToUse($directory));
+ $entries = $this->storage->getDirectoryContent($this->findPathToUse($directory));
+ foreach ($entries as $entry) {
+ $entry['name'] = trim(Filesystem::normalizePath($entry['name']), '/');
+ yield $entry;
+ }
}
}
diff --git a/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php b/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php
new file mode 100644
index 00000000000..935a15af4cf
--- /dev/null
+++ b/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * @copyright Copyright (c) 2021, Nextcloud GmbH.
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ * @author Vincent Petry <vincent@nextcloud.com>
+ *
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Files\Storage\Wrapper;
+
+use Icewind\Streams\DirectoryWrapper;
+use OC\Files\Filesystem;
+
+/**
+ * Normalize file names while reading directory entries
+ */
+class EncodingDirectoryWrapper extends DirectoryWrapper {
+ /**
+ * @return string
+ */
+ public function dir_readdir() {
+ $file = readdir($this->source);
+ if ($file !== false && $file !== '.' && $file !== '..') {
+ $file = trim(Filesystem::normalizePath($file), '/');
+ }
+
+ return $file;
+ }
+
+ /**
+ * @param resource $source
+ * @param callable $filter
+ * @return resource|bool
+ */
+ public static function wrap($source) {
+ return self::wrapSource($source, [
+ 'source' => $source,
+ ]);
+ }
+}