-
Notifications
You must be signed in to change notification settings - Fork 465
/
ScopedVariableValidator.go
82 lines (74 loc) · 3.49 KB
/
ScopedVariableValidator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package variables
import (
"fmt"
"github.com/devtron-labs/devtron/pkg/variables/helper"
"github.com/devtron-labs/devtron/pkg/variables/models"
"github.com/devtron-labs/devtron/pkg/variables/utils"
"golang.org/x/exp/slices"
"regexp"
"strings"
)
func (impl *ScopedVariableServiceImpl) isValidPayload(payload models.Payload) (error, bool) {
variableNamesList := make([]string, 0)
for _, variable := range payload.Variables {
if slices.Contains(variableNamesList, variable.Definition.VarName) {
return models.ValidationError{Err: fmt.Errorf("duplicate variable name %s", variable.Definition.VarName)}, false
}
if strings.HasPrefix(variable.Definition.VarName, impl.VariableNameConfig.SystemVariablePrefix) {
return models.ValidationError{Err: fmt.Errorf("%s is not allowed (Prefix %s is reserved for system variables)", variable.Definition.VarName, impl.VariableNameConfig.SystemVariablePrefix)}, false
}
regex := impl.VariableNameConfig.VariableNameRegex
regexExpression := regexp.MustCompile(regex)
if !regexExpression.MatchString(variable.Definition.VarName) {
return models.ValidationError{Err: fmt.Errorf("%s does not match the required format (Alphanumeric, 64 characters max, no hyphen/underscore at start/end)", variable.Definition.VarName)}, false
}
variableNamesList = append(variableNamesList, variable.Definition.VarName)
uniqueVariableMap := make(map[string]interface{})
for _, attributeValue := range variable.AttributeValues {
if !utils.IsStringType(attributeValue.VariableValue.Value) && variable.Definition.VarType.IsTypeSensitive() {
return models.ValidationError{Err: fmt.Errorf("data type other than string cannot be sensitive")}, false
}
validIdentifierTypeList := helper.GetIdentifierTypeFromAttributeType(attributeValue.AttributeType)
if len(validIdentifierTypeList) != len(attributeValue.AttributeParams) {
return models.ValidationError{Err: fmt.Errorf("attribute selectors are not valid for given category %s", attributeValue.AttributeType)}, false
}
for key, _ := range attributeValue.AttributeParams {
if !slices.Contains(validIdentifierTypeList, key) {
return models.ValidationError{Err: fmt.Errorf("invalid attribute selector key %s", key)}, false
}
}
identifierString := fmt.Sprintf("%s-%s", variable.Definition.VarName, string(attributeValue.AttributeType))
for _, key := range validIdentifierTypeList {
identifierString = fmt.Sprintf("%s-%s", identifierString, attributeValue.AttributeParams[key])
}
if _, ok := uniqueVariableMap[identifierString]; ok {
return models.ValidationError{Err: fmt.Errorf("duplicate Selectors found for category %v", attributeValue.AttributeType)}, false
}
uniqueVariableMap[identifierString] = attributeValue.VariableValue.Value
}
}
return nil, true
}
func complexTypeValidator(payload models.Payload) bool {
for _, variable := range payload.Variables {
variableType := variable.Definition.DataType
if variableType == models.YAML_TYPE || variableType == models.JSON_TYPE {
for _, attributeValue := range variable.AttributeValues {
if attributeValue.VariableValue.Value != "" {
if variable.Definition.DataType == models.YAML_TYPE {
if !utils.IsValidYAML(attributeValue.VariableValue.Value.(string)) {
return false
}
} else if variable.Definition.DataType == models.JSON_TYPE {
if !utils.IsValidJSON(attributeValue.VariableValue.Value.(string)) {
return false
}
}
} else {
return false
}
}
}
}
return true
}