2020-08-29 06:52:22 +05:30
|
|
|
package validate
|
|
|
|
|
|
|
|
import (
|
|
|
|
"container/list"
|
2022-10-20 13:36:46 +02:00
|
|
|
"sort"
|
2020-10-07 11:12:31 -07:00
|
|
|
|
2023-01-30 17:47:19 +05:30
|
|
|
"github.com/kyverno/kyverno/pkg/engine/anchor"
|
2020-08-29 06:52:22 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
// Checks if pattern has anchors
|
|
|
|
func hasNestedAnchors(pattern interface{}) bool {
|
|
|
|
switch typed := pattern.(type) {
|
|
|
|
case map[string]interface{}:
|
|
|
|
if anchors := getAnchorsFromMap(typed); len(anchors) > 0 {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
for _, value := range typed {
|
|
|
|
if hasNestedAnchors(value) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
case []interface{}:
|
|
|
|
for _, value := range typed {
|
|
|
|
if hasNestedAnchors(value) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
default:
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// getSortedNestedAnchorResource - sorts anchors key
|
|
|
|
func getSortedNestedAnchorResource(resources map[string]interface{}) *list.List {
|
|
|
|
sortedResourceKeys := list.New()
|
2022-10-20 13:36:46 +02:00
|
|
|
|
|
|
|
keys := make([]string, 0, len(resources))
|
|
|
|
for k := range resources {
|
|
|
|
keys = append(keys, k)
|
|
|
|
}
|
|
|
|
sort.Strings(keys)
|
|
|
|
|
|
|
|
for _, k := range keys {
|
|
|
|
v := resources[k]
|
2023-01-30 17:47:19 +05:30
|
|
|
if anchor.IsGlobal(anchor.Parse(k)) {
|
2021-09-21 20:15:09 +05:30
|
|
|
sortedResourceKeys.PushFront(k)
|
|
|
|
continue
|
|
|
|
}
|
2020-08-29 06:52:22 +05:30
|
|
|
if hasNestedAnchors(v) {
|
|
|
|
sortedResourceKeys.PushFront(k)
|
2020-12-08 22:52:37 -08:00
|
|
|
} else {
|
|
|
|
sortedResourceKeys.PushBack(k)
|
2020-08-29 06:52:22 +05:30
|
|
|
}
|
|
|
|
}
|
|
|
|
return sortedResourceKeys
|
|
|
|
}
|
|
|
|
|
|
|
|
// getAnchorsFromMap gets the anchor map
|
|
|
|
func getAnchorsFromMap(anchorsMap map[string]interface{}) map[string]interface{} {
|
|
|
|
result := make(map[string]interface{})
|
|
|
|
for key, value := range anchorsMap {
|
2023-01-30 17:47:19 +05:30
|
|
|
if a := anchor.Parse(key); anchor.IsCondition(a) || anchor.IsExistence(a) || anchor.IsEquality(a) || anchor.IsNegation(a) || anchor.IsGlobal(a) {
|
2020-08-29 06:52:22 +05:30
|
|
|
result[key] = value
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return result
|
|
|
|
}
|