Skip to content

Commit 992f818

Browse files
authored
feat: completely remove domain from RoleManager when calling DeleteDomains (#1496)
1 parent f2818d0 commit 992f818

File tree

6 files changed

+82
-3
lines changed

6 files changed

+82
-3
lines changed

model_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,10 @@ func (rm *testCustomRoleManager) AddDomainLinkConditionFunc(user string, role st
411411
func (rm *testCustomRoleManager) SetDomainLinkConditionFuncParams(user string, role string, domain string, params ...string) {
412412
}
413413

414+
func (rm *testCustomRoleManager) DeleteDomain(domain string) error {
415+
return nil
416+
}
417+
414418
func TestRBACModelWithCustomRoleManager(t *testing.T) {
415419
e, _ := NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")
416420
e.SetRoleManager(NewRoleManager())

rbac/default-role-manager/role_manager.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package defaultrolemanager
1616

1717
import (
18+
"errors"
1819
"fmt"
1920
"strings"
2021
"sync"
@@ -717,6 +718,12 @@ func (dm *DomainManager) BuildRelationship(name1 string, name2 string, domain ..
717718
return nil
718719
}
719720

721+
// DeleteDomain deletes the specified domain from DomainManager.
722+
func (dm *DomainManager) DeleteDomain(domain string) error {
723+
dm.rmMap.Delete(domain)
724+
return nil
725+
}
726+
720727
type RoleManager struct {
721728
*DomainManager
722729
}
@@ -727,6 +734,11 @@ func NewRoleManager(maxHierarchyLevel int) *RoleManager {
727734
return rm
728735
}
729736

737+
// DeleteDomain does nothing for RoleManagerImpl (no domain concept).
738+
func (rm *RoleManagerImpl) DeleteDomain(domain string) error {
739+
return errors.New("DeleteDomain is not supported by RoleManagerImpl (no domain concept)")
740+
}
741+
730742
type ConditionalRoleManager struct {
731743
RoleManagerImpl
732744
}

rbac/role_manager.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ type RoleManager interface {
5555
AddMatchingFunc(name string, fn MatchingFunc)
5656
// AddDomainMatchingFunc adds the domain matching function
5757
AddDomainMatchingFunc(name string, fn MatchingFunc)
58+
// DeleteDomain deletes all data of a domain in the role manager.
59+
DeleteDomain(domain string) error
5860
}
5961

6062
// ConditionalRoleManager provides interface to define the operations for managing roles.

rbac_api_with_domains.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,17 +144,26 @@ func (e *Enforcer) DeleteAllUsersByDomain(domain string) (bool, error) {
144144
return true, nil
145145
}
146146

147-
// DeleteDomains would delete all associated users and roles.
147+
// DeleteDomains would delete all associated policies.
148148
// It would delete all domains if parameter is not provided.
149149
func (e *Enforcer) DeleteDomains(domains ...string) (bool, error) {
150150
if len(domains) == 0 {
151-
e.ClearPolicy()
152-
return true, nil
151+
var err error
152+
domains, err = e.GetAllDomains()
153+
if err != nil {
154+
return false, err
155+
}
153156
}
154157
for _, domain := range domains {
155158
if _, err := e.DeleteAllUsersByDomain(domain); err != nil {
156159
return false, err
157160
}
161+
// remove the domain from the RoleManager.
162+
if e.GetRoleManager() != nil {
163+
if err := e.GetRoleManager().DeleteDomain(domain); err != nil {
164+
return false, err
165+
}
166+
}
158167
}
159168
return true, nil
160169
}

rbac_api_with_domains_synced.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,11 @@ func (e *SyncedEnforcer) DeleteRolesForUserInDomain(user string, domain string)
5858
defer e.m.Unlock()
5959
return e.Enforcer.DeleteRolesForUserInDomain(user, domain)
6060
}
61+
62+
// DeleteDomains deletes domains from the model.
63+
// Returns false if the domain does not exist (aka not affected).
64+
func (e *SyncedEnforcer) DeleteDomains(domains ...string) (bool, error) {
65+
e.m.Lock()
66+
defer e.m.Unlock()
67+
return e.Enforcer.DeleteDomains(domains...)
68+
}

rbac_api_with_domains_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,47 @@ func TestGetAllRolesByDomain(t *testing.T) {
296296
testGetAllRolesByDomain(t, e, "domain2", []string{"admin"})
297297
testGetAllRolesByDomain(t, e, "domain3", []string{"user"})
298298
}
299+
300+
func testDeleteDomains(t *testing.T, domains []string, expectedPolicy, expectedGroupingPolicy [][]string, expectedDomains []string) {
301+
e, _ := NewEnforcer("examples/rbac_with_domains_model.conf", "examples/rbac_with_domains_policy.csv")
302+
303+
_, _ = e.DeleteDomains(domains...)
304+
policy, err := e.GetPolicy()
305+
if err != nil {
306+
t.Error(err)
307+
}
308+
if !util.Array2DEquals(policy, expectedPolicy) {
309+
t.Errorf("policy after deleting domains %v: %v, supposed to be %v\n", domains, policy, expectedPolicy)
310+
}
311+
312+
policies, err := e.GetGroupingPolicy()
313+
if err != nil {
314+
t.Error(err)
315+
}
316+
if !util.Array2DEquals(policies, expectedGroupingPolicy) {
317+
t.Errorf("grouping policy after deleting domains %v: %v, supposed to be %v\n", domains, policies, expectedGroupingPolicy)
318+
}
319+
320+
domainsAfterRemoval, _ := e.GetAllDomains()
321+
if !util.SetEquals(domainsAfterRemoval, expectedDomains) {
322+
t.Errorf("domains after deleting %v: %v, supposed to be %v\n", domains, domainsAfterRemoval, expectedDomains)
323+
}
324+
}
325+
326+
func TestDeleteDomains(t *testing.T) {
327+
testDeleteDomains(t, []string{"domain1"}, [][]string{
328+
{"admin", "domain2", "data2", "read"},
329+
{"admin", "domain2", "data2", "write"},
330+
}, [][]string{
331+
{"bob", "admin", "domain2"},
332+
}, []string{"domain2"})
333+
334+
testDeleteDomains(t, []string{"domain2"}, [][]string{
335+
{"admin", "domain1", "data1", "read"},
336+
{"admin", "domain1", "data1", "write"},
337+
}, [][]string{
338+
{"alice", "admin", "domain1"},
339+
}, []string{"domain1"})
340+
341+
testDeleteDomains(t, []string{}, [][]string{}, [][]string{}, []string{})
342+
}

0 commit comments

Comments
 (0)