@@ -12,11 +12,7 @@ import (
1212 "k8s.io/apimachinery/pkg/runtime/serializer"
1313 utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1414 "k8s.io/apimachinery/pkg/util/wait"
15- genericapifilters "k8s.io/apiserver/pkg/endpoints/filters"
16- "k8s.io/apiserver/pkg/features"
1715 genericapiserver "k8s.io/apiserver/pkg/server"
18- genericfilters "k8s.io/apiserver/pkg/server/filters"
19- utilfeature "k8s.io/apiserver/pkg/util/feature"
2016 kclientset "k8s.io/client-go/kubernetes"
2117 corev1 "k8s.io/client-go/kubernetes/typed/core/v1"
2218 "k8s.io/client-go/rest"
@@ -47,7 +43,7 @@ func init() {
4743
4844// TODO we need to switch the oauth server to an external type, but that can be done after we get our externally facing flag values fixed
4945// TODO remaining bits involve the session file, LDAP util code, validation, ...
50- func NewOAuthServerConfig (oauthConfig osinv1.OAuthConfig , userClientConfig * rest.Config ) (* OAuthServerConfig , error ) {
46+ func NewOAuthServerConfig (oauthConfig osinv1.OAuthConfig , userClientConfig * rest.Config , genericConfig * genericapiserver. RecommendedConfig ) (* OAuthServerConfig , error ) {
5147 // TODO: there is probably some better way to do this
5248 decoder := codecs .UniversalDecoder (osinv1 .GroupVersion )
5349 for i , idp := range oauthConfig .IdentityProviders {
@@ -62,7 +58,11 @@ func NewOAuthServerConfig(oauthConfig osinv1.OAuthConfig, userClientConfig *rest
6258 oauthConfig .IdentityProviders [i ].Provider .Object = idpObject
6359 }
6460
65- genericConfig := genericapiserver .NewRecommendedConfig (codecs )
61+ // this leaves the embedded OAuth server code path alone
62+ if genericConfig == nil {
63+ genericConfig = genericapiserver .NewRecommendedConfig (codecs )
64+ }
65+
6666 genericConfig .LoopbackClientConfig = userClientConfig
6767
6868 userClient , err := userclient .NewForConfig (userClientConfig )
@@ -277,21 +277,26 @@ func (c completedOAuthConfig) New(delegationTarget genericapiserver.DelegationTa
277277}
278278
279279func (c * OAuthServerConfig ) buildHandlerChainForOAuth (startingHandler http.Handler , genericConfig * genericapiserver.Config ) http.Handler {
280+ // add OAuth handlers on top of the generic API server handlers
280281 handler , err := c .WithOAuth (startingHandler )
281282 if err != nil {
282- // the existing errors all cause the server to die anyway
283+ // the existing errors all cause the OAuth server to die anyway
283284 panic (err )
284285 }
285- if utilfeature .DefaultFeatureGate .Enabled (features .AdvancedAuditing ) {
286- handler = genericapifilters .WithAudit (handler , genericConfig .AuditBackend , genericConfig .AuditPolicyChecker , genericConfig .LongRunningFunc )
287- }
288286
289- handler = genericfilters .WithMaxInFlightLimit (handler , genericConfig .MaxRequestsInFlight , genericConfig .MaxMutatingRequestsInFlight , genericConfig .LongRunningFunc )
290- handler = genericfilters .WithCORS (handler , genericConfig .CorsAllowedOriginList , nil , nil , nil , "true" )
291- handler = genericfilters .WithTimeoutForNonLongRunningRequests (handler , genericConfig .LongRunningFunc , genericConfig .RequestTimeout )
292- handler = genericapifilters .WithRequestInfo (handler , genericapiserver .NewRequestInfoResolver (genericConfig ))
287+ // add back the Authorization header so that WithOAuth can use it even after WithAuthentication deletes it
288+ // WithOAuth sees users' passwords and can mint tokens so this is not really an issue
289+ handler = headers .WithRestoreAuthorizationHeader (handler )
290+
291+ // this is the normal kube handler chain
292+ handler = genericapiserver .DefaultBuildHandlerChain (handler , genericConfig )
293+
294+ // store a copy of the Authorization header for later use
295+ handler = headers .WithPreserveAuthorizationHeader (handler )
296+
297+ // protected endpoints should not be cached
293298 handler = headers .WithStandardHeaders (handler )
294- handler = genericfilters . WithPanicRecovery ( handler )
299+
295300 return handler
296301}
297302
0 commit comments