diff --git a/pkg/cmd/delete.go b/pkg/cmd/delete.go index 2ea82d1e269b7604dd0f7601cd2a2a695fb6aa55..48c8d555dc2aa70719ae4ce3e76d73a35d8dc554 100644 --- a/pkg/cmd/delete.go +++ b/pkg/cmd/delete.go @@ -18,7 +18,7 @@ var Delete = &cli.Command{ Use: "delete <template-tag>", Short: "Delete a project template from the template registry", Run: func(c *cli.Command, args []string) { - MustValidateVarArgs(args, validate.Argument{"template-path", validate.Alphanumeric}) + MustValidateVarArgs(args, validate.Argument{"template-path", validate.AlphanumericExt}) MustValidateTemplateDir() diff --git a/pkg/cmd/download.go b/pkg/cmd/download.go index aaa73828d1743488852d89feb583add92ba5e11b..a04893fd6cbb399fb34b203b79d6fe3aec7a0279 100644 --- a/pkg/cmd/download.go +++ b/pkg/cmd/download.go @@ -103,7 +103,7 @@ var Download = &cli.Command{ MustValidateArgs(args, []validate.Argument{ {"template-repo", validate.UnixPath}, - {"template-tag", validate.Alphanumeric}, + {"template-tag", validate.AlphanumericExt}, }) MustValidateTemplateDir() diff --git a/pkg/cmd/save.go b/pkg/cmd/save.go index f2d76357669a5723524f10c22b06ef97edb75d32..973bcfebb0242d2bc07079d9be8ec39137e2e438 100644 --- a/pkg/cmd/save.go +++ b/pkg/cmd/save.go @@ -21,7 +21,7 @@ var Save = &cli.Command{ Run: func(c *cli.Command, args []string) { MustValidateArgs(args, []validate.Argument{ {"template-path", validate.UnixPath}, - {"template-tag", validate.Alphanumeric}, + {"template-tag", validate.AlphanumericExt}, }) MustValidateTemplateDir() diff --git a/pkg/util/validate/pattern/pattern.go b/pkg/util/validate/pattern/pattern.go index 5604e8d94d4740ee9812d76a23378a7601fecd10..7efacf158c815199f7c5e160264eb23b47a941c8 100644 --- a/pkg/util/validate/pattern/pattern.go +++ b/pkg/util/validate/pattern/pattern.go @@ -8,10 +8,11 @@ const ( email = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" unixPath = `^((\/)|(?:\/*[a-zA-Z0-9\.\:]+(?:_[a-zA-Z0-9\:\.]+)*(?:\-[\:a-zA-Z0-9\.]+)*)+\/?)$` - alpha = "^[a-zA-Z]+$" - alphanumeric = "^[a-zA-Z0-9]+$" - integer = "^[-+]?(0|[1-9][0-9]*)$" - numeric = "^[-+]?[0-9]+$" + alpha = "^[a-zA-Z]+$" + alphanumeric = "^[a-zA-Z0-9]+$" + integer = "^[-+]?(0|[1-9][0-9]*)$" + numeric = "^[-+]?[0-9]+$" + alphanumericext = "^[a-zA-Z0-9-_]+$" ) var ( @@ -21,6 +22,10 @@ var ( // Alphanumeric regular expression for alphanumeric strings. Alphanumeric = regexp.MustCompile(alphanumeric) + // AlphanumericExt regular expression for alphanumeric strings plus + // certain allowed characters. + AlphanumericExt = regexp.MustCompile(alphanumericext) + // Email regular expression for e-mail strings. Email = regexp.MustCompile(email) diff --git a/pkg/util/validate/pattern/pattern_test.go b/pkg/util/validate/pattern/pattern_test.go index c6750b3466f86568d7c0ebdbde846bb80510cedb..3839b945b6521113a844c28dd61597db55efbc5e 100644 --- a/pkg/util/validate/pattern/pattern_test.go +++ b/pkg/util/validate/pattern/pattern_test.go @@ -48,6 +48,28 @@ func TestAlphanumericPattern(t *testing.T) { } } +func TestAlphanumericExtPattern(t *testing.T) { + tests := []struct { + String string + Valid bool + }{ + {" ", false}, + {"/", false}, + {"root", true}, + {"tmp-dir", true}, + {"tmp-dir_now", true}, + {"TMPDIR", true}, + {"L33T", true}, + {"L@@T", false}, + } + + for _, test := range tests { + if ok := pattern.AlphanumericExt.MatchString(test.String); ok != test.Valid { + t.Errorf("pattern.AlphanumericExt.MatchString(%q) expected to be %v", test.String, test.Valid) + } + } +} + func TestIntegerPattern(t *testing.T) { tests := []struct { String string diff --git a/pkg/util/validate/string.go b/pkg/util/validate/string.go index 547e24e66b4f1c162e97d5f61100305eb1a62f4c..f1dd0f1b8e10fbf35678b7633860ad47338c951d 100644 --- a/pkg/util/validate/string.go +++ b/pkg/util/validate/string.go @@ -37,3 +37,9 @@ func UnixPath(path string) bool { func Alphanumeric(s string) bool { return pattern.Alphanumeric.MatchString(s) } + +// AlphanumericExt validates whether a string is an alphanumeric string, but a +// small set of extra characters allowed +func AlphanumericExt(s string) bool { + return pattern.AlphanumericExt.MatchString(s) +}