diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..9cfa3bc4
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,15 @@
+FROM golang:1.12-alpine as builder
+RUN apk add --no-cache git
+WORKDIR /go/croc
+COPY . .
+RUN go build -v
+
+FROM alpine:latest
+EXPOSE 9009
+EXPOSE 9010
+EXPOSE 9011
+EXPOSE 9012
+EXPOSE 9013
+COPY --from=builder /go/croc/croc /croc
+ENTRYPOINT ["/croc"]
+CMD ["relay"]
diff --git a/README.md b/README.md
index 02c87acf..967ed674 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
src="https://user-images.githubusercontent.com/6550035/46709024-9b23ad00-cbf6-11e8-9fb2-ca8b20b7dbec.jpg"
width="408px" border="0" alt="croc">
-
+
@@ -76,6 +76,7 @@ $ croc code-phrase
The code phrase is used to establish password-authenticated key agreement ([PAKE](https://en.wikipedia.org/wiki/Password-authenticated_key_agreement)) which generates a secret key for the sender and recipient to use for end-to-end encryption.
+There are a number of configurable options (see `--help`). A set of options (like custom relay, ports, and code phrase) can be set using `--remember`.
### Custom code phrase
@@ -85,7 +86,6 @@ You can send with your own code phrase (must be more than 4 characters).
$ croc send --code [code-phrase] [file(s)-or-folder]
```
-
### Use pipes - stdin and stdout
You can pipe to `croc`:
@@ -118,6 +118,12 @@ You can send files using your relay by entering `--relay` to change the relay th
$ croc --relay "myrelay.example.com:9009" send [filename]
```
+If it's easier you can also run a relay with Docker:
+
+
+```
+$ docker run -d -p 9009:9009 -p 9010:9010 -p 9011:9011 -p 9012:9012 -p 9013:9013 schollz/croc
+```
## License
diff --git a/go.mod b/go.mod
index f7af347e..b3fee5f1 100644
--- a/go.mod
+++ b/go.mod
@@ -5,22 +5,21 @@ go 1.12
require (
github.com/OneOfOne/xxhash v1.2.5 // indirect
github.com/cespare/xxhash v1.1.0
- github.com/denisbrodbeck/machineid v1.0.1
github.com/fatih/color v1.7.0 // indirect
github.com/kalafut/imohash v1.0.0
github.com/mattn/go-colorable v0.1.2 // indirect
github.com/pkg/errors v0.8.1
github.com/schollz/logger v1.0.1
github.com/schollz/mnemonicode v1.0.1
- github.com/schollz/pake v1.1.0
+ github.com/schollz/pake v1.1.1
github.com/schollz/peerdiscovery v1.4.0
github.com/schollz/progressbar/v2 v2.13.2
github.com/schollz/spinner v0.0.0-20180925172146-6bbc5f7804f9
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/stretchr/testify v1.3.0
github.com/urfave/cli v1.20.0
- golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56
- golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 // indirect
- golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f // indirect
+ golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
+ golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect
+ golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 // indirect
golang.org/x/text v0.3.2 // indirect
)
diff --git a/go.sum b/go.sum
index 9712ccc2..57097ae9 100644
--- a/go.sum
+++ b/go.sum
@@ -7,8 +7,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ=
-github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI=
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/kalafut/imohash v1.0.0 h1:LgCJ+p/BwM2HKpOxFopkeddpzVCfm15EtXMroXD1SYE=
@@ -28,8 +26,8 @@ github.com/schollz/logger v1.0.1 h1:BuBAU+euqphM0Ny9qFVScl4RSxatis4nCHIkOxO2cUU=
github.com/schollz/logger v1.0.1/go.mod h1:P6F4/dGMGcx8wh+kG1zrNEd4vnNpEBY/mwEMd/vn6AM=
github.com/schollz/mnemonicode v1.0.1 h1:LiH5hwADZwjwnfXsaD4xgnMyTAtaKHN+e5AyjRU6WSU=
github.com/schollz/mnemonicode v1.0.1/go.mod h1:cl4UAOhUV0mkdjMj/QYaUZbZZdF8BnOqoz8rHMzwboY=
-github.com/schollz/pake v1.1.0 h1:+tYqsPVkuirFpmeRePjYTUhIHHKLufdmd7QfuspaXCk=
-github.com/schollz/pake v1.1.0/go.mod h1:pL7Z08gnQ4OQ3G27s5e5T6TEzp6cFc5GzCwLm0f75Io=
+github.com/schollz/pake v1.1.1 h1:QKeojDWzdAdtRC4m89b6HAxw/8gjqrVu7r4SAOxOFg8=
+github.com/schollz/pake v1.1.1/go.mod h1:aWMxQ1jwqZRwk3StflHcdyzPR+CyW5W7+WIZD6Y3dEY=
github.com/schollz/peerdiscovery v1.4.0 h1:wJWiJUBSMY2io9eIG1+gauXm8WD6sJVN5M+pLd4fYZQ=
github.com/schollz/peerdiscovery v1.4.0/go.mod h1:DXj/7VvxAkUuSZNabx3q8t524uWbrhMPxeX151kvvHs=
github.com/schollz/progressbar/v2 v2.9.1/go.mod h1:l6tn6yU6ZdQoF8lwX/VoAUQ3FjhCbrcZDnl9xeWZzYw=
@@ -43,28 +41,26 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b
github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937 h1:lhssCpSe3TjKcbvUoPzFMuv9oUyZDgI3Cmgolfw2C90=
github.com/tscholl2/siec v0.0.0-20180721101609-21667da05937/go.mod h1:KL9+ubr1JZdaKjgAaHr+tCytEncXBa1pR6FjbTsOJnw=
github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0WsgG8UdvHXe6TWjY7eL6k=
-golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
+golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4=
-golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI=
+golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
diff --git a/src/cli/cli.go b/src/cli/cli.go
index 9932fc06..5ff771a8 100644
--- a/src/cli/cli.go
+++ b/src/cli/cli.go
@@ -1,20 +1,23 @@
package cli
import (
+ "encoding/json"
"errors"
"fmt"
"io"
"io/ioutil"
- "log"
"os"
+ "path"
"path/filepath"
"runtime"
"strings"
"time"
"github.com/schollz/croc/v6/src/croc"
+ "github.com/schollz/croc/v6/src/models"
"github.com/schollz/croc/v6/src/tcp"
"github.com/schollz/croc/v6/src/utils"
+ log "github.com/schollz/logger"
"github.com/urfave/cli"
)
@@ -27,7 +30,7 @@ func Run() (err error) {
app := cli.NewApp()
app.Name = "croc"
if Version == "" {
- Version = "v6.0.10-1d744f1"
+ Version = "v6.1.0-6f31418"
}
app.Version = Version
app.Compiled = time.Now()
@@ -63,10 +66,11 @@ func Run() (err error) {
},
}
app.Flags = []cli.Flag{
+ cli.BoolFlag{Name: "remember", Usage: "save these settings to reuse next time"},
cli.BoolFlag{Name: "debug", Usage: "increase verbosity (a lot)"},
cli.BoolFlag{Name: "yes", Usage: "automatically agree to all prompts"},
cli.BoolFlag{Name: "stdout", Usage: "redirect file to stdout"},
- cli.StringFlag{Name: "relay", Value: "198.199.67.130:9009", Usage: "address of the relay"},
+ cli.StringFlag{Name: "relay", Value: models.DEFAULT_RELAY, Usage: "address of the relay"},
cli.StringFlag{Name: "out", Value: ".", Usage: "specify an output folder to receive the file"},
}
app.EnableBashCompletion = true
@@ -90,11 +94,66 @@ func Run() (err error) {
return app.Run(os.Args)
}
-// func saveDefaultConfig(c *cli.Context) error {
-// return croc.SaveDefaultConfig()
-// }
+func getConfigDir() (homedir string, err error) {
+ homedir, err = os.UserHomeDir()
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ homedir = path.Join(homedir, ".config", "croc")
+ if _, err := os.Stat(homedir); os.IsNotExist(err) {
+ log.Debugf("creating home directory %s", homedir)
+ err = os.MkdirAll(homedir, 0700)
+ }
+ return
+}
func send(c *cli.Context) (err error) {
+ if c.GlobalBool("debug") {
+ log.SetLevel("debug")
+ log.Debug("debug mode on")
+ } else {
+ log.SetLevel("info")
+ }
+ configFile, err := getConfigDir()
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ configFile = path.Join(configFile, "send.json")
+
+ crocOptions := croc.Options{
+ SharedSecret: c.String("code"),
+ IsSender: true,
+ Debug: c.GlobalBool("debug"),
+ NoPrompt: c.GlobalBool("yes"),
+ RelayAddress: c.GlobalString("relay"),
+ Stdout: c.GlobalBool("stdout"),
+ DisableLocal: c.Bool("no-local"),
+ RelayPorts: strings.Split(c.String("ports"), ","),
+ }
+ b, errOpen := ioutil.ReadFile(configFile)
+ if errOpen == nil && !c.GlobalBool("remember") {
+ var rememberedOptions croc.Options
+ err = json.Unmarshal(b, &rememberedOptions)
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ // update anything that isn't explicitly set
+ if !c.GlobalIsSet("relay") {
+ crocOptions.RelayAddress = rememberedOptions.RelayAddress
+ }
+ if !c.IsSet("no-local") {
+ crocOptions.DisableLocal = rememberedOptions.DisableLocal
+ }
+ if !c.IsSet("ports") {
+ crocOptions.RelayPorts = rememberedOptions.RelayPorts
+ }
+ if !c.IsSet("code") {
+ crocOptions.SharedSecret = rememberedOptions.SharedSecret
+ }
+ }
var fnames []string
stat, _ := os.Stdin.Stat()
@@ -115,7 +174,7 @@ func send(c *cli.Context) (err error) {
defer func() {
err = os.Remove(fnames[0])
if err != nil {
- log.Println(err)
+ log.Error(err)
}
}()
} else {
@@ -125,14 +184,9 @@ func send(c *cli.Context) (err error) {
return errors.New("must specify file: croc send [filename]")
}
- var sharedSecret string
- if c.String("code") != "" {
- sharedSecret = c.String("code")
- }
- // cr.LoadConfig()
- if len(sharedSecret) == 0 {
+ if len(crocOptions.SharedSecret) == 0 {
// generate code phrase
- sharedSecret = utils.GetRandomName()
+ crocOptions.SharedSecret = utils.GetRandomName()
}
haveFolder := false
@@ -161,20 +215,33 @@ func send(c *cli.Context) (err error) {
paths = append(paths, filepath.ToSlash(fname))
}
}
- cr, err := croc.New(croc.Options{
- SharedSecret: sharedSecret,
- IsSender: true,
- Debug: c.GlobalBool("debug"),
- NoPrompt: c.GlobalBool("yes"),
- RelayAddress: c.GlobalString("relay"),
- Stdout: c.GlobalBool("stdout"),
- DisableLocal: c.Bool("no-local"),
- RelayPorts: strings.Split(c.String("ports"), ","),
- })
+
+ cr, err := croc.New(crocOptions)
if err != nil {
return
}
+ // save the config
+ if c.GlobalBool("remember") {
+ log.Debug("saving config file")
+ var bConfig []byte
+ // if the code wasn't set, don't save it
+ if c.String("code") == "" {
+ crocOptions.SharedSecret = ""
+ }
+ bConfig, err = json.MarshalIndent(crocOptions, "", " ")
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ err = ioutil.WriteFile(configFile, bConfig, 0644)
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ log.Debugf("wrote %s", configFile)
+ }
+
err = cr.Send(croc.TransferOptions{
PathToFiles: paths,
KeepPathInRemote: haveFolder,
@@ -184,31 +251,80 @@ func send(c *cli.Context) (err error) {
}
func receive(c *cli.Context) (err error) {
- var sharedSecret string
- if c.GlobalString("code") != "" {
- sharedSecret = c.GlobalString("code")
- }
- if c.Args().First() != "" {
- sharedSecret = c.Args().First()
- }
- if sharedSecret == "" {
- sharedSecret = utils.GetInput("Enter receive code: ")
- }
- if c.GlobalString("out") != "" {
- os.Chdir(c.GlobalString("out"))
- }
-
- cr, err := croc.New(croc.Options{
- SharedSecret: sharedSecret,
+ crocOptions := croc.Options{
+ SharedSecret: c.String("code"),
IsSender: false,
Debug: c.GlobalBool("debug"),
NoPrompt: c.GlobalBool("yes"),
RelayAddress: c.GlobalString("relay"),
Stdout: c.GlobalBool("stdout"),
- })
+ }
+ if c.Args().First() != "" {
+ crocOptions.SharedSecret = c.Args().First()
+ }
+
+ // load options here
+ if c.GlobalBool("debug") {
+ log.SetLevel("debug")
+ log.Debug("debug mode on")
+ } else {
+ log.SetLevel("info")
+ }
+ configFile, err := getConfigDir()
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ configFile = path.Join(configFile, "receive.json")
+ b, errOpen := ioutil.ReadFile(configFile)
+ if errOpen == nil && !c.GlobalBool("remember") {
+ var rememberedOptions croc.Options
+ err = json.Unmarshal(b, &rememberedOptions)
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ // update anything that isn't explicitly set
+ if !c.GlobalIsSet("relay") {
+ crocOptions.RelayAddress = rememberedOptions.RelayAddress
+ }
+ if !c.GlobalIsSet("yes") {
+ crocOptions.NoPrompt = rememberedOptions.NoPrompt
+ }
+ if crocOptions.SharedSecret == "" {
+ crocOptions.SharedSecret = rememberedOptions.SharedSecret
+ }
+ }
+
+ if crocOptions.SharedSecret == "" {
+ crocOptions.SharedSecret = utils.GetInput("Enter receive code: ")
+ }
+ if c.GlobalString("out") != "" {
+ os.Chdir(c.GlobalString("out"))
+ }
+
+ cr, err := croc.New(crocOptions)
if err != nil {
return
}
+
+ // save the config
+ if c.GlobalBool("remember") {
+ log.Debug("saving config file")
+ var bConfig []byte
+ bConfig, err = json.MarshalIndent(crocOptions, "", " ")
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ err = ioutil.WriteFile(configFile, bConfig, 0644)
+ if err != nil {
+ log.Error(err)
+ return
+ }
+ log.Debugf("wrote %s", configFile)
+ }
+
err = cr.Receive()
return
}
@@ -233,14 +349,3 @@ func relay(c *cli.Context) (err error) {
}
return tcp.Run(debugString, ports[0], tcpPorts)
}
-
-// func dirSize(path string) (int64, error) {
-// var size int64
-// err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
-// if !info.IsDir() {
-// size += info.Size()
-// }
-// return err
-// })
-// return size, err
-// }
diff --git a/src/croc/croc.go b/src/croc/croc.go
index d2be0bb6..1ea6b192 100644
--- a/src/croc/croc.go
+++ b/src/croc/croc.go
@@ -17,7 +17,6 @@ import (
"sync"
"time"
- "github.com/denisbrodbeck/machineid"
"github.com/pkg/errors"
"github.com/schollz/croc/v6/src/comm"
"github.com/schollz/croc/v6/src/compress"
@@ -88,7 +87,6 @@ type Client struct {
bar *progressbar.ProgressBar
spinner *spinner.Spinner
- machineID string
firstSend bool
mutex *sync.Mutex
@@ -117,7 +115,6 @@ type RemoteFileRequest struct {
}
type SenderInfo struct {
- MachineID string
FilesToTransfer []FileInfo
}
@@ -216,17 +213,13 @@ func (c *Client) Send(options TransferOptions) (err error) {
if len(c.FilesToTransfer) == 1 {
fname = fmt.Sprintf("'%s'", c.FilesToTransfer[0].Name)
}
- machID, macIDerr := machineid.ID()
- if macIDerr != nil {
- log.Error(macIDerr)
- return
- }
- if len(machID) > 6 {
- machID = machID[:6]
- }
- c.machineID = machID
+
fmt.Fprintf(os.Stderr, "Sending %s (%s)\n", fname, utils.ByteCountDecimal(totalFilesSize))
- fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s\n", c.Options.SharedSecret, c.Options.SharedSecret)
+ otherRelay := ""
+ if c.Options.RelayAddress != models.DEFAULT_RELAY {
+ otherRelay = "--relay " + c.Options.RelayAddress + " "
+ }
+ fmt.Fprintf(os.Stderr, "Code is: %s\nOn the other computer run\n\ncroc %s%s\n", c.Options.SharedSecret, otherRelay, c.Options.SharedSecret)
// // c.spinner.Suffix = " waiting for recipient..."
// c.spinner.Start()
// create channel for quitting
@@ -234,6 +227,8 @@ func (c *Client) Send(options TransferOptions) (err error) {
errchan := make(chan error, 1)
if !c.Options.DisableLocal {
+ // add two things to the error channel
+ errchan = make(chan error, 2)
// setup the relay locally
for _, port := range c.Options.RelayPorts {
@@ -298,6 +293,7 @@ func (c *Client) Send(options TransferOptions) (err error) {
if err != nil {
err = errors.Wrap(err, fmt.Sprintf("could not connect to %s", c.Options.RelayAddress))
log.Debug(err)
+ errchan <- err
return
}
log.Debugf("connection established: %+v", conn)
@@ -331,7 +327,15 @@ func (c *Client) Send(options TransferOptions) (err error) {
errchan <- c.transfer(options)
}()
- return <-errchan
+ err = <-errchan
+ if err == nil {
+ // return if no error
+ return
+ }
+ if !c.Options.DisableLocal {
+ err = <-errchan
+ }
+ return err
}
// Receive will receive a file
@@ -641,7 +645,6 @@ func (c *Client) updateState() (err error) {
if c.Options.IsSender && c.Step1ChannelSecured && !c.Step2FileInfoTransfered {
var b []byte
b, err = json.Marshal(SenderInfo{
- MachineID: c.machineID,
FilesToTransfer: c.FilesToTransfer,
})
if err != nil {
diff --git a/src/install/default.txt b/src/install/default.txt
index 8376570d..792fd4c8 100644
--- a/src/install/default.txt
+++ b/src/install/default.txt
@@ -33,7 +33,7 @@ install_croc()
croc_os="unsupported"
croc_arch="unknown"
croc_arm=""
- croc_version="6.0.10"
+ croc_version="6.1.0"
# Termux on Android has $PREFIX set which already ends with /usr
diff --git a/src/models/constants.go b/src/models/constants.go
index f1b11e6e..acb20a7b 100644
--- a/src/models/constants.go
+++ b/src/models/constants.go
@@ -1,3 +1,4 @@
package models
const TCP_BUFFER_SIZE = 1024 * 64
+const DEFAULT_RELAY = "142.93.177.120:9009"