From 19b87a0114fe4913b61a0b8f6e133b3afa83e273 Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Wed, 29 Jun 2022 10:57:06 +0200 Subject: [PATCH 1/9] Don't show user management in app switcher if user has not role 'admin' --- packages/web-app-user-management/src/index.js | 8 ++++ packages/web-runtime/src/store/user.js | 46 +++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/packages/web-app-user-management/src/index.js b/packages/web-app-user-management/src/index.js index be54aeb3fe7..b181afea964 100644 --- a/packages/web-app-user-management/src/index.js +++ b/packages/web-app-user-management/src/index.js @@ -9,6 +9,8 @@ function $gettext(msg) { return msg } +const store = window.Vue.$store + const appInfo = { name: $gettext('User management'), id: 'user-management', @@ -41,6 +43,9 @@ const navItems = [ icon: 'user', route: { path: `/${appInfo.id}/users?` + }, + enabled: () => { + return store.getters.user.role.name === 'admin' } }, { @@ -48,6 +53,9 @@ const navItems = [ icon: 'group-2', route: { path: `/${appInfo.id}/groups?` + }, + enabled: () => { + return store.getters.user.role.name === 'admin' } } ] diff --git a/packages/web-runtime/src/store/user.js b/packages/web-runtime/src/store/user.js index 38ce5de36a5..d96b2f0c007 100644 --- a/packages/web-runtime/src/store/user.js +++ b/packages/web-runtime/src/store/user.js @@ -5,6 +5,7 @@ import { router } from '../router' import { clientService } from 'web-pkg/src/services' import { setUser as sentrySetUser } from '@sentry/browser' +import axios from 'axios' let vueAuthInstance @@ -20,7 +21,9 @@ const state = { groups: [], userReady: false, quota: null, - language: null + language: null, + role: {}, + roles: [] } const actions = { @@ -98,12 +101,44 @@ const actions = { const userGroups = await client.users.getUserGroups(login.id) const user = await client.users.getUser(login.id) + const { + data: { bundles: roles } + } = await axios.post( + '/api/v0/settings/roles-list', + {}, + { + headers: { + authorization: `Bearer ${token}` + } + } + ) + + context.commit('SET_ROLES', roles) // FIXME: Can be removed as soon as the uuid is integrated in the OCS api let graphUser + let role = [] if (context.state.capabilities.spaces?.enabled) { const graphClient = clientService.graphAuthenticated(instance, token) graphUser = await graphClient.users.getMe() + + const userAssignmentResponse = await axios.post( + '/api/v0/settings/assignments-list', + { + account_uuid: graphUser.data.id + }, + { + headers: { + authorization: `Bearer ${token}` + } + } + ) + const assignments = userAssignmentResponse.data?.assignments + const roleAssignment = assignments.find((assignment) => 'roleId' in assignment) + + if (roleAssignment) { + role = roles.find((role) => role.id === roleAssignment.roleId) + } } let userEmail = '' @@ -124,6 +159,7 @@ const actions = { token, isAuthenticated: true, groups: userGroups, + role, language }) @@ -261,6 +297,7 @@ const mutations = { state.token = user.token state.groups = user.groups state.language = user.language + state.role = user.role sentrySetUser({ username: user.id }) }, SET_CAPABILITIES(state, data) { @@ -281,6 +318,9 @@ const mutations = { quota.total = parseInt(quota.total) state.quota = quota + }, + SET_ROLES(state, roles) { + state.roles = roles } } @@ -300,8 +340,8 @@ const getters = { capabilities: (state) => { return state.capabilities }, - - quota: (state) => state.quota + quota: (state) => state.quota, + roles: (state) => state.roles } export default { From 7ee2c9b2d371073a374f05276ebd06dc6560846e Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Wed, 29 Jun 2022 13:03:18 +0200 Subject: [PATCH 2/9] Add permissionManager --- packages/web-app-user-management/src/index.js | 8 ++++--- packages/web-pkg/src/services/index.ts | 1 + .../web-pkg/src/services/permissionManager.ts | 22 +++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 packages/web-pkg/src/services/permissionManager.ts diff --git a/packages/web-app-user-management/src/index.js b/packages/web-app-user-management/src/index.js index b181afea964..d1a4517ad60 100644 --- a/packages/web-app-user-management/src/index.js +++ b/packages/web-app-user-management/src/index.js @@ -4,12 +4,14 @@ import Users from './views/Users.vue' import Groups from './views/Groups.vue' import { FilterSearch } from './search' import { bus } from 'web-pkg/src/instance' +import { PermissionManagerService } from 'web-pkg/src/services' // just a dummy function to trick gettext tools function $gettext(msg) { return msg } -const store = window.Vue.$store +const user = window.Vue.$store.getters.user +const permissionManagerService = new PermissionManagerService(user) const appInfo = { name: $gettext('User management'), @@ -45,7 +47,7 @@ const navItems = [ path: `/${appInfo.id}/users?` }, enabled: () => { - return store.getters.user.role.name === 'admin' + return permissionManagerService.hasUserManagement() } }, { @@ -55,7 +57,7 @@ const navItems = [ path: `/${appInfo.id}/groups?` }, enabled: () => { - return store.getters.user.role.name === 'admin' + return permissionManagerService.hasUserManagement() } } ] diff --git a/packages/web-pkg/src/services/index.ts b/packages/web-pkg/src/services/index.ts index 83dae7638cc..2f14e295909 100644 --- a/packages/web-pkg/src/services/index.ts +++ b/packages/web-pkg/src/services/index.ts @@ -1 +1,2 @@ export * from './client' +export * from './permissionManager' diff --git a/packages/web-pkg/src/services/permissionManager.ts b/packages/web-pkg/src/services/permissionManager.ts new file mode 100644 index 00000000000..bb1d3e5611f --- /dev/null +++ b/packages/web-pkg/src/services/permissionManager.ts @@ -0,0 +1,22 @@ +interface Role { + name: 'admin' | 'spaceadmin' | 'user' | 'guest' +} +interface User { + role: Role +} + +export class PermissionManagerService { + private readonly user: User + + constructor(user: User) { + this.user = user + } + + public hasUserManagement() { + return this.user.role.name === 'admin' + } + + public hasSpaceManagement() { + return ['admin', 'spaceadmin'].includes(this.user.role.name) + } +} From 8c31983fa32ade2635889a0785299c66aaf51d1d Mon Sep 17 00:00:00 2001 From: JanAckermann Date: Wed, 29 Jun 2022 13:15:43 +0200 Subject: [PATCH 3/9] Add permission check for create new space action --- packages/web-app-files/src/views/spaces/Projects.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/web-app-files/src/views/spaces/Projects.vue b/packages/web-app-files/src/views/spaces/Projects.vue index 803f5fef6c8..d903b037761 100644 --- a/packages/web-app-files/src/views/spaces/Projects.vue +++ b/packages/web-app-files/src/views/spaces/Projects.vue @@ -8,7 +8,7 @@ :show-actions-on-selection="true" >