Skip to content

Commit 3322378

Browse files
committed
Refactoring
1 parent a0449bb commit 3322378

File tree

7 files changed

+35
-161
lines changed

7 files changed

+35
-161
lines changed

client/client/client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@ func run() error {
5252
fmt.Printf("- %s (%d)\n", entry.Name, entry.Size)
5353
}
5454

55-
return nil
55+
return conn.Quit()
5656
}

server/logger.go logger/logger.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Use of this source code is governed by a MIT-style
33
// license that can be found in the LICENSE file.
44

5-
package server
5+
package logger
66

77
import (
88
"fmt"

server/cmd.go

+7-73
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
package server
66

77
import (
8-
"encoding/binary"
98
"fmt"
109
"log"
1110
"strconv"
1211
"strings"
12+
13+
socket2 "github.com/elwin/transmit2/socket"
1314
)
1415

1516
type Command interface {
@@ -277,22 +278,7 @@ func (cmd commandEprt) RequireAuth() bool {
277278
}
278279

279280
func (cmd commandEprt) Execute(conn *Conn, param string) {
280-
delim := string(param[0:1])
281-
parts := strings.Split(param, delim)
282-
addressFamily, err := strconv.Atoi(parts[1])
283-
host := parts[2]
284-
port, err := strconv.Atoi(parts[3])
285-
if addressFamily != 1 && addressFamily != 2 {
286-
conn.writeMessage(522, "Network protocol not supported, use (1,2)")
287-
return
288-
}
289-
socket, err := newActiveSocket(host, port, conn.logger, conn.sessionID)
290-
if err != nil {
291-
conn.writeMessage(425, "Data connection failed")
292-
return
293-
}
294-
conn.dataConn = socket
295-
conn.writeMessage(200, "Connection established ("+strconv.Itoa(port)+")")
281+
conn.writeMessage(502, "Active mode not supported, use passive mode instead")
296282
}
297283

298284
// commandLprt responds to the LPRT FTP command. It allows the client to
@@ -313,49 +299,8 @@ func (cmd commandLprt) RequireAuth() bool {
313299
}
314300

315301
func (cmd commandLprt) Execute(conn *Conn, param string) {
316-
// No tests for this code yet
317-
318-
parts := strings.Split(param, ",")
319-
320-
addressFamily, err := strconv.Atoi(parts[0])
321-
if addressFamily != 4 {
322-
conn.writeMessage(522, "Network protocol not supported, use 4")
323-
return
324-
}
325-
326-
addressLength, err := strconv.Atoi(parts[1])
327-
if addressLength != 4 {
328-
conn.writeMessage(522, "Network IP length not supported, use 4")
329-
return
330-
}
331-
332-
host := strings.Join(parts[2:2+addressLength], ".")
333-
334-
portLength, err := strconv.Atoi(parts[2+addressLength])
335-
portAddress := parts[3+addressLength : 3+addressLength+portLength]
302+
conn.writeMessage(502, "Active mode not supported, use passive mode instead")
336303

337-
// Convert string[] to byte[]
338-
portBytes := make([]byte, portLength)
339-
for i := range portAddress {
340-
p, _ := strconv.Atoi(portAddress[i])
341-
portBytes[i] = byte(p)
342-
}
343-
344-
// convert the bytes to an int
345-
port := int(binary.BigEndian.Uint16(portBytes))
346-
347-
// if the existing connection is on the same host/port don't reconnect
348-
if conn.dataConn.Host() == host && conn.dataConn.Port() == port {
349-
return
350-
}
351-
352-
socket, err := newActiveSocket(host, port, conn.logger, conn.sessionID)
353-
if err != nil {
354-
conn.writeMessage(425, "Data connection failed")
355-
return
356-
}
357-
conn.dataConn = socket
358-
conn.writeMessage(200, "Connection established ("+strconv.Itoa(port)+")")
359304
}
360305

361306
// commandEpsv responds to the EPSV FTP command. It allows the client to
@@ -377,7 +322,7 @@ func (cmd commandEpsv) RequireAuth() bool {
377322

378323
func (cmd commandEpsv) Execute(conn *Conn, param string) {
379324
addr := conn.passiveListenIP()
380-
socket, err := newPassiveSocket(addr, conn.PassivePort, conn.logger, conn.sessionID)
325+
socket, err := socket2.NewPassiveSocket(addr, conn.PassivePort, conn.logger, conn.sessionID)
381326
if err != nil {
382327
log.Println(err)
383328
conn.writeMessage(425, "Data connection failed")
@@ -646,7 +591,7 @@ func (cmd commandPasv) RequireAuth() bool {
646591

647592
func (cmd commandPasv) Execute(conn *Conn, param string) {
648593
listenIP := conn.passiveListenIP()
649-
socket, err := newPassiveSocket(listenIP, conn.PassivePort, conn.logger, conn.sessionID)
594+
socket, err := socket2.NewPassiveSocket(listenIP, conn.PassivePort, conn.logger, conn.sessionID)
650595
if err != nil {
651596
conn.writeMessage(425, "Data connection failed")
652597
return
@@ -679,18 +624,7 @@ func (cmd commandPort) RequireAuth() bool {
679624
}
680625

681626
func (cmd commandPort) Execute(conn *Conn, param string) {
682-
nums := strings.Split(param, ",")
683-
portOne, _ := strconv.Atoi(nums[4])
684-
portTwo, _ := strconv.Atoi(nums[5])
685-
port := (portOne * 256) + portTwo
686-
host := nums[0] + "." + nums[1] + "." + nums[2] + "." + nums[3]
687-
socket, err := newActiveSocket(host, port, conn.logger, conn.sessionID)
688-
if err != nil {
689-
conn.writeMessage(425, "Data connection failed")
690-
return
691-
}
692-
conn.dataConn = socket
693-
conn.writeMessage(200, "Connection established ("+strconv.Itoa(port)+")")
627+
conn.writeMessage(502, "Active mode not supported, use passive mode instead")
694628
}
695629

696630
// commandPwd responds to the PWD FTP command.

server/conn.go

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import (
1717
"path/filepath"
1818
"strconv"
1919
"strings"
20+
21+
"github.com/elwin/transmit2/logger"
22+
"github.com/elwin/transmit2/socket"
2023
)
2124

2225
const (
@@ -27,10 +30,10 @@ type Conn struct {
2730
conn net.Conn
2831
controlReader *bufio.Reader
2932
controlWriter *bufio.Writer
30-
dataConn DataSocket
33+
dataConn socket.DataSocket
3134
driver Driver
3235
auth Auth
33-
logger Logger
36+
logger logger.Logger
3437
server *Server
3538
sessionID string
3639
namePrefix string

server/scionftp/scionftp.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
filedriver "github.com/elwin/file-driver"
1414

15-
"goftp.io/server"
15+
"github.com/elwin/transmit2/server"
1616
)
1717

1818
func main() {

server/server.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
"fmt"
1212
"net"
1313
"strconv"
14+
15+
"github.com/elwin/transmit2/logger"
1416
)
1517

1618
// Version returns the library version
@@ -46,7 +48,7 @@ type ServerOpts struct {
4648
WelcomeMessage string
4749

4850
// A logger implementation, if nil the StdLogger is used
49-
Logger Logger
51+
Logger logger.Logger
5052
}
5153

5254
// Server is the root of your FTP application. You should instantiate one
@@ -55,12 +57,12 @@ type ServerOpts struct {
5557
// Always use the NewServer() method to create a new Server.
5658
type Server struct {
5759
*ServerOpts
58-
listenTo string
59-
logger Logger
60-
listener net.Listener
61-
ctx context.Context
62-
cancel context.CancelFunc
63-
feats string
60+
listenTo string
61+
logger logger.Logger
62+
listener net.Listener
63+
ctx context.Context
64+
cancel context.CancelFunc
65+
feats string
6466
}
6567

6668
// ErrServerClosed is returned by ListenAndServe() or Serve() when a shutdown
@@ -101,7 +103,7 @@ func serverOptsWithDefaults(opts *ServerOpts) *ServerOpts {
101103
newOpts.Auth = opts.Auth
102104
}
103105

104-
newOpts.Logger = &StdLogger{}
106+
newOpts.Logger = &logger.StdLogger{}
105107
if opts.Logger != nil {
106108
newOpts.Logger = opts.Logger
107109
}

server/socket.go socket/socket.go

+10-75
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
// Copyright 2018 The goftp Authors. All rights reserved.
2-
// Use of this source code is governed by a MIT-style
3-
// license that can be found in the LICENSE file.
4-
5-
package server
1+
package socket
62

73
import (
84
"io"
@@ -14,6 +10,8 @@ import (
1410
"sync"
1511
"syscall"
1612
"time"
13+
14+
"github.com/elwin/transmit2/logger"
1715
)
1816

1917
// DataSocket describes a data socket is used to send non-control data between the client and
@@ -36,74 +34,13 @@ type DataSocket interface {
3634
Close() error
3735
}
3836

39-
type ftpActiveSocket struct {
40-
conn *net.TCPConn
41-
host string
42-
port int
43-
logger Logger
44-
}
45-
46-
func newActiveSocket(remote string, port int, logger Logger, sessionID string) (DataSocket, error) {
47-
connectTo := net.JoinHostPort(remote, strconv.Itoa(port))
48-
49-
logger.Print(sessionID, "Opening active data connection to "+connectTo)
50-
51-
raddr, err := net.ResolveTCPAddr("tcp", connectTo)
52-
53-
if err != nil {
54-
logger.Print(sessionID, err)
55-
return nil, err
56-
}
57-
58-
tcpConn, err := net.DialTCP("tcp", nil, raddr)
59-
60-
if err != nil {
61-
logger.Print(sessionID, err)
62-
return nil, err
63-
}
64-
65-
socket := new(ftpActiveSocket)
66-
socket.conn = tcpConn
67-
socket.host = remote
68-
socket.port = port
69-
socket.logger = logger
70-
71-
return socket, nil
72-
}
73-
74-
func (socket *ftpActiveSocket) Host() string {
75-
return socket.host
76-
}
77-
78-
func (socket *ftpActiveSocket) Port() int {
79-
return socket.port
80-
}
81-
82-
func (socket *ftpActiveSocket) Read(p []byte) (n int, err error) {
83-
return socket.conn.Read(p)
84-
}
85-
86-
func (socket *ftpActiveSocket) ReadFrom(r io.Reader) (int64, error) {
87-
return socket.conn.ReadFrom(r)
88-
}
89-
90-
func (socket *ftpActiveSocket) Write(p []byte) (n int, err error) {
91-
return socket.conn.Write(p)
92-
}
93-
94-
func (socket *ftpActiveSocket) Close() error {
95-
return socket.conn.Close()
96-
}
97-
9837
type ftpPassiveSocket struct {
99-
conn net.Conn
100-
port int
101-
host string
102-
ingress chan []byte
103-
egress chan []byte
104-
logger Logger
105-
lock sync.Mutex // protects conn and err
106-
err error
38+
conn net.Conn
39+
port int
40+
host string
41+
logger logger.Logger
42+
lock sync.Mutex // protects conn and err
43+
err error
10744
}
10845

10946
// Detect if an error is "bind: address already in use"
@@ -132,10 +69,8 @@ func isErrorAddressAlreadyInUse(err error) bool {
13269
return false
13370
}
13471

135-
func newPassiveSocket(host string, port func() int, logger Logger, sessionID string) (DataSocket, error) {
72+
func NewPassiveSocket(host string, port func() int, logger logger.Logger, sessionID string) (DataSocket, error) {
13673
socket := new(ftpPassiveSocket)
137-
socket.ingress = make(chan []byte)
138-
socket.egress = make(chan []byte)
13974
socket.logger = logger
14075
socket.host = host
14176
const retries = 10

0 commit comments

Comments
 (0)