diff --git a/pkg/apis/application/v1alpha1/types.go b/pkg/apis/application/v1alpha1/types.go index 819204312d..a383ab1fd4 100644 --- a/pkg/apis/application/v1alpha1/types.go +++ b/pkg/apis/application/v1alpha1/types.go @@ -1578,8 +1578,8 @@ func validatePolicy(proj string, role string, policy string) error { } // resource resource := strings.Trim(policyComponents[2], " ") - if resource != "applications" { - return status.Errorf(codes.InvalidArgument, "invalid policy rule '%s': project resource must be: 'applications', not '%s'", policy, resource) + if resource != "applications" && resource != "repositories" && resource != "clusters" { + return status.Errorf(codes.InvalidArgument, "invalid policy rule '%s': project resource must be: 'applications', 'repositories' or 'clusters', not '%s'", policy, resource) } // action action := strings.Trim(policyComponents[3], " ") diff --git a/pkg/apis/application/v1alpha1/types_test.go b/pkg/apis/application/v1alpha1/types_test.go index 6dfc23fca5..fd1221385f 100644 --- a/pkg/apis/application/v1alpha1/types_test.go +++ b/pkg/apis/application/v1alpha1/types_test.go @@ -2580,3 +2580,10 @@ func Test_validatePolicy_projIsNotRegex(t *testing.T) { err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, applications, *, some-project/*, allow") assert.NoError(t, err) } + +func Test_validatePolicy_ValidResource(t *testing.T) { + err := validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, repositories, *, some-project/*, allow") + assert.NoError(t, err) + err = validatePolicy("some-project", "org-admin", "p, proj:some-project:org-admin, clusters, *, some-project/*, allow") + assert.NoError(t, err) +} diff --git a/server/rbacpolicy/rbacpolicy.go b/server/rbacpolicy/rbacpolicy.go index e38a2183af..fcbe59b046 100644 --- a/server/rbacpolicy/rbacpolicy.go +++ b/server/rbacpolicy/rbacpolicy.go @@ -167,8 +167,8 @@ func (p *RBACPolicyEnforcer) getProjectFromRequest(rvals ...interface{}) *v1alph if res, ok := rvals[1].(string); ok { if obj, ok := rvals[3].(string); ok { switch res { - case ResourceApplications: - if objSplit := strings.Split(obj, "/"); len(objSplit) == 2 { + case ResourceApplications, ResourceRepositories, ResourceClusters: + if objSplit := strings.Split(obj, "/"); len(objSplit) >= 2 { return getProjectByName(objSplit[0]) } case ResourceProjects: diff --git a/server/rbacpolicy/rbacpolicy_test.go b/server/rbacpolicy/rbacpolicy_test.go index 657966369e..9822b1a9b3 100644 --- a/server/rbacpolicy/rbacpolicy_test.go +++ b/server/rbacpolicy/rbacpolicy_test.go @@ -149,3 +149,13 @@ func TestGetScopes_CustomScopes(t *testing.T) { scopes := rbacEnforcer.GetScopes() assert.Equal(t, scopes, customScopes) } + +func Test_getProjectFromRequest(t *testing.T) { + fp := newFakeProj() + projLister := test.NewFakeProjLister(fp) + + rbacEnforcer := NewRBACPolicyEnforcer(nil, projLister) + project := rbacEnforcer.getProjectFromRequest("", "repositories", "create", fp.Name+"/https://github.com/argoproj/argocd-example-apps") + + assert.Equal(t, project.Name, fp.Name) +}