Skip to content

Commit 759a6da

Browse files
Kamil PrzybylKamil Przybyl
authored andcommitted
feat(webhook): validate AnnotationWebSocket
1 parent 0437832 commit 759a6da

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

pkg/alb/ingress/ingress_webhook_test.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,69 @@ func TestIngressValidator_Handle(t *testing.T) {
112112
},
113113
expectAllowed: false,
114114
},
115+
{
116+
name: "Valid WAF Name (Allowed)",
117+
operation: admissionv1.Create,
118+
className: &managedIngressClassName,
119+
annotations: map[string]string{
120+
AnnotationWAFName: "my-valid-waf-123",
121+
},
122+
expectAllowed: true,
123+
},
124+
{
125+
name: "Valid WAF Name Single Char (Allowed)",
126+
operation: admissionv1.Create,
127+
className: &managedIngressClassName,
128+
annotations: map[string]string{
129+
AnnotationWAFName: "a",
130+
},
131+
expectAllowed: true,
132+
},
133+
{
134+
name: "Denied - Invalid WAF Name (Uppercase)",
135+
operation: admissionv1.Create,
136+
className: &managedIngressClassName,
137+
annotations: map[string]string{
138+
AnnotationWAFName: "My-Waf-Name",
139+
},
140+
expectAllowed: false,
141+
},
142+
{
143+
name: "Denied - Invalid WAF Name (Starts with hyphen)",
144+
operation: admissionv1.Create,
145+
className: &managedIngressClassName,
146+
annotations: map[string]string{
147+
AnnotationWAFName: "-my-waf",
148+
},
149+
expectAllowed: false,
150+
},
151+
{
152+
name: "Denied - Invalid WAF Name (Ends with hyphen)",
153+
operation: admissionv1.Create,
154+
className: &managedIngressClassName,
155+
annotations: map[string]string{
156+
AnnotationWAFName: "my-waf-",
157+
},
158+
expectAllowed: false,
159+
},
160+
{
161+
name: "Denied - Invalid WAF Name (Invalid Character)",
162+
operation: admissionv1.Create,
163+
className: &managedIngressClassName,
164+
annotations: map[string]string{
165+
AnnotationWAFName: "my_waf_name",
166+
},
167+
expectAllowed: false,
168+
},
169+
{
170+
name: "Denied - Invalid WAF Name (Too Long - 64 chars)",
171+
operation: admissionv1.Create,
172+
className: &managedIngressClassName,
173+
annotations: map[string]string{
174+
AnnotationWAFName: "a123456789012345678901234567890123456789012345678901234567890123",
175+
},
176+
expectAllowed: false,
177+
},
115178
}
116179

117180
for _, tt := range tests {

pkg/alb/ingress/ingress_webook.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"context"
66
"net/http"
77
"strconv"
8+
"regexp"
89

910
networkingv1 "k8s.io/api/networking/v1"
1011
"sigs.k8s.io/controller-runtime/pkg/client"
@@ -80,6 +81,15 @@ func (v *IngressValidator) handleUpdate(ctx context.Context, req admission.Reque
8081

8182
// validateBaseAnnotations checks simple formatting, allowed values, and basic constraints for all relevant annotations.
8283
func (v *IngressValidator) validateBaseAnnotations(ctx context.Context, ingress *networkingv1.Ingress) admission.Response {
84+
// Validate WAF Name using the provided regex constraint
85+
if val, ok := ingress.Annotations[AnnotationWAFName]; ok {
86+
wafRegex := `^[0-9a-z](?:(?:[0-9a-z]|-){0,61}[0-9a-z])?$`
87+
matched, _ := regexp.MatchString(wafRegex, val)
88+
if !matched {
89+
return admission.Denied(fmt.Sprintf("Annotation '%s' has an invalid value '%s'. It must match the pattern: %s", AnnotationWAFName, val, wafRegex))
90+
}
91+
}
92+
8393
// Validate Booleans
8494
boolAnnotations := []string{
8595
AnnotationTargetPoolTLSEnabled,

0 commit comments

Comments
 (0)