Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a7614e3

Browse files
committed
Adjust users page to not allow editing roles when they cannot
1 parent f9c7cc5 commit a7614e3

File tree

5 files changed

+51
-9
lines changed

5 files changed

+51
-9
lines changed

coderd/database/db2sdk/db2sdk.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ func User(user database.User, organizationIDs []uuid.UUID) codersdk.User {
115115
OrganizationIDs: organizationIDs,
116116
Roles: make([]codersdk.Role, 0, len(user.RBACRoles)),
117117
AvatarURL: user.AvatarURL.String,
118+
LoginType: codersdk.LoginType(user.LoginType),
118119
}
119120

120121
for _, roleName := range user.RBACRoles {

site/src/components/EditRolesButton/EditRolesButton.stories.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ Loading.args = {
3434
isLoading: true,
3535
roles: MockSiteRoles,
3636
selectedRoles: [MockUserAdminRole, MockOwnerRole],
37+
userLoginType: "password",
38+
oidcRoleSync: false,
3739
}
3840
Loading.parameters = {
3941
chromatic: { delay: 300 },

site/src/components/EditRolesButton/EditRolesButton.tsx

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ import { Stack } from "components/Stack/Stack"
88
import Checkbox from "@mui/material/Checkbox"
99
import UserIcon from "@mui/icons-material/PersonOutline"
1010
import { Role } from "api/typesGenerated"
11+
import {
12+
HelpTooltip,
13+
HelpTooltipText,
14+
HelpTooltipTitle,
15+
} from "components/Tooltips/HelpTooltip"
16+
import { Maybe } from "components/Conditionals/Maybe"
1117

1218
const Option: React.FC<{
1319
value: string
@@ -46,6 +52,8 @@ export interface EditRolesButtonProps {
4652
selectedRoles: Role[]
4753
onChange: (roles: Role["name"][]) => void
4854
defaultIsOpen?: boolean
55+
oidcRoleSync: boolean
56+
userLoginType: string
4957
}
5058

5159
export const EditRolesButton: FC<EditRolesButtonProps> = ({
@@ -54,6 +62,8 @@ export const EditRolesButton: FC<EditRolesButtonProps> = ({
5462
onChange,
5563
isLoading,
5664
defaultIsOpen = false,
65+
userLoginType,
66+
oidcRoleSync,
5767
}) => {
5868
const styles = useStyles()
5969
const { t } = useTranslation("usersPage")
@@ -71,17 +81,30 @@ export const EditRolesButton: FC<EditRolesButtonProps> = ({
7181
onChange([...selectedRoleNames, roleName])
7282
}
7383

84+
const canSetRoles =
85+
userLoginType !== "oidc" || (userLoginType === "oidc" && !oidcRoleSync)
86+
7487
return (
7588
<>
76-
<IconButton
77-
ref={anchorRef}
78-
size="small"
79-
className={styles.editButton}
80-
title={t("editUserRolesTooltip") || ""}
81-
onClick={() => setIsOpen(true)}
82-
>
83-
<EditSquare />
84-
</IconButton>
89+
<Maybe condition={canSetRoles}>
90+
<IconButton
91+
ref={anchorRef}
92+
size="small"
93+
className={styles.editButton}
94+
title={t("editUserRolesTooltip") || ""}
95+
onClick={() => setIsOpen(true)}
96+
>
97+
<EditSquare />
98+
</IconButton>
99+
</Maybe>
100+
<Maybe condition={!canSetRoles}>
101+
<HelpTooltip size="small">
102+
<HelpTooltipTitle>Externally controlled</HelpTooltipTitle>
103+
<HelpTooltipText>
104+
Roles for this user are controlled by the OIDC identity provider.
105+
</HelpTooltipText>
106+
</HelpTooltip>
107+
</Maybe>
85108

86109
<Popover
87110
id={id}

site/src/components/UsersTable/UsersTableBody.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import { TableRowMenu } from "../TableRowMenu/TableRowMenu"
1616
import { EditRolesButton } from "components/EditRolesButton/EditRolesButton"
1717
import { Stack } from "components/Stack/Stack"
1818
import { EnterpriseBadge } from "components/DeploySettingsLayout/Badges"
19+
import { usePermissions } from "hooks"
20+
import { deploymentConfigMachine } from "xServices/deploymentConfig/deploymentConfigMachine"
21+
import { useMachine } from "@xstate/react"
1922

2023
const isOwnerRole = (role: TypesGen.Role): boolean => {
2124
return role.name === "owner"
@@ -72,6 +75,16 @@ export const UsersTableBody: FC<
7275
const styles = useStyles()
7376
const { t } = useTranslation("usersPage")
7477

78+
const permissions = usePermissions()
79+
const canViewDeployment = Boolean(permissions.viewDeploymentValues)
80+
const [state] = useMachine(deploymentConfigMachine)
81+
const { deploymentValues } = state.context
82+
83+
// Indicates if oidc roles are synced from the oidc idp.
84+
// Assign 'false' if unknown.
85+
const oidcRoleSync =
86+
canViewDeployment && deploymentValues?.config.oidc?.user_role_field !== ""
87+
7588
return (
7689
<ChooseOne>
7790
<Cond condition={Boolean(isLoading)}>
@@ -127,6 +140,8 @@ export const UsersTableBody: FC<
127140
roles={roles ? sortRoles(roles) : []}
128141
selectedRoles={userRoles}
129142
isLoading={Boolean(isUpdatingUserRoles)}
143+
userLoginType={user.login_type}
144+
oidcRoleSync={oidcRoleSync}
130145
onChange={(roles) => {
131146
// Remove the fallback role because it is only for the UI
132147
const rolesWithoutFallback = roles.filter(

site/src/pages/UserSettingsPage/AccountPage/AccountPage.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ describe("AccountPage", () => {
3838
roles: [],
3939
avatar_url: "",
4040
last_seen_at: new Date().toString(),
41+
login_type: "password",
4142
...data,
4243
}),
4344
)

0 commit comments

Comments
 (0)