diff options
author | Robin Appelman <robin@icewind.nl> | 2025-02-24 19:22:52 +0100 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2025-02-25 13:58:40 +0100 |
commit | 98af649cccf17d36614720179e734e3e79f4ea31 (patch) | |
tree | c8e4d4acc3199284cf7b1cdb94acce9c3415095d /apps | |
parent | 373107b6e4ebfd3487c69a122ff3230057a4ae51 (diff) | |
download | nextcloud-server-uploadfolder-rework.tar.gz nextcloud-server-uploadfolder-rework.zip |
fix: rework UploadFolder implementationuploadfolder-rework
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'apps')
-rw-r--r-- | apps/dav/lib/RootCollection.php | 5 | ||||
-rw-r--r-- | apps/dav/lib/Upload/RootCollection.php | 6 | ||||
-rw-r--r-- | apps/dav/lib/Upload/UploadHome.php | 54 |
3 files changed, 41 insertions, 24 deletions
diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index e14d07943e7..b2b34b26980 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -157,7 +157,10 @@ class RootCollection extends SimpleCollection { $uploadCollection = new Upload\RootCollection( $userPrincipalBackend, 'principals/users', - Server::get(CleanupService::class)); + Server::get(CleanupService::class), + $rootFolder, + $userSession, + ); $uploadCollection->disableListing = $disableListing; $avatarCollection = new Avatars\RootCollection($userPrincipalBackend, 'principals/users'); diff --git a/apps/dav/lib/Upload/RootCollection.php b/apps/dav/lib/Upload/RootCollection.php index 6b12363367a..9ea2592702b 100644 --- a/apps/dav/lib/Upload/RootCollection.php +++ b/apps/dav/lib/Upload/RootCollection.php @@ -9,6 +9,8 @@ declare(strict_types=1); */ namespace OCA\DAV\Upload; +use OCP\Files\IRootFolder; +use OCP\IUserSession; use Sabre\DAVACL\AbstractPrincipalCollection; use Sabre\DAVACL\PrincipalBackend; @@ -18,6 +20,8 @@ class RootCollection extends AbstractPrincipalCollection { PrincipalBackend\BackendInterface $principalBackend, string $principalPrefix, private CleanupService $cleanupService, + private IRootFolder $rootFolder, + private IUserSession $userSession, ) { parent::__construct($principalBackend, $principalPrefix); } @@ -26,7 +30,7 @@ class RootCollection extends AbstractPrincipalCollection { * @inheritdoc */ public function getChildForPrincipal(array $principalInfo): UploadHome { - return new UploadHome($principalInfo, $this->cleanupService); + return new UploadHome($principalInfo, $this->cleanupService, $this->rootFolder, $this->userSession); } /** diff --git a/apps/dav/lib/Upload/UploadHome.php b/apps/dav/lib/Upload/UploadHome.php index 3a8e13eb02d..a6551d4d079 100644 --- a/apps/dav/lib/Upload/UploadHome.php +++ b/apps/dav/lib/Upload/UploadHome.php @@ -7,18 +7,23 @@ */ namespace OCA\DAV\Upload; -use OC\Files\Filesystem; use OC\Files\View; use OCA\DAV\Connector\Sabre\Directory; +use OCP\Files\Folder; +use OCP\Files\IRootFolder; +use OCP\Files\NotFoundException; use OCP\IUserSession; -use OCP\Server; use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\ICollection; class UploadHome implements ICollection { + private ?Folder $uploadFolder = null; + public function __construct( - private array $principalInfo, - private CleanupService $cleanupService, + private readonly array $principalInfo, + private readonly CleanupService $cleanupService, + private readonly IRootFolder $rootFolder, + private readonly IUserSession $userSession, ) { } @@ -64,28 +69,33 @@ class UploadHome implements ICollection { return $this->impl()->getLastModified(); } - /** - * @return Directory - */ - private function impl() { - $view = $this->getView(); - $rootInfo = $view->getFileInfo(''); - return new Directory($view, $rootInfo); + private function getUploadFolder(): Folder { + if ($this->uploadFolder === null) { + $user = $this->userSession->getUser(); + if (!$user) { + throw new Forbidden('Not logged in'); + } + $path = '/' . $user->getUID() . '/uploads'; + try { + $folder = $this->rootFolder->get($path); + if (!$folder instanceof Folder) { + throw new \Exception('Upload folder is a file'); + } + $this->uploadFolder = $folder; + } catch (NotFoundException $e) { + $this->uploadFolder = $this->rootFolder->newFolder($path); + } + } + return $this->uploadFolder; } - private function getView() { - $rootView = new View(); - $user = Server::get(IUserSession::class)->getUser(); - Filesystem::initMountPoints($user->getUID()); - if (!$rootView->file_exists('/' . $user->getUID() . '/uploads')) { - $rootView->mkdir('/' . $user->getUID() . '/uploads'); - } - return new View('/' . $user->getUID() . '/uploads'); + private function impl(): Directory { + $folder = $this->getUploadFolder(); + $view = new View($folder->getPath()); + return new Directory($view, $folder); } private function getStorage() { - $view = $this->getView(); - $storage = $view->getFileInfo('')->getStorage(); - return $storage; + return $this->getUploadFolder()->getStorage(); } } |