Fix nil pointer to authenticator on restart + simplify
This commit is contained in:
parent
e72f8c9846
commit
d31f77262b
3
go.sum
3
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.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 h1:CO7EkGyz+jegZ4ap8g5NWRuDHA/56KKvGySR6OBPW+c=
|
||||||
git.openprivacy.ca/openprivacy/bine v0.0.4/go.mod h1:13ZqhKyqakDsN/ZkQkIGNULsmLyqtXc46XBcnuXm/mU=
|
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 h1:NWV5oBTatvlSzUE6wtB+UQCulgyMOtm4BXGd34evMys=
|
||||||
git.openprivacy.ca/openprivacy/log v1.0.1/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw=
|
git.openprivacy.ca/openprivacy/log v1.0.1/go.mod h1:gGYK8xHtndRLDymFtmjkG26GaMQNgyhioNS82m812Iw=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
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 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
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-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-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 h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
|
|
@ -31,11 +31,6 @@ const (
|
||||||
restartCooldown = time.Second * 30
|
restartCooldown = time.Second * 30
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
|
||||||
// CannotDialRicochetAddressError is thrown when a connection to a ricochet address fails.
|
|
||||||
CannotDialRicochetAddressError = connectivity.Error("CannotDialRicochetAddressError")
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
const (
|
||||||
networkUnknown = -3
|
networkUnknown = -3
|
||||||
torDown = -2
|
torDown = -2
|
||||||
|
@ -214,8 +209,39 @@ func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (conne
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tp *torProvider) Restart() {
|
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.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) {
|
func (tp *torProvider) Open(hostname string) (net.Conn, string, error) {
|
||||||
|
@ -268,12 +294,9 @@ func (tp *torProvider) callStatusCallback(prog int, status string) {
|
||||||
// NewTorACNWithAuth creates/starts a Tor ACN and returns a usable ACN object
|
// NewTorACNWithAuth creates/starts a Tor ACN and returns a usable ACN object
|
||||||
func NewTorACNWithAuth(appDirectory string, bundledTorPath string, controlPort int, authenticator tor.Authenticator) (connectivity.ACN, error) {
|
func NewTorACNWithAuth(appDirectory string, bundledTorPath string, controlPort int, authenticator tor.Authenticator) (connectivity.ACN, error) {
|
||||||
tp, err := startTor(appDirectory, bundledTorPath, controlPort, authenticator)
|
tp, err := startTor(appDirectory, bundledTorPath, controlPort, authenticator)
|
||||||
if err == nil {
|
|
||||||
tp.dialer, err = tp.t.Dialer(nil, &tor.DialConf{Authenticator: authenticator})
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
go tp.monitorRestart()
|
go tp.monitorRestart()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return tp, err
|
return tp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -337,7 +360,8 @@ func startTor(appDirectory string, bundledTorPath string, controlPort int, authe
|
||||||
log.Debugf("creating tor handler fom system tor")
|
log.Debugf("creating tor handler fom system tor")
|
||||||
tp.t = createFromExisting(controlport, dataDir)
|
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
|
// 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()
|
err = tp.checkVersion()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
tp.t.DeleteDataDirOnClose = true
|
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)
|
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 {
|
if prog == torDown && tp.t != nil {
|
||||||
log.Warnf("monitorRestart calling tp.restart() with prog:%v\n", prog)
|
log.Warnf("monitorRestart calling tp.restart() with prog:%v\n", prog)
|
||||||
tp.restart()
|
tp.restart()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if prog != lastBootstrapProgress {
|
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 {
|
func createFromExisting(controlport *control.Conn, datadir string) *tor.Tor {
|
||||||
t := &tor.Tor{
|
t := &tor.Tor{
|
||||||
Process: nil,
|
Process: nil,
|
||||||
|
|
|
@ -32,5 +32,13 @@ func TestTorProvider(t *testing.T) {
|
||||||
t.Logf("progress: %v", progress)
|
t.Logf("progress: %v", progress)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
acn.Restart()
|
||||||
|
|
||||||
|
progress = 0
|
||||||
|
for progress < 100 {
|
||||||
|
progress = <-progChan
|
||||||
|
t.Logf("progress: %v", progress)
|
||||||
|
}
|
||||||
|
|
||||||
acn.Close()
|
acn.Close()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue