diff options
author | Robin Appelman <robin@icewind.nl> | 2025-02-24 19:22:52 +0100 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2025-02-26 14:32:20 +0100 |
commit | 24ed04bd42fbbd0fad335e18c65e92333eed35bf (patch) | |
tree | b58c260a95b3d6c11aff01620c2690d439f288b3 | |
parent | 6a8bccc023db58f151393463e9a8ef7d9fb45dd6 (diff) | |
download | nextcloud-server-backport/51010/stable29.tar.gz nextcloud-server-backport/51010/stable29.zip |
fix: rework UploadFolder implementationbackport/51010/stable29
Signed-off-by: Robin Appelman <robin@icewind.nl>
[skip ci]
-rw-r--r-- | apps/dav/lib/RootCollection.php | 5 | ||||
-rw-r--r-- | apps/dav/lib/Upload/RootCollection.php | 14 | ||||
-rw-r--r-- | apps/dav/lib/Upload/UploadHome.php | 62 |
3 files changed, 46 insertions, 35 deletions
diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index d1f3dbc91bd..21a5558ded3 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -172,7 +172,10 @@ class RootCollection extends SimpleCollection { $uploadCollection = new Upload\RootCollection( $userPrincipalBackend, 'principals/users', - \OC::$server->query(CleanupService::class)); + \OC::$server->query(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 e05c154c8ea..b4f3d791781 100644 --- a/apps/dav/lib/Upload/RootCollection.php +++ b/apps/dav/lib/Upload/RootCollection.php @@ -26,26 +26,26 @@ declare(strict_types=1); */ namespace OCA\DAV\Upload; +use OCP\Files\IRootFolder; +use OCP\IUserSession; use Sabre\DAVACL\AbstractPrincipalCollection; use Sabre\DAVACL\PrincipalBackend; class RootCollection extends AbstractPrincipalCollection { - - /** @var CleanupService */ - private $cleanupService; - public function __construct(PrincipalBackend\BackendInterface $principalBackend, string $principalPrefix, - CleanupService $cleanupService) { + private CleanupService $cleanupService, + private IRootFolder $rootFolder, + private IUserSession $userSession, + ) { parent::__construct($principalBackend, $principalPrefix); - $this->cleanupService = $cleanupService; } /** * @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 6664d8c85b6..367462ae17c 100644 --- a/apps/dav/lib/Upload/UploadHome.php +++ b/apps/dav/lib/Upload/UploadHome.php @@ -25,21 +25,24 @@ */ 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 Sabre\DAV\Exception\Forbidden; use Sabre\DAV\ICollection; class UploadHome implements ICollection { - /** @var array */ - private $principalInfo; - /** @var CleanupService */ - private $cleanupService; - - public function __construct(array $principalInfo, CleanupService $cleanupService) { - $this->principalInfo = $principalInfo; - $this->cleanupService = $cleanupService; + private ?Folder $uploadFolder = null; + + public function __construct( + private array $principalInfo, + private CleanupService $cleanupService, + private IRootFolder $rootFolder, + private IUserSession $userSession, + ) { } public function createFile($name, $data = null) { @@ -84,28 +87,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 = \OC::$server->getUserSession()->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(); } } |