From 3c0d1aaa3f2eb5212704c1532e5ef1f8dd6cec56 Mon Sep 17 00:00:00 2001 From: Rocktavious Date: Fri, 22 Sep 2023 08:23:37 -0500 Subject: [PATCH 1/2] move tag key name validation from terraform down into opslevel-go --- tags.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/tags.go b/tags.go index 7b35128b..56a57d79 100644 --- a/tags.go +++ b/tags.go @@ -1,5 +1,10 @@ package opslevel +import ( + "fmt" + "regexp" +) + type TagOwner string const ( @@ -7,6 +12,11 @@ const ( TagOwnerRepository TagOwner = "Repository" ) +var ( + TagKeyRegex = regexp.MustCompile(`\A[a-z][0-9a-z_\.\/\\-]*\z`) + TagKeyErrorMsg = "tag key name '%s' must start with a letter and be only lowercase alphanumerics, underscores, hyphens, periods, and slashes" +) + type Tag struct { Id ID `json:"id"` Key string `json:"key"` @@ -49,6 +59,15 @@ type TagDeleteInput struct { Id ID `json:"id"` } +//#region Helpers + +func ValidateTagKey(key string) error { + if !TagKeyRegex.MatchString(key) { + return fmt.Errorf(TagKeyErrorMsg, key) + } + return nil +} + //#region Assign // Deprecated: Use AssignTagsFor instead @@ -76,6 +95,9 @@ func (client *Client) AssignTags(identifier string, tags map[string]string) ([]T Tags: []TagInput{}, } for key, value := range tags { + if err := ValidateTagKey(key); err != nil { + return nil, err + } input.Tags = append(input.Tags, TagInput{ Key: key, Value: value, @@ -110,6 +132,9 @@ func (client *Client) AssignTag(input TagAssignInput) ([]Tag, error) { func (client *Client) CreateTags(identifier string, tags map[string]string) ([]Tag, error) { var output []Tag for key, value := range tags { + if err := ValidateTagKey(key); err != nil { + return nil, err + } input := TagCreateInput{ Key: key, Value: value, @@ -141,6 +166,9 @@ func (client *Client) CreateTag(input TagCreateInput) (*Tag, error) { Errors []OpsLevelErrors } `graphql:"tagCreate(input: $input)"` } + if err := ValidateTagKey(input.Key); err != nil { + return nil, err + } v := PayloadVariables{ "input": input, } @@ -187,6 +215,9 @@ func (client *Client) UpdateTag(input TagUpdateInput) (*Tag, error) { Errors []OpsLevelErrors } `graphql:"tagUpdate(input: $input)"` } + if err := ValidateTagKey(input.Key); err != nil { + return nil, err + } v := PayloadVariables{ "input": input, } From 67233aa9e0124c145d98254e4792a93ecca4b6c7 Mon Sep 17 00:00:00 2001 From: Rocktavious Date: Fri, 22 Sep 2023 08:25:20 -0500 Subject: [PATCH 2/2] add changie entry --- .changes/unreleased/Feature-20230922-082512.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changes/unreleased/Feature-20230922-082512.yaml diff --git a/.changes/unreleased/Feature-20230922-082512.yaml b/.changes/unreleased/Feature-20230922-082512.yaml new file mode 100644 index 00000000..e15f20d2 --- /dev/null +++ b/.changes/unreleased/Feature-20230922-082512.yaml @@ -0,0 +1,3 @@ +kind: Feature +body: Add tag key name validation to `CreateTag` `AssignTag` and `UpdateTag` methods +time: 2023-09-22T08:25:12.029174-05:00