Fix some bugs and add tests for cur directory #98

Merged
lunny merged 1 commits from lunny/test_cur_dir into master 2020-02-09 06:08:09 +00:00
6 changed files with 51 additions and 14 deletions

16
cmd.go
View File

@ -386,14 +386,13 @@ func (cmd commandEpsv) RequireAuth() bool {
}
func (cmd commandEpsv) Execute(conn *Conn, param string) {
addr := conn.passiveListenIP()
socket, err := newPassiveSocket(addr, conn.PassivePort, conn.logger, conn.sessionID, conn.tlsConfig)
socket, err := conn.newPassiveSocket()
if err != nil {
log.Println(err)
conn.writeMessage(425, "Data connection failed")
return
}
conn.dataConn = socket
msg := fmt.Sprintf("Entering Extended Passive Mode (|||%d|)", socket.Port())
conn.writeMessage(229, msg)
}
@ -657,14 +656,21 @@ func (cmd commandPasv) RequireAuth() bool {
func (cmd commandPasv) Execute(conn *Conn, param string) {
listenIP := conn.passiveListenIP()
socket, err := newPassiveSocket(listenIP, conn.PassivePort, conn.logger, conn.sessionID, conn.tlsConfig)
// TODO: IPv6 for this command is not implemented
if strings.HasPrefix(listenIP, "::") {
conn.writeMessage(550, fmt.Sprint("Action not taken "))
return
}
socket, err := conn.newPassiveSocket()
if err != nil {
conn.writeMessage(425, "Data connection failed")
return
}
conn.dataConn = socket
p1 := socket.Port() / 256
p2 := socket.Port() - (p1 * 256)
quads := strings.Split(listenIP, ".")
target := fmt.Sprintf("(%s,%s,%s,%s,%d,%d)", quads[0], quads[1], quads[2], quads[3], p1, p2)
msg := "Entering Passive Mode " + target

View File

@ -67,6 +67,10 @@ func (conn *Conn) passiveListenIP() string {
listenIP = conn.conn.LocalAddr().(*net.TCPAddr).IP.String()
}
if listenIP == "::1" {
return listenIP
}
lastIdx := strings.LastIndex(listenIP, ":")
if lastIdx <= 0 {
return listenIP

View File

@ -93,7 +93,7 @@ func (driver *FileDriver) DeleteDir(path string) error {
return err
}
if f.IsDir() {
return os.Remove(rPath)
return os.RemoveAll(rPath)
}
return errors.New("Not a directory")
}

View File

@ -36,7 +36,7 @@ func TestMinioDriver(t *testing.T) {
Name: "admin",
Password: "admin",
},
//Logger: new(DiscardLogger),
Logger: new(DiscardLogger),
}
runServer(t, opt, func() {
@ -130,8 +130,24 @@ func TestMinioDriver(t *testing.T) {
assert.NoError(t, err)
buf, err = ioutil.ReadAll(r)
r.Close()
assert.NoError(t, err)
assert.EqualValues(t, "st", string(buf))
curDir, err = f.CurrentDir()
assert.NoError(t, err)
assert.EqualValues(t, "/src", curDir)
assert.NoError(t, f.Stor("server_test.go", strings.NewReader(content)))
r, err = f.Retr("/src/server_test.go")
assert.NoError(t, err)
buf, err = ioutil.ReadAll(r)
r.Close()
assert.NoError(t, err)
assert.EqualValues(t, "test", string(buf))
break
}
})

View File

@ -43,7 +43,7 @@ func TestFileDriver(t *testing.T) {
Name: "admin",
Password: "admin",
},
Logger: new(DiscardLogger),
//Logger: new(DiscardLogger),
}
runServer(t, opt, func() {
@ -111,6 +111,16 @@ func TestFileDriver(t *testing.T) {
assert.NoError(t, err)
assert.EqualValues(t, "/src", curDir)
assert.NoError(t, f.Stor("server_test.go", strings.NewReader(content)))
r, err = f.Retr("/src/server_test.go")
assert.NoError(t, err)
buf, err = ioutil.ReadAll(r)
r.Close()
assert.NoError(t, err)
assert.EqualValues(t, "test", string(buf))
err = f.RemoveDir("/src")
assert.NoError(t, err)

View File

@ -134,24 +134,25 @@ func isErrorAddressAlreadyInUse(err error) bool {
return false
}
func newPassiveSocket(host string, port func() int, logger Logger, sessionID string, tlsConfig *tls.Config) (DataSocket, error) {
func (conn *Conn) newPassiveSocket() (DataSocket, error) {
socket := new(ftpPassiveSocket)
socket.ingress = make(chan []byte)
socket.egress = make(chan []byte)
socket.logger = logger
socket.host = host
socket.tlsConfig = tlsConfig
socket.logger = conn.logger
socket.host = conn.passiveListenIP()
socket.tlsConfig = conn.tlsConfig
const retries = 10
var err error
for i := 1; i <= retries; i++ {
socket.port = port()
err = socket.GoListenAndServe(sessionID)
socket.port = conn.PassivePort()
err = socket.GoListenAndServe(conn.sessionID)
if err != nil && socket.port != 0 && isErrorAddressAlreadyInUse(err) {
// choose a different port on error already in use
continue
}
break
}
conn.dataConn = socket
return socket, err
}