diff --git a/.gitignore b/.gitignore index c559f99..2764e01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -tor/ .idea/ +coverage.* +tor/tor/ diff --git a/acn.go b/acn.go index de17257..4cbc45a 100644 --- a/acn.go +++ b/acn.go @@ -4,6 +4,18 @@ import ( "net" ) +// Error captures various common ricochet errors +type Error string + +func (e Error) Error() string { return string(e) } + +const ( + // CannotResolveLocalTCPAddressError is thrown when a local ricochet connection has the wrong format. + CannotResolveLocalTCPAddressError = Error("CannotResolveLocalTCPAddressError") + // CannotDialLocalTCPAddressError is thrown when a connection to a local ricochet address fails. + CannotDialLocalTCPAddressError = Error("CannotDialLocalTCPAddressError") +) + // PrivateKey represents a private key using an unspecified algorithm. type PrivateKey interface{} diff --git a/localProvider.go b/localProvider.go index fc71662..c6cffe1 100644 --- a/localProvider.go +++ b/localProvider.go @@ -13,6 +13,11 @@ type localListenService struct { type localProvider struct { } +// NewLocalACN returns a for testing use only local clearnet implementation of a ACN interface +func NewLocalACN() ACN { + return &localProvider{} +} + func (ls *localListenService) AddressFull() string { return ls.l.Addr().String() } @@ -70,8 +75,3 @@ func (lp *localProvider) Restart() { func (lp *localProvider) Close() { } - -// LocalProvider returns a for testing use only local clearnet implementation of a ACN interface -func LocalProvider() ACN { - return &localProvider{} -} diff --git a/tests.sh b/tests.sh new file mode 100644 index 0000000..ce47d08 --- /dev/null +++ b/tests.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -e +pwd +GORACE="haltonerror=1" +go test -race ${1} -coverprofile=tor.cover.out -v ./tor +echo "mode: set" > coverage.out && cat *.cover.out | grep -v mode: | sort -r | \ +awk '{if($1 != last) {print $0;last=$1}}' >> coverage.out +rm -rf *.cover.out + diff --git a/sysProcAttr_rest.go b/tor/sysProcAttr_rest.go similarity index 80% rename from sysProcAttr_rest.go rename to tor/sysProcAttr_rest.go index e5aa6d6..2d9fca9 100644 --- a/sysProcAttr_rest.go +++ b/tor/sysProcAttr_rest.go @@ -1,6 +1,6 @@ // +build !windows -package connectivity +package tor import ( "syscall" diff --git a/sysProcAttr_win.go b/tor/sysProcAttr_win.go similarity index 82% rename from sysProcAttr_win.go rename to tor/sysProcAttr_win.go index 501ff9d..1de2be0 100644 --- a/sysProcAttr_win.go +++ b/tor/sysProcAttr_win.go @@ -1,6 +1,6 @@ // +build windows -package connectivity +package tor import ( "syscall" diff --git a/torProvider.go b/tor/torProvider.go similarity index 92% rename from torProvider.go rename to tor/torProvider.go index 1205a59..2541f9a 100644 --- a/torProvider.go +++ b/tor/torProvider.go @@ -1,8 +1,9 @@ -package connectivity +package tor import ( "context" "errors" + "git.openprivacy.ca/openprivacy/connectivity" "git.openprivacy.ca/openprivacy/log" "github.com/cretz/bine/control" "github.com/cretz/bine/process" @@ -22,25 +23,16 @@ import ( "time" ) -// Error captures various common ricochet errors -type Error string - -func (e Error) Error() string { return string(e) } - -const ( - // CannotResolveLocalTCPAddressError is thrown when a local ricochet connection has the wrong format. - CannotResolveLocalTCPAddressError = Error("CannotResolveLocalTCPAddressError") - // CannotDialLocalTCPAddressError is thrown when a connection to a local ricochet address fails. - CannotDialLocalTCPAddressError = Error("CannotDialLocalTCPAddressError") - // CannotDialRicochetAddressError is thrown when a connection to a ricochet address fails. - CannotDialRicochetAddressError = Error("CannotDialRicochetAddressError") -) - const ( minStatusIntervalMs = 200 maxStatusIntervalMs = 2000 ) +const ( + // CannotDialRicochetAddressError is thrown when a connection to a ricochet address fails. + CannotDialRicochetAddressError = connectivity.Error("CannotDialRicochetAddressError") +) + type onionListenService struct { os *tor.OnionService tp *torProvider @@ -112,7 +104,7 @@ func (tp *torProvider) WaitTillBootstrapped() { } } -func (tp *torProvider) Listen(identity PrivateKey, port int) (ListenService, error) { +func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) { var onion = "" var privkey ed25519.PrivateKey @@ -207,8 +199,8 @@ func (tp *torProvider) SetStatusCallback(callback func(int, string)) { tp.statusCallback = callback } -// StartTor creates/starts a Tor ACN and returns a usable ACN object -func StartTor(appDirectory string, bundledTorPath string) (ACN, error) { +// NewTorACN creates/starts a Tor ACN and returns a usable ACN object +func NewTorACN(appDirectory string, bundledTorPath string) (connectivity.ACN, error) { tp, err := startTor(appDirectory, bundledTorPath) if err == nil { tp.dialer, err = tp.t.Dialer(nil, &tor.DialConf{}) @@ -293,15 +285,19 @@ func (tp *torProvider) monitorRestart() { prog, status := tp.GetBootstrapStatus() if prog == -1 && tp.t != nil { + tp.lock.Lock() if tp.statusCallback != nil { tp.statusCallback(prog, status) } + tp.lock.Unlock() tp.restart() interval = minStatusIntervalMs } else if prog != lastBootstrapProgress { + tp.lock.Lock() if tp.statusCallback != nil { tp.statusCallback(prog, status) } + tp.lock.Unlock() interval = minStatusIntervalMs } else { if interval < maxStatusIntervalMs { diff --git a/torProvider_test.go b/tor/torProvider_test.go similarity index 89% rename from torProvider_test.go rename to tor/torProvider_test.go index e3fce67..cce27a7 100644 --- a/torProvider_test.go +++ b/tor/torProvider_test.go @@ -1,4 +1,4 @@ -package connectivity +package tor import ( "fmt" @@ -14,7 +14,7 @@ func getStatusCallback(progChan chan int) func(int, string) { func TestTorProvider(t *testing.T) { progChan := make(chan int) - acn, err := StartTor(".", "") + acn, err := NewTorACN(".", "") if err != nil { t.Error(err) return diff --git a/torUtils.go b/tor/torUtils.go similarity index 98% rename from torUtils.go rename to tor/torUtils.go index 514234d..c98f659 100644 --- a/torUtils.go +++ b/tor/torUtils.go @@ -1,10 +1,10 @@ -package connectivity +package tor import ( "encoding/base32" - "strings" "golang.org/x/crypto/ed25519" "golang.org/x/crypto/sha3" + "strings" ) // V3HostnameLength is the length of a Tor V3 Onion Address (without the .onion suffix)