]> source.dussan.org Git - nextcloud-server.git/commitdiff
Fix initialisation of versions in the DB
authorLouis Chemineau <louis@chmn.me>
Thu, 25 May 2023 15:32:35 +0000 (17:32 +0200)
committerLouis Chemineau <louis@chmn.me>
Thu, 25 May 2023 21:43:40 +0000 (23:43 +0200)
Broken after https://github.com/nextcloud/server/pull/36690

Signed-off-by: Louis Chemineau <louis@chmn.me>
apps/files_versions/lib/Storage.php
apps/files_versions/lib/Versions/LegacyVersionsBackend.php

index 0b7debc126a0117b14cb573c9b50d700b13eaa86..676d94d2fb72a94cf4e54bad7c1580f68f7750db 100644 (file)
@@ -588,6 +588,10 @@ class Storage {
 
                        // Check that the version does not have a label.
                        $path = $versionsRoot->getRelativePath($info->getPath());
+                       if ($path === null) {
+                               throw new DoesNotExistException('Could not find relative path of (' . $info->getPath() . ')');
+                       }
+
                        $node = $userFolder->get(substr($path, 0, -strlen('.v'.$version)));
                        try {
                                $versionEntity = $versionsMapper->findVersionForFileId($node->getId(), $version);
index 0ad0eb8a439e9c4fa40245c331c966be568caabd..a9ea09247c2095d1c1f45a7624e00c36d29bf77a 100644 (file)
@@ -66,17 +66,35 @@ class LegacyVersionsBackend implements IVersionBackend, INameableVersionBackend,
 
        public function getVersionsForFile(IUser $user, FileInfo $file): array {
                $storage = $file->getStorage();
+
                if ($storage->instanceOfStorage(SharedStorage::class)) {
                        $owner = $storage->getOwner('');
                        $user = $this->userManager->get($owner);
 
+                       $fileId = $file->getId();
+                       if ($fileId === null) {
+                               throw new NotFoundException("File not found ($fileId)");
+                       }
+
+                       if ($user === null) {
+                               throw new NotFoundException("User $owner not found for $fileId");
+                       }
+
                        $userFolder = $this->rootFolder->getUserFolder($user->getUID());
-                       $nodes = $userFolder->getById($file->getId());
+
+                       $nodes = $userFolder->getById($fileId);
                        $file = array_pop($nodes);
 
                        if (!$file) {
                                throw new NotFoundException("version file not found for share owner");
                        }
+               } else {
+                       $userFolder = $this->rootFolder->getUserFolder($user->getUID());
+               }
+
+               $fileId = $file->getId();
+               if ($fileId === null) {
+                       throw new NotFoundException("File not found ($fileId)");
                }
 
                $versions = $this->getVersionsForFileFromDB($file, $user);
@@ -87,7 +105,7 @@ class LegacyVersionsBackend implements IVersionBackend, INameableVersionBackend,
 
                // Insert the entry in the DB for the current version.
                $versionEntity = new VersionEntity();
-               $versionEntity->setFileId($file->getId());
+               $versionEntity->setFileId($fileId);
                $versionEntity->setTimestamp($file->getMTime());
                $versionEntity->setSize($file->getSize());
                $versionEntity->setMimetype($this->mimeTypeLoader->getId($file->getMimetype()));
@@ -95,10 +113,15 @@ class LegacyVersionsBackend implements IVersionBackend, INameableVersionBackend,
                $this->versionsMapper->insert($versionEntity);
 
                // Insert entries in the DB for existing versions.
-               $versionsOnFS = Storage::getVersions($user->getUID(), $userFolder->getRelativePath($file->getPath()));
+               $relativePath = $userFolder->getRelativePath($file->getPath());
+               if ($relativePath === null) {
+                       throw new NotFoundException("Relative path not found for file $fileId (" . $file->getPath() . ')');
+               }
+
+               $versionsOnFS = Storage::getVersions($user->getUID(), $relativePath);
                foreach ($versionsOnFS as $version) {
                        $versionEntity = new VersionEntity();
-                       $versionEntity->setFileId($file->getId());
+                       $versionEntity->setFileId($fileId);
                        $versionEntity->setTimestamp((int)$version['version']);
                        $versionEntity->setSize((int)$version['size']);
                        $versionEntity->setMimetype($this->mimeTypeLoader->getId($version['mimetype']));