diff options
author | Roeland Jago Douma <rullzer@users.noreply.github.com> | 2021-04-01 15:11:25 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-01 15:11:25 +0200 |
commit | 507facda8b63ac12d2938fe6095d14a0d8d797f7 (patch) | |
tree | 1c546c79c050dc6568a2de65d5de8e09494d3564 | |
parent | 037411b3815bb11e009d7356e5254614a48c3e7a (diff) | |
parent | 6fd571461c32fc46c63943454c5087064a96b759 (diff) | |
download | nextcloud-server-507facda8b63ac12d2938fe6095d14a0d8d797f7.tar.gz nextcloud-server-507facda8b63ac12d2938fe6095d14a0d8d797f7.zip |
Merge pull request #26396 from nextcloud/bugfix/noid/ro-root-template
Get the parent directory before creating a file from a template
-rw-r--r-- | lib/private/DirectEditing/Manager.php | 8 | ||||
-rw-r--r-- | lib/private/Files/Template/TemplateManager.php | 12 | ||||
-rw-r--r-- | tests/lib/DirectEditing/ManagerTest.php | 22 |
3 files changed, 31 insertions, 11 deletions
diff --git a/lib/private/DirectEditing/Manager.php b/lib/private/DirectEditing/Manager.php index 0e7e988eef2..1ea09e74d59 100644 --- a/lib/private/DirectEditing/Manager.php +++ b/lib/private/DirectEditing/Manager.php @@ -27,6 +27,7 @@ namespace OC\DirectEditing; use Doctrine\DBAL\FetchMode; +use OC\Files\Node\Folder; use OCP\AppFramework\Http\NotFoundResponse; use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\TemplateResponse; @@ -130,7 +131,12 @@ class Manager implements IManager { if ($userFolder->nodeExists($path)) { throw new \RuntimeException('File already exists'); } else { - $file = $userFolder->newFile($path); + if (!$userFolder->nodeExists(dirname($path))) { + throw new \RuntimeException('Invalid path'); + } + /** @var Folder $folder */ + $folder = $userFolder->get(dirname($path)); + $file = $folder->newFile(basename($path)); $editor = $this->getEditor($editorId); $creators = $editor->getCreators(); foreach ($creators as $creator) { diff --git a/lib/private/Files/Template/TemplateManager.php b/lib/private/Files/Template/TemplateManager.php index 33d42bc9c42..0351e122658 100644 --- a/lib/private/Files/Template/TemplateManager.php +++ b/lib/private/Files/Template/TemplateManager.php @@ -36,7 +36,6 @@ use OCP\Files\GenericFileException; use OCP\Files\IRootFolder; use OCP\Files\Node; use OCP\Files\NotFoundException; -use OCP\Files\NotPermittedException; use OCP\Files\Template\FileCreatedFromTemplateEvent; use OCP\Files\Template\ICustomTemplateProvider; use OCP\Files\Template\ITemplateManager; @@ -155,7 +154,11 @@ class TemplateManager implements ITemplateManager { } catch (NotFoundException $e) { } try { - $targetFile = $userFolder->newFile($filePath); + if (!$userFolder->nodeExists(dirname($filePath))) { + throw new GenericFileException($this->l10n->t('Invalid path')); + } + $folder = $userFolder->get(dirname($filePath)); + $targetFile = $folder->newFile(basename($filePath)); if ($templateType === 'user' && $templateId !== '') { $template = $userFolder->get($templateId); $template->copy($targetFile->getPath()); @@ -296,9 +299,10 @@ class TemplateManager implements ITemplateManager { } try { - $folder = $userFolder->newFolder($userTemplatePath); - } catch (NotPermittedException $e) { $folder = $userFolder->get($userTemplatePath); + } catch (NotFoundException $e) { + $folder = $userFolder->get(dirname($userTemplatePath)); + $folder = $folder->newFolder(basename($userTemplatePath)); } $folderIsEmpty = count($folder->getDirectoryListing()) === 0; diff --git a/tests/lib/DirectEditing/ManagerTest.php b/tests/lib/DirectEditing/ManagerTest.php index 73bb4a836d8..b00de02bcf5 100644 --- a/tests/lib/DirectEditing/ManagerTest.php +++ b/tests/lib/DirectEditing/ManagerTest.php @@ -154,11 +154,16 @@ class ManagerTest extends TestCase { $this->random->expects($this->once()) ->method('generate') ->willReturn($expectedToken); + $folder = $this->createMock(Folder::class); $this->userFolder ->method('nodeExists') - ->with('/File.txt') - ->willReturn(false); - $this->userFolder->expects($this->once()) + ->withConsecutive(['/File.txt'], ['/']) + ->willReturnOnConsecutiveCalls(false, true); + $this->userFolder + ->method('get') + ->with('/') + ->willReturn($folder); + $folder->expects($this->once()) ->method('newFile') ->willReturn($file); $token = $this->manager->create('/File.txt', 'testeditor', 'createEmpty'); @@ -174,11 +179,16 @@ class ManagerTest extends TestCase { $this->random->expects($this->once()) ->method('generate') ->willReturn($expectedToken); + $folder = $this->createMock(Folder::class); $this->userFolder ->method('nodeExists') - ->with('/File.txt') - ->willReturn(false); - $this->userFolder->expects($this->once()) + ->withConsecutive(['/File.txt'], ['/']) + ->willReturnOnConsecutiveCalls(false, true); + $this->userFolder + ->method('get') + ->with('/') + ->willReturn($folder); + $folder->expects($this->once()) ->method('newFile') ->willReturn($file); $this->manager->create('/File.txt', 'testeditor', 'createEmpty'); |