@@ -2,6 +2,7 @@ package sshserver
2
2
3
3
import (
4
4
"context"
5
+ "encoding/json"
5
6
"errors"
6
7
"fmt"
7
8
"io"
@@ -408,21 +409,16 @@ func (s *serverImpl) createGSSAPIConfig(
408
409
}
409
410
handlerNetworkConnection .authenticatedMetadata = authenticated
410
411
s .logAuthSuccessful (logger , authenticated , "GSSAPI" )
411
- sshConnectionHandler , _ , err := handlerNetworkConnection .OnHandshakeSuccess (
412
- authenticated ,
413
- )
412
+
413
+ marshaledMetadata , err := json .Marshal (authenticated )
414
414
if err != nil {
415
- err = messageCodes .WrapUser (
416
- err ,
417
- messageCodes .ESSHBackendRejected ,
418
- "Authentication currently unavailable, please try again later." ,
419
- "The backend has rejected the user after successful authentication." ,
420
- )
421
- logger .Error (err )
422
415
return nil , err
423
416
}
424
- handlerNetworkConnection .sshConnectionHandler = sshConnectionHandler
425
- return & ssh.Permissions {}, nil
417
+ return & ssh.Permissions {
418
+ Extensions : map [string ]string {
419
+ "containerssh-metadata" : string (marshaledMetadata ),
420
+ },
421
+ }, err
426
422
},
427
423
Server : gssServer ,
428
424
}
@@ -444,27 +440,19 @@ func (s *serverImpl) createKeyboardInteractiveCallback(
444
440
conn ssh.ConnMetadata ,
445
441
challenge ssh.KeyboardInteractiveChallenge ,
446
442
) (* ssh.Permissions , error ) {
447
- permissions , authenticatedMetadata , err := keyboardInteractiveHandler (conn , challenge )
443
+ _ , authenticatedMetadata , err := keyboardInteractiveHandler (conn , challenge )
448
444
if err != nil {
449
- return permissions , err
445
+ return nil , err
450
446
}
451
- // HACK: check HACKS.md "OnHandshakeSuccess conformanceTestHandler"
452
- sshConnectionHandler , _ , err := handlerNetworkConnection .OnHandshakeSuccess (
453
- authenticatedMetadata ,
454
- )
447
+ marshaledMetadata , err := json .Marshal (authenticatedMetadata )
455
448
if err != nil {
456
- err = messageCodes .WrapUser (
457
- err ,
458
- messageCodes .ESSHBackendRejected ,
459
- "Authentication currently unavailable, please try again later." ,
460
- "The backend has rejected the user after successful authentication." ,
461
- )
462
- logger .Error (err )
463
- return permissions , err
449
+ return nil , err
464
450
}
465
- handlerNetworkConnection .authenticatedMetadata = authenticatedMetadata
466
- handlerNetworkConnection .sshConnectionHandler = sshConnectionHandler
467
- return permissions , err
451
+ return & ssh.Permissions {
452
+ Extensions : map [string ]string {
453
+ "containerssh-metadata" : string (marshaledMetadata ),
454
+ },
455
+ }, err
468
456
}
469
457
return keyboardInteractiveCallback
470
458
}
@@ -476,27 +464,19 @@ func (s *serverImpl) createPubKeyCallback(
476
464
) func (conn ssh.ConnMetadata , key ssh.PublicKey ) (* ssh.Permissions , error ) {
477
465
pubKeyHandler := s .createPubKeyAuthenticator (meta , handlerNetworkConnection , logger )
478
466
pubkeyCallback := func (conn ssh.ConnMetadata , key ssh.PublicKey ) (* ssh.Permissions , error ) {
479
- permissions , authenticatedMetadata , err := pubKeyHandler (conn , key )
467
+ _ , authenticatedMetadata , err := pubKeyHandler (conn , key )
480
468
if err != nil {
481
- return permissions , err
469
+ return nil , err
482
470
}
483
- // HACK: check HACKS.md "OnHandshakeSuccess conformanceTestHandler"
484
- sshConnectionHandler , _ , err := handlerNetworkConnection .OnHandshakeSuccess (
485
- authenticatedMetadata ,
486
- )
471
+ marshaledMetadata , err := json .Marshal (authenticatedMetadata )
487
472
if err != nil {
488
- err = messageCodes .WrapUser (
489
- err ,
490
- messageCodes .ESSHBackendRejected ,
491
- "Authentication currently unavailable, please try again later." ,
492
- "The backend has rejected the user after successful authentication." ,
493
- )
494
- logger .Error (err )
495
- return permissions , err
473
+ return nil , err
496
474
}
497
- handlerNetworkConnection .authenticatedMetadata = authenticatedMetadata
498
- handlerNetworkConnection .sshConnectionHandler = sshConnectionHandler
499
- return permissions , err
475
+ return & ssh.Permissions {
476
+ Extensions : map [string ]string {
477
+ "containerssh-metadata" : string (marshaledMetadata ),
478
+ },
479
+ }, err
500
480
}
501
481
return pubkeyCallback
502
482
}
@@ -508,27 +488,19 @@ func (s *serverImpl) createPasswordCallback(
508
488
) func (conn ssh.ConnMetadata , password []byte ) (* ssh.Permissions , error ) {
509
489
passwordHandler := s .createPasswordAuthenticator (meta , handlerNetworkConnection , logger )
510
490
passwordCallback := func (conn ssh.ConnMetadata , password []byte ) (* ssh.Permissions , error ) {
511
- permissions , authenticatedMetadata , err := passwordHandler (conn , password )
491
+ _ , authenticatedMetadata , err := passwordHandler (conn , password )
512
492
if err != nil {
513
- return permissions , err
493
+ return nil , err
514
494
}
515
- // HACK: check HACKS.md "OnHandshakeSuccess conformanceTestHandler"
516
- sshConnectionHandler , _ , err := handlerNetworkConnection .OnHandshakeSuccess (
517
- authenticatedMetadata ,
518
- )
495
+ marshaledMetadata , err := json .Marshal (authenticatedMetadata )
519
496
if err != nil {
520
- err = messageCodes .WrapUser (
521
- err ,
522
- messageCodes .ESSHBackendRejected ,
523
- "Authentication currently unavailable, please try again later." ,
524
- "The backend has rejected the user after successful authentication." ,
525
- )
526
- logger .Error (err )
527
- return permissions , err
497
+ return nil , err
528
498
}
529
- handlerNetworkConnection .authenticatedMetadata = authenticatedMetadata
530
- handlerNetworkConnection .sshConnectionHandler = sshConnectionHandler
531
- return permissions , err
499
+ return & ssh.Permissions {
500
+ Extensions : map [string ]string {
501
+ "containerssh-metadata" : string (marshaledMetadata ),
502
+ },
503
+ }, err
532
504
}
533
505
return passwordCallback
534
506
}
@@ -572,17 +544,47 @@ func (s *serverImpl) handleConnection(conn net.Conn) {
572
544
conn ,
573
545
s .createConfiguration (connectionMeta , & wrapper , logger ),
574
546
)
575
- if err != nil {
547
+ abortCleanup := func () {
576
548
logger .Info (messageCodes .Wrap (err , messageCodes .ESSHHandshakeFailed , "SSH handshake failed" ))
577
549
handlerNetworkConnection .OnHandshakeFailed (connectionMeta , err )
578
550
s .shutdownHandlers .Unregister (shutdownHandlerID )
579
551
logger .Debug (messageCodes .NewMessage (messageCodes .MSSHDisconnected , "Client disconnected" ))
580
552
handlerNetworkConnection .OnDisconnect ()
581
553
_ = conn .Close ()
582
554
s .wg .Done ()
555
+ }
556
+ if err != nil {
557
+ abortCleanup ()
558
+ return
559
+ }
560
+ var authenticatedMetadata metadata.ConnectionAuthenticatedMetadata
561
+ marshaledMetadata , ok := sshConn .Permissions .Extensions ["containerssh-metadata" ]
562
+ if ! ok {
563
+ abortCleanup ()
583
564
return
584
565
}
585
- authenticatedMetadata := wrapper .authenticatedMetadata
566
+ err = json .Unmarshal ([]byte (marshaledMetadata ), & authenticatedMetadata )
567
+ if err != nil {
568
+ abortCleanup ()
569
+ return
570
+ }
571
+ sshConnectionHandler , _ , err := handlerNetworkConnection .OnHandshakeSuccess (
572
+ authenticatedMetadata ,
573
+ )
574
+ if err != nil {
575
+ err = messageCodes .WrapUser (
576
+ err ,
577
+ messageCodes .ESSHBackendRejected ,
578
+ "Authentication currently unavailable, please try again later." ,
579
+ "The backend has rejected the user after successful authentication." ,
580
+ )
581
+ logger .Error (err )
582
+ abortCleanup ()
583
+ return
584
+ }
585
+ wrapper .authenticatedMetadata = authenticatedMetadata
586
+ wrapper .sshConnectionHandler = sshConnectionHandler
587
+
586
588
logger = logger .WithLabel ("username" , sshConn .User ())
587
589
logger .Debug (messageCodes .NewMessage (messageCodes .MSSHHandshakeSuccessful , "SSH handshake successful" ))
588
590
s .lock .Lock ()
0 commit comments