Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/store/src/commonSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ export const getUserCapabilities = createSelector([getUserRoles, getIsServicePro
const canReadUsers = uiPermissions.userManagement.includes(uiPermissionsById.read.value);
const canManageUsers = uiPermissions.userManagement.includes(uiPermissionsById.manage.value);

const canManageTokens = uiPermissions.tokenManagement?.includes(uiPermissionsById.manage.value) ?? false;

const canReadDevices = hasPermission(uiPermissions.groups, uiPermissionsById.read.value);
const canWriteDevices = Object.values(uiPermissions.groups).some(
groupPermissions => groupPermissions.includes(uiPermissionsById.read.value) && groupPermissions.length > 1
Expand All @@ -85,6 +87,7 @@ export const getUserCapabilities = createSelector([getUserRoles, getIsServicePro
canDeploy,
canManageDevices,
canManageReleases,
canManageTokens,
canManageUsers,
canReadDeployments,
canReadDevices,
Expand Down
5 changes: 4 additions & 1 deletion packages/testing/src/mockData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export const adminUserCapabilities = {
canDeploy: true,
canManageDevices: true,
canManageReleases: true,
canManageTokens: true,
canManageUsers: true,
canReadDeployments: true,
canReadDevices: true,
Expand Down Expand Up @@ -871,7 +872,8 @@ export const rbacRoles = [
permission_sets_with_scope: [
{ ...defaultPermissionSets.ReadReleases },
{ ...defaultPermissionSets.ManageReleases },
{ ...defaultPermissionSets.UploadArtifacts }
{ ...defaultPermissionSets.UploadArtifacts },
{ ...defaultPermissionSets.ManageTokens }
]
},
{
Expand Down Expand Up @@ -967,6 +969,7 @@ const expectedParsedRoles = {
[ALL_RELEASES]: [uiPermissionsById.manage.value, uiPermissionsById.upload.value, uiPermissionsById.read.value]
},
tenantManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value],
tokenManagement: [uiPermissionsById.manage.value],
userManagement: [uiPermissionsById.read.value, uiPermissionsById.manage.value]
}
}
Expand Down
23 changes: 20 additions & 3 deletions packages/utils/src/constants/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ export type UiPermissionsDefinition = Readonly<{
groups: Record<string, string[]>;
releases: Record<string, string[]>;
tenantManagement: string[];
tokenManagement: string[];
userManagement: string[];
}>;

Expand All @@ -56,6 +57,7 @@ export const emptyUiPermissions: UiPermissionsDefinition = Object.freeze({
groups: Object.freeze({}),
releases: Object.freeze({}),
tenantManagement: [],
tokenManagement: [],
userManagement: []
});

Expand Down Expand Up @@ -117,6 +119,7 @@ const permissionSetIds = {
ManageDevices: 'ManageDevices',
ManageReleases: 'ManageReleases',
ManageTenants: 'ManageTenants',
ManageTokens: 'ManageTokens',
ManageUsers: 'ManageUsers',
ReadAuditLogs: 'ReadAuditLogs',
ReadDevices: 'ReadDevices',
Expand Down Expand Up @@ -163,6 +166,7 @@ export const uiPermissionsById = {
groups: permissionSetIds.ManageDevices,
releases: permissionSetIds.ManageReleases,
tenantManagement: permissionSetIds.ManageTenants,
tokenManagement: permissionSetIds.ManageTokens,
userManagement: permissionSetIds.ManageUsers
},
title: 'Manage',
Expand Down Expand Up @@ -305,6 +309,7 @@ export const rolesById: Record<string, Role> = Object.freeze({
deployments: uiPermissionsByArea.deployments.uiPermissions.map(permissionMapper),
groups: { [ALL_DEVICES]: uiPermissionsByArea.groups.uiPermissions.map(permissionMapper) },
releases: { [ALL_RELEASES]: uiPermissionsByArea.releases.uiPermissions.map(permissionMapper) },
tokenManagement: [uiPermissionsById.manage.value],
userManagement: uiPermissionsByArea.userManagement.uiPermissions.map(permissionMapper)
}
},
Expand All @@ -319,6 +324,7 @@ export const rolesById: Record<string, Role> = Object.freeze({
deployments: [uiPermissionsById.read.value],
groups: { [ALL_DEVICES]: [uiPermissionsById.read.value] },
releases: { [ALL_RELEASES]: [uiPermissionsById.read.value] },
tokenManagement: [uiPermissionsById.manage.value],
userManagement: [uiPermissionsById.read.value]
}
},
Expand All @@ -330,7 +336,8 @@ export const rolesById: Record<string, Role> = Object.freeze({
permissions: [],
uiPermissions: {
...emptyUiPermissions,
releases: { [ALL_RELEASES]: uiPermissionsByArea.releases.uiPermissions.map(permissionMapper) }
releases: { [ALL_RELEASES]: uiPermissionsByArea.releases.uiPermissions.map(permissionMapper) },
tokenManagement: [uiPermissionsById.manage.value]
}
},
[staticRolesByName.deploymentsManager]: {
Expand All @@ -342,7 +349,8 @@ export const rolesById: Record<string, Role> = Object.freeze({
...emptyUiPermissions,
deployments: uiPermissionsByArea.deployments.uiPermissions.map(permissionMapper),
groups: { [ALL_DEVICES]: [uiPermissionsById.deploy.value, uiPermissionsById.read.value] },
releases: { [ALL_RELEASES]: [uiPermissionsById.read.value] }
releases: { [ALL_RELEASES]: [uiPermissionsById.read.value] },
tokenManagement: [uiPermissionsById.manage.value]
}
},
[staticRolesByName.terminalAccess]: {
Expand All @@ -352,7 +360,8 @@ export const rolesById: Record<string, Role> = Object.freeze({
permissions: [],
uiPermissions: {
...emptyUiPermissions,
groups: { [ALL_DEVICES]: [uiPermissionsById.connect.value] }
groups: { [ALL_DEVICES]: [uiPermissionsById.connect.value] },
tokenManagement: [uiPermissionsById.manage.value]
}
}
});
Expand Down Expand Up @@ -388,6 +397,8 @@ export const defaultPermissionSets: Record<string, Omit<PermissionSet, 'permissi
[permissionSetIds.Basic]: {
name: permissionSetIds.Basic,
result: {
// the personal access token endpoints are currently part of the Basic set; drop this once they move to ManageTokens
tokenManagement: [uiPermissionsById.manage.value],
// this is needed to prevent the detailed permissions of the basic permission set from being interpreted as allowing read & management access to user endpoints
userManagement: [uiPermissionsById.read.value]
}
Expand All @@ -398,6 +409,12 @@ export const defaultPermissionSets: Record<string, Omit<PermissionSet, 'permissi
...rolesById[staticRolesByName.admin].uiPermissions
}
},
[permissionSetIds.ManageTokens]: {
name: permissionSetIds.ManageTokens,
result: {
tokenManagement: [uiPermissionsById.manage.value]
}
},
[permissionSetIds.ManageUsers]: {
name: permissionSetIds.ManageUsers,
result: {
Expand Down