forked from cwtch.im/cwtch
Allowing Blocking of Unknown Contacts
This commit is contained in:
parent
262df80cda
commit
38542751c8
|
@ -113,7 +113,7 @@ func (app *application) CreatePeer(name string, password string) {
|
||||||
blockedPeers := profile.BlockedPeers()
|
blockedPeers := profile.BlockedPeers()
|
||||||
// TODO: Would be nice if ProtocolEngine did not need to explicitly be given the Private Key.
|
// TODO: Would be nice if ProtocolEngine did not need to explicitly be given the Private Key.
|
||||||
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
||||||
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, app.acn, app.eventBuses[profile.Onion], blockedPeers)
|
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, app.acn, app.eventBuses[profile.Onion], profile.GetContacts(), blockedPeers)
|
||||||
|
|
||||||
app.peers[profile.Onion] = peer
|
app.peers[profile.Onion] = peer
|
||||||
app.engines[profile.Onion] = engine
|
app.engines[profile.Onion] = engine
|
||||||
|
@ -168,7 +168,7 @@ func (app *application) LoadProfiles(password string) {
|
||||||
|
|
||||||
blockedPeers := profile.BlockedPeers()
|
blockedPeers := profile.BlockedPeers()
|
||||||
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
||||||
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, app.acn, app.eventBuses[profile.Onion], blockedPeers)
|
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, app.acn, app.eventBuses[profile.Onion], profile.GetContacts(), blockedPeers)
|
||||||
app.mutex.Lock()
|
app.mutex.Lock()
|
||||||
app.peers[profile.Onion] = peer
|
app.peers[profile.Onion] = peer
|
||||||
app.storage[profile.Onion] = profileStore
|
app.storage[profile.Onion] = profileStore
|
||||||
|
|
|
@ -96,7 +96,7 @@ func (as *applicationService) createPeer(name, password string) {
|
||||||
blockedPeers := profile.BlockedPeers()
|
blockedPeers := profile.BlockedPeers()
|
||||||
// TODO: Would be nice if ProtocolEngine did not need to explicitly be given the Private Key.
|
// TODO: Would be nice if ProtocolEngine did not need to explicitly be given the Private Key.
|
||||||
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
||||||
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, as.acn, as.eventBuses[profile.Onion], blockedPeers)
|
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, as.acn, as.eventBuses[profile.Onion], profile.GetContacts(), blockedPeers)
|
||||||
|
|
||||||
as.storage[profile.Onion] = profileStore
|
as.storage[profile.Onion] = profileStore
|
||||||
as.engines[profile.Onion] = engine
|
as.engines[profile.Onion] = engine
|
||||||
|
@ -112,7 +112,7 @@ func (as *applicationService) loadProfiles(password string) {
|
||||||
|
|
||||||
blockedPeers := profile.BlockedPeers()
|
blockedPeers := profile.BlockedPeers()
|
||||||
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
identity := primitives.InitializeIdentity(profile.Name, &profile.Ed25519PrivateKey, &profile.Ed25519PublicKey)
|
||||||
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, as.acn, as.eventBuses[profile.Onion], blockedPeers)
|
engine := connections.NewProtocolEngine(identity, profile.Ed25519PrivateKey, as.acn, as.eventBuses[profile.Onion], profile.GetContacts(), blockedPeers)
|
||||||
as.mutex.Lock()
|
as.mutex.Lock()
|
||||||
as.storage[profile.Onion] = profileStore
|
as.storage[profile.Onion] = profileStore
|
||||||
as.engines[profile.Onion] = engine
|
as.engines[profile.Onion] = engine
|
||||||
|
|
|
@ -16,6 +16,10 @@ const (
|
||||||
BlockPeer = Type("BlockPeer")
|
BlockPeer = Type("BlockPeer")
|
||||||
UnblockPeer = Type("UnblockPeer")
|
UnblockPeer = Type("UnblockPeer")
|
||||||
|
|
||||||
|
// Turn on/off blocking of unknown peers (if peers aren't in the contact list then they will be autoblocked
|
||||||
|
BlockUnknownPeers = Type("BlockUnknownPeers")
|
||||||
|
AllowUnknownPeers = Type("AllowUnknownPeers")
|
||||||
|
|
||||||
JoinServer = Type("JoinServer")
|
JoinServer = Type("JoinServer")
|
||||||
|
|
||||||
ProtocolEngineStartListen = Type("ProtocolEngineStartListen")
|
ProtocolEngineStartListen = Type("ProtocolEngineStartListen")
|
||||||
|
|
|
@ -30,6 +30,9 @@ type engine struct {
|
||||||
// Blocklist
|
// Blocklist
|
||||||
blocked sync.Map
|
blocked sync.Map
|
||||||
|
|
||||||
|
// Block Unknown Contacts
|
||||||
|
blockUnknownContacts bool
|
||||||
|
|
||||||
// Pointer to the Global Event Manager
|
// Pointer to the Global Event Manager
|
||||||
eventManager event.Manager
|
eventManager event.Manager
|
||||||
|
|
||||||
|
@ -51,7 +54,7 @@ type Engine interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewProtocolEngine initializes a new engine that runs Cwtch using the given parameters
|
// NewProtocolEngine initializes a new engine that runs Cwtch using the given parameters
|
||||||
func NewProtocolEngine(identity primitives.Identity, privateKey ed25519.PrivateKey, acn connectivity.ACN, eventManager event.Manager, blockedPeers []string) Engine {
|
func NewProtocolEngine(identity primitives.Identity, privateKey ed25519.PrivateKey, acn connectivity.ACN, eventManager event.Manager, knownPeers []string, blockedPeers []string) Engine {
|
||||||
engine := new(engine)
|
engine := new(engine)
|
||||||
engine.identity = identity
|
engine.identity = identity
|
||||||
engine.privateKey = privateKey
|
engine.privateKey = privateKey
|
||||||
|
@ -79,6 +82,13 @@ func NewProtocolEngine(identity primitives.Identity, privateKey ed25519.PrivateK
|
||||||
|
|
||||||
engine.eventManager.Subscribe(event.BlockPeer, engine.queue)
|
engine.eventManager.Subscribe(event.BlockPeer, engine.queue)
|
||||||
engine.eventManager.Subscribe(event.UnblockPeer, engine.queue)
|
engine.eventManager.Subscribe(event.UnblockPeer, engine.queue)
|
||||||
|
engine.eventManager.Subscribe(event.BlockUnknownPeers, engine.queue)
|
||||||
|
engine.eventManager.Subscribe(event.AllowUnknownPeers, engine.queue)
|
||||||
|
|
||||||
|
for _, peer := range knownPeers {
|
||||||
|
engine.blocked.Store(peer, false)
|
||||||
|
}
|
||||||
|
|
||||||
for _, peer := range blockedPeers {
|
for _, peer := range blockedPeers {
|
||||||
engine.blocked.Store(peer, true)
|
engine.blocked.Store(peer, true)
|
||||||
}
|
}
|
||||||
|
@ -101,6 +111,7 @@ func (e *engine) eventHandler() {
|
||||||
case event.StatusRequest:
|
case event.StatusRequest:
|
||||||
e.eventManager.Publish(event.Event{EventType: event.ProtocolEngineStatus, EventID: ev.EventID})
|
e.eventManager.Publish(event.Event{EventType: event.ProtocolEngineStatus, EventID: ev.EventID})
|
||||||
case event.PeerRequest:
|
case event.PeerRequest:
|
||||||
|
e.blocked.Store(ev.Data[event.RemotePeer], false)
|
||||||
go e.peerWithOnion(ev.Data[event.RemotePeer])
|
go e.peerWithOnion(ev.Data[event.RemotePeer])
|
||||||
case event.InvitePeerToGroup:
|
case event.InvitePeerToGroup:
|
||||||
e.sendMessageToPeer(ev.EventID, ev.Data[event.RemotePeer], event.ContextInvite, []byte(ev.Data[event.GroupInvite]))
|
e.sendMessageToPeer(ev.EventID, ev.Data[event.RemotePeer], event.ContextInvite, []byte(ev.Data[event.GroupInvite]))
|
||||||
|
@ -108,6 +119,8 @@ func (e *engine) eventHandler() {
|
||||||
e.joinServer(ev.Data[event.GroupServer])
|
e.joinServer(ev.Data[event.GroupServer])
|
||||||
case event.DeleteContact:
|
case event.DeleteContact:
|
||||||
onion := ev.Data[event.RemotePeer]
|
onion := ev.Data[event.RemotePeer]
|
||||||
|
// We remove this peer from out blocklist which will prevent them from contacting us if we have "block unknown peers" turned on.
|
||||||
|
e.blocked.Delete(ev.Data[event.RemotePeer])
|
||||||
e.deleteConnection(onion)
|
e.deleteConnection(onion)
|
||||||
case event.DeleteGroup:
|
case event.DeleteGroup:
|
||||||
// TODO: There isn't a way here to determine if other Groups are using a server connection...
|
// TODO: There isn't a way here to determine if other Groups are using a server connection...
|
||||||
|
@ -127,7 +140,7 @@ func (e *engine) eventHandler() {
|
||||||
// We simply remove the peer from our blocklist
|
// We simply remove the peer from our blocklist
|
||||||
// The UI has the responsibility to reinitiate contact with the peer.
|
// The UI has the responsibility to reinitiate contact with the peer.
|
||||||
// (this should happen periodically in any case)
|
// (this should happen periodically in any case)
|
||||||
e.blocked.Delete(ev.Data[event.RemotePeer])
|
e.blocked.Store(ev.Data[event.RemotePeer], false)
|
||||||
case event.BlockPeer:
|
case event.BlockPeer:
|
||||||
e.blocked.Store(ev.Data[event.RemotePeer], true)
|
e.blocked.Store(ev.Data[event.RemotePeer], true)
|
||||||
connection, err := e.service.GetConnection(ev.Data[event.RemotePeer])
|
connection, err := e.service.GetConnection(ev.Data[event.RemotePeer])
|
||||||
|
@ -138,6 +151,10 @@ func (e *engine) eventHandler() {
|
||||||
// an ongoing Open() connection fails and so the user will see a blocked peer as still connecting (because
|
// an ongoing Open() connection fails and so the user will see a blocked peer as still connecting (because
|
||||||
// there isn't an active connection and we are stuck waiting for tor to time out)
|
// there isn't an active connection and we are stuck waiting for tor to time out)
|
||||||
e.peerDisconnected(ev.Data[event.RemotePeer])
|
e.peerDisconnected(ev.Data[event.RemotePeer])
|
||||||
|
case event.AllowUnknownPeers:
|
||||||
|
e.blockUnknownContacts = false
|
||||||
|
case event.BlockUnknownPeers:
|
||||||
|
e.blockUnknownContacts = true
|
||||||
case event.ProtocolEngineStartListen:
|
case event.ProtocolEngineStartListen:
|
||||||
go e.listenFn()
|
go e.listenFn()
|
||||||
default:
|
default:
|
||||||
|
@ -149,8 +166,12 @@ func (e *engine) eventHandler() {
|
||||||
func (e *engine) createPeerTemplate() *PeerApp {
|
func (e *engine) createPeerTemplate() *PeerApp {
|
||||||
peerAppTemplate := new(PeerApp)
|
peerAppTemplate := new(PeerApp)
|
||||||
peerAppTemplate.IsBlocked = func(onion string) bool {
|
peerAppTemplate.IsBlocked = func(onion string) bool {
|
||||||
_, blocked := e.blocked.Load(onion)
|
blocked, known := e.blocked.Load(onion)
|
||||||
return blocked
|
if !known {
|
||||||
|
// if we block unknown peers we will block this contact
|
||||||
|
return e.blockUnknownContacts
|
||||||
|
}
|
||||||
|
return blocked.(bool)
|
||||||
}
|
}
|
||||||
peerAppTemplate.MessageHandler = e.handlePeerMessage
|
peerAppTemplate.MessageHandler = e.handlePeerMessage
|
||||||
peerAppTemplate.OnAcknowledgement = e.ignoreOnShutdown2(e.peerAck)
|
peerAppTemplate.OnAcknowledgement = e.ignoreOnShutdown2(e.peerAck)
|
||||||
|
@ -180,8 +201,8 @@ func (e *engine) Shutdown() {
|
||||||
// peerWithOnion is the entry point for cwtchPeer relationships
|
// peerWithOnion is the entry point for cwtchPeer relationships
|
||||||
// needs to be run in a goroutine as will block on Open.
|
// needs to be run in a goroutine as will block on Open.
|
||||||
func (e *engine) peerWithOnion(onion string) {
|
func (e *engine) peerWithOnion(onion string) {
|
||||||
_, blocked := e.blocked.Load(onion)
|
blocked, known := e.blocked.Load(onion)
|
||||||
if !blocked {
|
if known && !(blocked.(bool)) {
|
||||||
e.ignoreOnShutdown(e.peerConnecting)(onion)
|
e.ignoreOnShutdown(e.peerConnecting)(onion)
|
||||||
connected, err := e.service.Connect(onion, e.createPeerTemplate())
|
connected, err := e.service.Connect(onion, e.createPeerTemplate())
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ func TestPeerServerConnection(t *testing.T) {
|
||||||
onionAddr := identity.Hostname()
|
onionAddr := identity.Hostname()
|
||||||
|
|
||||||
manager := event.NewEventManager()
|
manager := event.NewEventManager()
|
||||||
engine := NewProtocolEngine(identity, priv, connectivity.LocalProvider(), manager, nil)
|
engine := NewProtocolEngine(identity, priv, connectivity.LocalProvider(), manager, nil, nil)
|
||||||
|
|
||||||
psc := NewPeerServerConnection(engine, "127.0.0.1:5451|"+onionAddr)
|
psc := NewPeerServerConnection(engine, "127.0.0.1:5451|"+onionAddr)
|
||||||
numcalls := 0
|
numcalls := 0
|
||||||
|
|
Loading…
Reference in New Issue