This is an automated email from the ASF dual-hosted git repository.
AlinsRan pushed a commit to branch feat/gateway-api-1.6.0
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git
The following commit(s) were added to refs/heads/feat/gateway-api-1.6.0 by this
push:
new 3a19574a fix: address review feedback on Gateway API 1.6 changes
3a19574a is described below
commit 3a19574a8a86801fe4a6f022f28ca5359926a6ff
Author: AlinsRan <[email protected]>
AuthorDate: Thu Jul 23 08:53:07 2026 +0800
fix: address review feedback on Gateway API 1.6 changes
- consumer webhook: drop the key-auth credential value from the
duplicate-key
error so secret material is not leaked to API clients and logs.
- gateway status: reuse a previous listener status only when the listener
name
also matches, so reordered spec.listeners cannot publish another
listener's
status under the wrong name.
- KindOf: return ReferenceGrant for *gatewayv1beta1.ReferenceGrant so
GvkOf(&ReferenceGrant{}) no longer yields kind Unknown.
- frontendValidation: resolve downstream mTLS only for TLS-terminating
listeners
(HTTPS/TLS), never for plaintext listeners.
---
internal/adc/translator/gateway.go | 5 +++++
internal/adc/translator/gateway_test.go | 1 +
internal/controller/gateway_controller.go | 5 +++++
internal/controller/utils.go | 6 ++++++
internal/types/k8s.go | 3 +++
internal/webhook/v1/consumer_webhook.go | 4 +++-
internal/webhook/v1/consumer_webhook_test.go | 4 +++-
7 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/internal/adc/translator/gateway.go
b/internal/adc/translator/gateway.go
index 7df96b48..2ec64946 100644
--- a/internal/adc/translator/gateway.go
+++ b/internal/adc/translator/gateway.go
@@ -159,6 +159,11 @@ func (t *Translator) translateSecret(tctx
*provider.TranslateContext, listener g
// spec.tls.frontend: Default applies to all HTTPS listeners, and a PerPort
entry
// overrides it for listeners on the matching port.
func frontendTLSValidation(obj *gatewayv1.Gateway, listener
gatewayv1.Listener) *gatewayv1.FrontendTLSValidation {
+ // Downstream mTLS only applies where the Gateway terminates TLS
(HTTPS/TLS
+ // listeners); never enable client-cert validation on plaintext
listeners.
+ if listener.Protocol != gatewayv1.HTTPSProtocolType &&
listener.Protocol != gatewayv1.TLSProtocolType {
+ return nil
+ }
if obj.Spec.TLS == nil || obj.Spec.TLS.Frontend == nil {
return nil
}
diff --git a/internal/adc/translator/gateway_test.go
b/internal/adc/translator/gateway_test.go
index 225cd2fd..ec1d7ee0 100644
--- a/internal/adc/translator/gateway_test.go
+++ b/internal/adc/translator/gateway_test.go
@@ -61,6 +61,7 @@ func newTLSGateway(frontendValidation
*gatewayv1.FrontendTLSValidation) *gateway
Listeners: []gatewayv1.Listener{
{
Name: "https",
+ Protocol: gatewayv1.HTTPSProtocolType,
Hostname:
ptr.To(gatewayv1.Hostname("example.com")),
TLS: &gatewayv1.ListenerTLSConfig{
Mode:
ptr.To(gatewayv1.TLSModeTerminate),
diff --git a/internal/controller/gateway_controller.go
b/internal/controller/gateway_controller.go
index 4c6f971a..f1a4135d 100644
--- a/internal/controller/gateway_controller.go
+++ b/internal/controller/gateway_controller.go
@@ -476,6 +476,11 @@ func (r *GatewayReconciler) processInfrastructure(tctx
*provider.TranslateContex
// validation (Gateway API v1.6 spec.tls.frontend) that applies to the given
HTTPS
// listener: a PerPort entry matching the listener's port overrides the
Default.
func frontendTLSValidationForListener(gateway *gatewayv1.Gateway, listener
gatewayv1.Listener) *gatewayv1.FrontendTLSValidation {
+ // Downstream mTLS only applies where the Gateway terminates TLS
(HTTPS/TLS
+ // listeners); never enable client-cert validation on plaintext
listeners.
+ if listener.Protocol != gatewayv1.HTTPSProtocolType &&
listener.Protocol != gatewayv1.TLSProtocolType {
+ return nil
+ }
if gateway.Spec.TLS == nil || gateway.Spec.TLS.Frontend == nil {
return nil
}
diff --git a/internal/controller/utils.go b/internal/controller/utils.go
index 6001534d..4ac80679 100644
--- a/internal/controller/utils.go
+++ b/internal/controller/utils.go
@@ -1035,6 +1035,12 @@ func getListenerStatus(
changed := false
if len(gateway.Status.Listeners) > i {
+ // Listener status is keyed by name, not position: if
the spec listeners
+ // were reordered, index i now points at a different
listener, so it must
+ // not be reused for this one.
+ if gateway.Status.Listeners[i].Name != listener.Name {
+ changed = true
+ }
if gateway.Status.Listeners[i].AttachedRoutes !=
attachedRoutes {
changed = true
}
diff --git a/internal/types/k8s.go b/internal/types/k8s.go
index dfe6a2de..42b2ea7a 100644
--- a/internal/types/k8s.go
+++ b/internal/types/k8s.go
@@ -43,6 +43,7 @@ const (
KindGRPCRoute = "GRPCRoute"
KindTLSRoute = "TLSRoute"
KindGatewayClass = "GatewayClass"
+ KindReferenceGrant = "ReferenceGrant"
KindIngress = "Ingress"
KindIngressClass = "IngressClass"
KindGatewayProxy = "GatewayProxy"
@@ -86,6 +87,8 @@ func KindOf(obj any) string {
return KindTLSRoute
case *gatewayv1.GatewayClass:
return KindGatewayClass
+ case *gatewayv1beta1.ReferenceGrant:
+ return KindReferenceGrant
case *netv1.Ingress:
return KindIngress
case *netv1.IngressClass:
diff --git a/internal/webhook/v1/consumer_webhook.go
b/internal/webhook/v1/consumer_webhook.go
index d511a5ea..a19b5782 100644
--- a/internal/webhook/v1/consumer_webhook.go
+++ b/internal/webhook/v1/consumer_webhook.go
@@ -174,7 +174,9 @@ func (v *ConsumerCustomValidator)
validateDuplicateKeyAuthCredentials(ctx contex
}
for key := range existingKeys {
if _, ok := keys[key]; ok {
- return fmt.Errorf("duplicate key-auth
credential key %q already used by Consumer %s/%s", key, existing.Namespace,
existing.Name)
+ // Do not include the credential value in the
error: it is returned to
+ // API clients and logged, which would leak the
secret key material.
+ return fmt.Errorf("duplicate key-auth
credential already used by Consumer %s/%s", existing.Namespace, existing.Name)
}
}
}
diff --git a/internal/webhook/v1/consumer_webhook_test.go
b/internal/webhook/v1/consumer_webhook_test.go
index 4dc32b84..1ea36d66 100644
--- a/internal/webhook/v1/consumer_webhook_test.go
+++ b/internal/webhook/v1/consumer_webhook_test.go
@@ -189,6 +189,8 @@ func TestConsumerValidator_DenyDuplicateKeyAuthCredential(t
*testing.T) {
warnings, err := validator.ValidateCreate(context.Background(),
consumer)
require.Empty(t, warnings)
require.Error(t, err)
- require.Contains(t, err.Error(), `duplicate key-auth credential key
"shared-key"`)
+ require.Contains(t, err.Error(), "duplicate key-auth credential")
require.Contains(t, err.Error(), "default/existing")
+ // The credential value must never leak into the error returned to
clients/logs.
+ require.NotContains(t, err.Error(), "shared-key")
}