Skip to content

Commit a92b540

Browse files
committed
feat: completely remove domain from RoleManager when calling DeleteDomains (#1942)
1 parent f2818d0 commit a92b540

File tree

6 files changed

+85
-2
lines changed

6 files changed

+85
-2
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: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,12 @@ func (dm *DomainManager) BuildRelationship(name1 string, name2 string, domain ..
717717
return nil
718718
}
719719

720+
// DeleteDomain deletes the specified domain from DomainManager.
721+
func (dm *DomainManager) DeleteDomain(domain string) error {
722+
dm.rmMap.Delete(domain)
723+
return nil
724+
}
725+
720726
type RoleManager struct {
721727
*DomainManager
722728
}
@@ -727,6 +733,16 @@ func NewRoleManager(maxHierarchyLevel int) *RoleManager {
727733
return rm
728734
}
729735

736+
// DeleteDomain does nothing for RoleManagerImpl (no domain concept).
737+
func (rm *RoleManagerImpl) DeleteDomain(domain string) error {
738+
return nil
739+
}
740+
741+
// DeleteDomain proxies to DomainManager.
742+
func (rm *RoleManager) DeleteDomain(domain string) error {
743+
return rm.DomainManager.DeleteDomain(domain)
744+
}
745+
730746
type ConditionalRoleManager struct {
731747
RoleManagerImpl
732748
}

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: 11 additions & 2 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()
151+
allDomains, _ := e.GetAllDomains()
152+
for _, domain := range allDomains {
153+
if _, err := e.DeleteDomains(domain); err != nil {
154+
return false, err
155+
}
156+
}
152157
return true, nil
153158
}
154159
for _, domain := range domains {
155160
if _, err := e.DeleteAllUsersByDomain(domain); err != nil {
156161
return false, err
157162
}
163+
// remove the domain from the RoleManager.
164+
if e.GetRoleManager() != nil {
165+
e.GetRoleManager().DeleteDomain(domain)
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)