]> git.r.bdr.sh - rbdr/mobius/blobdiff - hotline/server.go
Fix race in file upload handling that may cause panic
[rbdr/mobius] / hotline / server.go
index c5a29ba9ea19173b3499be0ab3e1ade4d7e49f95..3a58893fdcc1858e5338bcc7f2273955448c187e 100644 (file)
@@ -8,7 +8,6 @@ import (
        "go.uber.org/zap"
        "io"
        "io/ioutil"
        "go.uber.org/zap"
        "io"
        "io/ioutil"
-       "log"
        "math/big"
        "math/rand"
        "net"
        "math/big"
        "math/rand"
        "net"
@@ -21,7 +20,6 @@ import (
        "sync"
        "time"
 
        "sync"
        "time"
 
-       "golang.org/x/crypto/bcrypt"
        "gopkg.in/yaml.v2"
 )
 
        "gopkg.in/yaml.v2"
 )
 
@@ -50,8 +48,8 @@ type Server struct {
        APIListener  net.Listener
        FileListener net.Listener
 
        APIListener  net.Listener
        FileListener net.Listener
 
-       newsReader io.Reader
-       newsWriter io.WriteCloser
+       // newsReader io.Reader
+       // newsWriter io.WriteCloser
 
        outbox chan Transaction
 
 
        outbox chan Transaction
 
@@ -327,7 +325,7 @@ func (s *Server) NewClientConn(conn net.Conn) *ClientConn {
                Connection: conn,
                Server:     s,
                Version:    &[]byte{},
                Connection: conn,
                Server:     s,
                Version:    &[]byte{},
-               AutoReply:  &[]byte{},
+               AutoReply:  []byte{},
                Transfers:  make(map[int][]*FileTransfer),
                Agreed:     false,
        }
                Transfers:  make(map[int][]*FileTransfer),
                Agreed:     false,
        }
@@ -376,7 +374,7 @@ func (s *Server) connectedUsers() []Field {
 
        var connectedUsers []Field
        for _, c := range sortedClients(s.Clients) {
 
        var connectedUsers []Field
        for _, c := range sortedClients(s.Clients) {
-               if c.Agreed == false {
+               if !c.Agreed {
                        continue
                }
                user := User{
                        continue
                }
                user := User{
@@ -577,21 +575,6 @@ func (s *Server) handleNewConnection(conn net.Conn) error {
        }
 }
 
        }
 }
 
-func hashAndSalt(pwd []byte) string {
-       // Use GenerateFromPassword to hash & salt pwd.
-       // MinCost is just an integer constant provided by the bcrypt
-       // package along with DefaultCost & MaxCost.
-       // The cost can be any value you want provided it isn't lower
-       // than the MinCost (4)
-       hash, err := bcrypt.GenerateFromPassword(pwd, bcrypt.MinCost)
-       if err != nil {
-               log.Println(err)
-       }
-       // GenerateFromPassword returns a byte slice so we need to
-       // convert the bytes to a string and return it
-       return string(hash)
-}
-
 // NewTransactionRef generates a random ID for the file transfer.  The Hotline client includes this ID
 // in the file transfer request payload, and the file transfer server will use it to map the request
 // to a transfer
 // NewTransactionRef generates a random ID for the file transfer.  The Hotline client includes this ID
 // in the file transfer request payload, and the file transfer server will use it to map the request
 // to a transfer
@@ -626,13 +609,14 @@ const dlFldrActionNextFile = 3
 func (s *Server) TransferFile(conn net.Conn) error {
        defer func() { _ = conn.Close() }()
 
 func (s *Server) TransferFile(conn net.Conn) error {
        defer func() { _ = conn.Close() }()
 
-       buf := make([]byte, 1024)
-       if _, err := conn.Read(buf); err != nil {
+       txBuf := make([]byte, 16)
+       _, err := conn.Read(txBuf)
+       if err != nil {
                return err
        }
 
        var t transfer
                return err
        }
 
        var t transfer
-       _, err := t.Write(buf[:16])
+       _, err = t.Write(txBuf)
        if err != nil {
                return err
        }
        if err != nil {
                return err
        }
@@ -684,11 +668,16 @@ func (s *Server) TransferFile(conn net.Conn) error {
                        }
                }
        case FileUpload:
                        }
                }
        case FileUpload:
-               if _, err := conn.Read(buf); err != nil {
+               const buffSize = 1460
+
+               uploadBuf := make([]byte, buffSize)
+
+               _, err := conn.Read(uploadBuf)
+               if err != nil {
                        return err
                }
 
                        return err
                }
 
-               ffo := ReadFlattenedFileObject(buf)
+               ffo := ReadFlattenedFileObject(uploadBuf)
                payloadLen := len(ffo.BinaryMarshal())
                fileSize := int(binary.BigEndian.Uint32(ffo.FlatFileDataForkHeader.DataSize))
 
                payloadLen := len(ffo.BinaryMarshal())
                fileSize := int(binary.BigEndian.Uint32(ffo.FlatFileDataForkHeader.DataSize))
 
@@ -708,9 +697,7 @@ func (s *Server) TransferFile(conn net.Conn) error {
 
                defer func() { _ = newFile.Close() }()
 
 
                defer func() { _ = newFile.Close() }()
 
-               const buffSize = 1024
-
-               if _, err := newFile.Write(buf[payloadLen:]); err != nil {
+               if _, err := newFile.Write(uploadBuf[payloadLen:]); err != nil {
                        return err
                }
                receivedBytes := buffSize - payloadLen
                        return err
                }
                receivedBytes := buffSize - payloadLen
@@ -796,7 +783,7 @@ func (s *Server) TransferFile(conn net.Conn) error {
                        }
 
                        // Read the client's Next Action request
                        }
 
                        // Read the client's Next Action request
-                       //TODO: Remove hardcoded behavior and switch behaviors based on the next action send
+                       // TODO: Remove hardcoded behavior and switch behaviors based on the next action send
                        if _, err := conn.Read(readBuffer); err != nil {
                                return err
                        }
                        if _, err := conn.Read(readBuffer); err != nil {
                                return err
                        }
@@ -848,7 +835,7 @@ func (s *Server) TransferFile(conn net.Conn) error {
                                bytesRead, err := file.Read(sendBuffer)
                                if err == io.EOF {
                                        // Read the client's Next Action request
                                bytesRead, err := file.Read(sendBuffer)
                                if err == io.EOF {
                                        // Read the client's Next Action request
-                                       //TODO: Remove hardcoded behavior and switch behaviors based on the next action send
+                                       // TODO: Remove hardcoded behavior and switch behaviors based on the next action send
                                        if _, err := conn.Read(readBuffer); err != nil {
                                                s.Logger.Errorf("error reading next action: %v", err)
                                                return err
                                        if _, err := conn.Read(readBuffer); err != nil {
                                                s.Logger.Errorf("error reading next action: %v", err)
                                                return err