You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							81 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							81 lines
						
					
					
						
							2.3 KiB
						
					
					
				| package ftpd | |
| 
 | |
| import ( | |
| 	"crypto/tls" | |
| 	"errors" | |
| 	"fmt" | |
| 	"net" | |
| 
 | |
| 	ftpserver "github.com/fclairamb/ftpserverlib" | |
| 	"google.golang.org/grpc" | |
| ) | |
| 
 | |
| type FtpServerOption struct { | |
| 	Filer            string | |
| 	IP               string | |
| 	IpBind           string | |
| 	Port             int | |
| 	FilerGrpcAddress string | |
| 	FtpRoot          string | |
| 	GrpcDialOption   grpc.DialOption | |
| 	PassivePortStart int | |
| 	PassivePortStop  int | |
| } | |
| 
 | |
| type SftpServer struct { | |
| 	option      *FtpServerOption | |
| 	ftpListener net.Listener | |
| } | |
| 
 | |
| var _ = ftpserver.MainDriver(&SftpServer{}) | |
| 
 | |
| // NewServer returns a new FTP server driver | |
| func NewFtpServer(ftpListener net.Listener, option *FtpServerOption) (*SftpServer, error) { | |
| 	var err error | |
| 	server := &SftpServer{ | |
| 		option:      option, | |
| 		ftpListener: ftpListener, | |
| 	} | |
| 	return server, err | |
| } | |
| 
 | |
| // GetSettings returns some general settings around the server setup | |
| func (s *SftpServer) GetSettings() (*ftpserver.Settings, error) { | |
| 	var portRange *ftpserver.PortRange | |
| 	if s.option.PassivePortStart > 0 && s.option.PassivePortStop > s.option.PassivePortStart { | |
| 		portRange = &ftpserver.PortRange{ | |
| 			Start: s.option.PassivePortStart, | |
| 			End:   s.option.PassivePortStop, | |
| 		} | |
| 	} | |
| 
 | |
| 	return &ftpserver.Settings{ | |
| 		Listener:                 s.ftpListener, | |
| 		ListenAddr:               fmt.Sprintf("%s:%d", s.option.IpBind, s.option.Port), | |
| 		PublicHost:               s.option.IP, | |
| 		PassiveTransferPortRange: portRange, | |
| 		ActiveTransferPortNon20:  true, | |
| 		IdleTimeout:              -1, | |
| 		ConnectionTimeout:        20, | |
| 	}, nil | |
| } | |
| 
 | |
| // ClientConnected is called to send the very first welcome message | |
| func (s *SftpServer) ClientConnected(cc ftpserver.ClientContext) (string, error) { | |
| 	return "Welcome to SeaweedFS FTP Server", nil | |
| } | |
| 
 | |
| // ClientDisconnected is called when the user disconnects, even if he never authenticated | |
| func (s *SftpServer) ClientDisconnected(cc ftpserver.ClientContext) { | |
| } | |
| 
 | |
| // AuthUser authenticates the user and selects an handling driver | |
| func (s *SftpServer) AuthUser(cc ftpserver.ClientContext, username, password string) (ftpserver.ClientDriver, error) { | |
| 	return nil, nil | |
| } | |
| 
 | |
| // GetTLSConfig returns a TLS Certificate to use | |
| // The certificate could frequently change if we use something like "let's encrypt" | |
| func (s *SftpServer) GetTLSConfig() (*tls.Config, error) { | |
| 	return nil, errors.New("no TLS certificate configured") | |
| }
 |