diff --git a/app/applets.go b/app/applets.go index d6579ed..ae5bf49 100644 --- a/app/applets.go +++ b/app/applets.go @@ -113,7 +113,7 @@ func (ap *appletPlugins) AddPlugin(peerid string, id plugins.PluginID, bus event pluginsinf, _ := ap.plugins.Load(peerid) peerPlugins := pluginsinf.([]plugins.Plugin) - newp := plugins.Get(id, bus, acn) + newp := plugins.Get(id, bus, acn, peerid) newp.Start() peerPlugins = append(peerPlugins, newp) log.Debugf("storing plugin for %v %v", peerid, peerPlugins) diff --git a/app/plugins/contactRetry.go b/app/plugins/contactRetry.go index 369f9a8..ba49161 100644 --- a/app/plugins/contactRetry.go +++ b/app/plugins/contactRetry.go @@ -3,6 +3,7 @@ package plugins import ( "cwtch.im/cwtch/event" "cwtch.im/cwtch/protocol/connections" + "git.openprivacy.ca/openprivacy/log" "sync" "time" ) @@ -30,23 +31,29 @@ type contactRetry struct { bus event.Manager queue event.Queue networkUp bool - + running bool breakChan chan bool + onion string connections sync.Map //[string]*contact } // NewConnectionRetry returns a Plugin that when started will retry connecting to contacts with a backoff timing -func NewConnectionRetry(bus event.Manager) Plugin { - cr := &contactRetry{bus: bus, queue: event.NewQueue(), breakChan: make(chan bool), connections: sync.Map{}, networkUp: false} +func NewConnectionRetry(bus event.Manager, onion string) Plugin { + cr := &contactRetry{bus: bus, queue: event.NewQueue(), breakChan: make(chan bool), connections: sync.Map{}, networkUp: false, onion: onion} return cr } func (cr *contactRetry) Start() { - go cr.run() + if !cr.running { + go cr.run() + } else { + log.Errorf("Attempted to start Contact Retry plugin twice for %v", cr.onion) + } } func (cr *contactRetry) run() { + cr.running = true cr.bus.Subscribe(event.PeerStateChange, cr.queue) cr.bus.Subscribe(event.ACNStatus, cr.queue) cr.bus.Subscribe(event.ServerStateChange, cr.queue) @@ -56,12 +63,12 @@ func (cr *contactRetry) run() { case e := <-cr.queue.OutChan(): switch e.EventType { case event.PeerStateChange: - state := connections.ConnectionStateToType[e.Data[event.ConnectionState]] + state := connections.ConnectionStateToType()[e.Data[event.ConnectionState]] peer := e.Data[event.RemotePeer] cr.handleEvent(peer, state, peerConn) case event.ServerStateChange: - state := connections.ConnectionStateToType[e.Data[event.ConnectionState]] + state := connections.ConnectionStateToType()[e.Data[event.ConnectionState]] server := e.Data[event.GroupServer] cr.handleEvent(server, state, serverConn) @@ -102,6 +109,7 @@ func (cr *contactRetry) run() { }) case <-cr.breakChan: + cr.running = false return } } @@ -132,4 +140,5 @@ func (cr *contactRetry) handleEvent(id string, state connections.ConnectionState func (cr *contactRetry) Shutdown() { cr.breakChan <- true + } diff --git a/app/plugins/plugin.go b/app/plugins/plugin.go index 01f2375..2d271fc 100644 --- a/app/plugins/plugin.go +++ b/app/plugins/plugin.go @@ -21,10 +21,10 @@ type Plugin interface { } // Get is a plugin factory for the requested plugin -func Get(id PluginID, bus event.Manager, acn connectivity.ACN) Plugin { +func Get(id PluginID, bus event.Manager, acn connectivity.ACN, onion string) Plugin { switch id { case CONNECTIONRETRY: - return NewConnectionRetry(bus) + return NewConnectionRetry(bus, onion) case NETWORKCHECK: return NewNetworkCheck(bus, acn) } diff --git a/go.sum b/go.sum index 4a6d206..6947a92 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,9 @@ -cwtch.im/tapir v0.2.0 h1:7MkoR5+uEuPW34/O0GZRidnIjq/01Cfm8nl5IRuqpGc= -cwtch.im/tapir v0.2.0/go.mod h1:xzzZ28adyUXNkYL1YodcHsAiTt3IJ8Loc29YVn9mIEQ= cwtch.im/tapir v0.2.1 h1:t1YJB9q5sV1A9xwiiwL6WVfw3dwQWLoecunuzT1PQtw= cwtch.im/tapir v0.2.1/go.mod h1:xzzZ28adyUXNkYL1YodcHsAiTt3IJ8Loc29YVn9mIEQ= -git.openprivacy.ca/openprivacy/bine v0.0.3 h1:PSHUmNqaW7BZUX8n2eTDeNbjsuRe+t5Ae0Og+P+jDM0= -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/connectivity v1.2.0 h1:dbZ5CRl11vg3BNHdzRKSlDP8OUtDB+mf6FkxMVf73qw= git.openprivacy.ca/openprivacy/connectivity v1.2.0/go.mod h1:B7vzuVmChJtSKoh0ezph5vu6DQ0gIk0zHUNG6IgXCcA= -git.openprivacy.ca/openprivacy/connectivity v1.3.0 h1:e2EeV6CaMNwOb+PzAjF0hGCeOqAPagRaDL4en5ITf7U= -git.openprivacy.ca/openprivacy/connectivity v1.3.0/go.mod h1:s0/QhONuUqJQfYTAgUlu+ya7G3Ov6bKgpT5QkOhVxDI= git.openprivacy.ca/openprivacy/connectivity v1.3.3 h1:OKHZ/pzY95+UNOhF74DisSYPh7lULtjbxFQnK9r6cAk= git.openprivacy.ca/openprivacy/connectivity v1.3.3/go.mod h1:DL9QitHjpyNspMUe3wjIej9gFgDK2FdRKP2JE4+7T90= git.openprivacy.ca/openprivacy/log v1.0.0 h1:Rvqm1weUdR4AOnJ79b1upHCc9vC/QF1rhSD2Um7sr1Y= @@ -57,6 +51,7 @@ golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1V golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -75,9 +70,11 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200625195345-7480c7b4547d h1:V1BGE5ZHrUIYZYNEm0i7jrPwSo3ks0HSn1TrartSqME= golang.org/x/tools v0.0.0-20200625195345-7480c7b4547d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/peer/cwtch_peer.go b/peer/cwtch_peer.go index 4e3ad37..3bea251 100644 --- a/peer/cwtch_peer.go +++ b/peer/cwtch_peer.go @@ -336,7 +336,7 @@ func (cp *cwtchPeer) GetPeerState(onion string) (connections.ConnectionState, bo cp.mutex.Lock() defer cp.mutex.Unlock() if peer, ok := cp.Profile.Contacts[onion]; ok { - return connections.ConnectionStateToType[peer.State], true + return connections.ConnectionStateToType()[peer.State], true } return connections.DISCONNECTED, false } @@ -345,7 +345,7 @@ func (cp *cwtchPeer) GetGroupState(groupid string) (connections.ConnectionState, cp.mutex.Lock() defer cp.mutex.Unlock() if group, ok := cp.Profile.Groups[groupid]; ok { - return connections.ConnectionStateToType[group.State], true + return connections.ConnectionStateToType()[group.State], true } return connections.DISCONNECTED, false } diff --git a/protocol/connections/peerapp.go b/protocol/connections/peerapp.go index 24650b1..a4364e9 100644 --- a/protocol/connections/peerapp.go +++ b/protocol/connections/peerapp.go @@ -75,7 +75,8 @@ func (pa *PeerApp) Init(connection tapir.Connection) { go pa.listen() } } else { - pa.OnClose(connection.Hostname()) + // The auth protocol wasn't completed, we can safely shutdown the connection + connection.Close() } } diff --git a/protocol/connections/state.go b/protocol/connections/state.go index 5e7f527..4646e40 100644 --- a/protocol/connections/state.go +++ b/protocol/connections/state.go @@ -22,8 +22,10 @@ const ( var ( // ConnectionStateName allows conversion of states to their string representations ConnectionStateName = []string{"Disconnected", "Connecting", "Connected", "Authenticated", "Synced", "Failed", "Killed"} - - // ConnectionStateToType allows conversion of strings to their state type - ConnectionStateToType = map[string]ConnectionState{"Disconnected": DISCONNECTED, "Connecting": CONNECTING, - "Connected": CONNECTED, "Authenticated": AUTHENTICATED, "Synced": SYNCED, "Failed": FAILED, "Killed": KILLED} ) + +// ConnectionStateToType allows conversion of strings to their state type +func ConnectionStateToType() map[string]ConnectionState { + return map[string]ConnectionState{"Disconnected": DISCONNECTED, "Connecting": CONNECTING, + "Connected": CONNECTED, "Authenticated": AUTHENTICATED, "Synced": SYNCED, "Failed": FAILED, "Killed": KILLED} +}