Review Board Comments

This commit is contained in:
Sarah Jamie Lewis 2019-07-23 10:57:04 -07:00
parent bc226173e4
commit 71dd298a91
3 changed files with 41 additions and 15 deletions

View File

@ -169,3 +169,10 @@ const (
const ( const (
AppErrLoaded0 = "Loaded 0 profiles" AppErrLoaded0 = "Loaded 0 profiles"
) )
// Defining Protocol Contexts
const (
ContextAck = "im.cwtch.acknowledgement"
ContextInvite = "im.cwtch.invite"
ContextRaw = "im.cwtch.raw"
)

View File

@ -5,6 +5,7 @@ import (
"cwtch.im/cwtch/protocol" "cwtch.im/cwtch/protocol"
"cwtch.im/tapir" "cwtch.im/tapir"
"cwtch.im/tapir/networks/tor" "cwtch.im/tapir/networks/tor"
"errors"
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity" "git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
"git.openprivacy.ca/openprivacy/libricochet-go/identity" "git.openprivacy.ca/openprivacy/libricochet-go/identity"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
@ -100,7 +101,7 @@ func (e *engine) eventHandler() {
case event.PeerRequest: case event.PeerRequest:
e.peerWithOnion(ev.Data[event.RemotePeer]) e.peerWithOnion(ev.Data[event.RemotePeer])
case event.InvitePeerToGroup: case event.InvitePeerToGroup:
e.sendMessageToPeer(ev.EventID, ev.Data[event.RemotePeer], "im.cwtch.invite", []byte(ev.Data[event.GroupInvite])) e.sendMessageToPeer(ev.EventID, ev.Data[event.RemotePeer], event.ContextInvite, []byte(ev.Data[event.GroupInvite]))
case event.JoinServer: case event.JoinServer:
e.joinServer(ev.Data[event.GroupServer]) e.joinServer(ev.Data[event.GroupServer])
case event.SendMessageToGroup: case event.SendMessageToGroup:
@ -109,7 +110,7 @@ func (e *engine) eventHandler() {
// TODO: remove this passthrough once the UI is integrated. // TODO: remove this passthrough once the UI is integrated.
context, ok := ev.Data[event.EventContext] context, ok := ev.Data[event.EventContext]
if !ok { if !ok {
context = "im.cwtch.raw" context = event.ContextRaw
} }
err := e.sendMessageToPeer(ev.EventID, ev.Data[event.RemotePeer], context, []byte(ev.Data[event.GroupInvite])) err := e.sendMessageToPeer(ev.EventID, ev.Data[event.RemotePeer], context, []byte(ev.Data[event.GroupInvite]))
if err != nil { if err != nil {
@ -129,14 +130,19 @@ func (e *engine) eventHandler() {
} }
} }
// Listen sets up an onion listener to process incoming cwtch messages func (e *engine) createPeerTemplate() *PeerApp {
func (e *engine) listenFn() {
peerAppTemplate := new(PeerApp) peerAppTemplate := new(PeerApp)
peerAppTemplate.MessageHandler = e.handlePeerMessage peerAppTemplate.MessageHandler = e.handlePeerMessage
peerAppTemplate.OnAcknowledgement = e.peerAck peerAppTemplate.OnAcknowledgement = e.peerAck
peerAppTemplate.OnAuth = e.peerAuthed peerAppTemplate.OnAuth = e.peerAuthed
peerAppTemplate.OnConnecting = e.peerConnecting
peerAppTemplate.OnClose = e.peerDisconnected peerAppTemplate.OnClose = e.peerDisconnected
err := e.service.Listen(peerAppTemplate) return peerAppTemplate
}
// Listen sets up an onion listener to process incoming cwtch messages
func (e *engine) listenFn() {
err := e.service.Listen(e.createPeerTemplate())
e.eventManager.Publish(event.NewEvent(event.ProtocolEngineStopped, map[event.Field]string{event.Identity: e.identity.Hostname(), event.Error: err.Error()})) e.eventManager.Publish(event.NewEvent(event.ProtocolEngineStopped, map[event.Field]string{event.Identity: e.identity.Hostname(), event.Error: err.Error()}))
return return
} }
@ -150,12 +156,7 @@ func (e *engine) Shutdown() {
// peerWithOnion is the entry point for cwtchPeer relationships // peerWithOnion is the entry point for cwtchPeer relationships
func (e *engine) peerWithOnion(onion string) { func (e *engine) peerWithOnion(onion string) {
peerAppTemplate := new(PeerApp) e.service.Connect(onion, e.createPeerTemplate())
peerAppTemplate.MessageHandler = e.handlePeerMessage
peerAppTemplate.OnAcknowledgement = e.peerAck
peerAppTemplate.OnAuth = e.peerAuthed
peerAppTemplate.OnClose = e.peerDisconnected
e.service.Connect(onion, peerAppTemplate)
} }
func (e *engine) peerAuthed(onion string) { func (e *engine) peerAuthed(onion string) {
@ -165,6 +166,13 @@ func (e *engine) peerAuthed(onion string) {
})) }))
} }
func (e *engine) peerConnecting(onion string) {
e.eventManager.Publish(event.NewEvent(event.PeerStateChange, map[event.Field]string{
event.RemotePeer: string(onion),
event.ConnectionState: ConnectionStateName[CONNECTING],
}))
}
func (e *engine) peerAck(eventID string) { func (e *engine) peerAck(eventID string) {
e.eventManager.Publish(event.NewEvent(event.PeerAcknowledgement, map[event.Field]string{ e.eventManager.Publish(event.NewEvent(event.PeerAcknowledgement, map[event.Field]string{
event.EventID: eventID, event.EventID: eventID,
@ -187,7 +195,7 @@ func (e *engine) sendMessageToPeer(eventID string, onion string, context string,
peerApp.SendMessage(PeerMessage{eventID, context, message}) peerApp.SendMessage(PeerMessage{eventID, context, message})
return nil return nil
} }
panic("this should never happen") return errors.New("failed type assertion conn.App != PeerApp")
} }
return err return err
} }
@ -229,6 +237,7 @@ func (e *engine) handlePeerMessage(hostname string, message []byte) {
marshal, _ := proto.Marshal(cpp.GetGroupChatInvite()) marshal, _ := proto.Marshal(cpp.GetGroupChatInvite())
e.eventManager.Publish(event.NewEvent(event.NewGroupInvite, map[event.Field]string{event.TimestampReceived: time.Now().Format(time.RFC3339Nano), event.RemotePeer: hostname, event.GroupInvite: string(marshal)})) e.eventManager.Publish(event.NewEvent(event.NewGroupInvite, map[event.Field]string{event.TimestampReceived: time.Now().Format(time.RFC3339Nano), event.RemotePeer: hostname, event.GroupInvite: string(marshal)}))
} }
} else {
e.eventManager.Publish(event.NewEvent(event.NewMessageFromPeer, map[event.Field]string{event.TimestampReceived: time.Now().Format(time.RFC3339Nano), event.RemotePeer: hostname, event.Data: string(message)}))
} }
e.eventManager.Publish(event.NewEvent(event.NewMessageFromPeer, map[event.Field]string{event.TimestampReceived: time.Now().Format(time.RFC3339Nano), event.RemotePeer: hostname, event.Data: string(message)}))
} }

View File

@ -1,6 +1,7 @@
package connections package connections
import ( import (
"cwtch.im/cwtch/event"
"cwtch.im/tapir" "cwtch.im/tapir"
"cwtch.im/tapir/applications" "cwtch.im/tapir/applications"
"encoding/json" "encoding/json"
@ -12,9 +13,10 @@ type PeerApp struct {
applications.AuthApp applications.AuthApp
connection *tapir.Connection connection *tapir.Connection
MessageHandler func(string, []byte) MessageHandler func(string, []byte)
OnAcknowledgement func(string)
OnAuth func(string) OnAuth func(string)
OnClose func(string) OnClose func(string)
OnAcknowledgement func(string) OnConnecting func(string)
} }
// PeerMessage is an encapsulation that can be used by higher level applications // PeerMessage is an encapsulation that can be used by higher level applications
@ -28,13 +30,21 @@ type PeerMessage struct {
func (pa PeerApp) NewInstance() tapir.Application { func (pa PeerApp) NewInstance() tapir.Application {
newApp := new(PeerApp) newApp := new(PeerApp)
newApp.MessageHandler = pa.MessageHandler newApp.MessageHandler = pa.MessageHandler
newApp.OnAcknowledgement = pa.OnAcknowledgement
newApp.OnAuth = pa.OnAuth newApp.OnAuth = pa.OnAuth
newApp.OnClose = pa.OnClose newApp.OnClose = pa.OnClose
newApp.OnConnecting = pa.OnConnecting
return newApp return newApp
} }
// Init is run when the connection is first started. // Init is run when the connection is first started.
func (pa *PeerApp) Init(connection *tapir.Connection) { func (pa *PeerApp) Init(connection *tapir.Connection) {
// We don't want to issue an event for unknown peers (we only know inbound peer hostnames once we have authenticated)
if connection.Outbound {
pa.OnConnecting(connection.Hostname)
}
// First run the Authentication App // First run the Authentication App
pa.AuthApp.Init(connection) pa.AuthApp.Init(connection)
@ -58,7 +68,7 @@ func (pa PeerApp) listen() {
var peerMessage PeerMessage var peerMessage PeerMessage
err := json.Unmarshal(message, &peerMessage) err := json.Unmarshal(message, &peerMessage)
if err == nil { if err == nil {
if peerMessage.Context == "im.cwtch.acknowledgement" { if peerMessage.Context == event.ContextAck {
pa.OnAcknowledgement(peerMessage.ID) pa.OnAcknowledgement(peerMessage.ID)
} else { } else {
pa.MessageHandler(pa.connection.Hostname, peerMessage.Data) pa.MessageHandler(pa.connection.Hostname, peerMessage.Data)