Skip to content

Commit 33d3f37

Browse files
Merge pull request #3287 from nextcloud/fix/settings/config-handling-stable29
2 parents bd33227 + 6ba331d commit 33d3f37

File tree

5 files changed

+129
-120
lines changed

5 files changed

+129
-120
lines changed

lib/Controller/FolderController.php

+11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use OCA\GroupFolders\Service\DelegationService;
2828
use OCA\GroupFolders\Service\FoldersFilter;
2929
use OCP\AppFramework\Http;
30+
use OCP\AppFramework\Http\Attribute\PasswordConfirmationRequired;
3031
use OCP\AppFramework\Http\DataResponse;
3132
use OCP\AppFramework\OCSController;
3233
use OCP\Files\IRootFolder;
@@ -160,6 +161,7 @@ private function getRootFolderStorageId(): ?int {
160161
* @RequireGroupFolderAdmin
161162
* @NoAdminRequired
162163
*/
164+
#[PasswordConfirmationRequired]
163165
public function addFolder(string $mountpoint): DataResponse {
164166
$id = $this->manager->createFolder(trim($mountpoint));
165167
return new DataResponse(['id' => $id]);
@@ -169,6 +171,7 @@ public function addFolder(string $mountpoint): DataResponse {
169171
* @NoAdminRequired
170172
* @RequireGroupFolderAdmin
171173
*/
174+
#[PasswordConfirmationRequired]
172175
public function removeFolder(int $id): DataResponse {
173176
$response = $this->checkFolderExists($id);
174177
if ($response) {
@@ -184,6 +187,7 @@ public function removeFolder(int $id): DataResponse {
184187
* @NoAdminRequired
185188
* @RequireGroupFolderAdmin
186189
*/
190+
#[PasswordConfirmationRequired]
187191
public function setMountPoint(int $id, string $mountPoint): DataResponse {
188192
$this->manager->renameFolder($id, trim($mountPoint));
189193
return new DataResponse(['success' => true]);
@@ -193,6 +197,7 @@ public function setMountPoint(int $id, string $mountPoint): DataResponse {
193197
* @NoAdminRequired
194198
* @RequireGroupFolderAdmin
195199
*/
200+
#[PasswordConfirmationRequired]
196201
public function addGroup(int $id, string $group): DataResponse {
197202
$response = $this->checkFolderExists($id);
198203
if ($response) {
@@ -206,6 +211,7 @@ public function addGroup(int $id, string $group): DataResponse {
206211
* @NoAdminRequired
207212
* @RequireGroupFolderAdmin
208213
*/
214+
#[PasswordConfirmationRequired]
209215
public function removeGroup(int $id, string $group): DataResponse {
210216
$response = $this->checkFolderExists($id);
211217
if ($response) {
@@ -219,6 +225,7 @@ public function removeGroup(int $id, string $group): DataResponse {
219225
* @NoAdminRequired
220226
* @RequireGroupFolderAdmin
221227
*/
228+
#[PasswordConfirmationRequired]
222229
public function setPermissions(int $id, string $group, int $permissions): DataResponse {
223230
$response = $this->checkFolderExists($id);
224231
if ($response) {
@@ -233,6 +240,7 @@ public function setPermissions(int $id, string $group, int $permissions): DataRe
233240
* @RequireGroupFolderAdmin
234241
* @throws \OCP\DB\Exception
235242
*/
243+
#[PasswordConfirmationRequired]
236244
public function setManageACL(int $id, string $mappingType, string $mappingId, bool $manageAcl): DataResponse {
237245
$response = $this->checkFolderExists($id);
238246
if ($response) {
@@ -246,6 +254,7 @@ public function setManageACL(int $id, string $mappingType, string $mappingId, bo
246254
* @NoAdminRequired
247255
* @RequireGroupFolderAdmin
248256
*/
257+
#[PasswordConfirmationRequired]
249258
public function setQuota(int $id, int $quota): DataResponse {
250259
$response = $this->checkFolderExists($id);
251260
if ($response) {
@@ -259,6 +268,7 @@ public function setQuota(int $id, int $quota): DataResponse {
259268
* @NoAdminRequired
260269
* @RequireGroupFolderAdmin
261270
*/
271+
#[PasswordConfirmationRequired]
262272
public function setACL(int $id, bool $acl): DataResponse {
263273
$response = $this->checkFolderExists($id);
264274
if ($response) {
@@ -272,6 +282,7 @@ public function setACL(int $id, bool $acl): DataResponse {
272282
* @NoAdminRequired
273283
* @RequireGroupFolderAdmin
274284
*/
285+
#[PasswordConfirmationRequired]
275286
public function renameFolder(int $id, string $mountpoint): DataResponse {
276287
$response = $this->checkFolderExists($id);
277288
if ($response) {

package-lock.json

+39-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
"@nextcloud/webpack-vue-config": "^5.5.1",
2727
"@types/bootstrap": "^5.2.10",
2828
"@types/jest": "^29.5.12",
29-
"@types/jquery": "^3.5.29",
3029
"@types/react": "^17.0.43",
3130
"@types/react-dom": "^17.0.0",
3231
"@types/webpack": "^5.28.5",
@@ -59,6 +58,7 @@
5958
"@nextcloud/files": "^3.8.0",
6059
"@nextcloud/initial-state": "^2.2.0",
6160
"@nextcloud/l10n": "^2.2.0",
61+
"@nextcloud/password-confirmation": "^5.1.1",
6262
"@nextcloud/router": "^3.0.1",
6363
"@nextcloud/vue": "^8.17.0",
6464
"nextcloud-server": "^0.15.10",

src/settings/Api.ts

+78-77
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { generateUrl } from '@nextcloud/router'
2-
import { OCSResult, AxiosOCSResult } from 'NC'
32
import axios from '@nextcloud/axios'
4-
import Thenable = JQuery.Thenable;
3+
import { confirmPassword } from '@nextcloud/password-confirmation'
4+
// eslint-disable-next-line n/no-unpublished-import
5+
import type { OCSResponse } from '@nextcloud/typings/lib/ocs'
56

67
export interface Group {
78
gid: string;
@@ -29,7 +30,6 @@ export interface ManageRuleProps {
2930
displayname: string;
3031
}
3132

32-
3333
export interface Folder {
3434
id: number;
3535
mount_point: string;
@@ -46,118 +46,119 @@ export class Api {
4646
return OC.generateUrl(`apps/groupfolders/${endpoint}`)
4747
}
4848

49-
listFolders(): Thenable<Folder[]> {
50-
return $.getJSON(this.getUrl('folders'))
51-
.then((data: OCSResult<Folder[]>) => Object.keys(data.ocs.data).map(id => data.ocs.data[id]))
49+
async listFolders(): Promise<Folder[]> {
50+
const response = await axios.get<OCSResponse<Folder[]>>(this.getUrl('folders'))
51+
return Object.keys(response.data.ocs.data).map(id => response.data.ocs.data[id])
5252
}
5353

5454
// Returns all NC groups
55-
listGroups(): Thenable<Group[]> {
56-
return $.getJSON(this.getUrl('delegation/groups'))
57-
.then((data: OCSResult<Group[]>) => data.ocs.data)
55+
async listGroups(): Promise<Group[]> {
56+
const response = await axios.get<OCSResponse<Group[]>>(this.getUrl('delegation/groups'))
57+
return response.data.ocs.data
5858
}
5959

6060
// Returns all visible NC circles
61-
listCircles(): Thenable<Circle[]> {
62-
return $.getJSON(this.getUrl('delegation/circles'))
63-
.then((data: OCSResult<Circle[]>) => data.ocs.data)
61+
async listCircles(): Promise<Circle[]> {
62+
const response = await axios.get<OCSResponse<Circle[]>>(this.getUrl('delegation/circles'))
63+
return response.data.ocs.data
6464
}
6565

6666
// Returns all groups that have been granted delegated admin or subadmin rights on groupfolders
67-
listDelegatedGroups(classname: string): Thenable<Group[]> {
68-
return axios.get(this.getUrl('/delegation/authorized-groups'), { params: { classname } })
69-
.then((data: AxiosOCSResult<Group[]>) => {
70-
// The admin group is always there. We don't want the user to remove it
71-
const groups = data.data.ocs.data.filter(g => g.gid !== 'admin')
72-
return groups
73-
})
67+
async listDelegatedGroups(classname: string): Promise<Group[]> {
68+
const response = await axios.get<OCSResponse<Group[]>>(this.getUrl('/delegation/authorized-groups'), { params: { classname } })
69+
return response.data.ocs.data.filter(g => g.gid !== 'admin')
7470
}
7571

7672
// Updates the list of groups that have been granted delegated admin or subadmin rights on groupfolders
77-
updateDelegatedGroups(newGroups: Group[], classname: string): Thenable<void> {
78-
return axios.post(generateUrl('/apps/settings/') + '/settings/authorizedgroups/saveSettings', {
73+
async updateDelegatedGroups(newGroups: Group[], classname: string): Promise<void> {
74+
await confirmPassword()
75+
76+
await axios.post(generateUrl('/apps/settings/') + '/settings/authorizedgroups/saveSettings', {
7977
newGroups,
8078
class: classname,
81-
}).then((data) => data.data)
79+
})
8280
}
8381

84-
createFolder(mountPoint: string): Thenable<number> {
85-
return $.post(this.getUrl('folders'), {
86-
mountpoint: mountPoint
87-
}, null, 'json').then((data: OCSResult<{ id: number; }>) => data.ocs.data.id)
82+
async createFolder(mountPoint: string): Promise<number> {
83+
await confirmPassword()
84+
85+
const response = await axios.post<OCSResponse<number>>(this.getUrl('folders'), { mountpoint: mountPoint })
86+
return response.data.ocs.data
8887
}
8988

90-
deleteFolder(id: number): Thenable<void> {
91-
return $.ajax({
92-
url: this.getUrl(`folders/${id}`),
93-
type: 'DELETE'
94-
})
89+
async deleteFolder(id: number): Promise<void> {
90+
await confirmPassword()
91+
92+
await axios.delete(this.getUrl(`folders/${id}`))
9593
}
9694

97-
addGroup(folderId: number, group: string): Thenable<void> {
98-
return $.post(this.getUrl(`folders/${folderId}/groups`), {
99-
group
100-
})
95+
async addGroup(folderId: number, group: string): Promise<void> {
96+
await confirmPassword()
97+
98+
await axios.post(this.getUrl(`folders/${folderId}/groups`), { group })
10199
}
102100

103-
removeGroup(folderId: number, group: string): Thenable<void> {
104-
return $.ajax({
105-
url: this.getUrl(`folders/${folderId}/groups/${group}`),
106-
type: 'DELETE'
107-
})
101+
async removeGroup(folderId: number, group: string): Promise<void> {
102+
await confirmPassword()
103+
104+
await axios.delete(this.getUrl(`folders/${folderId}/groups/${group}`))
108105
}
109106

110-
setPermissions(folderId: number, group: string, permissions: number): Thenable<void> {
111-
return $.post(this.getUrl(`folders/${folderId}/groups/${group}`), {
112-
permissions
113-
})
107+
async setPermissions(folderId: number, group: string, permissions: number): Promise<void> {
108+
await confirmPassword()
109+
110+
await axios.post(this.getUrl(`folders/${folderId}/groups/${group}`), { permissions })
114111
}
115112

116-
setManageACL(folderId: number, type: string, id: string, manageACL: boolean): Thenable<void> {
117-
return $.post(this.getUrl(`folders/${folderId}/manageACL`), {
113+
async setManageACL(folderId: number, type: string, id: string, manageACL: boolean): Promise<void> {
114+
await confirmPassword()
115+
116+
await axios.post(this.getUrl(`folders/${folderId}/manageACL`), {
118117
mappingType: type,
119118
mappingId: id,
120-
manageAcl: manageACL ? 1 : 0
119+
manageAcl: manageACL ? 1 : 0,
121120
})
122121
}
123122

124-
setQuota(folderId: number, quota: number): Thenable<void> {
125-
return $.post(this.getUrl(`folders/${folderId}/quota`), {
126-
quota
127-
})
123+
async setQuota(folderId: number, quota: number): Promise<void> {
124+
await confirmPassword()
125+
126+
await axios.post(this.getUrl(`folders/${folderId}/quota`), { quota })
128127
}
129128

130-
setACL(folderId: number, acl: boolean): Thenable<void> {
131-
return $.post(this.getUrl(`folders/${folderId}/acl`), {
132-
acl: acl ? 1 : 0
133-
})
129+
async setACL(folderId: number, acl: boolean): Promise<void> {
130+
await confirmPassword()
131+
132+
await axios.post(this.getUrl(`folders/${folderId}/acl`), { acl: acl ? 1 : 0 })
134133
}
135134

136-
renameFolder(folderId: number, mountpoint: string): Thenable<void> {
137-
return $.post(this.getUrl(`folders/${folderId}/mountpoint`), {
138-
mountpoint
139-
})
135+
async renameFolder(folderId: number, mountpoint: string): Promise<void> {
136+
await confirmPassword()
137+
138+
await axios.post(this.getUrl(`folders/${folderId}/mountpoint`), { mountpoint })
140139
}
141140

142-
aclMappingSearch(folderId: number, search: string): Thenable<{groups: OCSGroup[], users: OCSUser[]}> {
143-
return $.getJSON(this.getUrl(`folders/${folderId}/search?format=json&search=${search}`))
144-
.then((data: OCSResult<{ groups: OCSGroup[]; users: OCSUser[]; }>) => {
141+
async aclMappingSearch(folderId: number, search: string): Promise<{
142+
groups: ManageRuleProps[],
143+
users: ManageRuleProps[]
144+
}> {
145+
const response = await axios.get<OCSResponse<{groups: OCSGroup[], users: OCSUser[]}>>(this.getUrl(`folders/${folderId}/search`), { params: { search } })
146+
return {
147+
groups: Object.values(response.data.ocs.data.groups).map((item) => {
145148
return {
146-
groups: Object.values(data.ocs.data.groups).map((item) => {
147-
return {
148-
type: 'group',
149-
id: item.gid,
150-
displayname: item.displayname
151-
}
152-
}),
153-
users: Object.values(data.ocs.data.users).map((item) => {
154-
return {
155-
type: 'user',
156-
id: item.uid,
157-
displayname: item.displayname
158-
}
159-
})
149+
type: 'group',
150+
id: item.gid,
151+
displayname: item.displayname,
160152
}
161-
})
153+
}),
154+
users: Object.values(response.data.ocs.data.users).map((item) => {
155+
return {
156+
type: 'user',
157+
id: item.uid,
158+
displayname: item.displayname,
159+
}
160+
}),
161+
}
162162
}
163+
163164
}

0 commit comments

Comments
 (0)