Fix nil pointer to authenticator on restart + simplify
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/pr Build is passing Details

This commit is contained in:
Sarah Jamie Lewis 2021-04-08 11:53:44 -07:00
parent e72f8c9846
commit d31f77262b
3 changed files with 46 additions and 41 deletions

3
go.sum
View File

@ -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=

View File

@ -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,

View File

@ -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()
}