Skip to content

Commit

Permalink
Merge pull request #3301 from nextcloud/fix/settings/config-handling-…
Browse files Browse the repository at this point in the history
…stable26
  • Loading branch information
provokateurin authored Sep 30, 2024
2 parents 022e919 + e0c6198 commit 6855176
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 110 deletions.
10 changes: 10 additions & 0 deletions lib/Controller/FolderController.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ private function getRootFolderStorageId(): ?int {
/**
* @RequireGroupFolderAdmin
* @NoAdminRequired
* @PasswordConfirmationRequired
*/
public function addFolder(string $mountpoint): DataResponse {
$id = $this->manager->createFolder($mountpoint);
Expand All @@ -122,6 +123,7 @@ public function addFolder(string $mountpoint): DataResponse {
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
*/
public function removeFolder(int $id): DataResponse {
$response = $this->checkFolderExists($id);
Expand All @@ -137,6 +139,7 @@ public function removeFolder(int $id): DataResponse {
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
*/
public function setMountPoint(int $id, string $mountPoint): DataResponse {
$this->manager->setMountPoint($id, $mountPoint);
Expand All @@ -146,6 +149,7 @@ public function setMountPoint(int $id, string $mountPoint): DataResponse {
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
*/
public function addGroup(int $id, string $group): DataResponse {
$response = $this->checkFolderExists($id);
Expand All @@ -159,6 +163,7 @@ public function addGroup(int $id, string $group): DataResponse {
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
*/
public function removeGroup(int $id, string $group): DataResponse {
$response = $this->checkFolderExists($id);
Expand All @@ -172,6 +177,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);
Expand All @@ -185,6 +191,7 @@ public function setPermissions(int $id, string $group, int $permissions): DataRe
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
* @throws \OCP\DB\Exception
*/
public function setManageACL(int $id, string $mappingType, string $mappingId, bool $manageAcl): DataResponse {
Expand All @@ -199,6 +206,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);
Expand All @@ -212,6 +220,7 @@ public function setQuota(int $id, int $quota): DataResponse {
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
*/
public function setACL(int $id, bool $acl): DataResponse {
$response = $this->checkFolderExists($id);
Expand All @@ -225,6 +234,7 @@ public function setACL(int $id, bool $acl): DataResponse {
/**
* @NoAdminRequired
* @RequireGroupFolderAdmin
* @PasswordConfirmationRequired
*/
public function renameFolder(int $id, string $mountpoint): DataResponse {
$response = $this->checkFolderExists($id);
Expand Down
68 changes: 67 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
"@nextcloud/stylelint-config": "^2.3.0",
"@nextcloud/webpack-vue-config": "^5.4.0",
"@types/bootstrap": "^5.2.6",
"@types/jquery": "^3.5.16",
"@types/react": "^17.0.43",
"@types/react-dom": "^18.0.3",
"@types/webpack": "^4.41.26",
Expand All @@ -35,6 +34,7 @@
"dependencies": {
"@nextcloud/axios": "^2.3.0",
"@nextcloud/event-bus": "^3.0.2",
"@nextcloud/password-confirmation": "4.0.4",
"@nextcloud/router": "^2.0.1",
"@nextcloud/vue": "^7.7.1",
"nextcloud-server": "^0.15.10",
Expand Down
151 changes: 75 additions & 76 deletions src/settings/Api.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {OCSResult, AxiosOCSResult} from "NC";
import Thenable = JQuery.Thenable;
import {FolderGroupsProps} from "./FolderGroups";
import axios from '@nextcloud/axios'
import { generateUrl } from "@nextcloud/router";
import { confirmPassword } from '@nextcloud/password-confirmation'
// eslint-disable-next-line n/no-unpublished-import
import type { OCSResponse } from '@nextcloud/typings/lib/ocs'

export interface Group {
gid: string;
Expand All @@ -25,7 +25,6 @@ export interface ManageRuleProps {
displayname: string;
}


export interface Folder {
id: number;
mount_point: string;
Expand All @@ -42,113 +41,113 @@ export class Api {
return OC.generateUrl(`apps/groupfolders/${endpoint}`);
}

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

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

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

// Updates the list of groups that have been granted delegated admin or subadmin rights on groupfolders
updateDelegatedGroups(newGroups: Group[], classname: string): Thenable<void> {
return axios.post(generateUrl('/apps/settings/') + '/settings/authorizedgroups/saveSettings', {
async updateDelegatedGroups(newGroups: Group[], classname: string): Promise<void> {
await confirmPassword()

await axios.post(generateUrl('/apps/settings/') + '/settings/authorizedgroups/saveSettings', {
newGroups,
class: classname,
})
.then((data) => data.data)
}

createFolder(mountPoint: string): Thenable<number> {
return $.post(this.getUrl('folders'), {
mountpoint: mountPoint
}, null, 'json').then((data: OCSResult<{ id: number; }>) => data.ocs.data.id);
async createFolder(mountPoint: string): Promise<number> {
await confirmPassword()

const response = await axios.post<OCSResponse<number>>(this.getUrl('folders'), { mountpoint: mountPoint })
return response.data.ocs.data
}

deleteFolder(id: number): Thenable<void> {
return $.ajax({
url: this.getUrl(`folders/${id}`),
type: 'DELETE'
});
async deleteFolder(id: number): Promise<void> {
await confirmPassword()

await axios.delete(this.getUrl(`folders/${id}`))
}

addGroup(folderId: number, group: string): Thenable<void> {
return $.post(this.getUrl(`folders/${folderId}/groups`), {
group
});
async addGroup(folderId: number, group: string): Promise<void> {
await confirmPassword()

await axios.post(this.getUrl(`folders/${folderId}/groups`), { group })
}

removeGroup(folderId: number, group: string): Thenable<void> {
return $.ajax({
url: this.getUrl(`folders/${folderId}/groups/${group}`),
type: 'DELETE'
});
async removeGroup(folderId: number, group: string): Promise<void> {
await confirmPassword()

await axios.delete(this.getUrl(`folders/${folderId}/groups/${group}`))
}

setPermissions(folderId: number, group: string, permissions: number): Thenable<void> {
return $.post(this.getUrl(`folders/${folderId}/groups/${group}`), {
permissions
});
async setPermissions(folderId: number, group: string, permissions: number): Promise<void> {
await confirmPassword()

await axios.post(this.getUrl(`folders/${folderId}/groups/${group}`), { permissions })
}

setManageACL(folderId: number, type: string, id: string, manageACL: boolean): Thenable<void> {
return $.post(this.getUrl(`folders/${folderId}/manageACL`), {
async setManageACL(folderId: number, type: string, id: string, manageACL: boolean): Promise<void> {
await confirmPassword()

await axios.post(this.getUrl(`folders/${folderId}/manageACL`), {
mappingType: type,
mappingId: id,
manageAcl: manageACL ? 1 : 0
});
manageAcl: manageACL ? 1 : 0,
})
}

setQuota(folderId: number, quota: number): Thenable<void> {
return $.post(this.getUrl(`folders/${folderId}/quota`), {
quota
});
async setQuota(folderId: number, quota: number): Promise<void> {
await confirmPassword()

await axios.post(this.getUrl(`folders/${folderId}/quota`), { quota })
}

setACL(folderId: number, acl: boolean): Thenable<void> {
return $.post(this.getUrl(`folders/${folderId}/acl`), {
acl: acl ? 1 : 0
});
async setACL(folderId: number, acl: boolean): Promise<void> {
await confirmPassword()

await axios.post(this.getUrl(`folders/${folderId}/acl`), { acl: acl ? 1 : 0 })
}

renameFolder(folderId: number, mountpoint: string): Thenable<void> {
return $.post(this.getUrl(`folders/${folderId}/mountpoint`), {
mountpoint
});
async renameFolder(folderId: number, mountpoint: string): Promise<void> {
await confirmPassword()

await axios.post(this.getUrl(`folders/${folderId}/mountpoint`), { mountpoint })
}

aclMappingSearch(folderId: number, search: string): Thenable<{groups: OCSGroup[], users: OCSUser[]}> {
return $.getJSON(this.getUrl(`folders/${folderId}/search?format=json&search=${search}`))
.then((data: OCSResult<{ groups: OCSGroup[]; users: OCSUser[]; }>) => {
async aclMappingSearch(folderId: number, search: string): Promise<{
groups: ManageRuleProps[],
users: ManageRuleProps[]
}> {
const response = await axios.get<OCSResponse<{groups: OCSGroup[], users: OCSUser[]}>>(this.getUrl(`folders/${folderId}/search`), { params: { search } })
return {
groups: Object.values(response.data.ocs.data.groups).map((item) => {
return {
groups: Object.values(data.ocs.data.groups).map((item) => {
return {
type: 'group',
id: item.gid,
displayname: item.displayname
}
}),
users: Object.values(data.ocs.data.users).map((item) => {
return {
type: 'user',
id: item.uid,
displayname: item.displayname
}
})
type: 'group',
id: item.gid,
displayname: item.displayname,
}
});
}),
users: Object.values(response.data.ocs.data.users).map((item) => {
return {
type: 'user',
id: item.uid,
displayname: item.displayname,
}
}),
}
}

}
Loading

0 comments on commit 6855176

Please sign in to comment.