From e4d569f59dfee30b35906b2d61167780f68f4cc4 Mon Sep 17 00:00:00 2001 From: provokateurin Date: Tue, 10 Sep 2024 18:16:52 +0200 Subject: [PATCH] fix(settings): Fix config handling Signed-off-by: provokateurin --- lib/Controller/FolderController.php | 11 +++++++++++ package-lock.json | 20 ++++++++++++++++++++ package.json | 1 + src/settings/Api.ts | 21 +++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/lib/Controller/FolderController.php b/lib/Controller/FolderController.php index 8e3d5b648..b9f598324 100644 --- a/lib/Controller/FolderController.php +++ b/lib/Controller/FolderController.php @@ -16,6 +16,7 @@ use OCP\AppFramework\Http; use OCP\AppFramework\Http\Attribute\ApiRoute; use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; @@ -151,6 +152,7 @@ private function getRootFolderStorageId(): ?int { /** * @throws OCSNotFoundException */ + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders')] @@ -170,6 +172,7 @@ public function addFolder(string $mountpoint): DataResponse { return new DataResponse($folder); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'DELETE', url: '/folders/{id}')] @@ -190,6 +193,7 @@ public function removeFolder(int $id): DataResponse { return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'PUT', url: '/folders/{id}')] @@ -198,6 +202,7 @@ public function setMountPoint(int $id, string $mountPoint): DataResponse { return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders/{id}/groups')] @@ -212,6 +217,7 @@ public function addGroup(int $id, string $group): DataResponse { return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'DELETE', url: '/folders/{id}/groups/{group}', requirements: ['group' => '.+'])] @@ -226,6 +232,7 @@ public function removeGroup(int $id, string $group): DataResponse { return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders/{id}/groups/{group}', requirements: ['group' => '.+'])] @@ -243,6 +250,7 @@ public function setPermissions(int $id, string $group, int $permissions): DataRe /** * @throws \OCP\DB\Exception */ + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders/{id}/manageACL')] @@ -257,6 +265,7 @@ public function setManageACL(int $id, string $mappingType, string $mappingId, bo return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders/{id}/quota')] @@ -271,6 +280,7 @@ public function setQuota(int $id, int $quota): DataResponse { return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders/{id}/acl')] @@ -285,6 +295,7 @@ public function setACL(int $id, bool $acl): DataResponse { return new DataResponse(['success' => true]); } + #[PasswordConfirmationRequired] #[RequireGroupFolderAdmin] #[NoAdminRequired] #[ApiRoute(verb: 'POST', url: '/folders/{id}/mountpoint')] diff --git a/package-lock.json b/package-lock.json index 7201e0ef4..b5e887932 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@nextcloud/initial-state": "^2.2.0", "@nextcloud/l10n": "^3.1.0", "@nextcloud/logger": "^3.0.2", + "@nextcloud/password-confirmation": "^5.1.1", "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^8.19.0", "nextcloud-server": "^0.15.10", @@ -4386,6 +4387,25 @@ "npm": "^10.0.0" } }, + "node_modules/@nextcloud/password-confirmation": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@nextcloud/password-confirmation/-/password-confirmation-5.1.1.tgz", + "integrity": "sha512-UlQcjVe/fr/JaJ6TWaRM+yBLIEZRU6RWMy0JoExcA6UVJs2HJrRIyVMuiCLuIYlH23ReJH+z7zFI3+V7vdeJ1Q==", + "license": "MIT", + "dependencies": { + "@nextcloud/axios": "^2.5.0", + "@nextcloud/l10n": "^3.1.0", + "@nextcloud/router": "^3.0.1" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" + }, + "peerDependencies": { + "@nextcloud/vue": "^8.0.0", + "vue": "^2.7.16" + } + }, "node_modules/@nextcloud/paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-2.2.1.tgz", diff --git a/package.json b/package.json index d2229c429..a95b4cabc 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "@nextcloud/initial-state": "^2.2.0", "@nextcloud/l10n": "^3.1.0", "@nextcloud/logger": "^3.0.2", + "@nextcloud/password-confirmation": "^5.1.1", "@nextcloud/router": "^3.0.1", "@nextcloud/vue": "^8.19.0", "nextcloud-server": "^0.15.10", diff --git a/src/settings/Api.ts b/src/settings/Api.ts index b53719626..0ff560d82 100644 --- a/src/settings/Api.ts +++ b/src/settings/Api.ts @@ -4,6 +4,7 @@ */ import { generateUrl, generateOcsUrl } from '@nextcloud/router' import axios from '@nextcloud/axios' +import { confirmPassword } from '@nextcloud/password-confirmation' // eslint-disable-next-line n/no-unpublished-import import type { OCSResponse } from '@nextcloud/typings/lib/ocs' @@ -74,6 +75,8 @@ export class Api { // Updates the list of groups that have been granted delegated admin or subadmin rights on groupfolders async updateDelegatedGroups(newGroups: Group[], classname: string): Promise { + await confirmPassword() + await axios.post(generateUrl('/apps/settings/') + '/settings/authorizedgroups/saveSettings', { newGroups, class: classname, @@ -81,27 +84,39 @@ export class Api { } async createFolder(mountPoint: string): Promise { + await confirmPassword() + const response = await axios.post>(this.getUrl('folders'), { mountpoint: mountPoint }) return response.data.ocs.data } async deleteFolder(id: number): Promise { + await confirmPassword() + await axios.delete(this.getUrl(`folders/${id}`)) } async addGroup(folderId: number, group: string): Promise { + await confirmPassword() + await axios.post(this.getUrl(`folders/${folderId}/groups`), { group }) } async removeGroup(folderId: number, group: string): Promise { + await confirmPassword() + await axios.delete(this.getUrl(`folders/${folderId}/groups/${group}`)) } async setPermissions(folderId: number, group: string, permissions: number): Promise { + await confirmPassword() + await axios.post(this.getUrl(`folders/${folderId}/groups/${group}`), { permissions }) } async setManageACL(folderId: number, type: string, id: string, manageACL: boolean): Promise { + await confirmPassword() + await axios.post(this.getUrl(`folders/${folderId}/manageACL`), { mappingType: type, mappingId: id, @@ -110,14 +125,20 @@ export class Api { } async setQuota(folderId: number, quota: number): Promise { + await confirmPassword() + await axios.post(this.getUrl(`folders/${folderId}/quota`), { quota }) } async setACL(folderId: number, acl: boolean): Promise { + await confirmPassword() + await axios.post(this.getUrl(`folders/${folderId}/acl`), { acl: acl ? 1 : 0 }) } async renameFolder(folderId: number, mountpoint: string): Promise { + await confirmPassword() + await axios.post(this.getUrl(`folders/${folderId}/mountpoint`), { mountpoint }) }