From 9fbe8363e60c4ce82018b57aee40c0697551331e Mon Sep 17 00:00:00 2001 From: Luka Trovic Date: Tue, 4 Nov 2025 17:09:37 +0100 Subject: [PATCH] fix: check creation permission when import board Signed-off-by: Luka Trovic [skip ci] --- lib/Controller/BoardController.php | 5 ++++ lib/Controller/BoardImportApiController.php | 6 +++++ .../BoardImportApiControllerTest.php | 23 +++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/lib/Controller/BoardController.php b/lib/Controller/BoardController.php index ebd856d4d9..d053d6bcc6 100644 --- a/lib/Controller/BoardController.php +++ b/lib/Controller/BoardController.php @@ -9,6 +9,7 @@ use OCA\Deck\Db\Acl; use OCA\Deck\Db\Board; +use OCA\Deck\NoPermissionException; use OCA\Deck\Service\BoardService; use OCA\Deck\Service\Importer\BoardImportService; use OCA\Deck\Service\PermissionService; @@ -172,6 +173,10 @@ public function export($boardId) { * @NoAdminRequired */ public function import(): DataResponse { + if (!$this->permissionService->canCreate()) { + throw new NoPermissionException('Creating boards has been disabled for your account.'); + } + $file = $this->request->getUploadedFile('file'); $error = null; $phpFileUploadErrors = [ diff --git a/lib/Controller/BoardImportApiController.php b/lib/Controller/BoardImportApiController.php index 2163a8c955..c4016acf14 100644 --- a/lib/Controller/BoardImportApiController.php +++ b/lib/Controller/BoardImportApiController.php @@ -7,7 +7,9 @@ namespace OCA\Deck\Controller; +use OCA\Deck\NoPermissionException; use OCA\Deck\Service\Importer\BoardImportService; +use OCA\Deck\Service\PermissionService; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; @@ -18,6 +20,7 @@ public function __construct( string $appName, IRequest $request, private BoardImportService $boardImportService, + private PermissionService $permissionService, private string $userId, ) { parent::__construct($appName, $request); @@ -29,6 +32,9 @@ public function __construct( * @NoCSRFRequired */ public function import(string $system, array $config, array $data): DataResponse { + if (!$this->permissionService->canCreate()) { + throw new NoPermissionException('Creating boards has been disabled for your account.'); + } $this->boardImportService->setSystem($system); $config = json_decode(json_encode($config)); $config->owner = $this->userId; diff --git a/tests/unit/controller/BoardImportApiControllerTest.php b/tests/unit/controller/BoardImportApiControllerTest.php index 2ff4a49472..da61d6005c 100644 --- a/tests/unit/controller/BoardImportApiControllerTest.php +++ b/tests/unit/controller/BoardImportApiControllerTest.php @@ -25,6 +25,7 @@ use OCA\Deck\Db\Board; use OCA\Deck\Service\Importer\BoardImportService; +use OCA\Deck\Service\PermissionService; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\IRequest; @@ -37,16 +38,20 @@ class BoardImportApiControllerTest extends \Test\TestCase { private $controller; /** @var BoardImportService|MockObject */ private $boardImportService; + /** @var PermissionService|MockObject */ + private $permissionService; public function setUp(): void { parent::setUp(); $this->request = $this->createMock(IRequest::class); $this->boardImportService = $this->createMock(BoardImportService::class); + $this->permissionService = $this->createMock(PermissionService::class); $this->controller = new BoardImportApiController( $this->appName, $this->request, $this->boardImportService, + $this->permissionService, $this->userId ); } @@ -75,9 +80,27 @@ public function testImport() { $data = [ 'name' => 'test' ]; + $this->permissionService + ->method('canCreate') + ->willReturn(true); $actual = $this->controller->import($system, $config, $data); $board = $this->createMock(Board::class); $this->assertInstanceOf(Board::class, $board); $this->assertEquals(HTTP::STATUS_OK, $actual->getStatus()); } + + public function testImportWithoutPermission() { + $system = 'trelloJson'; + $config = [ + 'owner' => 'test' + ]; + $data = [ + 'name' => 'test' + ]; + $this->permissionService + ->method('canCreate') + ->willReturn(false); + $this->expectException(\OCA\Deck\NoPermissionException::class); + $this->controller->import($system, $config, $data); + } }