diff --git a/apps/dav/lib/RootCollection.php b/apps/dav/lib/RootCollection.php index b2b34b269803a..c8a47cd984fc5 100644 --- a/apps/dav/lib/RootCollection.php +++ b/apps/dav/lib/RootCollection.php @@ -160,6 +160,7 @@ public function __construct() { Server::get(CleanupService::class), $rootFolder, $userSession, + $logger, ); $uploadCollection->disableListing = $disableListing; diff --git a/apps/dav/lib/Upload/RootCollection.php b/apps/dav/lib/Upload/RootCollection.php index 9ea2592702b24..5b33d07d77a39 100644 --- a/apps/dav/lib/Upload/RootCollection.php +++ b/apps/dav/lib/Upload/RootCollection.php @@ -11,6 +11,7 @@ use OCP\Files\IRootFolder; use OCP\IUserSession; +use Psr\Log\LoggerInterface; use Sabre\DAVACL\AbstractPrincipalCollection; use Sabre\DAVACL\PrincipalBackend; @@ -22,6 +23,7 @@ public function __construct( private CleanupService $cleanupService, private IRootFolder $rootFolder, private IUserSession $userSession, + private LoggerInterface $logger, ) { parent::__construct($principalBackend, $principalPrefix); } @@ -30,7 +32,7 @@ public function __construct( * @inheritdoc */ public function getChildForPrincipal(array $principalInfo): UploadHome { - return new UploadHome($principalInfo, $this->cleanupService, $this->rootFolder, $this->userSession); + return new UploadHome($principalInfo, $this->cleanupService, $this->rootFolder, $this->userSession, $this->logger); } /** diff --git a/apps/dav/lib/Upload/UploadHome.php b/apps/dav/lib/Upload/UploadHome.php index a6551d4d079fe..d38e3953720d5 100644 --- a/apps/dav/lib/Upload/UploadHome.php +++ b/apps/dav/lib/Upload/UploadHome.php @@ -9,10 +9,12 @@ use OC\Files\View; use OCA\DAV\Connector\Sabre\Directory; +use OCP\Constants; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\IUserSession; +use Psr\Log\LoggerInterface; use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\ICollection; @@ -24,6 +26,7 @@ public function __construct( private readonly CleanupService $cleanupService, private readonly IRootFolder $rootFolder, private readonly IUserSession $userSession, + private readonly LoggerInterface $logger, ) { } @@ -91,6 +94,12 @@ private function getUploadFolder(): Folder { private function impl(): Directory { $folder = $this->getUploadFolder(); + if (!$folder->isCreatable()) { + $user = $this->userSession->getUser(); + $this->logger->warning('Upload home not writable for ' . $user->getUID() . ', attempting to fix', ['permissions' => $folder->getPermissions()]); + $cache = $folder->getStorage()->getCache(); + $cache->update($folder->getId(), ['permissions', Constants::PERMISSION_ALL]); + } $view = new View($folder->getPath()); return new Directory($view, $folder); }