From e923a0a67b525c479e24d2c0a415802b1de5d328 Mon Sep 17 00:00:00 2001 From: Baptiste Fotia Date: Tue, 9 May 2023 17:44:30 +0200 Subject: [PATCH 1/9] refactor(php): Using native PHP8.0 attributes It works with native PHP8.0 and for NC27 only. For the moment at least... link: https://help.nextcloud.com/t/how-should-we-use-php8-attributes/104278 Signed-off-by: Baptiste Fotia --- lib/AppInfo/Application.php | 3 -- lib/Controller/GroupController.php | 43 +++++++++---------- lib/Controller/PageController.php | 6 ++- lib/Controller/SpaceController.php | 15 ++++--- lib/Controller/WorkspaceController.php | 43 ++++++++++--------- .../Attribute/GeneralManagerRequired.php | 30 +++++++++++++ .../Attribute/SapceAdminRequired.php | 30 +++++++++++++ lib/Middleware/IsGeneralManagerMiddleware.php | 10 ++--- lib/Middleware/IsSpaceAdminMiddleware.php | 7 ++- 9 files changed, 127 insertions(+), 60 deletions(-) create mode 100644 lib/Middleware/Attribute/GeneralManagerRequired.php create mode 100644 lib/Middleware/Attribute/SapceAdminRequired.php diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 216b74427..7cff1a8a5 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -31,7 +31,6 @@ use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; -use OCP\AppFramework\Utility\IControllerMethodReflector; use OCP\IRequest; use OCP\IURLGenerator; @@ -52,7 +51,6 @@ public function register(IRegistrationContext $context): void { $context->registerService(IsSpaceAdminMiddleware::class, function ($c) { return new IsSpaceAdminMiddleware( - $c->query(IControllerMethodReflector::class), $c->query(IRequest::class), $c->query(UserService::class), $c->query(SpaceService::class) @@ -61,7 +59,6 @@ public function register(IRegistrationContext $context): void { $context->registerService(IsGeneralManagerMiddleware::class, function ($c) { return new IsGeneralManagerMiddleware( - $c->query(IControllerMethodReflector::class), $c->query(IRequest::class), $c->query(UserService::class) ); diff --git a/lib/Controller/GroupController.php b/lib/Controller/GroupController.php index f9493e8fe..58bb1ca0e 100644 --- a/lib/Controller/GroupController.php +++ b/lib/Controller/GroupController.php @@ -25,6 +25,9 @@ namespace OCA\Workspace\Controller; +use OCA\Workspace\Service\Group\GroupsWorkspace; +use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; +use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\Group\GroupFolder\GroupFolderManage; use OCA\Workspace\Service\Group\GroupFormatter; use OCA\Workspace\Service\Group\GroupsWorkspaceService; @@ -36,6 +39,7 @@ use OCA\Workspace\Service\UserService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\JSONResponse; use OCP\IGroupManager; use OCP\IRequest; @@ -60,9 +64,6 @@ public function __construct( } /** - * @NoAdminRequired - * @SpaceAdminRequired - * * Creates a group * NB: This function could probably be abused by space managers to create arbitrary group. But, do we really care? * @@ -73,6 +74,8 @@ public function __construct( * @var string $spaceId for Middleware * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function create(array $data = []): JSONResponse { $data = array_merge(self::DEFAULT, $data); @@ -100,9 +103,6 @@ public function create(array $data = []): JSONResponse { } /** - * @NoAdminRequired - * @SpaceAdminRequired - * * Deletes a group * Cannot delete GE- and U- groups (This is on-purpose) * @@ -110,8 +110,10 @@ public function create(array $data = []): JSONResponse { * @var int $spaceId * */ - public function delete(string $gid, int $spaceId): JSONResponse { - // TODO Use groupfolder api to retrieve workspace group. + #[NoAdminRequired] + #[SpaceAdminRequired] + public function delete(string $gid, int $spaceId): JSONResponse { + // TODO Use groupfolder api to retrieve workspace group. if (substr($gid, -strlen($spaceId)) != $spaceId) { return new JSONResponse(['You may only delete workspace groups of this space (ie: group\'s name does not end by the workspace\'s ID)'], Http::STATUS_FORBIDDEN); } @@ -132,9 +134,6 @@ public function delete(string $gid, int $spaceId): JSONResponse { } /** - * @NoAdminRequired - * @SpaceAdminRequired - * * Renames a group * Cannot rename GE- and U- groups (This is on-purpose) * @@ -143,6 +142,8 @@ public function delete(string $gid, int $spaceId): JSONResponse { * @var int $spaceId * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function rename(string $newGroupName, string $gid, int $spaceId): JSONResponse { @@ -176,8 +177,6 @@ public function rename(string $newGroupName, } /** - * @NoAdminRequired - * @SpaceAdminRequired * Adds a user to a group. * The function automaticaly adds the user the the corresponding workspace's user group, and to the application * manager group when we are adding a workspace manager @@ -187,6 +186,8 @@ public function rename(string $newGroupName, * @var string $user * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function addUser(string $spaceId, string $gid, string $user): JSONResponse { // Makes sure group exist $NCGroup = $this->groupManager->get($gid); @@ -226,14 +227,13 @@ public function addUser(string $spaceId, string $gid, string $user): JSONRespons /** * Remove a user from a workspace. * - * @NoAdminRequired - * @SpaceAdminRequired - * * @param array|string $space * @param string $gid * @param string $user * @return JSONResponse */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function removeUserFromWorkspace( array|string $space, string $gid, @@ -283,9 +283,6 @@ public function removeUserFromWorkspace( } /** - * @NoAdminRequired - * @SpaceAdminRequired - * * Removes a user from a group * The function also remove the user from all workspace 'subgroup when the user is being removed from the U- group * and from the WorkspacesManagers group when the user is being removed from the GE- group @@ -295,6 +292,8 @@ public function removeUserFromWorkspace( * @var string $user * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function removeUser( IRequest $request, array|string $space, @@ -370,11 +369,11 @@ public function removeUser( } /** - * @NoAdminRequired - * @GeneralManagerRequired + * @param string $spaceId * @param string|array $groupfolder - * */ + #[NoAdminRequired] + #[GeneralManagerRequired] public function transferUsersToGroups(string $spaceId, string|array $groupfolder): JSONResponse { if (gettype($groupfolder) === 'string') { diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index df78af9da..dfe62e7f9 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -29,6 +29,8 @@ use OCA\Workspace\Service\UserService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\Util; class PageController extends Controller { @@ -40,9 +42,9 @@ public function __construct( /** * Application's main page * - * @NoAdminRequired - * @NOCSRFRequired */ + #[NoAdminRequired] + #[NoCSRFRequired] public function index(): TemplateResponse { Util::addScript(Application::APP_ID, 'workspace-main'); // js/workspace-main.js Util::addStyle(Application::APP_ID, 'workspace-style'); // css/workspace-style.css diff --git a/lib/Controller/SpaceController.php b/lib/Controller/SpaceController.php index be73c7364..f482e1582 100644 --- a/lib/Controller/SpaceController.php +++ b/lib/Controller/SpaceController.php @@ -26,8 +26,10 @@ namespace OCA\Workspace\Controller; use OCA\Workspace\Db\SpaceMapper; +use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\SpaceService; use OCP\AppFramework\Controller; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\DataResponse; use OCP\IRequest; @@ -42,23 +44,24 @@ public function __construct( } /** - * @NoAdminRequired + * @param $id - The space id to get a space - OCA\Workspace\Db\Space . + * @return DataResponse - The space serialized */ + #[NoAdminRequired] public function find(int $id): DataResponse { return new DataResponse($this->spaceService->find($id)); } - /** - * @NoAdminRequired - */ + #[NoAdminRequired] public function findAll(): DataResponse { return new DataResponse($this->spaceService->findAll()); } /** - * @NoAdminRequired - * @SpaceAdminRequired + * @return DataResponse - The space serialized */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function updateColorCode(string $colorCode, int $spaceId): DataResponse { return new DataResponse($this->spaceService->updateColorCode($colorCode, (int)$spaceId)); } diff --git a/lib/Controller/WorkspaceController.php b/lib/Controller/WorkspaceController.php index e9a0f2d3b..ee5dead76 100644 --- a/lib/Controller/WorkspaceController.php +++ b/lib/Controller/WorkspaceController.php @@ -37,12 +37,16 @@ use OCA\Workspace\Service\Group\ManagersWorkspace; use OCA\Workspace\Service\Group\UserGroup; use OCA\Workspace\Service\Group\WorkspaceManagerGroup; +use OCA\Workspace\Service\Group\GroupsWorkspace; +use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; +use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\SpaceService; use OCA\Workspace\Service\UserService; use OCA\Workspace\Service\Workspace\WorkspaceCheckService; use OCA\Workspace\Service\WorkspaceService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\JSONResponse; use OCP\IGroupManager; use OCP\IRequest; @@ -79,14 +83,14 @@ private function deleteBlankSpaceName(string $spaceName): string { } /** - * @NoAdminRequired - * @GeneralManagerRequired * @param string $spaceName * @param int $folderId * @throws BadRequestException * @throws CreateWorkspaceException * @throws CreateGroupException */ + #[NoAdminRequired] + #[GeneralManagerRequired] public function createWorkspace(string $spaceName, int $folderId): JSONResponse { if ($spaceName === false || @@ -134,15 +138,15 @@ public function createWorkspace(string $spaceName, ]); } - /** - * - * Deletes the workspace, and the corresponding groupfolder and groups - * - * @NoAdminRequired - * @GeneralManagerRequired - * @param array $workspace - * - */ + /** + * + * Deletes the workspace, and the corresponding groupfolder and groups + * + * @param array $workspace + * + */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function destroy(array $workspace): JSONResponse { $this->logger->debug('Removing GE users from the WorkspacesManagers group if needed.'); $GEGroup = $this->groupManager->get(WorkspaceManagerGroup::get($workspace['id'])); @@ -179,9 +183,8 @@ public function destroy(array $workspace): JSONResponse { * * Returns a list of all the workspaces that the connected user may use. * - * @NoAdminRequired - * */ + #[NoAdminRequired] public function findAll(): JSONResponse { $workspaces = $this->workspaceService->getAll(); $spaces = []; @@ -215,17 +218,17 @@ public function findAll(): JSONResponse { } /** - * @NoAdminRequired * @param string|array $workspace */ + #[NoAdminRequired] public function addGroupsInfo(string|array $workspace): JSONResponse { return new JSONResponse($this->workspaceService->addGroupsInfo($workspace)); } /** - * @NoAdminRequired * @param string|array $workspace */ + #[NoAdminRequired] public function addUsersInfo(string|array $workspace): JSONResponse { if (gettype($workspace) === 'string') { $workspace = json_decode($workspace, true); @@ -236,12 +239,12 @@ public function addUsersInfo(string|array $workspace): JSONResponse { /** * Returns a list of users whose name matches $term * - * @NoAdminRequired * @param string $term * @param string $spaceId * @param string|array $space * */ + #[NoAdminRequired] public function lookupUsers(string $term, string $spaceId, string|array $space): JSONResponse { @@ -256,13 +259,13 @@ public function lookupUsers(string $term, * * Change a user's role in a workspace * - * @NoAdminRequired - * @SpaceAdminRequired * * @param array|string $space * @param string $userId * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function changeUserRole(array|string $space, string $userId): JSONResponse { if (gettype($space) === 'string') { @@ -289,13 +292,13 @@ public function changeUserRole(array|string $space, /** * - * @NoAdminRequired - * @SpaceAdminRequired * @param array|string $workspace * @param string $newSpaceName * * @todo Manage errors */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function renameSpace(array|string $workspace, string $newSpaceName): JSONResponse { if (gettype($workspace) === 'string') { diff --git a/lib/Middleware/Attribute/GeneralManagerRequired.php b/lib/Middleware/Attribute/GeneralManagerRequired.php new file mode 100644 index 000000000..84251e1e1 --- /dev/null +++ b/lib/Middleware/Attribute/GeneralManagerRequired.php @@ -0,0 +1,30 @@ + + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\Workspace\Middleware\Attribute; + +use Attribute; + +#[Attribute(Attribute::TARGET_METHOD)] +class GeneralManagerRequired +{ +} diff --git a/lib/Middleware/Attribute/SapceAdminRequired.php b/lib/Middleware/Attribute/SapceAdminRequired.php new file mode 100644 index 000000000..f6fee200f --- /dev/null +++ b/lib/Middleware/Attribute/SapceAdminRequired.php @@ -0,0 +1,30 @@ + + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +namespace OCA\Workspace\Middleware\Attribute; + +use Attribute; + +#[Attribute(Attribute::TARGET_METHOD)] +class SpaceAdminRequired +{ +} diff --git a/lib/Middleware/IsGeneralManagerMiddleware.php b/lib/Middleware/IsGeneralManagerMiddleware.php index 346899770..066e3716e 100644 --- a/lib/Middleware/IsGeneralManagerMiddleware.php +++ b/lib/Middleware/IsGeneralManagerMiddleware.php @@ -26,24 +26,24 @@ namespace OCA\Workspace\Middleware; use Exception; +use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; use OCA\Workspace\Middleware\Exceptions\AccessDeniedException; use OCA\Workspace\Service\UserService; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Middleware; -use OCP\AppFramework\Utility\IControllerMethodReflector; -use OCP\IRequest; class IsGeneralManagerMiddleware extends Middleware { + public function __construct( - private IControllerMethodReflector $reflector, - private IRequest $request, private UserService $userService ) { } public function beforeController($controller, $methodName): void { - if ($this->reflector->hasAnnotation('GeneralManagerRequired')) { + $reflectionMethod = new \ReflectionMethod($controller, $methodName); + $hasAttribute = !empty($reflectionMethod->getAttributes(GeneralManagerRequired::class)); + if ($hasAttribute) { if (!$this->userService->isUserGeneralAdmin()) { throw new AccessDeniedException(); } diff --git a/lib/Middleware/IsSpaceAdminMiddleware.php b/lib/Middleware/IsSpaceAdminMiddleware.php index 269a04068..c7b7a72c8 100644 --- a/lib/Middleware/IsSpaceAdminMiddleware.php +++ b/lib/Middleware/IsSpaceAdminMiddleware.php @@ -25,16 +25,17 @@ namespace OCA\Workspace\Middleware; +use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Middleware\Exceptions\AccessDeniedException; use OCA\Workspace\Service\SpaceService; use OCA\Workspace\Service\UserService; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Middleware; -use OCP\AppFramework\Utility\IControllerMethodReflector; use OCP\IRequest; class IsSpaceAdminMiddleware extends Middleware { + public function __construct( private IControllerMethodReflector $reflector, private IRequest $request, @@ -44,7 +45,9 @@ public function __construct( } public function beforeController($controller, $methodName): void { - if ($this->reflector->hasAnnotation('SpaceAdminRequired')) { + $reflectionMethod = new \ReflectionMethod($controller, $methodName); + $hasAttribute = !empty($reflectionMethod->getAttributes(SpaceAdminRequired::class)); + if ($hasAttribute) { $spaceId = $this->request->getParam('spaceId'); $space = $this->spaceService->find($spaceId); if (!$this->userService->isSpaceManagerOfSpace($space->jsonSerialize()) && !$this->userService->isUserGeneralAdmin()) { From c6701a5b5cbe21a222dee8e32f2d3fc31652aa0b Mon Sep 17 00:00:00 2001 From: Baptiste Fotia Date: Tue, 9 May 2023 17:53:23 +0200 Subject: [PATCH 2/9] build(): Apply composer run cs:fix Signed-off-by: Baptiste Fotia --- lib/Controller/PageController.php | 4 ++-- lib/Controller/SpaceController.php | 2 +- lib/Middleware/Attribute/GeneralManagerRequired.php | 3 +-- lib/Middleware/Attribute/SapceAdminRequired.php | 3 +-- lib/Middleware/IsSpaceAdminMiddleware.php | 1 - 5 files changed, 5 insertions(+), 8 deletions(-) diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index dfe62e7f9..2272f7efa 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -28,9 +28,9 @@ use OCA\Workspace\AppInfo\Application; use OCA\Workspace\Service\UserService; use OCP\AppFramework\Controller; -use OCP\AppFramework\Http\TemplateResponse; -use OCP\AppFramework\Http\Attribute\NoCSRFRequired; use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\TemplateResponse; use OCP\Util; class PageController extends Controller { diff --git a/lib/Controller/SpaceController.php b/lib/Controller/SpaceController.php index f482e1582..77434c189 100644 --- a/lib/Controller/SpaceController.php +++ b/lib/Controller/SpaceController.php @@ -45,7 +45,7 @@ public function __construct( /** * @param $id - The space id to get a space - OCA\Workspace\Db\Space . - * @return DataResponse - The space serialized + * @return DataResponse - The space serialized */ #[NoAdminRequired] public function find(int $id): DataResponse { diff --git a/lib/Middleware/Attribute/GeneralManagerRequired.php b/lib/Middleware/Attribute/GeneralManagerRequired.php index 84251e1e1..53f8af0a2 100644 --- a/lib/Middleware/Attribute/GeneralManagerRequired.php +++ b/lib/Middleware/Attribute/GeneralManagerRequired.php @@ -25,6 +25,5 @@ use Attribute; #[Attribute(Attribute::TARGET_METHOD)] -class GeneralManagerRequired -{ +class GeneralManagerRequired { } diff --git a/lib/Middleware/Attribute/SapceAdminRequired.php b/lib/Middleware/Attribute/SapceAdminRequired.php index f6fee200f..22674d409 100644 --- a/lib/Middleware/Attribute/SapceAdminRequired.php +++ b/lib/Middleware/Attribute/SapceAdminRequired.php @@ -25,6 +25,5 @@ use Attribute; #[Attribute(Attribute::TARGET_METHOD)] -class SpaceAdminRequired -{ +class SpaceAdminRequired { } diff --git a/lib/Middleware/IsSpaceAdminMiddleware.php b/lib/Middleware/IsSpaceAdminMiddleware.php index c7b7a72c8..8a5dc56ae 100644 --- a/lib/Middleware/IsSpaceAdminMiddleware.php +++ b/lib/Middleware/IsSpaceAdminMiddleware.php @@ -37,7 +37,6 @@ class IsSpaceAdminMiddleware extends Middleware { public function __construct( - private IControllerMethodReflector $reflector, private IRequest $request, private UserService $userService, private SpaceService $spaceService From a31ef148bf1f88f27e0d2cdcfd944e7158231a5a Mon Sep 17 00:00:00 2001 From: Baptiste Fotia Date: Fri, 26 May 2023 11:02:42 +0200 Subject: [PATCH 3/9] style(php): Run composer cs:fix Signed-off-by: Baptiste Fotia --- lib/Controller/GroupController.php | 27 +++++++++-------- lib/Controller/PageController.php | 2 +- lib/Controller/SpaceController.php | 8 ++--- lib/Controller/WorkspaceController.php | 29 +++++++++---------- lib/Middleware/IsGeneralManagerMiddleware.php | 4 +-- lib/Middleware/IsSpaceAdminMiddleware.php | 4 +-- 6 files changed, 36 insertions(+), 38 deletions(-) diff --git a/lib/Controller/GroupController.php b/lib/Controller/GroupController.php index 58bb1ca0e..b1d4c48df 100644 --- a/lib/Controller/GroupController.php +++ b/lib/Controller/GroupController.php @@ -25,7 +25,6 @@ namespace OCA\Workspace\Controller; -use OCA\Workspace\Service\Group\GroupsWorkspace; use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\Group\GroupFolder\GroupFolderManage; @@ -74,8 +73,8 @@ public function __construct( * @var string $spaceId for Middleware * */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function create(array $data = []): JSONResponse { $data = array_merge(self::DEFAULT, $data); @@ -110,10 +109,10 @@ public function create(array $data = []): JSONResponse { * @var int $spaceId * */ - #[NoAdminRequired] - #[SpaceAdminRequired] - public function delete(string $gid, int $spaceId): JSONResponse { - // TODO Use groupfolder api to retrieve workspace group. + #[NoAdminRequired] + #[SpaceAdminRequired] + public function delete(string $gid, int $spaceId): JSONResponse { + // TODO Use groupfolder api to retrieve workspace group. if (substr($gid, -strlen($spaceId)) != $spaceId) { return new JSONResponse(['You may only delete workspace groups of this space (ie: group\'s name does not end by the workspace\'s ID)'], Http::STATUS_FORBIDDEN); } @@ -142,8 +141,8 @@ public function delete(string $gid, int $spaceId): JSONResponse { * @var int $spaceId * */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function rename(string $newGroupName, string $gid, int $spaceId): JSONResponse { @@ -186,8 +185,8 @@ public function rename(string $newGroupName, * @var string $user * */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function addUser(string $spaceId, string $gid, string $user): JSONResponse { // Makes sure group exist $NCGroup = $this->groupManager->get($gid); @@ -369,11 +368,11 @@ public function removeUser( } /** - * @param string $spaceId + * @param string $spaceId * @param string|array $groupfolder */ - #[NoAdminRequired] - #[GeneralManagerRequired] + #[NoAdminRequired] + #[GeneralManagerRequired] public function transferUsersToGroups(string $spaceId, string|array $groupfolder): JSONResponse { if (gettype($groupfolder) === 'string') { diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 2272f7efa..c7e6711b3 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -43,7 +43,7 @@ public function __construct( * Application's main page * */ - #[NoAdminRequired] + #[NoAdminRequired] #[NoCSRFRequired] public function index(): TemplateResponse { Util::addScript(Application::APP_ID, 'workspace-main'); // js/workspace-main.js diff --git a/lib/Controller/SpaceController.php b/lib/Controller/SpaceController.php index 77434c189..95f739492 100644 --- a/lib/Controller/SpaceController.php +++ b/lib/Controller/SpaceController.php @@ -47,12 +47,12 @@ public function __construct( * @param $id - The space id to get a space - OCA\Workspace\Db\Space . * @return DataResponse - The space serialized */ - #[NoAdminRequired] + #[NoAdminRequired] public function find(int $id): DataResponse { return new DataResponse($this->spaceService->find($id)); } - #[NoAdminRequired] + #[NoAdminRequired] public function findAll(): DataResponse { return new DataResponse($this->spaceService->findAll()); } @@ -60,8 +60,8 @@ public function findAll(): DataResponse { /** * @return DataResponse - The space serialized */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function updateColorCode(string $colorCode, int $spaceId): DataResponse { return new DataResponse($this->spaceService->updateColorCode($colorCode, (int)$spaceId)); } diff --git a/lib/Controller/WorkspaceController.php b/lib/Controller/WorkspaceController.php index ee5dead76..b5052c189 100644 --- a/lib/Controller/WorkspaceController.php +++ b/lib/Controller/WorkspaceController.php @@ -33,13 +33,12 @@ use OCA\Workspace\Exceptions\WorkspaceNameExistException; use OCA\Workspace\Folder\RootFolder; use OCA\Workspace\Helper\GroupfolderHelper; +use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; +use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\Group\GroupFormatter; use OCA\Workspace\Service\Group\ManagersWorkspace; use OCA\Workspace\Service\Group\UserGroup; use OCA\Workspace\Service\Group\WorkspaceManagerGroup; -use OCA\Workspace\Service\Group\GroupsWorkspace; -use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; -use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\SpaceService; use OCA\Workspace\Service\UserService; use OCA\Workspace\Service\Workspace\WorkspaceCheckService; @@ -89,8 +88,8 @@ private function deleteBlankSpaceName(string $spaceName): string { * @throws CreateWorkspaceException * @throws CreateGroupException */ - #[NoAdminRequired] - #[GeneralManagerRequired] + #[NoAdminRequired] + #[GeneralManagerRequired] public function createWorkspace(string $spaceName, int $folderId): JSONResponse { if ($spaceName === false || @@ -145,8 +144,8 @@ public function createWorkspace(string $spaceName, * @param array $workspace * */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function destroy(array $workspace): JSONResponse { $this->logger->debug('Removing GE users from the WorkspacesManagers group if needed.'); $GEGroup = $this->groupManager->get(WorkspaceManagerGroup::get($workspace['id'])); @@ -184,7 +183,7 @@ public function destroy(array $workspace): JSONResponse { * Returns a list of all the workspaces that the connected user may use. * */ - #[NoAdminRequired] + #[NoAdminRequired] public function findAll(): JSONResponse { $workspaces = $this->workspaceService->getAll(); $spaces = []; @@ -220,7 +219,7 @@ public function findAll(): JSONResponse { /** * @param string|array $workspace */ - #[NoAdminRequired] + #[NoAdminRequired] public function addGroupsInfo(string|array $workspace): JSONResponse { return new JSONResponse($this->workspaceService->addGroupsInfo($workspace)); } @@ -228,7 +227,7 @@ public function addGroupsInfo(string|array $workspace): JSONResponse { /** * @param string|array $workspace */ - #[NoAdminRequired] + #[NoAdminRequired] public function addUsersInfo(string|array $workspace): JSONResponse { if (gettype($workspace) === 'string') { $workspace = json_decode($workspace, true); @@ -244,7 +243,7 @@ public function addUsersInfo(string|array $workspace): JSONResponse { * @param string|array $space * */ - #[NoAdminRequired] + #[NoAdminRequired] public function lookupUsers(string $term, string $spaceId, string|array $space): JSONResponse { @@ -264,8 +263,8 @@ public function lookupUsers(string $term, * @param string $userId * */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function changeUserRole(array|string $space, string $userId): JSONResponse { if (gettype($space) === 'string') { @@ -297,8 +296,8 @@ public function changeUserRole(array|string $space, * * @todo Manage errors */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function renameSpace(array|string $workspace, string $newSpaceName): JSONResponse { if (gettype($workspace) === 'string') { diff --git a/lib/Middleware/IsGeneralManagerMiddleware.php b/lib/Middleware/IsGeneralManagerMiddleware.php index 066e3716e..675f184c8 100644 --- a/lib/Middleware/IsGeneralManagerMiddleware.php +++ b/lib/Middleware/IsGeneralManagerMiddleware.php @@ -41,8 +41,8 @@ public function __construct( } public function beforeController($controller, $methodName): void { - $reflectionMethod = new \ReflectionMethod($controller, $methodName); - $hasAttribute = !empty($reflectionMethod->getAttributes(GeneralManagerRequired::class)); + $reflectionMethod = new \ReflectionMethod($controller, $methodName); + $hasAttribute = !empty($reflectionMethod->getAttributes(GeneralManagerRequired::class)); if ($hasAttribute) { if (!$this->userService->isUserGeneralAdmin()) { throw new AccessDeniedException(); diff --git a/lib/Middleware/IsSpaceAdminMiddleware.php b/lib/Middleware/IsSpaceAdminMiddleware.php index 8a5dc56ae..56eab9008 100644 --- a/lib/Middleware/IsSpaceAdminMiddleware.php +++ b/lib/Middleware/IsSpaceAdminMiddleware.php @@ -44,8 +44,8 @@ public function __construct( } public function beforeController($controller, $methodName): void { - $reflectionMethod = new \ReflectionMethod($controller, $methodName); - $hasAttribute = !empty($reflectionMethod->getAttributes(SpaceAdminRequired::class)); + $reflectionMethod = new \ReflectionMethod($controller, $methodName); + $hasAttribute = !empty($reflectionMethod->getAttributes(SpaceAdminRequired::class)); if ($hasAttribute) { $spaceId = $this->request->getParam('spaceId'); $space = $this->spaceService->find($spaceId); From 290e5e5b889f7e61901a1ecd3abe53ea853cb899 Mon Sep 17 00:00:00 2001 From: Baptiste Fotia Date: Mon, 4 Mar 2024 16:10:07 +0100 Subject: [PATCH 4/9] refactor(): Replace the anotations by attributes for the FileCSVController file Signed-off-by: Baptiste Fotia --- lib/Controller/FileCSVController.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/Controller/FileCSVController.php b/lib/Controller/FileCSVController.php index 2dce3ea4e..d880047db 100644 --- a/lib/Controller/FileCSVController.php +++ b/lib/Controller/FileCSVController.php @@ -28,10 +28,12 @@ use OCA\Workspace\Files\Csv; use OCA\Workspace\Files\InternalFile; use OCA\Workspace\Files\LocalFile; +use OCA\Workspace\Middleware\Attribute\SpaceAdminRequired; use OCA\Workspace\Service\UserService; use OCA\Workspace\Service\WorkspaceService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; use OCP\AppFramework\Http\JSONResponse; use OCP\Files\IRootFolder; use OCP\Files\Node; @@ -57,11 +59,10 @@ public function __construct( } /** - * @NoAdminRequired - * @SpaceAdminRequired * Returns formatted list of existing users of the instance. - * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function import(): JSONResponse { $params = $this->request->getParams(); $spaceObj = $params['space']; @@ -116,11 +117,10 @@ public function import(): JSONResponse { } /** - * @NoAdminRequired - * @SpaceAdminRequired * Returns formatted list of existing users of the instance. - * */ + #[NoAdminRequired] + #[SpaceAdminRequired] public function getFromFiles():JSONResponse { $params = $this->request->getParams(); $path = $params['path']; From 8fdcac61a8e150ba5b3c40570daeed2aa7006535 Mon Sep 17 00:00:00 2001 From: Baptiste Fotia Date: Wed, 27 Mar 2024 18:34:50 +0100 Subject: [PATCH 5/9] chore(info): Add php8.0 as dependency for the app Signed-off-by: Baptiste Fotia --- appinfo/info.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/appinfo/info.xml b/appinfo/info.xml index c7b72b333..e9dd9bfac 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -20,6 +20,7 @@ https://www.arawa.fr/contact/ + From 7a51e4c549d2d10f10ad159d57633dc4efa5b2a7 Mon Sep 17 00:00:00 2001 From: zak39 Date: Wed, 10 Jul 2024 16:20:38 +0200 Subject: [PATCH 6/9] style(): composer run cs:fix --- lib/Controller/FileCSVController.php | 8 ++++---- lib/Controller/GroupController.php | 4 ++-- lib/Controller/WorkspaceController.php | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/Controller/FileCSVController.php b/lib/Controller/FileCSVController.php index d880047db..110269b99 100644 --- a/lib/Controller/FileCSVController.php +++ b/lib/Controller/FileCSVController.php @@ -61,8 +61,8 @@ public function __construct( /** * Returns formatted list of existing users of the instance. */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function import(): JSONResponse { $params = $this->request->getParams(); $spaceObj = $params['space']; @@ -119,8 +119,8 @@ public function import(): JSONResponse { /** * Returns formatted list of existing users of the instance. */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function getFromFiles():JSONResponse { $params = $this->request->getParams(); $path = $params['path']; diff --git a/lib/Controller/GroupController.php b/lib/Controller/GroupController.php index b1d4c48df..ff48a703e 100644 --- a/lib/Controller/GroupController.php +++ b/lib/Controller/GroupController.php @@ -291,8 +291,8 @@ public function removeUserFromWorkspace( * @var string $user * */ - #[NoAdminRequired] - #[SpaceAdminRequired] + #[NoAdminRequired] + #[SpaceAdminRequired] public function removeUser( IRequest $request, array|string $space, diff --git a/lib/Controller/WorkspaceController.php b/lib/Controller/WorkspaceController.php index b5052c189..3c3e270a1 100644 --- a/lib/Controller/WorkspaceController.php +++ b/lib/Controller/WorkspaceController.php @@ -137,13 +137,13 @@ public function createWorkspace(string $spaceName, ]); } - /** - * - * Deletes the workspace, and the corresponding groupfolder and groups - * - * @param array $workspace - * - */ + /** + * + * Deletes the workspace, and the corresponding groupfolder and groups + * + * @param array $workspace + * + */ #[NoAdminRequired] #[SpaceAdminRequired] public function destroy(array $workspace): JSONResponse { From 3a27f45ef72dba29dac9420cb3dfb85fcc336d3f Mon Sep 17 00:00:00 2001 From: zak39 Date: Tue, 20 Aug 2024 17:50:36 +0200 Subject: [PATCH 7/9] fix(application): Remove IRequest as parameter to register the middleware I added an extra parameter to register the IsGeneralManager Middleware. --- lib/AppInfo/Application.php | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 7cff1a8a5..b70790cb8 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -59,7 +59,6 @@ public function register(IRegistrationContext $context): void { $context->registerService(IsGeneralManagerMiddleware::class, function ($c) { return new IsGeneralManagerMiddleware( - $c->query(IRequest::class), $c->query(UserService::class) ); }); From ff26b2eb1158e5ac21da7372a27dcea91a73e865 Mon Sep 17 00:00:00 2001 From: zak39 Date: Wed, 21 Aug 2024 17:43:12 +0200 Subject: [PATCH 8/9] fix(middleware): Fill data in the json return --- lib/Middleware/IsGeneralManagerMiddleware.php | 18 ++++++++++++++---- lib/Middleware/IsSpaceAdminMiddleware.php | 9 ++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/Middleware/IsGeneralManagerMiddleware.php b/lib/Middleware/IsGeneralManagerMiddleware.php index 675f184c8..63236d7fd 100644 --- a/lib/Middleware/IsGeneralManagerMiddleware.php +++ b/lib/Middleware/IsGeneralManagerMiddleware.php @@ -26,12 +26,13 @@ namespace OCA\Workspace\Middleware; use Exception; -use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; -use OCA\Workspace\Middleware\Exceptions\AccessDeniedException; -use OCA\Workspace\Service\UserService; use OCP\AppFramework\Http; -use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Middleware; +use OCA\Workspace\Service\UserService; +use OCP\AppFramework\Http\JSONResponse; +use OCA\Workspace\Exceptions\BadRequestException; +use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; +use OCA\Workspace\Middleware\Exceptions\AccessDeniedException; class IsGeneralManagerMiddleware extends Middleware { @@ -59,5 +60,14 @@ public function afterException($controller, $methodName, Exception $exception): 'msg' => 'You are not allowed to perform this action' ], Http::STATUS_FORBIDDEN); } + + return new JSONResponse([ + 'message' => 'Impossible to catch the exception from the ' . $this::class, + 'exception' => [ + 'class' => $exception::class, + 'message' => $exception->getMessage(), + 'trace' => $exception->getTrace() + ] + ]); } } diff --git a/lib/Middleware/IsSpaceAdminMiddleware.php b/lib/Middleware/IsSpaceAdminMiddleware.php index 56eab9008..0d78e39c1 100644 --- a/lib/Middleware/IsSpaceAdminMiddleware.php +++ b/lib/Middleware/IsSpaceAdminMiddleware.php @@ -63,6 +63,13 @@ public function afterException($controller, $methodName, \Exception $exception): ], Http::STATUS_FORBIDDEN); } - return new JSONResponse([]); + return new JSONResponse([ + 'message' => 'Impossible to catch the exception from the ' . $this::class, + 'exception' => [ + 'class' => $exception::class, + 'message' => $exception->getMessage(), + 'trace' => $exception->getTrace() + ] + ]); } } From 91b51491e1288bf498028acf6271f99d83c29fc2 Mon Sep 17 00:00:00 2001 From: zak39 Date: Wed, 21 Aug 2024 17:45:53 +0200 Subject: [PATCH 9/9] chore(): run composer cs:fix --- lib/Middleware/IsGeneralManagerMiddleware.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/Middleware/IsGeneralManagerMiddleware.php b/lib/Middleware/IsGeneralManagerMiddleware.php index 63236d7fd..22e18b4d6 100644 --- a/lib/Middleware/IsGeneralManagerMiddleware.php +++ b/lib/Middleware/IsGeneralManagerMiddleware.php @@ -26,13 +26,12 @@ namespace OCA\Workspace\Middleware; use Exception; -use OCP\AppFramework\Http; -use OCP\AppFramework\Middleware; -use OCA\Workspace\Service\UserService; -use OCP\AppFramework\Http\JSONResponse; -use OCA\Workspace\Exceptions\BadRequestException; use OCA\Workspace\Middleware\Attribute\GeneralManagerRequired; use OCA\Workspace\Middleware\Exceptions\AccessDeniedException; +use OCA\Workspace\Service\UserService; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Middleware; class IsGeneralManagerMiddleware extends Middleware {