aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php')
-rw-r--r--lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php b/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php
new file mode 100644
index 00000000000..0a90b49f0f1
--- /dev/null
+++ b/lib/private/Files/Storage/Wrapper/EncodingDirectoryWrapper.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+namespace OC\Files\Storage\Wrapper;
+
+use Icewind\Streams\DirectoryWrapper;
+use OC\Files\Filesystem;
+
+/**
+ * Normalize file names while reading directory entries
+ */
+class EncodingDirectoryWrapper extends DirectoryWrapper {
+ public function dir_readdir(): string|false {
+ $file = readdir($this->source);
+ if ($file !== false && $file !== '.' && $file !== '..') {
+ $file = trim(Filesystem::normalizePath($file), '/');
+ }
+
+ return $file;
+ }
+
+ /**
+ * @param resource $source
+ * @return resource|false
+ */
+ public static function wrap($source) {
+ return self::wrapSource($source, [
+ 'source' => $source,
+ ]);
+ }
+}