Fix some bugs and add tests for cur directory #98
16
cmd.go
16
cmd.go
|
@ -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
|
||||
|
|
4
conn.go
4
conn.go
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
})
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
13
socket.go
13
socket.go
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user