Skip to content

Commit 20878e7

Browse files
committed
improve regex for cidr
1 parent 71f3a1b commit 20878e7

File tree

6 files changed

+46
-9
lines changed

6 files changed

+46
-9
lines changed

apis/v1alpha1/nginxproxy_types.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ type RewriteClientIP struct {
155155
// Sets NGINX directive set_real_ip_from: https://nginx.org/en/docs/http/ngx_http_realip_module.html#set_real_ip_from
156156
// This field is required if mode is set.
157157
// +kubebuilder:validation:MaxItems=16
158-
// +listType=atomic
158+
// +listType=map
159+
// +listMapKey=type
159160
//
160161
//
161162
// +optional
@@ -200,6 +201,6 @@ type AddressType string
200201

201202
const (
202203
// AddressTypeCIDR specifies that the address is a CIDR block.
203-
// kubebuilder:validation:Pattern=`(\/([0-9]?[0-9]?[0-8]))$`
204+
// kubebuilder:validation:Pattern=`^[\.a-zA-Z0-9::]*(\/([0-9]?[0-9]?[0-8]))$`
204205
AddressTypeCIDR AddressType = "cidr"
205206
)

config/crd/bases/gateway.nginx.org_nginxproxies.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ spec:
118118
type: object
119119
maxItems: 16
120120
type: array
121-
x-kubernetes-list-type: atomic
121+
x-kubernetes-list-map-keys:
122+
- type
123+
x-kubernetes-list-type: map
122124
type: object
123125
x-kubernetes-validations:
124126
- message: if mode is set, trustedAddresses is a required field

deploy/crds.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,9 @@ spec:
703703
type: object
704704
maxItems: 16
705705
type: array
706-
x-kubernetes-list-type: atomic
706+
x-kubernetes-list-map-keys:
707+
- type
708+
x-kubernetes-list-type: map
707709
type: object
708710
x-kubernetes-validations:
709711
- message: if mode is set, trustedAddresses is a required field

internal/mode/static/state/graph/nginxproxy.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,23 @@ func validateRewriteClientIP(npCfg *ngfAPI.NginxProxy) field.ErrorList {
172172
}
173173

174174
for _, addr := range rewriteClientIP.TrustedAddresses {
175-
if err := k8svalidation.IsValidCIDR(trustedAddressesPath, addr.Value); err != nil {
175+
switch addr.Type {
176+
case ngfAPI.AddressTypeCIDR:
177+
if err := k8svalidation.IsValidCIDR(trustedAddressesPath, addr.Value); err != nil {
178+
allErrs = append(
179+
allErrs,
180+
field.Invalid(trustedAddressesPath.Child(addr.Value),
181+
addr,
182+
err.ToAggregate().Error(),
183+
),
184+
)
185+
}
186+
default:
176187
allErrs = append(
177188
allErrs,
178-
field.Invalid(trustedAddressesPath.Child(addr.Value),
179-
addr,
180-
err.ToAggregate().Error(),
189+
field.NotSupported(trustedAddressesPath.Child(addr.Value),
190+
addr.Type,
191+
[]string{string(ngfAPI.AddressTypeCIDR)},
181192
),
182193
)
183194
}

internal/mode/static/state/graph/nginxproxy_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,27 @@ func TestValidateRewriteClientIP(t *testing.T) {
517517
"required when mode is set, spec.rewriteClientIP.mode: " +
518518
"Unsupported value: \"invalid\": supported values: \"ProxyProtocol\", \"XForwardedFor\"]",
519519
},
520+
{
521+
name: "invalid address type in trustedAddresses",
522+
validator: createInvalidValidator(),
523+
np: &ngfAPI.NginxProxy{
524+
Spec: ngfAPI.NginxProxySpec{
525+
RewriteClientIP: &ngfAPI.RewriteClientIP{
526+
SetIPRecursively: helpers.GetPointer(true),
527+
TrustedAddresses: []ngfAPI.Address{
528+
{
529+
Type: ngfAPI.AddressType("invalid"),
530+
Value: "2001:db8::/129",
531+
},
532+
},
533+
Mode: helpers.GetPointer(ngfAPI.RewriteClientIPModeProxyProtocol),
534+
},
535+
},
536+
},
537+
expectErrCount: 1,
538+
errorString: "spec.rewriteClientIP.trustedAddresses.2001:db8::/129: " +
539+
"Unsupported value: \"invalid\": supported values: \"cidr\"",
540+
},
520541
}
521542

522543
for _, test := range tests {

site/content/reference/api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ string
533533
</thead>
534534
<tbody><tr><td><p>&#34;cidr&#34;</p></td>
535535
<td><p>AddressTypeCIDR specifies that the address is a CIDR block.
536-
kubebuilder:validation:Pattern=<code>(\/([0-9]?[0-9]?[0-8]))$</code></p>
536+
kubebuilder:validation:Pattern=<code>^[\.a-zA-Z0-9::]*(\/([0-9]?[0-9]?[0-8]))$</code></p>
537537
</td>
538538
</tr></tbody>
539539
</table>

0 commit comments

Comments
 (0)