HFish/core/protocol/ftp/ftp.go

107 lines
2.1 KiB
Go
Raw Normal View History

2019-08-11 20:14:28 +08:00
package ftp
import (
"io"
"fmt"
"time"
"os"
"strings"
"strconv"
"HFish/core/protocol/ftp/graval"
)
const (
fileOne = "This is the first file available for download.\n\nBy Jàmes"
fileTwo = "This is file number two.\n\n2012-12-04"
)
type MemDriver struct{}
func (driver *MemDriver) Authenticate(user string, pass string) bool {
//return user == "test" && pass == "1234"
return false
}
func (driver *MemDriver) Bytes(path string) (bytes int) {
switch path {
case "/one.txt":
bytes = len(fileOne)
break
case "/files/two.txt":
bytes = len(fileTwo)
break
default:
bytes = -1
}
return
}
func (driver *MemDriver) ModifiedTime(path string) (time.Time, error) {
return time.Now(), nil
}
func (driver *MemDriver) ChangeDir(path string) bool {
return path == "/" || path == "/files"
}
func (driver *MemDriver) DirContents(path string) (files []os.FileInfo) {
files = []os.FileInfo{}
switch path {
case "/":
files = append(files, graval.NewDirItem("files"))
files = append(files, graval.NewFileItem("one.txt", len(fileOne)))
case "/files":
files = append(files, graval.NewFileItem("two.txt", len(fileOne)))
}
return files
}
func (driver *MemDriver) DeleteDir(path string) bool {
return false
}
func (driver *MemDriver) DeleteFile(path string) bool {
return false
}
func (driver *MemDriver) Rename(fromPath string, toPath string) bool {
return false
}
func (driver *MemDriver) MakeDir(path string) bool {
return false
}
func (driver *MemDriver) GetFile(path string) (data string, err error) {
switch path {
case "/one.txt":
data = fileOne
case "/files/two.txt":
data = fileTwo
}
return
}
func (driver *MemDriver) PutFile(destPath string, data io.Reader) bool {
return false
}
type MemDriverFactory struct{}
func (factory *MemDriverFactory) NewDriver() (graval.FTPDriver, error) {
return &MemDriver{}, nil
}
func Start(addr string) {
arr := strings.Split(addr, ":")
port, _ := strconv.Atoi(arr[1])
factory := &MemDriverFactory{}
ftpServer := graval.NewFTPServer(&graval.FTPServerOpts{Factory: factory, Hostname: arr[0], Port: port})
err := ftpServer.ListenAndServe()
if err != nil {
fmt.Print(err)
}
}