diff --git a/src/croc/croc.go b/src/croc/croc.go index 95790caec..acd562d1e 100644 --- a/src/croc/croc.go +++ b/src/croc/croc.go @@ -33,6 +33,11 @@ import ( "github.com/schollz/croc/v9/src/utils" ) +var ( + ipRequest = []byte("ips?") + handshakeRequest = []byte("handshake") +) + func init() { log.SetLevel("debug") } @@ -334,7 +339,7 @@ func (c *Client) transferOverLocalRelay(options TransferOptions, errchan chan<- log.Debugf("local connection established: %+v", conn) for { data, _ := conn.Receive() - if bytes.Equal(data, []byte("handshake")) { + if bytes.Equal(data, handshakeRequest) { break } else if bytes.Equal(data, []byte{1}) { log.Debug("got ping") @@ -403,7 +408,7 @@ func (c *Client) Send(options TransferOptions) (err error) { // Default port to :9009 if port == "" { host = address - port = "9009" + port = models.DEFAULT_PORT } log.Debugf("got host '%v' and port '%v'", host, port) address = net.JoinHostPort(host, port) @@ -432,7 +437,7 @@ func (c *Client) Send(options TransferOptions) (err error) { if errConn != nil { log.Debugf("[%+v] had error: %s", conn, errConn.Error()) } - if bytes.Equal(data, []byte("ips?")) { + if bytes.Equal(data, ipRequest) { // recipient wants to try to connect to local ips var ips []string // only get local ips if the local is enabled @@ -449,7 +454,7 @@ func (c *Client) Send(options TransferOptions) (err error) { if err := conn.Send(bips); err != nil { log.Errorf("error sending: %v", err) } - } else if bytes.Equal(data, []byte("handshake")) { + } else if bytes.Equal(data, handshakeRequest) { break } else if bytes.Equal(data, []byte{1}) { log.Debug("got ping") @@ -569,7 +574,7 @@ func (c *Client) Receive() (err error) { log.Debug("switching to local") portToUse := string(bytes.TrimPrefix(discoveries[0].Payload, []byte("croc"))) if portToUse == "" { - portToUse = "9009" + portToUse = models.DEFAULT_PORT } address := net.JoinHostPort(discoveries[0].Address, portToUse) if tcp.PingServer(address) == nil { @@ -597,7 +602,7 @@ func (c *Client) Receive() (err error) { // Default port to :9009 if port == "" { host = address - port = "9009" + port = models.DEFAULT_PORT } log.Debugf("got host '%v' and port '%v'", host, port) address = net.JoinHostPort(host, port) @@ -622,7 +627,7 @@ func (c *Client) Receive() (err error) { // and try to connect to them log.Debug("sending ips?") var data []byte - if err := c.conn[0].Send([]byte("ips?")); err != nil { + if err := c.conn[0].Send(ipRequest); err != nil { log.Errorf("ips send error: %v", err) } data, err = c.conn[0].Receive() @@ -674,7 +679,7 @@ func (c *Client) Receive() (err error) { } } - if err := c.conn[0].Send([]byte("handshake")); err != nil { + if err := c.conn[0].Send(handshakeRequest); err != nil { log.Errorf("handshake send error: %v", err) } c.Options.RelayPorts = strings.Split(banner, ",") @@ -703,7 +708,7 @@ func (c *Client) transfer(options TransferOptions) (err error) { log.Debug("ready") if !c.Options.IsSender && !c.Step1ChannelSecured { err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "pake", + Type: message.TypePAKE, Bytes: c.Pake.Bytes(), Bytes2: []byte(c.Options.Curve), }) @@ -822,7 +827,7 @@ func (c *Client) processMessageFileInfo(m message.Message) (done bool, err error choice := strings.ToLower(utils.GetInput("")) if choice != "" && choice != "y" && choice != "yes" { err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "error", + Type: message.TypeError, Message: "refusing files", }) if err != nil { @@ -868,7 +873,7 @@ func (c *Client) processMessagePake(m message.Message) (err error) { } log.Debug("sender sending pake+salt") err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "pake", + Type: message.TypePAKE, Bytes: c.Pake.Bytes(), Bytes2: salt, }) @@ -928,7 +933,7 @@ func (c *Client) processMessagePake(m message.Message) (err error) { if !c.Options.IsSender { log.Debug("sending external IP") err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "externalip", + Type: message.TypeExternalIP, Message: c.ExternalIP, Bytes: m.Bytes, }) @@ -940,7 +945,7 @@ func (c *Client) processExternalIP(m message.Message) (done bool, err error) { log.Debugf("received external IP: %+v", m) if c.Options.IsSender { err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "externalip", + Type: message.TypeExternalIP, Message: c.ExternalIP, }) if err != nil { @@ -967,36 +972,36 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { // only "pake" messages should be unencrypted // if a non-"pake" message is received unencrypted something // is weird - if m.Type != "pake" && c.Key == nil { + if m.Type != message.TypePAKE && c.Key == nil { err = fmt.Errorf("unencrypted communication rejected") done = true return } switch m.Type { - case "finished": + case message.TypeFinished: err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "finished", + Type: message.TypeFinished, }) done = true c.SuccessfulTransfer = true return - case "pake": + case message.TypePAKE: err = c.processMessagePake(m) if err != nil { err = fmt.Errorf("pake not successful: %w", err) log.Debug(err) } - case "externalip": + case message.TypeExternalIP: done, err = c.processExternalIP(m) - case "error": + case message.TypeError: // c.spinner.Stop() fmt.Print("\r") err = fmt.Errorf("peer error: %s", m.Message) return true, err - case "fileinfo": + case message.TypeFileInfo: done, err = c.processMessageFileInfo(m) - case "recipientready": + case message.TypeRecipientReady: var remoteFile RemoteFileRequest err = json.Unmarshal(m.Bytes, &remoteFile) if err != nil { @@ -1019,23 +1024,23 @@ func (c *Client) processMessage(payload []byte) (done bool, err error) { choice := strings.ToLower(utils.GetInput("")) if choice != "" && choice != "y" && choice != "yes" { err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "error", + Type: message.TypeError, Message: "refusing files", }) done = true return } } - case "close-sender": + case message.TypeCloseSender: c.bar.Finish() log.Debug("close-sender received...") c.Step4FileTransfer = false c.Step3RecipientRequestFile = false log.Debug("sending close-recipient") err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "close-recipient", + Type: message.TypeCloseRecipient, }) - case "close-recipient": + case message.TypeCloseRecipient: c.Step4FileTransfer = false c.Step3RecipientRequestFile = false } @@ -1068,7 +1073,7 @@ func (c *Client) updateIfSenderChannelSecured() (err error) { return } err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "fileinfo", + Type: message.TypeFileInfo, Bytes: b, }) if err != nil { @@ -1140,7 +1145,7 @@ func (c *Client) recipientGetFileReady(finished bool) (err error) { // TODO: do the last finishing stuff log.Debug("finished") err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "finished", + Type: message.TypeFinished, }) if err != nil { panic(err) @@ -1172,7 +1177,7 @@ func (c *Client) recipientGetFileReady(finished bool) (err error) { log.Debugf("sending recipient ready with %d chunks", len(c.CurrentFileChunks)) err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "recipientready", + Type: message.TypeRecipientReady, Bytes: bRequest, }) if err != nil { @@ -1478,7 +1483,7 @@ func (c *Client) receiveData(i int) { } log.Debug("sending close-sender") err = message.Send(c.conn[0], c.Key, message.Message{ - Type: "close-sender", + Type: message.TypeCloseSender, }) if err != nil { panic(err) diff --git a/src/message/message.go b/src/message/message.go index c5e661215..1d94b80ae 100644 --- a/src/message/message.go +++ b/src/message/message.go @@ -9,9 +9,23 @@ import ( log "github.com/schollz/logger" ) +// Type is a message type +type Type string + +const ( + TypePAKE Type = "pake" + TypeExternalIP Type = "externalip" + TypeFinished Type = "finished" + TypeError Type = "error" + TypeCloseRecipient Type = "close-recipient" + TypeCloseSender Type = "close-sender" + TypeRecipientReady Type = "recipientready" + TypeFileInfo Type = "fileinfo" +) + // Message is the possible payload for messaging type Message struct { - Type string `json:"t,omitempty"` + Type Type `json:"t,omitempty"` Message string `json:"m,omitempty"` Bytes []byte `json:"b,omitempty"` Bytes2 []byte `json:"b2,omitempty"` diff --git a/src/message/message_test.go b/src/message/message_test.go index 66b80aab8..35b7ff5db 100644 --- a/src/message/message_test.go +++ b/src/message/message_test.go @@ -13,9 +13,11 @@ import ( "github.com/stretchr/testify/assert" ) +var TypeMessage Type = "message" + func TestMessage(t *testing.T) { log.SetLevel("debug") - m := Message{Type: "message", Message: "hello, world"} + m := Message{Type: TypeMessage, Message: "hello, world"} e, salt, err := crypt.New([]byte("pass"), nil) assert.Nil(t, err) fmt.Println(salt) @@ -35,7 +37,7 @@ func TestMessage(t *testing.T) { func TestMessageNoPass(t *testing.T) { log.SetLevel("debug") - m := Message{Type: "message", Message: "hello, world"} + m := Message{Type: TypeMessage, Message: "hello, world"} b, err := Encode(nil, m) assert.Nil(t, err) fmt.Printf("%x\n", b) @@ -85,7 +87,7 @@ func TestSend(t *testing.T) { time.Sleep(300 * time.Millisecond) a, err := comm.NewConnection("localhost:"+port, 10*time.Minute) assert.Nil(t, err) - m := Message{Type: "message", Message: "hello, world"} + m := Message{Type: TypeMessage, Message: "hello, world"} e, salt, err := crypt.New([]byte("pass"), nil) log.Debug(salt) assert.Nil(t, err) diff --git a/src/tcp/tcp.go b/src/tcp/tcp.go index 96b4145f3..c57baf31a 100644 --- a/src/tcp/tcp.go +++ b/src/tcp/tcp.go @@ -36,8 +36,10 @@ type roomMap struct { sync.Mutex } -var timeToRoomDeletion = 10 * time.Minute -var pingRoom = "pinglkasjdlfjsaldjf" +const ( + timeToRoomDeletion = 10 * time.Minute + pingRoom = "pinglkasjdlfjsaldjf" +) // Run starts a tcp listener, run async func Run(debugLevel, port, password string, banner ...string) (err error) {