From 41cb91b4c496cc87488c1b564a4d936610c811a2 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 | 80 ++++++++++++++++++++++++++--- package.json | 1 + src/settings/Api.ts | 21 ++++++++ 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/lib/Controller/FolderController.php b/lib/Controller/FolderController.php index 22e9da7f0..0b3c9df88 100644 --- a/lib/Controller/FolderController.php +++ b/lib/Controller/FolderController.php @@ -27,6 +27,7 @@ use OCA\GroupFolders\Service\DelegationService; use OCA\GroupFolders\Service\FoldersFilter; use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\OCSController; use OCP\Files\IRootFolder; @@ -160,6 +161,7 @@ private function getRootFolderStorageId(): ?int { * @RequireGroupFolderAdmin * @NoAdminRequired */ + #[PasswordConfirmationRequired] public function addFolder(string $mountpoint): DataResponse { $id = $this->manager->createFolder(trim($mountpoint)); return new DataResponse(['id' => $id]); @@ -169,6 +171,7 @@ public function addFolder(string $mountpoint): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function removeFolder(int $id): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -184,6 +187,7 @@ public function removeFolder(int $id): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function setMountPoint(int $id, string $mountPoint): DataResponse { $this->manager->renameFolder($id, trim($mountPoint)); return new DataResponse(['success' => true]); @@ -193,6 +197,7 @@ public function setMountPoint(int $id, string $mountPoint): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function addGroup(int $id, string $group): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -206,6 +211,7 @@ public function addGroup(int $id, string $group): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function removeGroup(int $id, string $group): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -219,6 +225,7 @@ public function removeGroup(int $id, string $group): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function setPermissions(int $id, string $group, int $permissions): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -233,6 +240,7 @@ public function setPermissions(int $id, string $group, int $permissions): DataRe * @RequireGroupFolderAdmin * @throws \OCP\DB\Exception */ + #[PasswordConfirmationRequired] public function setManageACL(int $id, string $mappingType, string $mappingId, bool $manageAcl): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -246,6 +254,7 @@ public function setManageACL(int $id, string $mappingType, string $mappingId, bo * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function setQuota(int $id, int $quota): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -259,6 +268,7 @@ public function setQuota(int $id, int $quota): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function setACL(int $id, bool $acl): DataResponse { $response = $this->checkFolderExists($id); if ($response) { @@ -272,6 +282,7 @@ public function setACL(int $id, bool $acl): DataResponse { * @NoAdminRequired * @RequireGroupFolderAdmin */ + #[PasswordConfirmationRequired] public function renameFolder(int $id, string $mountpoint): DataResponse { $response = $this->checkFolderExists($id); if ($response) { diff --git a/package-lock.json b/package-lock.json index 46653f184..d1f192861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@nextcloud/files": "^3.1.0", "@nextcloud/initial-state": "^2.1.0", "@nextcloud/l10n": "^2.2.0", + "@nextcloud/password-confirmation": "^5.1.1", "@nextcloud/router": "^2.2.0", "@nextcloud/vue": "^8.4.0", "nextcloud-server": "^0.15.10", @@ -3451,17 +3452,31 @@ } }, "node_modules/@nextcloud/axios": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.4.0.tgz", - "integrity": "sha512-ARGzT9p45L0sjRIV3JZWGPtMbwgxd4eEMcMJNn58NA7UQIsMkTwHb5pXQjL+5elXY9zp/JMz7n/7SHTp0bkuXQ==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.5.1.tgz", + "integrity": "sha512-AA7BPF/rsOZWAiVxqlobGSdD67AEwjOnymZCKUIwEIBArKxYK7OQEqcILDjQwgj6G0e/Vg9Y8zTVsPZp+mlvwA==", + "license": "GPL-3.0-or-later", "dependencies": { - "@nextcloud/auth": "^2.1.0", - "@nextcloud/router": "^2.1.2", - "axios": "^1.4.0" + "@nextcloud/auth": "^2.3.0", + "@nextcloud/router": "^3.0.1", + "axios": "^1.6.8" }, "engines": { "node": "^20.0.0", - "npm": "^9.0.0" + "npm": "^10.0.0" + } + }, + "node_modules/@nextcloud/axios/node_modules/@nextcloud/router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.0.1.tgz", + "integrity": "sha512-Ci/uD3x8OKHdxSqXL6gRJ+mGJOEXjeiHjj7hqsZqVTsT7kOrCjDf0/J8z5RyLlokKZ0IpSe+hGxgi3YB7Gpw3Q==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/typings": "^1.7.0" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" } }, "node_modules/@nextcloud/babel-config": { @@ -3662,6 +3677,57 @@ "npm": "^9.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/password-confirmation/node_modules/@nextcloud/l10n": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/l10n/-/l10n-3.1.0.tgz", + "integrity": "sha512-unciqr8QSJ29vFBw9S1bquyoj1PTWHszNL8tcUNuxUAYpq0hX+8o7rpB5gimELA4sj4m9+VCJwgLtBZd1Yj0lg==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/router": "^3.0.1", + "@nextcloud/typings": "^1.8.0", + "@types/dompurify": "^3.0.5", + "@types/escape-html": "^1.0.4", + "dompurify": "^3.1.2", + "escape-html": "^1.0.3", + "node-gettext": "^3.0.0" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" + } + }, + "node_modules/@nextcloud/password-confirmation/node_modules/@nextcloud/router": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.0.1.tgz", + "integrity": "sha512-Ci/uD3x8OKHdxSqXL6gRJ+mGJOEXjeiHjj7hqsZqVTsT7kOrCjDf0/J8z5RyLlokKZ0IpSe+hGxgi3YB7Gpw3Q==", + "license": "GPL-3.0-or-later", + "dependencies": { + "@nextcloud/typings": "^1.7.0" + }, + "engines": { + "node": "^20.0.0", + "npm": "^10.0.0" + } + }, "node_modules/@nextcloud/paths": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@nextcloud/paths/-/paths-2.1.0.tgz", diff --git a/package.json b/package.json index 56423e48c..e610fc05f 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "@nextcloud/files": "^3.1.0", "@nextcloud/initial-state": "^2.1.0", "@nextcloud/l10n": "^2.2.0", + "@nextcloud/password-confirmation": "^5.1.1", "@nextcloud/router": "^2.2.0", "@nextcloud/vue": "^8.4.0", "nextcloud-server": "^0.15.10", diff --git a/src/settings/Api.ts b/src/settings/Api.ts index 944aae1ff..e9e6d5399 100644 --- a/src/settings/Api.ts +++ b/src/settings/Api.ts @@ -1,5 +1,6 @@ import { generateUrl } 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' @@ -70,6 +71,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, @@ -77,27 +80,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, @@ -106,14 +121,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 }) }