aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Appelman <robin@icewind.nl>2025-02-24 19:22:52 +0100
committerRobin Appelman <robin@icewind.nl>2025-02-26 14:32:20 +0100
commit24ed04bd42fbbd0fad335e18c65e92333eed35bf (patch)
treeb58c260a95b3d6c11aff01620c2690d439f288b3
parent6a8bccc023db58f151393463e9a8ef7d9fb45dd6 (diff)
downloadnextcloud-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.php5
-rw-r--r--apps/dav/lib/Upload/RootCollection.php14
-rw-r--r--apps/dav/lib/Upload/UploadHome.php62
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();
}
}