Skip to content

Commit

Permalink
fix: explainPolicy piggyback owner's privilige
Browse files Browse the repository at this point in the history
  • Loading branch information
Qiu Jian committed Jun 8, 2020
1 parent d1d2245 commit e7b198a
Showing 1 changed file with 33 additions and 24 deletions.
57 changes: 33 additions & 24 deletions pkg/cloudcommon/policy/policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -418,9 +418,13 @@ func (manager *SPolicyManager) allowWithoutCache(scope rbacutils.TRbacScope, use
return result
}

func explainPolicy(ctx context.Context, userCred mcclient.TokenCredential, policyReq jsonutils.JSONObject, name string) ([]string, rbacutils.TRbacResult, error) {
_, request, result, err := explainPolicyInternal(ctx, userCred, policyReq, name)
return request, result, err
//
// result: allow/deny for the named policy
// userResult: allow/deny for the matched policies of userCred
//
func explainPolicy(ctx context.Context, userCred mcclient.TokenCredential, policyReq jsonutils.JSONObject, name string) ([]string, rbacutils.TRbacResult, rbacutils.TRbacResult, error) {
_, request, result, userResult, err := explainPolicyInternal(ctx, userCred, policyReq, name)
return request, result, userResult, err
}

func fetchPolicyByIdOrName(ctx context.Context, id string) (rbacutils.SPolicyInfo, error) {
Expand All @@ -432,10 +436,10 @@ func fetchPolicyByIdOrName(ctx context.Context, id string) (rbacutils.SPolicyInf
return parseJsonPolicy(data, false)
}

func explainPolicyInternal(ctx context.Context, userCred mcclient.TokenCredential, policyReq jsonutils.JSONObject, name string) (rbacutils.TRbacScope, []string, rbacutils.TRbacResult, error) {
func explainPolicyInternal(ctx context.Context, userCred mcclient.TokenCredential, policyReq jsonutils.JSONObject, name string) (rbacutils.TRbacScope, []string, rbacutils.TRbacResult, rbacutils.TRbacResult, error) {
policySeq, err := policyReq.GetArray()
if err != nil {
return rbacutils.ScopeSystem, nil, rbacutils.Deny, httperrors.NewInputParameterError("invalid format")
return rbacutils.ScopeSystem, nil, rbacutils.Deny, rbacutils.Deny, httperrors.NewInputParameterError("invalid format")
}
service := rbacutils.WILD_MATCH
resource := rbacutils.WILD_MATCH
Expand Down Expand Up @@ -466,32 +470,34 @@ func explainPolicyInternal(ctx context.Context, userCred mcclient.TokenCredentia
scope := rbacutils.String2Scope(scopeStr)
if !consts.IsRbacEnabled() {
if scope == rbacutils.ScopeProject || (scope == rbacutils.ScopeSystem && userCred.HasSystemAdminPrivilege()) {
return scope, reqStrs, rbacutils.Allow, nil
return scope, reqStrs, rbacutils.Allow, rbacutils.Allow, nil
} else {
return scope, reqStrs, rbacutils.Deny, httperrors.NewForbiddenError("operation not allowed")
return scope, reqStrs, rbacutils.Deny, rbacutils.Deny, httperrors.NewForbiddenError("operation not allowed")
}
}

if len(name) == 0 {
return scope, reqStrs, PolicyManager.Allow(scope, userCred, service, resource, action, extra...), nil
}
userResult := PolicyManager.Allow(scope, userCred, service, resource, action, extra...)
result := userResult

policy := PolicyManager.findPolicyByName(scope, name)
if policy == nil {
// policy not found locally, remote fetch
sp, err := fetchPolicyByIdOrName(ctx, name)
if err != nil {
return scope, reqStrs, rbacutils.Deny, httperrors.NewNotFoundError("policy %s not found: %s", name, err)
if len(name) > 0 {
policy := PolicyManager.findPolicyByName(scope, name)
if policy == nil {
// policy not found locally, remote fetch
sp, err := fetchPolicyByIdOrName(ctx, name)
if err != nil {
return scope, reqStrs, rbacutils.Deny, rbacutils.Deny, httperrors.NewNotFoundError("policy %s not found: %s", name, err)
}
policy = sp.Policy
}
policy = sp.Policy
}

rule := policy.GetMatchRule(service, resource, action, extra...)
result := rbacutils.Deny
if rule != nil {
result = rule.Result
rule := policy.GetMatchRule(service, resource, action, extra...)
result = rbacutils.Deny
if rule != nil {
result = rule.Result
}
}
return scope, reqStrs, result, nil

return scope, reqStrs, result, userResult, nil
}

func ExplainRpc(ctx context.Context, userCred mcclient.TokenCredential, params jsonutils.JSONObject, name string) (jsonutils.JSONObject, error) {
Expand All @@ -501,11 +507,14 @@ func ExplainRpc(ctx context.Context, userCred mcclient.TokenCredential, params j
}
ret := jsonutils.NewDict()
for key, policyReq := range paramDict {
reqStrs, result, err := explainPolicy(ctx, userCred, policyReq, name)
reqStrs, result, userResult, err := explainPolicy(ctx, userCred, policyReq, name)
if err != nil {
return nil, err
}
reqStrs = append(reqStrs, string(result))
if len(name) > 0 {
reqStrs = append(reqStrs, string(userResult))
}
ret.Add(jsonutils.NewStringArray(reqStrs), key)
}
return ret, nil
Expand Down

0 comments on commit e7b198a

Please sign in to comment.