From 1ca1170b11aea7f74c4d936ad302157697a3e1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 16 Aug 2023 16:21:43 -0300 Subject: [PATCH] Add validation of app and job name --- api/types/rule.go | 15 +++++++++++++++ api/types/rule_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/api/types/rule.go b/api/types/rule.go index 0ea42dd..0da3281 100644 --- a/api/types/rule.go +++ b/api/types/rule.go @@ -9,6 +9,7 @@ import ( "fmt" "net" "reflect" + "regexp" "sort" "strings" "time" @@ -17,6 +18,8 @@ import ( "k8s.io/apimachinery/pkg/util/validation" ) +var tsuruNameRegexp = regexp.MustCompile(`^[a-z][a-z0-9-]{0,39}$`) + type Rule struct { RuleID string RuleName string @@ -73,6 +76,10 @@ func (r *RuleType) Validate() error { if r.TsuruApp.AppName != "" && r.TsuruApp.PoolName != "" { return errors.New("cannot set both app name and pool name") } + + if r.TsuruApp.AppName != "" && !validateTsuruName(r.TsuruApp.AppName) { + return errors.New("invalid app name") + } countSet++ } @@ -80,6 +87,10 @@ func (r *RuleType) Validate() error { if r.TsuruJob.JobName == "" { return errors.New("cannot have empty tsuru job name") } + + if !validateTsuruName(r.TsuruJob.JobName) { + return errors.New("invalid job name") + } countSet++ } @@ -227,6 +238,10 @@ func validatePorts(ports []ProtoPort) error { return nil } +func validateTsuruName(name string) bool { + return tsuruNameRegexp.MatchString(name) +} + type ProtoPorts []ProtoPort type ProtoPort struct { diff --git a/api/types/rule_test.go b/api/types/rule_test.go index 34152b0..001240d 100644 --- a/api/types/rule_test.go +++ b/api/types/rule_test.go @@ -133,6 +133,31 @@ func TestValidateRuleType(t *testing.T) { }, expected: `Invalid rpaas instance name`, }, + { + rt: RuleType{ + TsuruApp: &TsuruAppRule{ + AppName: "blaah-blah", + PoolName: "pool-name", + }, + }, + expected: `cannot set both app name and pool name`, + }, + { + rt: RuleType{ + TsuruApp: &TsuruAppRule{ + AppName: "blaah-blah.cluster", + }, + }, + expected: `invalid app name`, + }, + { + rt: RuleType{ + TsuruJob: &TsuruJobRule{ + JobName: "blaah-blah.cluster", + }, + }, + expected: `invalid job name`, + }, } for _, tt := range tests {