aboutsummaryrefslogtreecommitdiff
path: root/weed/ftpd/ftp_server.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/ftpd/ftp_server.go')
-rw-r--r--weed/ftpd/ftp_server.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/weed/ftpd/ftp_server.go b/weed/ftpd/ftp_server.go
new file mode 100644
index 000000000..4a0dca2c3
--- /dev/null
+++ b/weed/ftpd/ftp_server.go
@@ -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")
+}