Access control: hide team role picker if user doesn't have access to it (#45068)

* hide team role column

* hide or disable the role picker as needed

* add SWL filtering for role listing
This commit is contained in:
Ieva 2022-02-08 16:38:13 +00:00 committed by GitHub
parent 4e38ac9cf7
commit 4f4b1cb5ea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 3 deletions

View File

@ -11,6 +11,7 @@ import (
var sqlIDAcceptList = map[string]struct{}{ var sqlIDAcceptList = map[string]struct{}{
"org_user.user_id": {}, "org_user.user_id": {},
"role.id": {},
} }
var ( var (

View File

@ -74,6 +74,14 @@ export class TeamList extends PureComponent<Props, State> {
team, team,
isPermissionTeamAdmin({ permission, editorsCanAdmin, signedInUser }) isPermissionTeamAdmin({ permission, editorsCanAdmin, signedInUser })
); );
const canSeeTeamRoles = contextSrv.hasAccessInMetadata(AccessControlAction.ActionTeamsRolesList, team, false);
const canUpdateTeamRoles =
contextSrv.hasAccess(AccessControlAction.ActionTeamsRolesAdd, false) ||
contextSrv.hasAccess(AccessControlAction.ActionTeamsRolesRemove, false);
const displayRolePicker =
contextSrv.licensedAccessControlEnabled() &&
contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList) &&
contextSrv.hasPermission(AccessControlAction.ActionRolesList);
return ( return (
<tr key={team.id}> <tr key={team.id}>
@ -93,9 +101,11 @@ export class TeamList extends PureComponent<Props, State> {
<td className="link-td"> <td className="link-td">
<a href={teamUrl}>{team.memberCount}</a> <a href={teamUrl}>{team.memberCount}</a>
</td> </td>
{contextSrv.licensedAccessControlEnabled() && ( {displayRolePicker && (
<td> <td>
<TeamRolePicker teamId={team.id} roleOptions={this.state.roleOptions} /> {canSeeTeamRoles && (
<TeamRolePicker teamId={team.id} roleOptions={this.state.roleOptions} disabled={!canUpdateTeamRoles} />
)}
</td> </td>
)} )}
<td className="text-right"> <td className="text-right">
@ -134,6 +144,10 @@ export class TeamList extends PureComponent<Props, State> {
const { teams, searchQuery, editorsCanAdmin, searchPage, setTeamsSearchPage } = this.props; const { teams, searchQuery, editorsCanAdmin, searchPage, setTeamsSearchPage } = this.props;
const teamAdmin = contextSrv.hasRole('Admin') || (editorsCanAdmin && contextSrv.hasRole('Editor')); const teamAdmin = contextSrv.hasRole('Admin') || (editorsCanAdmin && contextSrv.hasRole('Editor'));
const canCreate = contextSrv.hasAccess(AccessControlAction.ActionTeamsCreate, teamAdmin); const canCreate = contextSrv.hasAccess(AccessControlAction.ActionTeamsCreate, teamAdmin);
const displayRolePicker =
contextSrv.licensedAccessControlEnabled() &&
contextSrv.hasPermission(AccessControlAction.ActionTeamsRolesList) &&
contextSrv.hasPermission(AccessControlAction.ActionRolesList);
const newTeamHref = canCreate ? 'org/teams/new' : '#'; const newTeamHref = canCreate ? 'org/teams/new' : '#';
const paginatedTeams = this.getPaginatedTeams(teams); const paginatedTeams = this.getPaginatedTeams(teams);
const totalPages = Math.ceil(teams.length / pageLimit); const totalPages = Math.ceil(teams.length / pageLimit);
@ -159,7 +173,7 @@ export class TeamList extends PureComponent<Props, State> {
<th>Name</th> <th>Name</th>
<th>Email</th> <th>Email</th>
<th>Members</th> <th>Members</th>
{contextSrv.licensedAccessControlEnabled() && <th>Roles</th>} {displayRolePicker && <th>Roles</th>}
<th style={{ width: '1%' }} /> <th style={{ width: '1%' }} />
</tr> </tr>
</thead> </thead>

View File

@ -60,6 +60,9 @@ export enum AccessControlAction {
ActionRolesList = 'roles:list', ActionRolesList = 'roles:list',
ActionBuiltinRolesList = 'roles.builtin:list', ActionBuiltinRolesList = 'roles.builtin:list',
ActionTeamsRolesList = 'teams.roles:list',
ActionTeamsRolesAdd = 'teams.roles:add',
ActionTeamsRolesRemove = 'teams.roles:remove',
ActionUserRolesList = 'users.roles:list', ActionUserRolesList = 'users.roles:list',
} }