Clean up ACN Closing Logic
This commit is contained in:
parent
384d59e9ef
commit
35247bd044
3
acn.go
3
acn.go
|
@ -21,9 +21,6 @@ type PrivateKey interface{}
|
||||||
|
|
||||||
// ListenService is an address that was opened with Listen() and can Accept() new connections
|
// ListenService is an address that was opened with Listen() and can Accept() new connections
|
||||||
type ListenService interface {
|
type ListenService interface {
|
||||||
// AddressIdentity is the core "identity" part of an address, ex: rsjeuxzlexy4fvo75vrdtj37nrvlmvbw57n5mhypcjpzv3xkka3l4yyd
|
|
||||||
AddressIdentity() string
|
|
||||||
|
|
||||||
// AddressFull is the full network address, ex: rsjeuxzlexy4fvo75vrdtj37nrvlmvbw57n5mhypcjpzv3xkka3l4yyd.onion:9878
|
// AddressFull is the full network address, ex: rsjeuxzlexy4fvo75vrdtj37nrvlmvbw57n5mhypcjpzv3xkka3l4yyd.onion:9878
|
||||||
AddressFull() string
|
AddressFull() string
|
||||||
|
|
||||||
|
|
|
@ -81,21 +81,13 @@ func (ols *onionListenService) AddressFull() string {
|
||||||
return ols.os.Addr().String()
|
return ols.os.Addr().String()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ols *onionListenService) AddressIdentity() string {
|
|
||||||
ols.lock.Lock()
|
|
||||||
defer ols.lock.Unlock()
|
|
||||||
return ols.os.Addr().String()[:56]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ols *onionListenService) Accept() (net.Conn, error) {
|
func (ols *onionListenService) Accept() (net.Conn, error) {
|
||||||
return ols.os.Accept()
|
return ols.os.Accept()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ols *onionListenService) Close() {
|
func (ols *onionListenService) Close() {
|
||||||
address := ols.AddressIdentity()
|
|
||||||
ols.lock.Lock()
|
ols.lock.Lock()
|
||||||
defer ols.lock.Unlock()
|
defer ols.lock.Unlock()
|
||||||
ols.tp.unregisterListener(address)
|
|
||||||
ols.os.Close()
|
ols.os.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,9 +149,15 @@ func (tp *torProvider) GetVersion() string {
|
||||||
return "No Tor"
|
return "No Tor"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (tp *torProvider) closed() bool {
|
||||||
|
tp.lock.Lock()
|
||||||
|
defer tp.lock.Unlock()
|
||||||
|
return tp.isClosed
|
||||||
|
}
|
||||||
|
|
||||||
// WaitTillBootstrapped Blocks until underlying network is bootstrapped
|
// WaitTillBootstrapped Blocks until underlying network is bootstrapped
|
||||||
func (tp *torProvider) WaitTillBootstrapped() error {
|
func (tp *torProvider) WaitTillBootstrapped() error {
|
||||||
for !tp.isClosed {
|
for !tp.closed() {
|
||||||
progress, _ := tp.GetBootstrapStatus()
|
progress, _ := tp.GetBootstrapStatus()
|
||||||
if progress == 100 {
|
if progress == 100 {
|
||||||
return nil
|
return nil
|
||||||
|
@ -170,9 +168,6 @@ func (tp *torProvider) WaitTillBootstrapped() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) {
|
func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (connectivity.ListenService, error) {
|
||||||
var onion = ""
|
|
||||||
var privkey ed25519.PrivateKey
|
|
||||||
|
|
||||||
tp.lock.Lock()
|
tp.lock.Lock()
|
||||||
defer tp.lock.Unlock()
|
defer tp.lock.Unlock()
|
||||||
|
|
||||||
|
@ -180,6 +175,9 @@ func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (conne
|
||||||
return nil, errors.New("tor provider closed")
|
return nil, errors.New("tor provider closed")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var onion string
|
||||||
|
var privkey ed25519.PrivateKey
|
||||||
|
|
||||||
switch pk := identity.(type) {
|
switch pk := identity.(type) {
|
||||||
case ed25519.PrivateKey:
|
case ed25519.PrivateKey:
|
||||||
privkey = pk
|
privkey = pk
|
||||||
|
@ -187,7 +185,11 @@ func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (conne
|
||||||
switch pubk := gpubk.(type) {
|
switch pubk := gpubk.(type) {
|
||||||
case ed25519.PublicKey:
|
case ed25519.PublicKey:
|
||||||
onion = GetTorV3Hostname(pubk)
|
onion = GetTorV3Hostname(pubk)
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown public key type %v", pubk)
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unknown private key type %v", pk)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hack around tor detached onions not having a more obvious resume mechanism
|
// Hack around tor detached onions not having a more obvious resume mechanism
|
||||||
|
@ -223,7 +225,7 @@ func (tp *torProvider) Listen(identity connectivity.PrivateKey, port int) (conne
|
||||||
os.CloseLocalListenerOnClose = true
|
os.CloseLocalListenerOnClose = true
|
||||||
|
|
||||||
ols := &onionListenService{os: os, tp: tp}
|
ols := &onionListenService{os: os, tp: tp}
|
||||||
tp.childListeners[ols.AddressIdentity()] = ols
|
tp.childListeners[ols.AddressFull()] = ols
|
||||||
return ols, nil
|
return ols, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,11 +288,17 @@ func (tp *torProvider) Open(hostname string) (net.Conn, string, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tp *torProvider) Close() {
|
func (tp *torProvider) Close() {
|
||||||
for _, child := range tp.childListeners {
|
|
||||||
child.Close()
|
|
||||||
}
|
|
||||||
tp.lock.Lock()
|
tp.lock.Lock()
|
||||||
defer tp.lock.Unlock()
|
defer tp.lock.Unlock()
|
||||||
|
|
||||||
|
// Unregister Child Listeners
|
||||||
|
for addr, child := range tp.childListeners {
|
||||||
|
child.Close()
|
||||||
|
delete(tp.childListeners, addr)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Break out of any background checks and close
|
||||||
|
// the underlying tor connection
|
||||||
tp.isClosed = true
|
tp.isClosed = true
|
||||||
tp.breakChan <- true
|
tp.breakChan <- true
|
||||||
if tp.t != nil {
|
if tp.t != nil {
|
||||||
|
@ -438,12 +446,6 @@ func (tp *torProvider) GetPID() (int, error) {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tp *torProvider) unregisterListener(id string) {
|
|
||||||
tp.lock.Lock()
|
|
||||||
defer tp.lock.Unlock()
|
|
||||||
delete(tp.childListeners, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tp *torProvider) monitorRestart() {
|
func (tp *torProvider) monitorRestart() {
|
||||||
lastBootstrapProgress := networkUnknown
|
lastBootstrapProgress := networkUnknown
|
||||||
interval := minStatusIntervalMs
|
interval := minStatusIntervalMs
|
||||||
|
|
Loading…
Reference in New Issue