Skip to content

Commit 64174db

Browse files
change: [UIE-9942] - IAM - Replace view_account with fine-grained permissions (#13262)
* save progress * remaining instances * cleanup and tests
1 parent 81f29fe commit 64174db

File tree

13 files changed

+62
-63
lines changed

13 files changed

+62
-63
lines changed

packages/api-v4/src/iam/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,12 @@ export type AccountAdmin =
9797
| 'list_default_firewalls'
9898
| 'list_delegate_users'
9999
| 'list_enrolled_beta_programs'
100+
| 'list_entities'
101+
| 'list_role_permissions'
100102
| 'list_service_transfers'
101103
| 'list_user_delegate_accounts'
102104
| 'list_user_grants'
105+
| 'list_user_permissions'
103106
| 'revoke_profile_app'
104107
| 'revoke_profile_device'
105108
| 'send_profile_phone_number_verification_code'
@@ -254,8 +257,11 @@ export type AccountViewer =
254257
| 'list_available_services'
255258
| 'list_default_firewalls'
256259
| 'list_enrolled_beta_programs'
260+
| 'list_entities'
261+
| 'list_role_permissions'
257262
| 'list_service_transfers'
258263
| 'list_user_grants'
264+
| 'list_user_permissions'
259265
| 'view_account'
260266
| 'view_account_login'
261267
| 'view_account_settings'

packages/manager/src/features/IAM/Roles/Roles.test.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ describe('RolesLanding', () => {
5959
const mockPermissions = accountRolesFactory.build();
6060
queryMocks.usePermissions.mockReturnValue({
6161
data: {
62-
view_account: true,
63-
is_account_admin: true,
62+
list_role_permissions: true,
6463
},
6564
});
6665
queryMocks.useAccountRoles.mockReturnValue({
@@ -76,8 +75,7 @@ describe('RolesLanding', () => {
7675
it('should show an error message if user does not have permissions', () => {
7776
queryMocks.usePermissions.mockReturnValue({
7877
data: {
79-
view_account: false,
80-
is_account_admin: false,
78+
list_role_permissions: false,
8179
},
8280
});
8381

@@ -90,8 +88,7 @@ describe('RolesLanding', () => {
9088
it('should not show the default roles panel for non-child accounts', () => {
9189
queryMocks.usePermissions.mockReturnValue({
9290
data: {
93-
view_account: true,
94-
is_account_admin: true,
91+
list_role_permissions: true,
9592
},
9693
});
9794
queryMocks.useProfile.mockReturnValue({ data: { user_type: 'parent' } });
@@ -109,8 +106,7 @@ describe('RolesLanding', () => {
109106
it('should show the default roles panel for child accounts', () => {
110107
queryMocks.usePermissions.mockReturnValue({
111108
data: {
112-
view_account: true,
113-
is_account_admin: true,
109+
list_role_permissions: true,
114110
},
115111
});
116112
queryMocks.useProfile.mockReturnValue({ data: { user_type: 'child' } });

packages/manager/src/features/IAM/Roles/Roles.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import { DefaultRolesPanel } from './Defaults/DefaultRolesPanel';
1313
export const RolesLanding = () => {
1414
const { data: permissions, isLoading: isPermissionsLoading } = usePermissions(
1515
'account',
16-
['view_account', 'is_account_admin']
16+
['list_role_permissions']
1717
);
1818
const { data: accountRoles, isLoading } = useAccountRoles(
19-
permissions?.view_account
19+
permissions?.list_role_permissions
2020
);
2121
const { isIAMDelegationEnabled } = useIsIAMDelegationEnabled();
2222
const { isChildAccount, isProfileLoading } = useDelegationRole();
@@ -33,7 +33,7 @@ export const RolesLanding = () => {
3333
return <CircleProgress />;
3434
}
3535

36-
if (!(permissions?.view_account || permissions?.is_account_admin)) {
36+
if (!permissions?.list_role_permissions) {
3737
return (
3838
<Notice variant="error">You do not have permission to view roles.</Notice>
3939
);

packages/manager/src/features/IAM/Shared/AssignedEntitiesTable/AssignedEntitiesTable.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export const AssignedEntitiesTable = ({ username }: Props) => {
6060
const { data: permissions } = usePermissions('account', [
6161
'is_account_admin',
6262
'update_default_delegate_access',
63+
'list_entities',
6364
]);
6465

6566
const { isDefaultDelegationRolesForChildAccount } =
@@ -106,7 +107,9 @@ export const AssignedEntitiesTable = ({ username }: Props) => {
106107
data: entities,
107108
error: entitiesError,
108109
isLoading: entitiesLoading,
109-
} = useAllAccountEntities({});
110+
} = useAllAccountEntities({
111+
enabled: permissions?.list_entities,
112+
});
110113

111114
const {
112115
data: assignedUserRoles,

packages/manager/src/features/IAM/Users/UserDetails/UserProfile.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,27 @@ import { UsernamePanel } from './UsernamePanel';
2020
export const UserProfile = () => {
2121
const { username } = useParams({ from: '/iam/users/$username' });
2222
const { data: permissions } = usePermissions('account', [
23-
'is_account_admin',
24-
'view_account',
23+
'view_user',
24+
'update_user',
25+
'delete_user',
26+
'list_user_permissions',
2527
]);
2628

27-
const isAccountAdmin = permissions?.is_account_admin;
28-
2929
const {
3030
data: user,
3131
error,
3232
isLoading,
33-
} = useAccountUser(
34-
username ?? '',
35-
isAccountAdmin || permissions?.view_account
36-
);
33+
} = useAccountUser(username ?? '', permissions?.view_user);
3734
const { data: assignedRoles } = useUserRoles(
3835
username ?? '',
39-
isAccountAdmin || permissions?.view_account
36+
permissions?.list_user_permissions
4037
);
4138

4239
if (isLoading) {
4340
return <CircleProgress />;
4441
}
4542

46-
if (!(isAccountAdmin || permissions?.view_account)) {
43+
if (!permissions?.view_user || !permissions?.list_user_permissions) {
4744
return (
4845
<Notice variant="error">
4946
You do not have permission to view this user&apos;s details.
@@ -67,9 +64,15 @@ export const UserProfile = () => {
6764
sx={(theme) => ({ marginTop: theme.tokens.spacing.S16 })}
6865
>
6966
<UserDetailsPanel activeUser={user} assignedRoles={assignedRoles} />
70-
<UsernamePanel activeUser={user} canUpdateUser={isAccountAdmin} />
67+
<UsernamePanel
68+
activeUser={user}
69+
canUpdateUser={permissions?.update_user}
70+
/>
7171
<UserEmailPanel activeUser={user} />
72-
<DeleteUserPanel activeUser={user} canDeleteUser={isAccountAdmin} />
72+
<DeleteUserPanel
73+
activeUser={user}
74+
canDeleteUser={permissions?.delete_user}
75+
/>
7376
</Stack>
7477
</>
7578
);

packages/manager/src/features/IAM/Users/UserEntities/UserEntities.test.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ describe('UserEntities', () => {
7474
});
7575
queryMocks.usePermissions.mockReturnValue({
7676
data: {
77-
is_account_admin: true,
77+
list_entities: true,
7878
},
7979
});
8080
});
@@ -155,8 +155,9 @@ describe('UserEntities', () => {
155155
it('should not render if user does not have permissions', () => {
156156
queryMocks.usePermissions.mockReturnValue({
157157
data: {
158-
is_account_admin: false,
159-
view_account: false,
158+
list_entities: false,
159+
view_user: false,
160+
list_role_permissions: false,
160161
},
161162
});
162163

packages/manager/src/features/IAM/Users/UserEntities/UserEntities.tsx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,17 @@ export const UserEntities = () => {
2424
const theme = useTheme();
2525
const { username } = useParams({ from: '/iam/users/$username' });
2626
const { data: permissions } = usePermissions('account', [
27-
'is_account_admin',
28-
'view_account',
27+
'view_user',
28+
'list_entities',
29+
'list_user_permissions',
2930
]);
3031
const {
3132
data: assignedRoles,
3233
isLoading,
3334
error: assignedRolesError,
34-
} = useUserRoles(
35-
username ?? '',
36-
permissions?.is_account_admin || permissions?.view_account
37-
);
35+
} = useUserRoles(username ?? '', permissions?.list_user_permissions);
3836

39-
const { error } = useAccountUser(
40-
username ?? '',
41-
permissions?.is_account_admin || permissions?.view_account
42-
);
37+
const { error } = useAccountUser(username ?? '', permissions?.view_user);
4338

4439
const hasAssignedRoles = assignedRoles
4540
? assignedRoles.entity_access.length > 0
@@ -49,7 +44,7 @@ export const UserEntities = () => {
4944
return <CircleProgress />;
5045
}
5146

52-
if (!(permissions?.is_account_admin || permissions?.view_account)) {
47+
if (!permissions?.list_entities) {
5348
return (
5449
<Notice variant="error">
5550
You do not have permission to view this user&apos;s entities.

packages/manager/src/features/IAM/Users/UserRoles/UserRoles.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ describe('UserRoles', () => {
7373
});
7474
queryMocks.usePermissions.mockReturnValue({
7575
data: {
76-
is_account_admin: true,
76+
view_user: true,
7777
},
7878
});
7979
});

packages/manager/src/features/IAM/Users/UserRoles/UserRoles.tsx

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,18 @@ export const UserRoles = () => {
2424
const { username } = useParams({ from: '/iam/users/$username' });
2525
const { data: permissions } = usePermissions('account', [
2626
'is_account_admin',
27-
'view_account',
27+
'view_user',
28+
'list_user_permissions',
2829
]);
2930
const theme = useTheme();
3031

3132
const {
3233
data: assignedRoles,
3334
isLoading,
3435
error: assignedRolesError,
35-
} = useUserRoles(
36-
username ?? '',
37-
permissions?.is_account_admin || permissions?.view_account
38-
);
36+
} = useUserRoles(username ?? '', permissions?.list_user_permissions);
3937

40-
const { error } = useAccountUser(
41-
username ?? '',
42-
permissions?.is_account_admin || permissions?.view_account
43-
);
38+
const { error } = useAccountUser(username ?? '', permissions?.view_user);
4439

4540
const hasAssignedRoles = assignedRoles
4641
? assignedRoles.account_access.length > 0 ||
@@ -51,7 +46,7 @@ export const UserRoles = () => {
5146
return <CircleProgress />;
5247
}
5348

54-
if (!(permissions?.is_account_admin || permissions?.view_account)) {
49+
if (!permissions?.view_user) {
5550
return (
5651
<Notice variant="error">
5752
You do not have permission to view this user&apos;s roles.

packages/manager/src/features/IAM/Users/UsersTable/UserRow.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ export const UserRow = ({ onDelete, user }: Props) => {
3030
const { data: permissions } = usePermissions('account', [
3131
'delete_user',
3232
'is_account_admin',
33-
'view_account',
33+
'view_user',
3434
]);
3535

3636
const { isIAMDelegationEnabled } = useIsIAMDelegationEnabled();
37-
const canViewUser = permissions.view_account;
37+
const canViewUser = permissions.view_user;
3838

3939
// Determine if the current user is a child account with isIAMDelegationEnabled enabled
4040
// If so, we need to show the 'User type' column in the table

0 commit comments

Comments
 (0)