mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 08:11:32 +01:00 
			
		
		
		
	The upstream crypto package now supports sending banners at any time during authentication, so the Tailscale fork of crypto/ssh is no longer necessary. github.com/tailscale/golang-x-crypto is still needed for some custom ACME autocert functionality. tempfork/gliderlabs is still necessary because of a few other customizations, mostly related to TTY handling. Originally implemented in 46fd4e58a27495263336b86ee961ee28d8c332b7, which was reverted in b60f6b849af1fae1cf343be98f7fb1714c9ea165 to keep the change out of v1.80. Updates #8593 Signed-off-by: Percy Wegmann <percy@tailscale.com>
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package ssh
 | |
| 
 | |
| import (
 | |
| 	"os"
 | |
| 
 | |
| 	gossh "golang.org/x/crypto/ssh"
 | |
| )
 | |
| 
 | |
| // PasswordAuth returns a functional option that sets PasswordHandler on the server.
 | |
| func PasswordAuth(fn PasswordHandler) Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		srv.PasswordHandler = fn
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // PublicKeyAuth returns a functional option that sets PublicKeyHandler on the server.
 | |
| func PublicKeyAuth(fn PublicKeyHandler) Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		srv.PublicKeyHandler = fn
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // HostKeyFile returns a functional option that adds HostSigners to the server
 | |
| // from a PEM file at filepath.
 | |
| func HostKeyFile(filepath string) Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		pemBytes, err := os.ReadFile(filepath)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		signer, err := gossh.ParsePrivateKey(pemBytes)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		srv.AddHostKey(signer)
 | |
| 
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func KeyboardInteractiveAuth(fn KeyboardInteractiveHandler) Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		srv.KeyboardInteractiveHandler = fn
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // HostKeyPEM returns a functional option that adds HostSigners to the server
 | |
| // from a PEM file as bytes.
 | |
| func HostKeyPEM(bytes []byte) Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		signer, err := gossh.ParsePrivateKey(bytes)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		srv.AddHostKey(signer)
 | |
| 
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // NoPty returns a functional option that sets PtyCallback to return false,
 | |
| // denying PTY requests.
 | |
| func NoPty() Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		srv.PtyCallback = func(ctx Context, pty Pty) bool {
 | |
| 			return false
 | |
| 		}
 | |
| 		return nil
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // WrapConn returns a functional option that sets ConnCallback on the server.
 | |
| func WrapConn(fn ConnCallback) Option {
 | |
| 	return func(srv *Server) error {
 | |
| 		srv.ConnCallback = fn
 | |
| 		return nil
 | |
| 	}
 | |
| }
 |