From 90f1277ee5fc8e37e8b8c641fdd9855cc98e0fcd Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Tue, 24 Apr 2018 20:54:50 -0700 Subject: [PATCH] automatically determine if local --- connect.go | 132 +++++++++++++++++++++-------------------------------- 1 file changed, 51 insertions(+), 81 deletions(-) diff --git a/connect.go b/connect.go index 7900bb43..2ab5c85e 100644 --- a/connect.go +++ b/connect.go @@ -74,13 +74,6 @@ func NewConnection(config *AppConfig) (*Connection, error) { c.rate = config.Rate c.Local = config.Local - if c.Local { - c.DontEncrypt = true - if c.Server == "cowyo.com" { - c.Server = "" - } - } - stat, _ := os.Stdin.Stat() if (stat.Mode() & os.ModeCharDevice) == 0 { config.File = "stdin" @@ -167,72 +160,7 @@ func (c *Connection) Run() error { }() defer c.cleanup() - if c.Local { - c.DontEncrypt = true - c.Yes = true - if c.Code == "" { - c.Code = strings.Split(GetRandomName(), "-")[0] - } - } - - if c.IsSender { - if c.Code == "" { - c.Code = GetRandomName() - } - log.Debug("settings payload to ", c.Code) - p, _ := peerdiscovery.New(peerdiscovery.Settings{ - Limit: 1, - TimeLimit: 600 * time.Second, - Delay: 50 * time.Millisecond, - Payload: []byte(c.Code), - }) - go func() { - discovered, _ := p.Discover() - if len(discovered) > 0 { - log.Debugf("discovered by '%+v'", discovered[0]) - c.runClient("localhost") - os.Exit(1) - } else { - log.Debug("discovered by no one") - } - }() - } else { - p, _ := peerdiscovery.New(peerdiscovery.Settings{ - Limit: 1, - TimeLimit: 1 * time.Second, - Delay: 50 * time.Millisecond, - Payload: []byte(c.Code), - }) - fmt.Print("Finding local croc relay...") - discovered, _ := p.Discover() - if len(discovered) > 0 { - c.Server = discovered[0].Address - fmt.Println(discovered[0].Address) - c.Code = string(discovered[0].Payload) - log.Debugf("discovered code '%s'", c.Code) - time.Sleep(200 * time.Millisecond) - } - } - - if c.IsSender { - log.Debug("starting relay in case local connections") - relay := NewRelay(&AppConfig{ - Debug: c.Debug, - }) - go relay.Run() - time.Sleep(200 * time.Millisecond) - } - - log.Debug("checking code validity") - if len(c.Code) == 0 { - if c.IsSender { - c.Code = GetRandomName() - } else { - c.Code = getInput("Enter receive code: ") - } - log.Debug("changed code to ", c.Code) - } - + // calculate number of threads c.NumberOfConnections = MAX_NUMBER_THREADS if c.IsSender { fsize, err := FileSize(path.Join(c.File.Path, c.File.Name)) @@ -245,7 +173,19 @@ func (c *Connection) Run() error { } } + runClientError := make(chan error) if c.IsSender { + if c.Code == "" { + c.Code = GetRandomName() + } + + log.Debug("starting relay in case local connections") + relay := NewRelay(&AppConfig{ + Debug: c.Debug, + }) + go relay.Run() + time.Sleep(200 * time.Millisecond) + if c.DontEncrypt { // don't encrypt CopyFile(path.Join(c.File.Path, c.File.Name), c.File.Name+".enc") @@ -293,16 +233,44 @@ func (c *Connection) Run() error { fmt.Fprintf(os.Stderr, "Sending %s file named '%s'\n", humanize.Bytes(uint64(c.File.Size)), c.File.Name) } - if c.Local { - fmt.Fprintf(os.Stderr, "Receive with: croc --local\n") - fmt.Fprintf(os.Stderr, "or croc --local --server %s --code %s\n", GetLocalIP(), c.Code) + fmt.Fprintf(os.Stderr, "Code is: %s\n", c.Code) + // broadcast local connection from sender + log.Debug("settings payload to ", c.Code) + go func() { + go peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + TimeLimit: 600 * time.Second, + Delay: 50 * time.Millisecond, + Payload: []byte(c.Code), + }) + runClientError <- c.runClient("localhost") + }() + } + + log.Debug("checking code validity") + if len(c.Code) == 0 && !c.IsSender { + log.Debug("Finding local croc relay...") + discovered, _ := peerdiscovery.Discover(peerdiscovery.Settings{ + Limit: 1, + TimeLimit: 1 * time.Second, + Delay: 50 * time.Millisecond, + Payload: []byte(c.Code), + }) + if len(discovered) > 0 { + c.Server = discovered[0].Address + log.Debug(discovered[0].Address) + c.Code = string(discovered[0].Payload) + log.Debugf("discovered code '%s'", c.Code) + time.Sleep(200 * time.Millisecond) } else { - fmt.Fprintf(os.Stderr, "Code is: %s\n", c.Code) + c.Code = getInput("Enter receive code: ") + log.Debug("changed code to ", c.Code) } } - return c.runClient(c.Server) + go func() { runClientError <- c.runClient(c.Server) }() + return <-runClientError } // runClient spawns threads for parallel uplink/downlink via TCP @@ -348,15 +316,15 @@ func (c *Connection) runClient(serverName string) error { message := receiveMessage(connection) log.Debugf("relay says: %s", message) if c.IsSender { - log.Debugf("telling relay: %s", "s."+c.Code) + log.Debugf("telling relay (%s): %s", c.Server, "s."+c.Code) metaData, err := json.Marshal(c.File) if err != nil { log.Error(err) } - encryptedMetaData, salt, iv := Encrypt(metaData, c.Code, c.DontEncrypt) + encryptedMetaData, salt, iv := Encrypt(metaData, c.Code) sendMessage("s."+c.HashedCode+"."+hex.EncodeToString(encryptedMetaData)+"-"+salt+"-"+iv, connection) } else { - log.Debugf("telling relay: %s", "r."+c.Code) + log.Debugf("telling relay (%s): %s", c.Server, "r."+c.Code) if c.Wait { // tell server to wait for sender sendMessage("r."+c.HashedCode+".0.0.0", connection) @@ -420,6 +388,8 @@ func (c *Connection) runClient(serverName string) error { responses.Unlock() time.Sleep(1 * time.Second) return + } else if strings.Split(sendersAddress, ":")[0] == "127.0.0.1" { + sendersAddress = strings.Replace(sendersAddress, "127.0.0.1", c.Server, 1) } // have the main thread ask for the okay if id == 0 {