mirror of
https://github.com/nextcloud/server.git
synced 2026-02-03 20:41:22 -05:00
Merge pull request #51010 from nextcloud/uploadfolder-rework
fix: rework UploadFolder implementation
This commit is contained in:
commit
587e7c5358
3 changed files with 41 additions and 24 deletions
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue