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
path: root/lib
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2022-04-21 10:57:30 +0300
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2022-04-25 16:54:38 +0300
commit953c8875dba06e4ef640bc5580c074e76aee6242 (patch)
treec3cfb832a6e7c0dba56558caae2be7f9fd6ecd79 /lib
parent8f34bc833c859763717c30ce0dc29170585956ed (diff)
Fix scanning app data with metadata
Previously we were listening to change in the appdata folder but an appdata scan didn't setup the file system, so the view was unavailable. **Test plan:** 1. rm -rf data/appdata_...../preview data/<user>/Media 2. occ files:scan-app-data 3. occ files:scan <user> No errors and the files and metadata are correctly removed from the database too. Signed-off-by: Carl Schwan <carl@carlschwan.eu>
Diffstat (limited to 'lib')
-rw-r--r--lib/private/Metadata/FileEventListener.php23
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/private/Metadata/FileEventListener.php b/lib/private/Metadata/FileEventListener.php
index fdec891c6e2..6d41ccdef30 100644
--- a/lib/private/Metadata/FileEventListener.php
+++ b/lib/private/Metadata/FileEventListener.php
@@ -31,12 +31,15 @@ use OCP\Files\File;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\Files\FileInfo;
+use Psr\Log\LoggerInterface;
class FileEventListener implements IEventListener {
private IMetadataManager $manager;
+ private LoggerInterface $logger;
- public function __construct(IMetadataManager $manager) {
+ public function __construct(IMetadataManager $manager, LoggerInterface $logger) {
$this->manager = $manager;
+ $this->logger = $logger;
}
private function shouldExtractMetadata(Node $node): bool {
@@ -52,13 +55,31 @@ class FileEventListener implements IEventListener {
}
$path = $node->getPath();
+ return $this->isCorrectPath($path);
+ }
+
+ private function isCorrectPath(string $path): bool {
// TODO make this more dynamic, we have the same issue in other places
return !str_starts_with($path, 'appdata_') && !str_starts_with($path, 'files_versions/') && !str_starts_with($path, 'files_trashbin/');
}
public function handle(Event $event): void {
if ($event instanceof NodeRemovedFromCache) {
+ if (!$this->isCorrectPath($event->getPath())) {
+ // Don't listen to paths for which we don't extract metadata
+ return;
+ }
$view = Filesystem::getView();
+ if (!$view) {
+ // Should not happen since a scan in the user folder should setup
+ // the file system.
+ $e = new \Exception(); // don't trigger, just get backtrace
+ $this->logger->error('Detecting deletion of a file with possible metadata but file system setup is not setup', [
+ 'exception' => $e,
+ 'app' => 'metadata'
+ ]);
+ return;
+ }
$info = $view->getFileInfo($event->getPath());
if ($info && $info->getType() === FileInfo::TYPE_FILE) {
$this->manager->clearMetadata($info->getId());