diff --git a/go.sum b/go.sum index 49e4814..88697c9 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,6 @@ git.openprivacy.ca/openprivacy/bine v0.0.3 h1:PSHUmNqaW7BZUX8n2eTDeNbjsuRe+t5Ae0 git.openprivacy.ca/openprivacy/bine v0.0.3/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU= git.openprivacy.ca/openprivacy/bine v0.0.4 h1:CO7EkGyz+jegZ4ap8g5NWRuDHA/56KKvGySR6OBPW+c= git.openprivacy.ca/openprivacy/bine v0.0.4/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU= -git.openprivacy.ca/openprivacy/log v1.0.0 h1:Rvqm1weUdR4AOnJ79b1upHCc9vC/QF1rhSD2Um7sr1Y= -git.openprivacy.ca/openprivacy/log v1.0.0/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw= git.openprivacy.ca/openprivacy/log v1.0.1 h1:NWV5oBTatvlSzUE6wtB+UQCulgyMOtm4BXGd34evMys= git.openprivacy.ca/openprivacy/log v1.0.1/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= @@ -25,7 +23,6 @@ golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/tor/torProvider.go b/tor/torProvider.go index 21c07b5..6819a1f 100644 --- a/tor/torProvider.go +++ b/tor/torProvider.go @@ -31,11 +31,6 @@ const ( restartCooldown = time.Second * 30 ) -const ( - // CannotDialRicochetAddressError is thrown when a connection to a ricochet address fails. - CannotDialRicochetAddressError = connectivity.Error("CannotDialRicochetAddressError") -) - const ( networkUnknown = -3 torDown = -2 @@ -214,8 +209,39 @@ func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (conne } func (tp *torProvider) Restart() { + log.Debugf("launching restart...") + + tp.lock.Lock() + log.Debugf("checking last restart time") + if time.Now().Sub(tp.lastRestartTime) < restartCooldown { + return + } + tp.lock.Unlock() + + go tp.restart() +} + +func (tp *torProvider) restart() { + log.Debugf("Waiting for Tor to Close...") tp.callStatusCallback(0, "rebooting") - tp.restart() + tp.Close() + tp.lock.Lock() + defer tp.lock.Unlock() + + // preserve status callback after shutdown + statusCallback := tp.statusCallback + + tp.t = nil + log.Debugf("Restarting Tor Process") + newTp, err := startTor(tp.appDirectory, tp.bundeledTorPath, tp.controlPort, tp.authenticator) + if err == nil { + tp.t = newTp.t + tp.statusCallback = statusCallback + tp.lastRestartTime = time.Now() + go tp.monitorRestart() + } else { + log.Errorf("Error restarting Tor process: %v", err) + } } func (tp *torProvider) Open(hostname string) (net.Conn, string, error) { @@ -269,10 +295,7 @@ func (tp *torProvider) callStatusCallback(prog int, status string) { func NewTorACNWithAuth(appDirectory string, bundledTorPath string, controlPort int, authenticator tor.Authenticator) (connectivity.ACN, error) { tp, err := startTor(appDirectory, bundledTorPath, controlPort, authenticator) if err == nil { - tp.dialer, err = tp.t.Dialer(nil, &tor.DialConf{Authenticator: authenticator}) - if err == nil { - go tp.monitorRestart() - } + go tp.monitorRestart() } return tp, err } @@ -337,7 +360,8 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe log.Debugf("creating tor handler fom system tor") tp.t = createFromExisting(controlport, dataDir) } - return tp, nil + tp.dialer, err = tp.t.Dialer(nil, &tor.DialConf{Authenticator: tp.authenticator}) + return tp, err } // check if the torrc file is present where expected @@ -368,7 +392,8 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe err = tp.checkVersion() if err == nil { tp.t.DeleteDataDirOnClose = true - return tp, nil + tp.dialer, err = tp.t.Dialer(nil, &tor.DialConf{Authenticator: tp.authenticator}) + return tp, err } return nil, fmt.Errorf("could not connect to or start Tor that met requirments (min Tor version 0.3.5.x): %v", err) } @@ -403,6 +428,7 @@ func (tp *torProvider) monitorRestart() { if prog == torDown && tp.t != nil { log.Warnf("monitorRestart calling tp.restart() with prog:%v\n", prog) tp.restart() + return } if prog != lastBootstrapProgress { @@ -417,32 +443,6 @@ func (tp *torProvider) monitorRestart() { } } -func (tp *torProvider) restart() { - tp.lock.Lock() - defer tp.lock.Unlock() - if time.Now().Sub(tp.lastRestartTime) < restartCooldown { - return - } - tp.lastRestartTime = time.Now() - - for _, child := range tp.childListeners { - delete(tp.childListeners, child.AddressIdentity()) - child.os.Close() - } - - tp.t.Close() - tp.t = nil - - for { - newTp, err := startTor(tp.appDirectory, tp.bundeledTorPath, tp.controlPort, tp.authenticator) - if err == nil { - tp.t = newTp.t - tp.dialer, _ = tp.t.Dialer(nil, &tor.DialConf{}) - return - } - } -} - func createFromExisting(controlport *control.Conn, datadir string) *tor.Tor { t := &tor.Tor{ Process: nil, diff --git a/tor/torProvider_test.go b/tor/torProvider_test.go index e6022c3..d906c3d 100644 --- a/tor/torProvider_test.go +++ b/tor/torProvider_test.go @@ -32,5 +32,13 @@ func TestTorProvider(t *testing.T) { t.Logf("progress: %v", progress) } + acn.Restart() + + progress = 0 + for progress < 100 { + progress = <-progChan + t.Logf("progress: %v", progress) + } + acn.Close() }