From 4326d73ff6dc4514163dbbe4164342cef8deba0a Mon Sep 17 00:00:00 2001 From: Vincent Petry Date: Fri, 29 Apr 2016 11:19:00 +0200 Subject: [PATCH] Fix SMB storage to not normalize UTF8 This makes sure that even if a NFD file name exists, it is found by the storage and will be visible to higher layers. Even though the file will be discarded anyway there, it gives the scanner a chance to display a warning at least. --- apps/files_external/lib/storage/smb.php | 2 +- lib/private/Files/Filesystem.php | 21 ++++++++------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/apps/files_external/lib/storage/smb.php b/apps/files_external/lib/storage/smb.php index 4249d13168..868c52a63b 100644 --- a/apps/files_external/lib/storage/smb.php +++ b/apps/files_external/lib/storage/smb.php @@ -100,7 +100,7 @@ class SMB extends \OC\Files\Storage\Common { * @return string */ protected function buildPath($path) { - return Filesystem::normalizePath($this->root . '/' . $path); + return Filesystem::normalizePath($this->root . '/' . $path, true, false, true); } /** diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php index 7cd1f56071..3a85d5fb9f 100644 --- a/lib/private/Files/Filesystem.php +++ b/lib/private/Files/Filesystem.php @@ -790,11 +790,12 @@ class Filesystem { * Fix common problems with a file path * * @param string $path - * @param bool $stripTrailingSlash - * @param bool $isAbsolutePath + * @param bool $stripTrailingSlash whether to strip the trailing slash + * @param bool $isAbsolutePath whether the given path is absolute + * @param bool $keepUnicode true to disable unicode normalization * @return string */ - public static function normalizePath($path, $stripTrailingSlash = true, $isAbsolutePath = false) { + public static function normalizePath($path, $stripTrailingSlash = true, $isAbsolutePath = false, $keepUnicode = false) { if (is_null(self::$normalizedPathCache)) { self::$normalizedPathCache = new CappedMemoryCache(); } @@ -818,19 +819,13 @@ class Filesystem { } //normalize unicode if possible - $path = \OC_Util::normalizeUnicode($path); + if (!$keepUnicode) { + $path = \OC_Util::normalizeUnicode($path); + } //no windows style slashes $path = str_replace('\\', '/', $path); - // When normalizing an absolute path, we need to ensure that the drive-letter - // is still at the beginning on windows - $windows_drive_letter = ''; - if ($isAbsolutePath && \OC_Util::runningOnWindows() && preg_match('#^([a-zA-Z])$#', $path[0]) && $path[1] == ':' && $path[2] == '/') { - $windows_drive_letter = substr($path, 0, 2); - $path = substr($path, 2); - } - //add leading slash if ($path[0] !== '/') { $path = '/' . $path; @@ -856,7 +851,7 @@ class Filesystem { $path = substr($path, 0, -2); } - $normalizedPath = $windows_drive_letter . $path; + $normalizedPath = $path; self::$normalizedPathCache[$cacheKey] = $normalizedPath; return $normalizedPath;