From 42c41a07c8da4d6d37996dd1c4060e7077c61e23 Mon Sep 17 00:00:00 2001 From: xilabao Date: Wed, 7 Jun 2017 14:04:17 +0800 Subject: [PATCH] validate nonResourceURL in create clusterrole --- pkg/kubectl/cmd/create_clusterrole.go | 15 ++++++++ pkg/kubectl/cmd/create_clusterrole_test.go | 42 +++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/pkg/kubectl/cmd/create_clusterrole.go b/pkg/kubectl/cmd/create_clusterrole.go index 9ab572871b7..1a6ba4e6821 100644 --- a/pkg/kubectl/cmd/create_clusterrole.go +++ b/pkg/kubectl/cmd/create_clusterrole.go @@ -19,6 +19,7 @@ package cmd import ( "fmt" "io" + "strings" "github.com/spf13/cobra" @@ -133,6 +134,20 @@ func (c *CreateClusterRoleOptions) Validate() error { return fmt.Errorf("invalid verb: '%s' for nonResourceURL", v) } } + + for _, nonResourceURL := range c.NonResourceURLs { + if nonResourceURL == "*" { + continue + } + + if nonResourceURL == "" || !strings.HasPrefix(nonResourceURL, "/") { + return fmt.Errorf("nonResourceURL should start with /") + } + + if strings.ContainsRune(nonResourceURL[:len(nonResourceURL)-1], '*') { + return fmt.Errorf("nonResourceURL only supports wildcard matches when '*' is at the end") + } + } } return nil diff --git a/pkg/kubectl/cmd/create_clusterrole_test.go b/pkg/kubectl/cmd/create_clusterrole_test.go index 4d877307c8b..e930c6eacf0 100644 --- a/pkg/kubectl/cmd/create_clusterrole_test.go +++ b/pkg/kubectl/cmd/create_clusterrole_test.go @@ -375,6 +375,46 @@ func TestClusterRoleValidate(t *testing.T) { }, expectErr: false, }, + "test-invalid-empty-non-resource-url": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{""}, + }, + expectErr: true, + }, + "test-invalid-non-resource-url": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{"logs"}, + }, + expectErr: true, + }, + "test-invalid-non-resource-url-with-*": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{"/logs/*/"}, + }, + expectErr: true, + }, + "test-invalid-non-resource-url-with-multiple-*": { + clusterRoleOptions: &CreateClusterRoleOptions{ + CreateRoleOptions: &CreateRoleOptions{ + Name: "my-clusterrole", + Verbs: []string{"create"}, + }, + NonResourceURLs: []string{"/logs*/*"}, + }, + expectErr: true, + }, "test-invalid-verb-for-non-resource-url": { clusterRoleOptions: &CreateClusterRoleOptions{ CreateRoleOptions: &CreateRoleOptions{ @@ -397,7 +437,7 @@ func TestClusterRoleValidate(t *testing.T) { }, }, }, - NonResourceURLs: []string{"/logs/"}, + NonResourceURLs: []string{"/logs/", "/logs/*"}, }, expectErr: false, },