0
0
Fork 0
mirror of https://github.com/nextcloud/server.git synced 2025-04-17 14:43:14 +00:00

fix: rework UploadFolder implementation

Signed-off-by: Robin Appelman <robin@icewind.nl>

[skip ci]
This commit is contained in:
Robin Appelman 2025-02-24 19:22:52 +01:00
parent 3d7ae440f0
commit a6826eeee5
3 changed files with 45 additions and 34 deletions

View file

@ -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');

View file

@ -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);
}
/**

View file

@ -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;
private ?Folder $uploadFolder = null;
public function __construct(array $principalInfo, CleanupService $cleanupService) {
$this->principalInfo = $principalInfo;
$this->cleanupService = $cleanupService;
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();
}
}