Skip to content

Commit 536bc1a

Browse files
authored
feat(groups): Prevent user with org viewer role to become group maintainers (#2232)
Signed-off-by: Javier Rodriguez <[email protected]>
1 parent dd80555 commit 536bc1a

File tree

2 files changed

+29
-10
lines changed

2 files changed

+29
-10
lines changed

app/controlplane/pkg/biz/group.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,11 @@ func (uc *GroupUseCase) addExistingUserToGroup(ctx context.Context, orgID, group
563563
return nil, NewErrAlreadyExistsStr("user is already a member of this group")
564564
}
565565

566+
// If trying to make the user a maintainer, verify they don't have the org viewer role
567+
if opts.Maintainer && userMembership.Role == authz.RoleViewer {
568+
return nil, NewErrValidationStr("users with organization viewer role cannot be group maintainers")
569+
}
570+
566571
// Add the user to the group
567572
membership, err := uc.groupRepo.AddMemberToGroup(ctx, orgID, groupID, userUUID, opts.Maintainer)
568573
if err != nil {
@@ -790,6 +795,20 @@ func (uc *GroupUseCase) UpdateMemberMaintainerStatus(ctx context.Context, orgID
790795
return NewErrValidationStr("user is not a member of this group")
791796
}
792797

798+
// If trying to make the user a maintainer, verify they don't have the org viewer role
799+
if opts.IsMaintainer {
800+
// Check the user's org role
801+
userOrgMembership, err := uc.membershipRepo.FindByOrgAndUser(ctx, orgID, userUUID)
802+
if err != nil {
803+
return fmt.Errorf("failed to check user's organization role: %w", err)
804+
}
805+
806+
// Prevent org viewers from becoming maintainers
807+
if userOrgMembership.Role == authz.RoleViewer {
808+
return NewErrValidationStr("users with organization viewer role cannot be group maintainers")
809+
}
810+
}
811+
793812
// Update the member's maintainer status
794813
if err := uc.groupRepo.UpdateMemberMaintainerStatus(ctx, orgID, resolvedGroupID, userUUID, opts.IsMaintainer); err != nil {
795814
return fmt.Errorf("failed to update member maintainer status: %w", err)

app/controlplane/pkg/biz/group_integration_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ func (s *groupMembersIntegrationTestSuite) TestAddMemberToGroup() {
705705
// Add users to organization
706706
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID)
707707
require.NoError(s.T(), err)
708-
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID)
708+
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID, biz.WithMembershipRole(authz.RoleOrgMember))
709709
require.NoError(s.T(), err)
710710

711711
s.Run("add member using group ID", func() {
@@ -945,11 +945,11 @@ func (s *groupMembersIntegrationTestSuite) TestRemoveMemberFromGroup() {
945945
require.NoError(s.T(), err)
946946

947947
// Add users to organization
948-
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID)
948+
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID, biz.WithMembershipRole(authz.RoleOrgMember))
949949
require.NoError(s.T(), err)
950-
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID)
950+
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID, biz.WithMembershipRole(authz.RoleOrgMember))
951951
require.NoError(s.T(), err)
952-
_, err = s.Membership.Create(ctx, s.org.ID, user4.ID)
952+
_, err = s.Membership.Create(ctx, s.org.ID, user4.ID, biz.WithMembershipRole(authz.RoleOrgMember))
953953
require.NoError(s.T(), err)
954954

955955
// Add users to the group
@@ -1175,9 +1175,9 @@ func (s *groupMembersIntegrationTestSuite) TestGroupMemberCount() {
11751175
require.NoError(s.T(), err)
11761176

11771177
// Add users to organization
1178-
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID)
1178+
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID, biz.WithMembershipRole(authz.RoleOrgMember))
11791179
require.NoError(s.T(), err)
1180-
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID)
1180+
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID, biz.WithMembershipRole(authz.RoleOrgMember))
11811181
require.NoError(s.T(), err)
11821182

11831183
// Check initial member count
@@ -1278,9 +1278,9 @@ func (s *groupMembersIntegrationTestSuite) TestUpdateMemberMaintainerStatus() {
12781278
require.NoError(s.T(), err)
12791279

12801280
// Add users to organization
1281-
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID)
1281+
_, err = s.Membership.Create(ctx, s.org.ID, user2.ID, biz.WithMembershipRole(authz.RoleOrgMember))
12821282
require.NoError(s.T(), err)
1283-
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID)
1283+
_, err = s.Membership.Create(ctx, s.org.ID, user3.ID, biz.WithMembershipRole(authz.RoleOrgMember))
12841284
require.NoError(s.T(), err)
12851285

12861286
// Add users to the group (user2 as a regular member, user3 as a maintainer)
@@ -1705,7 +1705,7 @@ func (s *groupMembersIntegrationTestSuite) TestAddMemberToGroupSystemCall() {
17051705
require.NoError(s.T(), err)
17061706

17071707
// Add user to organization
1708-
_, err = s.Membership.Create(ctx, s.org.ID, systemUser.ID)
1708+
_, err = s.Membership.Create(ctx, s.org.ID, systemUser.ID, biz.WithMembershipRole(authz.RoleOrgMember))
17091709
require.NoError(s.T(), err)
17101710

17111711
// Add the user to the group without a requester ID (system call)
@@ -1753,7 +1753,7 @@ func (s *groupMembersIntegrationTestSuite) TestUpdateMemberMaintainerStatusSyste
17531753
require.NoError(s.T(), err)
17541754

17551755
// Add user to organization
1756-
_, err = s.Membership.Create(ctx, s.org.ID, systemUser.ID)
1756+
_, err = s.Membership.Create(ctx, s.org.ID, systemUser.ID, biz.WithMembershipRole(authz.RoleOrgMember))
17571757
require.NoError(s.T(), err)
17581758

17591759
// First add the user to the group (with requester ID for this setup step)

0 commit comments

Comments
 (0)