Skip to content

Commit

Permalink
[add] module counter
Browse files Browse the repository at this point in the history
  • Loading branch information
panapol-p committed Jul 4, 2022
1 parent 52fab63 commit c06d453
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 0 deletions.
31 changes: 31 additions & 0 deletions gate.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,23 @@ func (g Gate) AssignRoleToUser(domain, role, user string) error {
return err
}

func (g Gate) CountModule(domain string) map[string]int {
roles := g.GetRoles(domain)
counter := make(map[string]int)
moduleRole := make(map[string][]string)
for _, role := range roles {
modules := g.GetModuleRelatedByRole(domain, role)
moduleRole[role] = modules
}
users := g.GetAllUsersRole(domain)
for _, user := range users {
for _, module := range moduleRole[user.Role] {
counter[module]++
}
}
return counter
}

func (g Gate) RevokeRoleToUser(domain, role, user string) error {
_, err := g.E.RemoveGroupingPolicy(user, role, domain)
return err
Expand All @@ -119,3 +136,17 @@ func (g Gate) Load() error {
func (g Gate) Save() error {
return g.E.SavePolicy()
}

func (g Gate) GetModuleRelatedByRole(domain, role string) []string {
var modules []string
mapModules := map[string]struct{}{}
policies := g.E.GetFilteredPolicy(0, role, domain, "", "")
for _, policy := range policies {
moduleName := policy[2]
if _, ok := mapModules[moduleName]; !ok {
mapModules[moduleName] = struct{}{}
modules = append(modules, moduleName)
}
}
return modules
}
66 changes: 66 additions & 0 deletions gate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ func TestGate_GetAllUsersRole(t *testing.T) {
{"alice", "admin"},
{"bob", "reader"},
{"foo", "visitor"},
{"chalet", "visitor"},
}
assert.Equal(t, expectedD1, u1)

Expand All @@ -37,13 +38,15 @@ func TestGate_GetAllUsersRole(t *testing.T) {
{"alice", "reader2"},
{"bob", "admin"},
{"foo", "visitor2"},
{"chalet", "visitor2"},
}
assert.Equal(t, expectedD2, u2)

u3 := g.GetAllUsersRole("domain3")
expectedD3 := []UserRole{
{"alice", "visitor3"},
{"bob", "reader3"},
{"chalet", "reader3"},
{"foo", "admin"},
}
assert.Equal(t, expectedD3, u3)
Expand Down Expand Up @@ -268,3 +271,66 @@ func TestGate_AddPolicy(t *testing.T) {
err = g.Load()
assert.NoError(t, err)
}

func TestGate_CountModule(t *testing.T) {
a := fileadapter.NewAdapter("./testdata/rbac_with_domains_policy.csv")
g, err := NewGate(a)
assert.NoError(t, err)

c := g.CountModule("domain1")
assert.NoError(t, err)
expect := map[string]int{
"data2": 1,
"data3": 2,
}
assert.Equal(t, expect, c)

c = g.CountModule("domain2")
assert.NoError(t, err)
expect = map[string]int{
"data2": 1,
}
assert.Equal(t, expect, c)

c = g.CountModule("domain3")
assert.NoError(t, err)
expect = map[string]int{
"data2": 2,
"data3": 1,
}
assert.Equal(t, expect, c)

c = g.CountModule("domain5")
assert.NoError(t, err)
expect = map[string]int{}
assert.Equal(t, expect, c)
}

func TestGate_GetModuleRelatedByRole(t *testing.T) {
a := fileadapter.NewAdapter("./testdata/rbac_with_domains_policy.csv")
g, err := NewGate(a)
assert.NoError(t, err)

m := g.GetModuleRelatedByRole("domain1", "reader")
assert.NoError(t, err)
expect := []string{"data2"}
assert.Equal(t, expect, m)

m = g.GetModuleRelatedByRole("domain1", "visitor")
assert.NoError(t, err)
expect = []string{"data3"}
assert.Equal(t, expect, m)

m = g.GetModuleRelatedByRole("domain1", "writer")
assert.NoError(t, err)
expect = []string{"data1"}
assert.Equal(t, expect, m)

m = g.GetModuleRelatedByRole("domain1", "writer2")
assert.NoError(t, err)
assert.Nil(t, m)

m = g.GetModuleRelatedByRole("domain5", "writer2")
assert.NoError(t, err)
assert.Nil(t, m)
}
3 changes: 3 additions & 0 deletions testdata/rbac_with_domains_policy.csv
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@ p, Observer3, domain3, data3, view
g, alice, admin, domain1
g, bob, reader, domain1
g, foo, visitor, domain1
g, chalet, visitor, domain1
g, alice, reader2, domain2
g, bob, admin, domain2
g, foo, visitor2, domain2
g, chalet, visitor2, domain2
g, alice, visitor3, domain3
g, bob, reader3, domain3
g, chalet, reader3, domain3
g, foo, admin, domain3

0 comments on commit c06d453

Please sign in to comment.