Skip to content

Commit 2f52dc7

Browse files
committed
refactor(shares): use getOrCreateFolder and fix TOCTOU in folder lookup
-e Signed-off-by: Peter Ringelmann <peter.ringelmann@nextcloud.com>
1 parent 050c2b9 commit 2f52dc7

File tree

2 files changed

+8
-15
lines changed

2 files changed

+8
-15
lines changed

lib/Controller/ShareApiController.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
use OCP\AppFramework\OCS\OCSNotFoundException;
3232
use OCP\AppFramework\OCSController;
3333
use OCP\Files\IRootFolder;
34+
use OCP\Files\NotFoundException;
3435
use OCP\IGroup;
3536
use OCP\IGroupManager;
3637
use OCP\IRequest;
@@ -274,12 +275,7 @@ public function updateShare(int $formId, int $shareId, array $keyValuePairs): Da
274275
if (in_array(Constants::PERMISSION_RESULTS, $keyValuePairs['permissions'], true)) {
275276
$userFolder = $this->rootFolder->getUserFolder($form->getOwnerId());
276277
$uploadedFilesFolderPath = $this->formsService->getFormUploadedFilesFolderPath($form);
277-
if ($userFolder->nodeExists($uploadedFilesFolderPath)) {
278-
$folder = $userFolder->get($uploadedFilesFolderPath);
279-
} else {
280-
$folder = $userFolder->newFolder($uploadedFilesFolderPath);
281-
}
282-
/** @var \OCP\Files\Folder $folder */
278+
$folder = $userFolder->getOrCreateFolder($uploadedFilesFolderPath);
283279

284280
$folderShare = $this->shareManager->newShare();
285281
$folderShare->setShareType($formShare->getShareType());
@@ -359,11 +355,11 @@ private function removeUploadedFilesShare(Form $form, Share $formShare): void {
359355

360356
$userFolder = $this->rootFolder->getUserFolder($form->getOwnerId());
361357
$uploadedFilesFolderPath = $this->formsService->getFormUploadedFilesFolderPath($form);
362-
if (!$userFolder->nodeExists($uploadedFilesFolderPath)) {
358+
try {
359+
$folder = $userFolder->get($uploadedFilesFolderPath);
360+
} catch (NotFoundException $e) {
363361
return;
364362
}
365-
366-
$folder = $userFolder->get($uploadedFilesFolderPath);
367363
$folderShares = $this->shareManager->getSharesBy($form->getOwnerId(), $formShare->getShareType(), $folder, false, -1);
368364
foreach ($folderShares as $folderShare) {
369365
if ($folderShare->getSharedWith() === $formShare->getShareWith()) {

tests/Unit/Controller/ShareApiControllerTest.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -566,9 +566,6 @@ public function testDeleteShare_cleansUpFileShare(): void {
566566
// Mock the uploaded files folder lookup
567567
$folder = $this->createMock(Folder::class);
568568
$userFolder = $this->createMock(Folder::class);
569-
$userFolder->expects($this->once())
570-
->method('nodeExists')
571-
->willReturn(true);
572569
$userFolder->expects($this->once())
573570
->method('get')
574571
->willReturn($folder);
@@ -864,9 +861,6 @@ public function testUpdateShare(array $share, string $formOwner, array $keyValue
864861
->willReturn($this->createMock(IUser::class));
865862

866863
$userFolder = $this->createMock(Folder::class);
867-
$userFolder->expects($this->any())
868-
->method('nodeExists')
869-
->willReturn(true);
870864

871865
$file = $this->createMock(File::class);
872866
$file->expects($this->any())
@@ -878,6 +872,9 @@ public function testUpdateShare(array $share, string $formOwner, array $keyValue
878872
->method('newFile')
879873
->willReturn($file);
880874

875+
$userFolder->expects($this->any())
876+
->method('getOrCreateFolder')
877+
->willReturn($folder);
881878
$userFolder->expects($this->any())
882879
->method('get')
883880
->willReturn($folder);

0 commit comments

Comments
 (0)