@@ -170,7 +170,7 @@ func RunControlPlane(cfg ControlPlaneConfig) {
170170 // It is intentionally started after pre-warm to avoid concurrent worker
171171 // creation races between pre-warm and first external Flight requests.
172172 if cfg .FlightPort > 0 {
173- flightIngress , err := NewFlightIngress (cfg .Host , cfg .FlightPort , tlsCfg , cfg .Users , sessions , FlightIngressConfig {
173+ flightIngress , err := NewFlightIngress (cfg .Host , cfg .FlightPort , tlsCfg , cfg .Users , sessions , cp . rateLimiter , FlightIngressConfig {
174174 SessionIdleTTL : cfg .FlightSessionIdleTTL ,
175175 SessionReapTick : cfg .FlightSessionReapInterval ,
176176 HandleIdleTTL : cfg .FlightHandleIdleTTL ,
@@ -343,19 +343,13 @@ func (cp *ControlPlane) acceptLoop() {
343343func (cp * ControlPlane ) handleConnection (conn net.Conn ) {
344344 remoteAddr := conn .RemoteAddr ()
345345
346- // Rate limiting
347- if msg := cp . rateLimiter . CheckConnection ( remoteAddr ); msg != "" {
346+ releaseRateLimit , msg := server . BeginRateLimitedAuthAttempt ( cp . rateLimiter , remoteAddr )
347+ if msg != "" {
348348 slog .Warn ("Connection rejected." , "remote_addr" , remoteAddr , "reason" , msg )
349349 _ = conn .Close ()
350350 return
351351 }
352-
353- if ! cp .rateLimiter .RegisterConnection (remoteAddr ) {
354- slog .Warn ("Connection rejected: rate limit." , "remote_addr" , remoteAddr )
355- _ = conn .Close ()
356- return
357- }
358- defer cp .rateLimiter .UnregisterConnection (remoteAddr )
352+ defer releaseRateLimit ()
359353
360354 // Read startup message to determine SSL vs cancel
361355 params , err := readStartupFromRaw (conn )
@@ -376,6 +370,7 @@ func (cp *ControlPlane) handleConnection(conn net.Conn) {
376370 // Require SSL
377371 if ! params .sslRequest {
378372 slog .Warn ("Connection rejected: SSL required." , "remote_addr" , remoteAddr )
373+ server .RecordFailedAuthAttempt (cp .rateLimiter , remoteAddr )
379374 _ = conn .Close ()
380375 return
381376 }
@@ -423,20 +418,12 @@ func (cp *ControlPlane) handleConnection(conn net.Conn) {
423418 database := startupParams ["database" ]
424419
425420 if username == "" {
421+ server .RecordFailedAuthAttempt (cp .rateLimiter , remoteAddr )
426422 _ = server .WriteErrorResponse (writer , "FATAL" , "28000" , "no user specified" )
427423 _ = writer .Flush ()
428424 return
429425 }
430426
431- // Look up expected password for this user
432- expectedPassword , ok := cp .cfg .Users [username ]
433- if ! ok {
434- slog .Warn ("Unknown user." , "user" , username , "remote_addr" , remoteAddr )
435- _ = server .WriteErrorResponse (writer , "FATAL" , "28P01" , "password authentication failed" )
436- _ = writer .Flush ()
437- return
438- }
439-
440427 // Request password
441428 if err := server .WriteAuthCleartextPassword (writer ); err != nil {
442429 slog .Error ("Failed to request password." , "remote_addr" , remoteAddr , "error" , err )
@@ -455,15 +442,19 @@ func (cp *ControlPlane) handleConnection(conn net.Conn) {
455442 }
456443
457444 if msgType != 'p' {
445+ server .RecordFailedAuthAttempt (cp .rateLimiter , remoteAddr )
458446 _ = server .WriteErrorResponse (writer , "FATAL" , "28000" , "expected password message" )
459447 _ = writer .Flush ()
460448 return
461449 }
462450
463451 password := string (bytes .TrimRight (body , "\x00 " ))
464- if password != expectedPassword {
452+ if ! server . ValidateUserPassword ( cp . cfg . Users , username , password ) {
465453 slog .Warn ("Authentication failed." , "user" , username , "remote_addr" , remoteAddr )
466- cp .rateLimiter .RecordFailedAuth (remoteAddr )
454+ banned := server .RecordFailedAuthAttempt (cp .rateLimiter , remoteAddr )
455+ if banned {
456+ slog .Warn ("IP banned after too many failed auth attempts." , "remote_addr" , remoteAddr )
457+ }
467458 _ = server .WriteErrorResponse (writer , "FATAL" , "28P01" , "password authentication failed" )
468459 _ = writer .Flush ()
469460 return
@@ -475,7 +466,7 @@ func (cp *ControlPlane) handleConnection(conn net.Conn) {
475466 return
476467 }
477468
478- cp .rateLimiter . RecordSuccessfulAuth ( remoteAddr )
469+ server . RecordSuccessfulAuthAttempt ( cp .rateLimiter , remoteAddr )
479470 slog .Info ("User authenticated." , "user" , username , "remote_addr" , remoteAddr )
480471
481472 // Create session on a worker
@@ -740,7 +731,7 @@ func (cp *ControlPlane) recoverFlightIngressAfterFailedReload() {
740731 return
741732 }
742733
743- flightIngress , err := NewFlightIngress (cp .cfg .Host , cp .cfg .FlightPort , cp .tlsConfig , cp .cfg .Users , cp .sessions , FlightIngressConfig {
734+ flightIngress , err := NewFlightIngress (cp .cfg .Host , cp .cfg .FlightPort , cp .tlsConfig , cp .cfg .Users , cp .sessions , cp . rateLimiter , FlightIngressConfig {
744735 SessionIdleTTL : cp .cfg .FlightSessionIdleTTL ,
745736 SessionReapTick : cp .cfg .FlightSessionReapInterval ,
746737 HandleIdleTTL : cp .cfg .FlightHandleIdleTTL ,
0 commit comments