From e357d46863e02bb896185fc4604d05e51f7b4422 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Fri, 10 Jul 2020 14:18:40 +0200 Subject: [PATCH] filter files containing a hash in the path for ftp storages the php ftp streamwrapper doesn't handle hashes correctly and will break when it tries to enter a path containing a hash. By filtering out paths containing a hash we can at least stop the external storage from breaking completely Signed-off-by: Robin Appelman --- apps/files_external/lib/Lib/Storage/FTP.php | 17 +++++++++++++++++ lib/private/Files/Storage/Common.php | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/files_external/lib/Lib/Storage/FTP.php b/apps/files_external/lib/Lib/Storage/FTP.php index 2af145ad4a..d9e5e2a0d5 100644 --- a/apps/files_external/lib/Lib/Storage/FTP.php +++ b/apps/files_external/lib/Lib/Storage/FTP.php @@ -35,6 +35,7 @@ namespace OCA\Files_External\Lib\Storage; use Icewind\Streams\CallbackWrapper; +use Icewind\Streams\IteratorDirectory; use Icewind\Streams\RetryWrapper; class FTP extends StreamWrapper { @@ -136,6 +137,22 @@ class FTP extends StreamWrapper { return false; } + public function opendir($path) { + $dh = parent::opendir($path); + if (is_resource($dh)) { + $files = []; + while (($file = readdir($dh)) !== false) { + if ($file != '.' && $file != '..' && strpos($file, '#') === false) { + $files[] = $file; + } + } + return IteratorDirectory::wrap($files); + } else { + return false; + } + } + + public function writeBack($tmpFile, $path) { $this->uploadFile($tmpFile, $path); unlink($tmpFile); diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php index 6c57405619..a62b7d727f 100644 --- a/lib/private/Files/Storage/Common.php +++ b/lib/private/Files/Storage/Common.php @@ -876,7 +876,10 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage { while (($file = readdir($dh)) !== false) { if (!Filesystem::isIgnoredDir($file) && !Filesystem::isFileBlacklisted($file)) { $childPath = $basePath . '/' . trim($file, '/'); - yield $this->getMetaData($childPath); + $metadata = $this->getMetaData($childPath); + if ($metadata !== null) { + yield $metadata; + } } } }