aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Petry <vincent@nextcloud.com>2021-11-10 15:09:25 +0100
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2021-11-19 14:51:39 +0000
commit88b5860e7021b8d41ade8d32f7990dc316d8b738 (patch)
treef11c8c842d6dd1c9f0c26f3a62405fabbe04ebcc
parent2e7944482841355ebd3b600e4f160da2ce4e60cf (diff)
downloadnextcloud-server-88b5860e7021b8d41ade8d32f7990dc316d8b738.tar.gz
nextcloud-server-88b5860e7021b8d41ade8d32f7990dc316d8b738.zip
Move storage encoding compatibility warning logic
The encoding check for file names is now happening the Scanner, and an event will be emitted only if the storage doesn't contain the encoding compatibility wrapper. The event is listened to by the occ scan command to be able to display a warning in case of file name mismatches when they have NFD encoding. Signed-off-by: Vincent Petry <vincent@nextcloud.com>
-rw-r--r--apps/files/lib/Command/Scan.php17
-rw-r--r--apps/files/lib/Command/ScanAppData.php17
-rw-r--r--lib/private/Files/Cache/Scanner.php10
-rw-r--r--lib/private/Files/Utils/Scanner.php3
4 files changed, 15 insertions, 32 deletions
diff --git a/apps/files/lib/Command/Scan.php b/apps/files/lib/Command/Scan.php
index d8156da3669..a340433fcfb 100644
--- a/apps/files/lib/Command/Scan.php
+++ b/apps/files/lib/Command/Scan.php
@@ -107,15 +107,6 @@ class Scan extends Base {
);
}
- public function checkScanWarning($fullPath, OutputInterface $output) {
- $normalizedPath = basename(\OC\Files\Filesystem::normalizePath($fullPath));
- $path = basename($fullPath);
-
- if ($normalizedPath !== $path) {
- $output->writeln("\t<error>Entry \"" . $fullPath . '" will not be accessible due to incompatible encoding</error>');
- }
- }
-
protected function scanFiles($user, $path, OutputInterface $output, $backgroundScan = false, $recursive = true, $homeOnly = false) {
$connection = $this->reconnectToDatabase($output);
$scanner = new \OC\Files\Utils\Scanner(
@@ -143,12 +134,8 @@ class Scan extends Base {
$output->writeln('Error while scanning, storage not available (' . $e->getMessage() . ')', OutputInterface::VERBOSITY_VERBOSE);
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) {
- $this->checkScanWarning($path, $output);
- });
-
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) {
- $this->checkScanWarning($path, $output);
+ $scanner->listen('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', function ($fullPath) use ($output) {
+ $output->writeln("\t<error>Entry \"" . $fullPath . '" will not be accessible due to incompatible encoding</error>');
});
try {
diff --git a/apps/files/lib/Command/ScanAppData.php b/apps/files/lib/Command/ScanAppData.php
index 854445c82dc..5517e6b93e3 100644
--- a/apps/files/lib/Command/ScanAppData.php
+++ b/apps/files/lib/Command/ScanAppData.php
@@ -74,15 +74,6 @@ class ScanAppData extends Base {
$this->addArgument('folder', InputArgument::OPTIONAL, 'The appdata subfolder to scan', '');
}
- public function checkScanWarning($fullPath, OutputInterface $output) {
- $normalizedPath = basename(\OC\Files\Filesystem::normalizePath($fullPath));
- $path = basename($fullPath);
-
- if ($normalizedPath !== $path) {
- $output->writeln("\t<error>Entry \"" . $fullPath . '" will not be accessible due to incompatible encoding</error>');
- }
- }
-
protected function scanFiles(OutputInterface $output, string $folder): int {
try {
$appData = $this->getAppDataFolder();
@@ -125,12 +116,8 @@ class ScanAppData extends Base {
$output->writeln('Error while scanning, storage not available (' . $e->getMessage() . ')', OutputInterface::VERBOSITY_VERBOSE);
});
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) {
- $this->checkScanWarning($path, $output);
- });
-
- $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) {
- $this->checkScanWarning($path, $output);
+ $scanner->listen('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', function ($fullPath) use ($output) {
+ $output->writeln("\t<error>Entry \"" . $fullPath . '" will not be accessible due to incompatible encoding</error>');
});
try {
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php
index 6dc22a79b14..3674ebd2c01 100644
--- a/lib/private/Files/Cache/Scanner.php
+++ b/lib/private/Files/Cache/Scanner.php
@@ -38,6 +38,7 @@ namespace OC\Files\Cache;
use Doctrine\DBAL\Exception;
use OC\Files\Filesystem;
+use OC\Files\Storage\Wrapper\Encoding;
use OC\Hooks\BasicEmitter;
use OCP\Files\Cache\IScanner;
use OCP\Files\ForbiddenException;
@@ -420,8 +421,13 @@ class Scanner extends BasicEmitter implements IScanner {
if ($permissions === 0) {
continue;
}
- $file = $fileMeta['name'];
- $file = trim(\OC\Files\Filesystem::normalizePath($file), '/');
+ $originalFile = $fileMeta['name'];
+ $file = trim(\OC\Files\Filesystem::normalizePath($originalFile), '/');
+ if (trim($originalFile, '/') !== $file && !$this->storage->instanceOfStorage(Encoding::class)) {
+ // encoding mismatch, might require compatibility wrapper
+ $this->emit('\OC\Files\Cache\Scanner', 'normalizedNameMismatch', [$path ? $path . '/' . $originalFile : $originalFile]);
+ }
+
$newChildNames[] = $file;
$child = $path ? $path . '/' . $file : $file;
try {
diff --git a/lib/private/Files/Utils/Scanner.php b/lib/private/Files/Utils/Scanner.php
index 5509a49941b..b886eaca80d 100644
--- a/lib/private/Files/Utils/Scanner.php
+++ b/lib/private/Files/Utils/Scanner.php
@@ -146,6 +146,9 @@ class Scanner extends PublicEmitter {
$this->emit('\OC\Files\Utils\Scanner', 'postScanFolder', [$mount->getMountPoint() . $path]);
$this->dispatcher->dispatchTyped(new FolderScannedEvent($mount->getMountPoint() . $path));
});
+ $scanner->listen('\OC\Files\Cache\Scanner', 'normalizedNameMismatch', function ($path) use ($mount) {
+ $this->emit('\OC\Files\Utils\Scanner', 'normalizedNameMismatch', [$path]);
+ });
}
/**