@@ -19,7 +19,7 @@ package v1alpha1
1919import (
2020 "context"
2121 "fmt"
22-
22+ oauth2v3 "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/oauth2/v3"
2323 hcmv3 "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3"
2424 "github.com/kaasops/envoy-xds-controller/pkg/errors"
2525 "github.com/kaasops/envoy-xds-controller/pkg/options"
@@ -33,9 +33,9 @@ func (h *HttpFilter) Validate(ctx context.Context) error {
3333 }
3434
3535 for _ , httpFilter := range h .Spec {
36- httpFilterv3 := & hcmv3.HttpFilter {}
37- if err := options . Unmarshaler . Unmarshal (httpFilter .Raw , httpFilterv3 ); err != nil {
38- return errors . Wrap ( err , errors . UnmarshalMessage )
36+ hf := & hcmv3.HttpFilter {}
37+ if err := UnmarshalAndValidateHTTPFilter (httpFilter .Raw , hf ); err != nil {
38+ return err
3939 }
4040 }
4141
@@ -68,3 +68,36 @@ func (h *HttpFilter) ValidateDelete(ctx context.Context, cl client.Client) error
6868
6969 return nil
7070}
71+
72+ func UnmarshalAndValidateHTTPFilter (raw []byte , httpFilter * hcmv3.HttpFilter ) error {
73+ if err := options .Unmarshaler .Unmarshal (raw , httpFilter ); err != nil {
74+ return errors .Wrap (err , errors .UnmarshalMessage )
75+ }
76+ if err := httpFilter .ValidateAll (); err != nil {
77+ return errors .WrapUKS (err , errors .InvalidHTTPFilter )
78+ }
79+ switch v := httpFilter .ConfigType .(type ) {
80+ case * hcmv3.HttpFilter_TypedConfig :
81+ switch v .TypedConfig .TypeUrl {
82+ case "type.googleapis.com/envoy.extensions.filters.http.oauth2.v3.OAuth2" :
83+ if err := validateOAuth2Filter (v ); err != nil {
84+ return err
85+ }
86+ }
87+ }
88+ return nil
89+ }
90+
91+ func validateOAuth2Filter (v * hcmv3.HttpFilter_TypedConfig ) error {
92+ var oauthCfg oauth2v3.OAuth2
93+ if err := v .TypedConfig .UnmarshalTo (& oauthCfg ); err != nil {
94+ return errors .Wrap (err , errors .UnmarshalMessage )
95+ }
96+ if err := oauthCfg .ValidateAll (); err != nil {
97+ return errors .WrapUKS (err , errors .InvalidHTTPFilter )
98+ }
99+ if oauthCfg .Config .PreserveAuthorizationHeader && oauthCfg .Config .ForwardBearerToken {
100+ return errors .Newf ("%s: preserve_authorization_header=true and forward_bearer_token=true" , errors .InvalidParamsCombination )
101+ }
102+ return nil
103+ }
0 commit comments