fix(teams): preserve user direct access when deleting a team [BE-13303] (#3356)

This commit is contained in:
Oscar Zhou
2026-08-05 12:25:33 +12:00
committed by GitHub
parent 935b1d42d0
commit 1ff35385a6
2 changed files with 4 additions and 20 deletions
+2 -18
View File
@@ -57,7 +57,7 @@ func (handler *Handler) teamDelete(w http.ResponseWriter, r *http.Request) *http
}
if err := handler.DataStore.UpdateTx(func(tx dataservices.DataStoreTx) error {
return handler.removeTeamAccessPolicies(tx, portainer.TeamID(teamID), memberships)
return handler.removeTeamAccessPolicies(tx, portainer.TeamID(teamID))
}); err != nil {
return httperror.InternalServerError("Unable to clean-up team access policies", err)
}
@@ -70,7 +70,7 @@ func (handler *Handler) teamDelete(w http.ResponseWriter, r *http.Request) *http
return response.Empty(w)
}
func (handler *Handler) removeTeamAccessPolicies(tx dataservices.DataStoreTx, teamID portainer.TeamID, memberships []portainer.TeamMembership) error {
func (handler *Handler) removeTeamAccessPolicies(tx dataservices.DataStoreTx, teamID portainer.TeamID) error {
endpoints, err := tx.Endpoint().Endpoints()
if err != nil {
return err
@@ -82,22 +82,6 @@ func (handler *Handler) removeTeamAccessPolicies(tx dataservices.DataStoreTx, te
}
delete(ep.TeamAccessPolicies, teamID)
for _, m := range memberships {
otherMemberships, err := tx.TeamMembership().TeamMembershipsByUserID(m.UserID)
if err != nil {
return err
}
hasOtherTeamAccess := false
for _, om := range otherMemberships {
if _, ok := ep.TeamAccessPolicies[om.TeamID]; ok {
hasOtherTeamAccess = true
break
}
}
if !hasOtherTeamAccess {
delete(ep.UserAccessPolicies, m.UserID)
}
}
if err := tx.Endpoint().UpdateEndpoint(ep.ID, ep); err != nil {
return err
}
+2 -2
View File
@@ -60,7 +60,7 @@ func TestTeamDelete_removesTeamFromEndpointAccessPolicies(t *testing.T) {
assert.False(t, stillPresent, "deleted team must be removed from endpoint TeamAccessPolicies")
})
t.Run("team with member has both team and user policies removed", func(t *testing.T) {
t.Run("team member's direct user access policy survives team deletion", func(t *testing.T) {
t.Parallel()
_, store := datastore.MustNewTestStore(t, true, true)
@@ -102,7 +102,7 @@ func TestTeamDelete_removesTeamFromEndpointAccessPolicies(t *testing.T) {
assert.False(t, teamStillPresent, "deleted team must be removed from endpoint TeamAccessPolicies")
_, userStillPresent := updated.UserAccessPolicies[user.ID]
assert.False(t, userStillPresent, "team member must be removed from endpoint UserAccessPolicies")
assert.True(t, userStillPresent, "team member's own direct access policy must survive team deletion")
})
t.Run("team member in another team retains user access policy", func(t *testing.T) {