| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- // Copyright 2019 Yunion
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package rbacutils
- import (
- "testing"
- "yunion.io/x/jsonutils"
- "yunion.io/x/pkg/util/netutils"
- )
- func TestSRabcRule_Match(t *testing.T) {
- all := SRbacRule{Service: "*", Resource: "*", Action: "*"}
- compute := SRbacRule{Service: "compute", Resource: "*", Action: "*"}
- getOnly := SRbacRule{Service: "*", Resource: "*", Action: "get"}
- listOnly := SRbacRule{Service: "*", Resource: "*", Action: "list"}
- serverList := SRbacRule{Service: "compute", Resource: "server", Action: "list"}
- serverPerform := SRbacRule{Service: "compute", Resource: "server", Action: "perform", Extra: []string{"*"}}
- rule_server_list := []string{"compute", "server", "list"}
- rule_server_perform_start := []string{"compute", "server", "perform", "start"}
- rule_server_create := []string{"compute", "server", "create"}
- cases := []struct {
- inRule SRbacRule
- inMatch []string
- want bool
- count int
- }{
- {all, rule_server_list, true, 0},
- {all, rule_server_perform_start, true, 0},
- {all, rule_server_create, true, 0},
- {compute, rule_server_list, true, 1},
- {compute, rule_server_perform_start, true, 1},
- {compute, rule_server_create, true, 1},
- {getOnly, rule_server_list, false, 0},
- {getOnly, rule_server_perform_start, false, 0},
- {getOnly, rule_server_create, false, 0},
- {listOnly, rule_server_list, true, 1},
- {listOnly, rule_server_perform_start, false, 0},
- {listOnly, rule_server_create, false, 0},
- {serverList, rule_server_list, true, 3},
- {serverList, rule_server_perform_start, false, 0},
- {serverList, rule_server_create, false, 0},
- {serverPerform, rule_server_list, false, 0},
- {serverPerform, rule_server_perform_start, true, 3},
- {serverPerform, rule_server_create, false, 0},
- }
- for _, c := range cases {
- got, cnt, _ := c.inRule.match(c.inMatch[0], c.inMatch[1], c.inMatch[2], c.inMatch[3:]...)
- if got != c.want {
- t.Errorf("%#v %#v want %#v got %#v", c.inRule, c.inMatch, c.want, got)
- }
- if cnt != c.count {
- t.Errorf("%#v %#v want %#v got %#v", c.inRule, c.inMatch, c.count, cnt)
- }
- }
- }
- func TestContains(t *testing.T) {
- cases := []struct {
- left SRbacRule
- right SRbacRule
- contains bool
- }{
- {
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- true,
- },
- {
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- SRbacRule{Service: "compute", Resource: "*", Action: "*", Result: Allow},
- true,
- },
- {
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- SRbacRule{Service: "compute", Resource: "server", Action: "*", Result: Allow},
- true,
- },
- {
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- SRbacRule{Service: "compute", Resource: "server", Action: "list", Result: Allow},
- true,
- },
- {
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- SRbacRule{Service: "compute", Resource: "server", Action: "get", Extra: []string{"vnc"}, Result: Allow},
- true,
- },
- {
- SRbacRule{Service: "compute", Resource: "*", Action: "*", Result: Allow},
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- false,
- },
- {
- SRbacRule{Service: "compute", Resource: "server", Action: "*", Result: Allow},
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- false,
- },
- {
- SRbacRule{Service: "compute", Resource: "server", Action: "list", Result: Allow},
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- false,
- },
- {
- SRbacRule{Service: "compute", Resource: "server", Action: "get", Extra: []string{"vnc"}, Result: Allow},
- SRbacRule{Service: "*", Resource: "*", Action: "*", Result: Allow},
- false,
- },
- }
- for _, c := range cases {
- got := c.left.contains(&c.right)
- if got != c.contains {
- t.Errorf("%s contains %s want %#v got %#v", c.left, c.right, c.contains, got)
- }
- }
- }
- func TestSRabcPolicy_Encode(t *testing.T) {
- cases := []string{
- `{
- "condition": "tenant == \"system\" && roles.contains(\"projectowner\")",
- "is_admin": false,
- "policy": {
- "compute": {
- "keypair": "allow",
- "server": "deny",
- "*": {
- "*": "allow",
- "create": "deny"
- }
- },
- "meter": {
- "*": "allow"
- }
- }
- }`,
- `{
- "auth": false,
- "ips": ["10.0.0.0/8", "192.168.222.171"],
- "projects": ["system"],
- "roles": ["projectowner","admin"],
- "scope": "domain",
- "policy": {
- "compute": {
- "keypair": "allow",
- "server": "deny",
- "*": {
- "*": "allow",
- "create": "deny"
- }
- },
- "meter": {
- "*": "allow"
- }
- }
- }`,
- `{
- "auth": false,
- "scope": "domain",
- "policy": {
- "compute": {
- "keypair": "allow",
- "server": "deny",
- "*": {
- "*": "allow",
- "create": "deny"
- }
- },
- "meter": {
- "*": "allow"
- }
- }
- }`,
- }
- for _, policyStr := range cases {
- policyJson, err := jsonutils.ParseString(policyStr)
- if err != nil {
- t.Errorf("fail to parse json string %s", err)
- return
- }
- policy := SRbacPolicy{}
- err = policy.Decode(policyJson)
- if err != nil {
- t.Errorf("decode error %s", err)
- return
- }
- policyJson1 := policy.Encode()
- policy2 := SRbacPolicy{}
- err = policy2.Decode(policyJson1)
- if err != nil {
- t.Errorf("decode error 2 %s", err)
- return
- }
- policyJson2 := policy2.Encode()
- policyStr1 := policyJson1.PrettyString()
- policyStr2 := policyJson2.PrettyString()
- if policyStr1 != policyStr2 {
- t.Errorf("%s != %s", policyStr1, policyStr2)
- return
- }
- t.Logf("%s", policyStr1)
- }
- }
- /*
- func TestSRabcPolicy_Explain(t *testing.T) {
- policyStr := `{
- "condition": "usercred.project != \"system\" && usercred.roles==\"projectowner\"",
- "is_admin": false,
- "policy": {
- "compute": {
- "keypair": "allow",
- "server": "deny",
- "*": {
- "*": "allow",
- "create": "deny"
- }
- },
- "meter": {
- "*": "allow"
- },
- "k8s": "allow"
- }
- }`
- policyJson, err := jsonutils.ParseString(policyStr)
- if err != nil {
- t.Errorf("fail to parse json string %s", err)
- return
- }
- policy := SRbacPolicy{}
- err = policy.Decode(policyJson)
- if err != nil {
- t.Errorf("decode error %s", err)
- return
- }
- request := [][]string{
- {"compute", "keypair", "list"},
- {"compute", "server", "list"},
- {"compute", "server", "get", "vnc"},
- {"compute", "keypair", "create"},
- {"meter", "price", "list"},
- {"image", "image", "list"},
- {"k8s", "pod", "list"},
- }
- output := policy.Explain(request)
- t.Logf("%#v", output)
- }
- */
- func TestConditionParser(t *testing.T) {
- condition := `tenant=="system" && roles.contains("admin")`
- tenants := searchMatchTenants(condition)
- t.Logf("%s", tenants)
- roles := searchMatchRoles(condition)
- t.Logf("%s", roles)
- }
- func TestSRbacPolicyMatch(t *testing.T) {
- prefix, _ := netutils.NewIPV4Prefix("10.168.22.0/24")
- cases := []struct {
- policy SRbacPolicy
- userCred IRbacIdentity2
- want bool
- }{
- {
- SRbacPolicy{},
- newRbacIdentity2("", "", nil, ""),
- true,
- },
- {
- SRbacPolicy{},
- nil,
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- },
- newRbacIdentity2("", "system", nil, ""),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- },
- newRbacIdentity2("", "demo", nil, ""),
- false,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- },
- newRbacIdentity2("", "system", []string{"admin"}, ""),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- },
- newRbacIdentity2("", "system", []string{"admin", "_member_"}, ""),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- },
- newRbacIdentity2("", "system", []string{"_member_"}, ""),
- false,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- },
- nil,
- false,
- },
- {
- SRbacPolicy{
- Auth: false,
- },
- nil,
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- Ips: []netutils.IPV4Prefix{prefix},
- },
- newRbacIdentity2("", "system", []string{"admin"}, "10.0.0.23"),
- false,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- Ips: []netutils.IPV4Prefix{prefix},
- },
- newRbacIdentity2("", "system", []string{"admin"}, "10.168.22.23"),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin"},
- Ips: []netutils.IPV4Prefix{prefix},
- },
- newRbacIdentity2("", "system", []string{"_member_"}, "10.168.22.23"),
- false,
- },
- {
- SRbacPolicy{
- Roles: []string{"admin"},
- Ips: []netutils.IPV4Prefix{prefix},
- },
- newRbacIdentity2("", "system", []string{"_member_", "admin"}, "10.168.22.23"),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{"system"},
- Roles: []string{"admin", "_member_"},
- Ips: []netutils.IPV4Prefix{prefix},
- },
- newRbacIdentity2("", "system", []string{"_member_", "projectowner"}, "10.168.22.23"),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{},
- Roles: []string{"domain_admin"},
- Auth: true,
- },
- newRbacIdentity2("", "ldapproj", []string{"domain_admin"}, ""),
- true,
- },
- {
- SRbacPolicy{
- Projects: []string{},
- Roles: []string{"admin"},
- Auth: true,
- },
- newRbacIdentity2("", "", []string{"admin"}, ""),
- true,
- },
- }
- for i, c := range cases {
- got, _ := c.policy.Match(c.userCred)
- if got != c.want {
- t.Errorf("[%d]: %#v %#v got %v want %v", i, c.policy, c.userCred, got, c.want)
- }
- }
- }
- func TestGetMatchRules(t *testing.T) {
- cases := []struct {
- rules []SRbacRule
- service string
- resource string
- action string
- want bool
- }{
- {
- []SRbacRule{
- {
- Service: "yunionconf",
- Resource: "parameters",
- Action: "list",
- Result: Allow,
- },
- },
- "yunionconf",
- "parameters",
- "list",
- true,
- },
- }
- for _, c := range cases {
- rule := GetMatchRule(c.rules, c.service, c.resource, c.action)
- got := rule != nil
- if got != c.want {
- t.Errorf("want %v got %v", c.want, got)
- }
- }
- }
|