scaffold for sftpd
This commit is contained in:
81
weed/ftpd/ftp_server.go
Normal file
81
weed/ftpd/ftp_server.go
Normal file
@@ -0,0 +1,81 @@
|
||||
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")
|
||||
}
|
||||
Reference in New Issue
Block a user