package ftpserver import ( "crypto/tls" "fmt" ftpserver "github.com/fclairamb/ftpserverlib" "github.com/spf13/afero" ) type driver struct { User, Pass string ListenAddr string ClientDriver afero.Fs } // GetSettings returns some general settings around the server setup func (d *driver) GetSettings() (*ftpserver.Settings, error) { //log.Printf("Passed settings to ftpserverlib.") return &ftpserver.Settings{ ListenAddr: d.ListenAddr, DefaultTransferType: ftpserver.TransferTypeBinary, }, nil } // ClientConnected is called to send the very first welcome message func (d *driver) ClientConnected(cc ftpserver.ClientContext) (string, error) { //log.Printf("Client %q connected.", cc.RemoteAddr()) return "Welcome to the Scanyonero FTP server.", nil } // ClientDisconnected is called when the user disconnects, even if he never authenticated func (d *driver) ClientDisconnected(cc ftpserver.ClientContext) { //log.Printf("Client %q disconnected.", cc.RemoteAddr()) } // AuthUser authenticates the user and selects an handling driver func (d *driver) AuthUser(cc ftpserver.ClientContext, user, pass string) (ftpserver.ClientDriver, error) { if d.User != "" && d.Pass != "" { if user != d.User || pass != d.Pass { return nil, fmt.Errorf("wrong username or password") } } //log.Printf("Client %q authenticated with %q and %q.", cc.RemoteAddr(), user, pass) return d.ClientDriver, nil } // GetTLSConfig returns a TLS Certificate to use // The certificate could frequently change if we use something like "let's encrypt" func (d *driver) GetTLSConfig() (*tls.Config, error) { return nil, fmt.Errorf("tls not implemented") }