Skip to content

Commit b7e4052

Browse files
authored
feat: granular permission assignment for organization members (#6231)
1 parent 946ba18 commit b7e4052

File tree

75 files changed

+5718
-2556
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+5718
-2556
lines changed

.changeset/tall-islands-occur.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
---
2+
'hive': major
3+
---
4+
5+
Introduce new permission system for organization member roles.
6+
7+
The existing scopes assigned to organization member users are now replaced with permissions.
8+
Using the permissions allows more granular access control to features in Hive.
9+
10+
This introduces the following breaking changes:
11+
12+
- Organization members with the default `Viewer` role, will experience downgraded permissions. They will no longer be able to create targets or projects.
13+
- Organization member roles permissions for inviting, removing or assigning roles have been revoked. A organization admin will have to re-apply the permissions to the desired member roles.
14+
- Organization members with permissions for managing invites, removing members, assigning roles or modifying roles are no longer restrained in granting more rights to other users. Please be aware when granting these permissions to a user role. We recommend only assigning these to member roles that are considered "Admin" user roles.
15+
16+
A future update will introduce resource based access control (based on project, target, service or app deployments) for organization members.

integration-tests/testkit/flow.ts

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,10 @@ export function createOrganization(input: CreateOrganizationInput, authToken: st
5050
slug
5151
owner {
5252
id
53-
organizationAccessScopes
54-
projectAccessScopes
55-
targetAccessScopes
53+
role {
54+
id
55+
permissions
56+
}
5657
}
5758
memberRoles {
5859
id
@@ -178,9 +179,11 @@ export function joinOrganization(code: string, authToken: string) {
178179
user {
179180
id
180181
}
181-
organizationAccessScopes
182-
projectAccessScopes
183-
targetAccessScopes
182+
role {
183+
id
184+
name
185+
permissions
186+
}
184187
}
185188
}
186189
}
@@ -213,10 +216,8 @@ export function getOrganizationMembers(selector: OrganizationSelectorInput, auth
213216
role {
214217
id
215218
name
219+
permissions
216220
}
217-
organizationAccessScopes
218-
projectAccessScopes
219-
targetAccessScopes
220221
}
221222
}
222223
}
@@ -664,9 +665,7 @@ export function createMemberRole(input: CreateMemberRoleInput, authToken: string
664665
name
665666
description
666667
locked
667-
organizationAccessScopes
668-
projectAccessScopes
669-
targetAccessScopes
668+
permissions
670669
}
671670
}
672671
}
@@ -724,9 +723,7 @@ export function deleteMemberRole(input: DeleteMemberRoleInput, authToken: string
724723
name
725724
description
726725
locked
727-
organizationAccessScopes
728-
projectAccessScopes
729-
targetAccessScopes
726+
permissions
730727
}
731728
}
732729
}
@@ -754,9 +751,7 @@ export function updateMemberRole(input: UpdateMemberRoleInput, authToken: string
754751
name
755752
description
756753
locked
757-
organizationAccessScopes
758-
projectAccessScopes
759-
targetAccessScopes
754+
permissions
760755
}
761756
}
762757
error {

integration-tests/testkit/seed.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import {
4848
updateMemberRole,
4949
updateTargetValidationSettings,
5050
} from './flow';
51+
import * as GraphQLSchema from './gql/graphql';
5152
import {
5253
BreakingChangeFormula,
5354
OrganizationAccessScope,
@@ -185,10 +186,10 @@ export function initSeed() {
185186

186187
return members;
187188
},
188-
async projects() {
189+
async projects(token = ownerToken) {
189190
const projectsResult = await getOrganizationProjects(
190191
{ organizationSlug: organization.slug },
191-
ownerToken,
192+
token,
192193
).then(r => r.expectNoGraphQLErrors());
193194

194195
const projects = projectsResult.organization?.organization.projects.nodes;
@@ -806,6 +807,7 @@ export function initSeed() {
806807
input: {
807808
roleId: string;
808809
userId: string;
810+
resources?: GraphQLSchema.ResourceAssignmentInput;
809811
},
810812
options: { useMemberToken?: boolean } = {
811813
useMemberToken: false,
@@ -816,6 +818,10 @@ export function initSeed() {
816818
organizationSlug: organization.slug,
817819
userId: input.userId,
818820
roleId: input.roleId,
821+
resources: input.resources ?? {
822+
mode: GraphQLSchema.ResourceAssignmentMode.All,
823+
projects: [],
824+
},
819825
},
820826
options.useMemberToken ? memberToken : ownerToken,
821827
).then(r => r.expectNoGraphQLErrors());
@@ -847,11 +853,7 @@ export function initSeed() {
847853
return memberRoleDeletionResult.deleteMemberRole.ok?.updatedOrganization;
848854
},
849855
async createMemberRole(
850-
scopes: {
851-
organization: OrganizationAccessScope[];
852-
project: ProjectAccessScope[];
853-
target: TargetAccessScope[];
854-
},
856+
permissions: Array<string>,
855857
options: { useMemberToken?: boolean } = {
856858
useMemberToken: false,
857859
},
@@ -867,9 +869,7 @@ export function initSeed() {
867869
organizationSlug: organization.slug,
868870
name,
869871
description: 'some description',
870-
organizationAccessScopes: scopes.organization,
871-
projectAccessScopes: scopes.project,
872-
targetAccessScopes: scopes.target,
872+
selectedPermissions: permissions,
873873
},
874874
options.useMemberToken ? memberToken : ownerToken,
875875
).then(r => r.expectNoGraphQLErrors());
@@ -908,11 +908,7 @@ export function initSeed() {
908908
name: string;
909909
description: string;
910910
},
911-
scopes: {
912-
organization: OrganizationAccessScope[];
913-
project: ProjectAccessScope[];
914-
target: TargetAccessScope[];
915-
},
911+
permissions: Array<string>,
916912
options: { useMemberToken?: boolean } = {
917913
useMemberToken: false,
918914
},
@@ -923,9 +919,7 @@ export function initSeed() {
923919
roleId: role.id,
924920
name: role.name,
925921
description: role.description,
926-
organizationAccessScopes: scopes.organization,
927-
projectAccessScopes: scopes.project,
928-
targetAccessScopes: scopes.target,
922+
selectedPermissions: permissions,
929923
},
930924
options.useMemberToken ? memberToken : ownerToken,
931925
).then(r => r.expectNoGraphQLErrors());

0 commit comments

Comments
 (0)