adding new filterable logging system
This commit is contained in:
parent
fa720940d8
commit
2815e29704
|
@ -6,7 +6,7 @@ import (
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/connection"
|
"git.openprivacy.ca/openprivacy/libricochet-go/connection"
|
||||||
"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"
|
||||||
"log"
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"net"
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
@ -42,7 +42,7 @@ func (ra *RicochetApplication) Init(acn connectivity.ACN, name string, v3identit
|
||||||
func (ra *RicochetApplication) handleConnection(conn net.Conn) {
|
func (ra *RicochetApplication) handleConnection(conn net.Conn) {
|
||||||
rc, err := goricochet.NegotiateVersionInbound(conn)
|
rc, err := goricochet.NegotiateVersionInbound(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("There was an error")
|
log.Errorln("There was an error")
|
||||||
conn.Close()
|
conn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -52,12 +52,11 @@ func (ra *RicochetApplication) handleConnection(conn net.Conn) {
|
||||||
err = ich.ProcessAuthAsV3Server(ra.v3identity, ra.contactManager.LookupContactV3)
|
err = ich.ProcessAuthAsV3Server(ra.v3identity, ra.contactManager.LookupContactV3)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("There was an error authenticating the connection: %v", err)
|
log.Errorf("There was an error authenticating the connection: %v", err)
|
||||||
conn.Close()
|
conn.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rc.TraceLog(true)
|
|
||||||
rai := ra.aif.GetApplicationInstance(rc)
|
rai := ra.aif.GetApplicationInstance(rc)
|
||||||
ra.lock.Lock()
|
ra.lock.Lock()
|
||||||
ra.instances = append(ra.instances, rai)
|
ra.instances = append(ra.instances, rai)
|
||||||
|
@ -82,12 +81,11 @@ func (ra *RicochetApplication) HandleApplicationInstance(rai *ApplicationInstanc
|
||||||
ra.lock.Unlock()
|
ra.lock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open a connection to another Ricochet peer at onionAddress. If they are unknown to use, use requestMessage (otherwise can be blank)
|
// Open a connection to another Ricochet peer at onionAddress. Infof they are unknown to use, use requestMessage (otherwise can be blank)
|
||||||
func (ra *RicochetApplication) Open(onionAddress string, requestMessage string) (*ApplicationInstance, error) {
|
func (ra *RicochetApplication) Open(onionAddress string, requestMessage string) (*ApplicationInstance, error) {
|
||||||
rc, err := goricochet.Open(ra.acn, onionAddress)
|
rc, err := goricochet.Open(ra.acn, onionAddress)
|
||||||
rc.TraceLog(true)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error in application.Open(): %v\n", err)
|
log.Errorf("Error in application.Open(): %v\n", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +94,7 @@ func (ra *RicochetApplication) Open(onionAddress string, requestMessage string)
|
||||||
known, err := och.ProcessAuthAsV3Client(ra.v3identity)
|
known, err := och.ProcessAuthAsV3Client(ra.v3identity)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("There was an error authenticating the connection: %v", err)
|
log.Errorf("There was an error authenticating the connection: %v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rai := ra.aif.GetApplicationInstance(rc)
|
rai := ra.aif.GetApplicationInstance(rc)
|
||||||
|
@ -113,7 +111,7 @@ func (ra *RicochetApplication) Open(onionAddress string, requestMessage string)
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("could not contact %s", err)
|
log.Errorf("could not contact %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ra.HandleApplicationInstance(rai)
|
ra.HandleApplicationInstance(rai)
|
||||||
|
|
|
@ -7,11 +7,12 @@ import (
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/connection"
|
"git.openprivacy.ca/openprivacy/libricochet-go/connection"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/identity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/identity"
|
||||||
"log"
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
||||||
"golang.org/x/crypto/ed25519"
|
"golang.org/x/crypto/ed25519"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type EchoBotInstance struct {
|
type EchoBotInstance struct {
|
||||||
|
@ -26,7 +27,7 @@ func (ebi *EchoBotInstance) Init(rai *application.ApplicationInstance, ra *appli
|
||||||
|
|
||||||
// We always want bidirectional chat channels
|
// We always want bidirectional chat channels
|
||||||
func (ebi *EchoBotInstance) OpenInbound() {
|
func (ebi *EchoBotInstance) OpenInbound() {
|
||||||
log.Println("OpenInbound() ChatChannel handler called...")
|
log.Degubln("OpenInbound() ChatChannel handler called...")
|
||||||
outboutChatChannel := ebi.rai.Connection.Channel("im.ricochet.chat", channels.Outbound)
|
outboutChatChannel := ebi.rai.Connection.Channel("im.ricochet.chat", channels.Outbound)
|
||||||
if outboutChatChannel == nil {
|
if outboutChatChannel == nil {
|
||||||
ebi.rai.Connection.Do(func() error {
|
ebi.rai.Connection.Do(func() error {
|
||||||
|
@ -40,7 +41,7 @@ func (ebi *EchoBotInstance) OpenInbound() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ebi *EchoBotInstance) ChatMessage(messageID uint32, when time.Time, message string) bool {
|
func (ebi *EchoBotInstance) ChatMessage(messageID uint32, when time.Time, message string) bool {
|
||||||
log.Printf("message from %v - %v", ebi.rai.RemoteHostname, message)
|
log.Infof("message from %v - %v", ebi.rai.RemoteHostname, message)
|
||||||
ebi.SendChatMessage(ebi.rai, ebi.rai.RemoteHostname+" "+message)
|
ebi.SendChatMessage(ebi.rai, ebi.rai.RemoteHostname+" "+message)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -66,20 +67,24 @@ func main() {
|
||||||
////////////
|
////////////
|
||||||
// SERVER //
|
// SERVER //
|
||||||
////////////
|
////////////
|
||||||
|
log.SetLevel(log.LevelInfo)
|
||||||
|
log.AddEverythingFromPattern("connectivity")
|
||||||
|
|
||||||
echobot := new(application.RicochetApplication)
|
echobot := new(application.RicochetApplication)
|
||||||
cpubk, cprivk, err := ed25519.GenerateKey(rand.Reader)
|
cpubk, cprivk, err := ed25519.GenerateKey(rand.Reader)
|
||||||
|
|
||||||
acn, err := connectivity.StartTor(".", "")
|
acn, err := connectivity.StartTor(".", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("Unable to start Tor: %v", err)
|
log.Errorf("Unable to start Tor: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer acn.Close()
|
defer acn.Close()
|
||||||
|
|
||||||
listenService, err := acn.Listen(cprivk, application.RicochetPort)
|
listenService, err := acn.Listen(cprivk, application.RicochetPort)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("error setting up onion service: %v", err)
|
log.Errorf("error setting up onion service: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
af := application.ApplicationInstanceFactory{}
|
af := application.ApplicationInstanceFactory{}
|
||||||
|
@ -95,10 +100,10 @@ func main() {
|
||||||
})
|
})
|
||||||
|
|
||||||
echobot.Init(acn, "echobot", identity.InitializeV3("echobot", &cprivk, &cpubk), af, new(application.AcceptAllContactManager))
|
echobot.Init(acn, "echobot", identity.InitializeV3("echobot", &cprivk, &cpubk), af, new(application.AcceptAllContactManager))
|
||||||
log.Printf("echobot listening on %s", listenService.AddressFull())
|
log.Infof("echobot listening on %v", listenService.AddressFull())
|
||||||
go echobot.Run(listenService)
|
go echobot.Run(listenService)
|
||||||
|
|
||||||
log.Printf("counting to five ...")
|
log.Infoln("counting to five ...")
|
||||||
time.Sleep(time.Second * 5)
|
time.Sleep(time.Second * 5)
|
||||||
|
|
||||||
////////////
|
////////////
|
||||||
|
@ -121,18 +126,20 @@ func NewAliceBot(acn connectivity.ACN, onion string) alicebot {
|
||||||
var err error
|
var err error
|
||||||
alice.pub, alice.priv, err = ed25519.GenerateKey(rand.Reader)
|
alice.pub, alice.priv, err = ed25519.GenerateKey(rand.Reader)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("[alice] error generating key: %v", err)
|
log.Errorf("[alice] error generating key: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
rc, err := goricochet.Open(acn, onion)
|
rc, err := goricochet.Open(acn, onion)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("[alice] error connecting to echobot: %v", err)
|
log.Errorf("[alice] error connecting to echobot: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
rc.TraceLog(false)
|
|
||||||
_, err = connection.HandleOutboundConnection(rc).ProcessAuthAsV3Client(identity.InitializeV3("alice", &alice.priv, &alice.pub))
|
_, err = connection.HandleOutboundConnection(rc).ProcessAuthAsV3Client(identity.InitializeV3("alice", &alice.priv, &alice.pub))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("[alice] failed to authenticate connection: %v", err)
|
log.Errorf("[alice] failed to authenticate connection: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
alice.rc = rc
|
alice.rc = rc
|
||||||
|
@ -148,14 +155,15 @@ func NewAliceBot(acn connectivity.ACN, onion string) alicebot {
|
||||||
|
|
||||||
go alice.rc.Process(&ach)
|
go alice.rc.Process(&ach)
|
||||||
|
|
||||||
log.Printf("[alice] requesting channel...")
|
log.Infof("[alice] requesting channel...")
|
||||||
alice.rc.Do(func() error {
|
alice.rc.Do(func() error {
|
||||||
chatchannel := channels.ChatChannel{}
|
chatchannel := channels.ChatChannel{}
|
||||||
chatchannel.Handler = &alice
|
chatchannel.Handler = &alice
|
||||||
|
|
||||||
_, err := alice.rc.RequestOpenChannel("im.ricochet.chat", &chatchannel)
|
_, err := alice.rc.RequestOpenChannel("im.ricochet.chat", &chatchannel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("failed requestopenchannel: %v", err)
|
log.Errorf("failed requestopenchannel: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -172,33 +180,35 @@ type alicebot struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *alicebot) SendMessage(message string) {
|
func (this *alicebot) SendMessage(message string) {
|
||||||
log.Printf("[alice] sending...")
|
log.Infof("[alice] sending...")
|
||||||
this.rc.Do(func() error {
|
this.rc.Do(func() error {
|
||||||
channel := this.rc.Channel("im.ricochet.chat", channels.Outbound)
|
channel := this.rc.Channel("im.ricochet.chat", channels.Outbound)
|
||||||
if channel != nil {
|
if channel != nil {
|
||||||
peerchannel, ok := channel.Handler.(*channels.ChatChannel)
|
peerchannel, ok := channel.Handler.(*channels.ChatChannel)
|
||||||
if ok {
|
if ok {
|
||||||
log.Printf("[alice] sending '%s' to echobot", message)
|
log.Infof("[alice] sending '%s' to echobot", message)
|
||||||
this.messages[peerchannel.SendMessage(message)] = message
|
this.messages[peerchannel.SendMessage(message)] = message
|
||||||
} else {
|
} else {
|
||||||
log.Fatalf("couldn't cast channel:")
|
log.Errorf("couldn't cast channel:")
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Fatalf("couldn't create channel")
|
log.Errorf("couldn't create channel")
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *alicebot) OpenInbound() {
|
func (this *alicebot) OpenInbound() {
|
||||||
log.Printf("[alice] inbound connection established")
|
log.Infof("[alice] inbound connection established")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *alicebot) ChatMessage(messageID uint32, when time.Time, message string) bool {
|
func (this *alicebot) ChatMessage(messageID uint32, when time.Time, message string) bool {
|
||||||
log.Printf("[alice] got message from echobot: %s", message)
|
log.Infof("[alice] got message from echobot: %s", message)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *alicebot) ChatMessageAck(messageID uint32, accepted bool) {
|
func (this *alicebot) ChatMessageAck(messageID uint32, accepted bool) {
|
||||||
log.Printf("[alice] message \"%s\" ack'd", this.messages[messageID])
|
log.Infof("[alice] message \"%s\" ack'd", this.messages[messageID])
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,19 +4,22 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/base32"
|
"encoding/base32"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/application"
|
"git.openprivacy.ca/openprivacy/libricochet-go/application"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"golang.org/x/crypto/ed25519"
|
"golang.org/x/crypto/ed25519"
|
||||||
"log"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
// An example of how to setup a v3 onion service in go
|
// An example of how to setup a v3 onion service in go
|
||||||
func main() {
|
func main() {
|
||||||
|
log.SetLevel(log.LevelInfo)
|
||||||
tm, err := connectivity.StartTor(".", "")
|
tm, err := connectivity.StartTor(".", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Panicf("Unable to start Tor: %v", err)
|
log.Errorf("Unable to start Tor: %v", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
defer tm.Close()
|
defer tm.Close()
|
||||||
|
|
||||||
|
@ -24,8 +27,8 @@ func main() {
|
||||||
onion, err := tm.Listen(cprivk, application.RicochetPort)
|
onion, err := tm.Listen(cprivk, application.RicochetPort)
|
||||||
utils.CheckError(err)
|
utils.CheckError(err)
|
||||||
defer onion.Close()
|
defer onion.Close()
|
||||||
log.Printf("Got Listener %v", onion.AddressFull())
|
log.Infof("Got Listener %v", onion.AddressFull())
|
||||||
decodedPub, err := base32.StdEncoding.DecodeString(strings.ToUpper(onion.AddressIdentity()))
|
decodedPub, err := base32.StdEncoding.DecodeString(strings.ToUpper(onion.AddressIdentity()))
|
||||||
log.Printf("Decoded Public Key: %x %v", decodedPub[:32], err)
|
log.Infof("Decoded Public Key: %x %v", decodedPub[:32], err)
|
||||||
log.Printf("ed25519 Public Key: %x", cpubk)
|
log.Infof("ed25519 Public Key: %x", cpubk)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/identity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/identity"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/wire/auth/3edh"
|
"git.openprivacy.ca/openprivacy/libricochet-go/wire/auth/3edh"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
||||||
|
@ -13,7 +14,6 @@ import (
|
||||||
"golang.org/x/crypto/nacl/secretbox"
|
"golang.org/x/crypto/nacl/secretbox"
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
"log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Server3DHAuthChannel wraps implementation of im.ricochet.auth.hidden-service"
|
// Server3DHAuthChannel wraps implementation of im.ricochet.auth.hidden-service"
|
||||||
|
@ -62,7 +62,7 @@ func (ah *Server3DHAuthChannel) Closed(err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenInbound is the first method called for an inbound channel request.
|
// OpenInbound is the first method called for an inbound channel request.
|
||||||
// If an error is returned, the channel is rejected. If a RawMessage is
|
// Infof an error is returned, the channel is rejected. Infof a RawMessage is
|
||||||
// returned, it will be sent as the ChannelResult message.
|
// returned, it will be sent as the ChannelResult message.
|
||||||
// Remote -> [Open Authentication Channel] -> Local
|
// Remote -> [Open Authentication Channel] -> Local
|
||||||
func (ah *Server3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Protocol_Data_Control.OpenChannel) ([]byte, error) {
|
func (ah *Server3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Protocol_Data_Control.OpenChannel) ([]byte, error) {
|
||||||
|
@ -76,7 +76,7 @@ func (ah *Server3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Proto
|
||||||
ah.clientEphmeralPublicKey = ed25519.PublicKey(clientEphmeralPublicKeyBytes[:])
|
ah.clientEphmeralPublicKey = ed25519.PublicKey(clientEphmeralPublicKeyBytes[:])
|
||||||
|
|
||||||
clientHostname := utils.GetTorV3Hostname(clientPubKeyBytes)
|
clientHostname := utils.GetTorV3Hostname(clientPubKeyBytes)
|
||||||
log.Printf("Received inbound auth 3DH request from %v", clientHostname)
|
log.Debugf("Received inbound auth 3DH request from %v", clientHostname)
|
||||||
|
|
||||||
// Generate Ephemeral Keys
|
// Generate Ephemeral Keys
|
||||||
pubkey, privkey, _ := ed25519.GenerateKey(rand.Reader)
|
pubkey, privkey, _ := ed25519.GenerateKey(rand.Reader)
|
||||||
|
@ -93,7 +93,7 @@ func (ah *Server3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Proto
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenOutbound is the first method called for an outbound channel request.
|
// OpenOutbound is the first method called for an outbound channel request.
|
||||||
// If an error is returned, the channel is not opened. If a RawMessage is
|
// Infof an error is returned, the channel is not opened. Infof a RawMessage is
|
||||||
// returned, it will be sent as the OpenChannel message.
|
// returned, it will be sent as the OpenChannel message.
|
||||||
// Local -> [Open Authentication Channel] -> Remote
|
// Local -> [Open Authentication Channel] -> Remote
|
||||||
func (ah *Server3DHAuthChannel) OpenOutbound(channel *channels.Channel) ([]byte, error) {
|
func (ah *Server3DHAuthChannel) OpenOutbound(channel *channels.Channel) ([]byte, error) {
|
||||||
|
@ -101,7 +101,7 @@ func (ah *Server3DHAuthChannel) OpenOutbound(channel *channels.Channel) ([]byte,
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenOutboundResult is called when a response is received for an
|
// OpenOutboundResult is called when a response is received for an
|
||||||
// outbound OpenChannel request. If `err` is non-nil, the channel was
|
// outbound OpenChannel request. Infof `err` is non-nil, the channel was
|
||||||
// rejected and Closed will be called immediately afterwards. `raw`
|
// rejected and Closed will be called immediately afterwards. `raw`
|
||||||
// contains the raw protocol message including any extension data.
|
// contains the raw protocol message including any extension data.
|
||||||
// Input: Remote -> [ChannelResult] -> {Client}
|
// Input: Remote -> [ChannelResult] -> {Client}
|
||||||
|
@ -152,7 +152,7 @@ func (ah *Server3DHAuthChannel) Packet(data []byte) {
|
||||||
if ok && string(decrypted) == "Hello World" {
|
if ok && string(decrypted) == "Hello World" {
|
||||||
allowed, known := ah.ServerAuthValid(utils.GetTorV3Hostname(ah.clientPubKey), ah.clientPubKey)
|
allowed, known := ah.ServerAuthValid(utils.GetTorV3Hostname(ah.clientPubKey), ah.clientPubKey)
|
||||||
ah.channel.DelegateAuthorization()
|
ah.channel.DelegateAuthorization()
|
||||||
log.Printf("3DH Session Decrypted OK. Authenticating Connection!")
|
log.Debugf("3DH Session Decrypted OK. Authenticating Connection!")
|
||||||
messageBuilder := new(utils.MessageBuilder)
|
messageBuilder := new(utils.MessageBuilder)
|
||||||
result := messageBuilder.AuthResult3DH(allowed, known)
|
result := messageBuilder.AuthResult3DH(allowed, known)
|
||||||
ah.channel.SendMessage(result)
|
ah.channel.SendMessage(result)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/identity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/identity"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/wire/auth/3edh"
|
"git.openprivacy.ca/openprivacy/libricochet-go/wire/auth/3edh"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
||||||
|
@ -14,7 +15,6 @@ import (
|
||||||
"golang.org/x/crypto/pbkdf2"
|
"golang.org/x/crypto/pbkdf2"
|
||||||
"golang.org/x/crypto/sha3"
|
"golang.org/x/crypto/sha3"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client3DHAuthChannel wraps implementation of im.ricochet.auth.hidden-service"
|
// Client3DHAuthChannel wraps implementation of im.ricochet.auth.hidden-service"
|
||||||
|
@ -60,7 +60,7 @@ func (ah *Client3DHAuthChannel) Closed(err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenInbound is the first method called for an inbound channel request.
|
// OpenInbound is the first method called for an inbound channel request.
|
||||||
// If an error is returned, the channel is rejected. If a RawMessage is
|
// Infof an error is returned, the channel is rejected. Infof a RawMessage is
|
||||||
// returned, it will be sent as the ChannelResult message.
|
// returned, it will be sent as the ChannelResult message.
|
||||||
// Remote -> [Open Authentication Channel] -> Local
|
// Remote -> [Open Authentication Channel] -> Local
|
||||||
func (ah *Client3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Protocol_Data_Control.OpenChannel) ([]byte, error) {
|
func (ah *Client3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Protocol_Data_Control.OpenChannel) ([]byte, error) {
|
||||||
|
@ -68,13 +68,13 @@ func (ah *Client3DHAuthChannel) OpenInbound(channel *channels.Channel, oc *Proto
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenOutbound is the first method called for an outbound channel request.
|
// OpenOutbound is the first method called for an outbound channel request.
|
||||||
// If an error is returned, the channel is not opened. If a RawMessage is
|
// Infof an error is returned, the channel is not opened. Infof a RawMessage is
|
||||||
// returned, it will be sent as the OpenChannel message.
|
// returned, it will be sent as the OpenChannel message.
|
||||||
// Local -> [Open Authentication Channel] -> Remote
|
// Local -> [Open Authentication Channel] -> Remote
|
||||||
func (ah *Client3DHAuthChannel) OpenOutbound(channel *channels.Channel) ([]byte, error) {
|
func (ah *Client3DHAuthChannel) OpenOutbound(channel *channels.Channel) ([]byte, error) {
|
||||||
ah.channel = channel
|
ah.channel = channel
|
||||||
|
|
||||||
log.Printf("Opening an outbound connection to %v", ah.ServerHostname)
|
log.Debugf("Opening an outbound connection to %v", ah.ServerHostname)
|
||||||
|
|
||||||
// Generate Ephemeral Keys
|
// Generate Ephemeral Keys
|
||||||
pubkey, privkey, _ := ed25519.GenerateKey(rand.Reader)
|
pubkey, privkey, _ := ed25519.GenerateKey(rand.Reader)
|
||||||
|
@ -92,7 +92,7 @@ func (ah *Client3DHAuthChannel) OpenOutbound(channel *channels.Channel) ([]byte,
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenOutboundResult is called when a response is received for an
|
// OpenOutboundResult is called when a response is received for an
|
||||||
// outbound OpenChannel request. If `err` is non-nil, the channel was
|
// outbound OpenChannel request. Infof `err` is non-nil, the channel was
|
||||||
// rejected and Closed will be called immediately afterwards. `raw`
|
// rejected and Closed will be called immediately afterwards. `raw`
|
||||||
// contains the raw protocol message including any extension data.
|
// contains the raw protocol message including any extension data.
|
||||||
// Input: Remote -> [ChannelResult] -> {Client}
|
// Input: Remote -> [ChannelResult] -> {Client}
|
||||||
|
@ -113,7 +113,7 @@ func (ah *Client3DHAuthChannel) OpenOutboundResult(err error, crm *Protocol_Data
|
||||||
serverEphmeralPublicKeyBytes := serverEphemeralPublicKey.([]byte)
|
serverEphmeralPublicKeyBytes := serverEphemeralPublicKey.([]byte)
|
||||||
ah.serverEphemeralPublicKey = ed25519.PublicKey(serverEphmeralPublicKeyBytes[:])
|
ah.serverEphemeralPublicKey = ed25519.PublicKey(serverEphmeralPublicKeyBytes[:])
|
||||||
|
|
||||||
log.Printf("Public Keys Exchanged. Deriving Encryption Keys and Sending Encrypted Test Message")
|
log.Debugf("Public Keys Exchanged. Deriving Encryption Keys and Sending Encrypted Test Message")
|
||||||
|
|
||||||
// Server Ephemeral <-> Client Identity
|
// Server Ephemeral <-> Client Identity
|
||||||
secret1 := utils.EDH(ah.clientEphemeralPrivateKey, ah.serverPubKey)
|
secret1 := utils.EDH(ah.clientEphemeralPrivateKey, ah.serverPubKey)
|
||||||
|
@ -159,7 +159,7 @@ func (ah *Client3DHAuthChannel) Packet(data []byte) {
|
||||||
if res.GetResult() != nil {
|
if res.GetResult() != nil {
|
||||||
ah.ClientAuthResult(res.GetResult().GetAccepted(), res.GetResult().GetIsKnownContact())
|
ah.ClientAuthResult(res.GetResult().GetAccepted(), res.GetResult().GetIsKnownContact())
|
||||||
if res.GetResult().GetAccepted() {
|
if res.GetResult().GetAccepted() {
|
||||||
log.Printf("3DH Session Accepted OK. Authenticated! Connection!")
|
log.Debugf("3DH Session Accepted OK. Authenticated! Connection!")
|
||||||
ah.channel.DelegateAuthorization()
|
ah.channel.DelegateAuthorization()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -4,11 +4,11 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
||||||
"github.com/golang/protobuf/proto"
|
"github.com/golang/protobuf/proto"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -31,7 +31,6 @@ type Connection struct {
|
||||||
unlockResponseChannel chan bool
|
unlockResponseChannel chan bool
|
||||||
|
|
||||||
messageBuilder utils.MessageBuilder
|
messageBuilder utils.MessageBuilder
|
||||||
trace bool
|
|
||||||
|
|
||||||
closed bool
|
closed bool
|
||||||
closing bool
|
closing bool
|
||||||
|
@ -88,13 +87,6 @@ func NewOutboundConnection(conn io.ReadWriteCloser, remoteHostname string) *Conn
|
||||||
return rc
|
return rc
|
||||||
}
|
}
|
||||||
|
|
||||||
// TraceLog turns on debug logging, you shouldn't need to do this but if for some
|
|
||||||
// reason ricochet isn't working, you can use this to see at what point in the
|
|
||||||
// protcol trace ricochet is failing.
|
|
||||||
func (rc *Connection) TraceLog(enabled bool) {
|
|
||||||
rc.trace = enabled
|
|
||||||
}
|
|
||||||
|
|
||||||
// start
|
// start
|
||||||
func (rc *Connection) start() {
|
func (rc *Connection) start() {
|
||||||
for {
|
for {
|
||||||
|
@ -146,11 +138,11 @@ func (rc *Connection) Do(do func() error) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force process to soft-break so we can lock
|
// Force process to soft-break so we can lock
|
||||||
rc.traceLog("request unlocking of process loop for do()")
|
log.Degubln("request unlocking of process loop for do()")
|
||||||
rc.unlockChannel <- true
|
rc.unlockChannel <- true
|
||||||
rc.traceLog("process loop is unlocked for do()")
|
log.Degubln("process loop is unlocked for do()")
|
||||||
defer func() {
|
defer func() {
|
||||||
rc.traceLog("giving up lock process loop after do() ")
|
log.Degubln("giving up lock process loop after do() ")
|
||||||
rc.unlockResponseChannel <- true
|
rc.unlockResponseChannel <- true
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -177,18 +169,18 @@ func (rc *Connection) DoContext(ctx context.Context, do func(context.Context) er
|
||||||
}
|
}
|
||||||
|
|
||||||
// Force process to soft-break so we can lock
|
// Force process to soft-break so we can lock
|
||||||
rc.traceLog("request unlocking of process loop for do()")
|
log.Degubln("request unlocking of process loop for do()")
|
||||||
select {
|
select {
|
||||||
case rc.unlockChannel <- true:
|
case rc.unlockChannel <- true:
|
||||||
break
|
break
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
rc.traceLog("giving up on unlocking process loop for do() because context cancelled")
|
log.Degubln("giving up on unlocking process loop for do() because context cancelled")
|
||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
rc.traceLog("process loop is unlocked for do()")
|
log.Degubln("process loop is unlocked for do()")
|
||||||
defer func() {
|
defer func() {
|
||||||
rc.traceLog("giving up lock process loop after do() ")
|
log.Degubln("giving up lock process loop after do() ")
|
||||||
rc.unlockResponseChannel <- true
|
rc.unlockResponseChannel <- true
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@ -203,7 +195,7 @@ func (rc *Connection) DoContext(ctx context.Context, do func(context.Context) er
|
||||||
// are not met on the local side (a nil error return does not mean the
|
// are not met on the local side (a nil error return does not mean the
|
||||||
// channel was opened successfully, because channels open asynchronously).
|
// channel was opened successfully, because channels open asynchronously).
|
||||||
func (rc *Connection) RequestOpenChannel(ctype string, handler channels.Handler) (*channels.Channel, error) {
|
func (rc *Connection) RequestOpenChannel(ctype string, handler channels.Handler) (*channels.Channel, error) {
|
||||||
rc.traceLog(fmt.Sprintf("requesting open channel of type %s", ctype))
|
log.Degubln(fmt.Sprintf("requesting open channel of type %s", ctype))
|
||||||
channel, err := rc.buildChannel(handler, rc.channelManager.OpenChannelRequest)
|
channel, err := rc.buildChannel(handler, rc.channelManager.OpenChannelRequest)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
response, err := handler.OpenOutbound(channel)
|
response, err := handler.OpenOutbound(channel)
|
||||||
|
@ -217,7 +209,7 @@ func (rc *Connection) handleChannelOpening(channel *channels.Channel, response [
|
||||||
rc.SendRicochetPacket(rc.Conn, 0, response)
|
rc.SendRicochetPacket(rc.Conn, 0, response)
|
||||||
return channel, nil
|
return channel, nil
|
||||||
}
|
}
|
||||||
rc.traceLog(fmt.Sprintf("failed to request open channel: %v", err))
|
log.Degubln(fmt.Sprintf("failed to request open channel: %v", err))
|
||||||
rc.channelManager.RemoveChannel(channel.ID)
|
rc.channelManager.RemoveChannel(channel.ID)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -271,12 +263,12 @@ func (rc *Connection) processUserCallback(cb func()) {
|
||||||
// including connection close.
|
// including connection close.
|
||||||
//
|
//
|
||||||
// Process blocks until the connection is closed or until Break() is called.
|
// Process blocks until the connection is closed or until Break() is called.
|
||||||
// If the connection is closed, a non-nil error is returned.
|
// Infof the connection is closed, a non-nil error is returned.
|
||||||
func (rc *Connection) Process(handler Handler) error {
|
func (rc *Connection) Process(handler Handler) error {
|
||||||
if rc.closed {
|
if rc.closed {
|
||||||
return utils.ConnectionClosedError
|
return utils.ConnectionClosedError
|
||||||
}
|
}
|
||||||
rc.traceLog("entering process loop")
|
log.Degubln("entering process loop")
|
||||||
rc.processUserCallback(func() { handler.OnReady(rc) })
|
rc.processUserCallback(func() { handler.OnReady(rc) })
|
||||||
|
|
||||||
// There are exactly two ways out of this loop: a signal on breakChannel
|
// There are exactly two ways out of this loop: a signal on breakChannel
|
||||||
|
@ -296,7 +288,7 @@ func (rc *Connection) Process(handler Handler) error {
|
||||||
<-rc.unlockResponseChannel
|
<-rc.unlockResponseChannel
|
||||||
continue
|
continue
|
||||||
case <-rc.breakChannel:
|
case <-rc.breakChannel:
|
||||||
rc.traceLog("process has ended after break")
|
log.Degubln("process has ended after break")
|
||||||
rc.breakResultChannel <- nil
|
rc.breakResultChannel <- nil
|
||||||
return nil
|
return nil
|
||||||
case packet = <-rc.packetChannel:
|
case packet = <-rc.packetChannel:
|
||||||
|
@ -341,7 +333,7 @@ func (rc *Connection) Process(handler Handler) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
if packet.Channel == 0 {
|
if packet.Channel == 0 {
|
||||||
rc.traceLog(fmt.Sprintf("received control packet on channel %d", packet.Channel))
|
log.Degubln(fmt.Sprintf("received control packet on channel %d", packet.Channel))
|
||||||
res := new(Protocol_Data_Control.Packet)
|
res := new(Protocol_Data_Control.Packet)
|
||||||
err := proto.Unmarshal(packet.Data[:], res)
|
err := proto.Unmarshal(packet.Data[:], res)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
@ -354,11 +346,11 @@ func (rc *Connection) Process(handler Handler) error {
|
||||||
channel, found := rc.channelManager.GetChannel(packet.Channel)
|
channel, found := rc.channelManager.GetChannel(packet.Channel)
|
||||||
if found {
|
if found {
|
||||||
if len(packet.Data) == 0 {
|
if len(packet.Data) == 0 {
|
||||||
rc.traceLog(fmt.Sprintf("removing channel %d", packet.Channel))
|
log.Degubln(fmt.Sprintf("removing channel %d", packet.Channel))
|
||||||
rc.channelManager.RemoveChannel(packet.Channel)
|
rc.channelManager.RemoveChannel(packet.Channel)
|
||||||
rc.processUserCallback(func() { channel.Handler.Closed(utils.ChannelClosedByPeerError) })
|
rc.processUserCallback(func() { channel.Handler.Closed(utils.ChannelClosedByPeerError) })
|
||||||
} else {
|
} else {
|
||||||
rc.traceLog(fmt.Sprintf("received packet on %v channel %d", channel.Handler.Type(), packet.Channel))
|
log.Degubln(fmt.Sprintf("received packet on %v channel %d", channel.Handler.Type(), packet.Channel))
|
||||||
// Send The Ricochet Packet to the Handler
|
// Send The Ricochet Packet to the Handler
|
||||||
rc.processUserCallback(func() { channel.Handler.Packet(packet.Data[:]) })
|
rc.processUserCallback(func() { channel.Handler.Packet(packet.Data[:]) })
|
||||||
}
|
}
|
||||||
|
@ -366,7 +358,7 @@ func (rc *Connection) Process(handler Handler) error {
|
||||||
// When a non-zero packet is received for an unknown
|
// When a non-zero packet is received for an unknown
|
||||||
// channel, the recipient responds by closing
|
// channel, the recipient responds by closing
|
||||||
// that channel.
|
// that channel.
|
||||||
rc.traceLog(fmt.Sprintf("received packet on unknown channel %d. closing.", packet.Channel))
|
log.Degubln(fmt.Sprintf("received packet on unknown channel %d. closing.", packet.Channel))
|
||||||
if len(packet.Data) != 0 {
|
if len(packet.Data) != 0 {
|
||||||
rc.SendRicochetPacket(rc.Conn, packet.Channel, []byte{})
|
rc.SendRicochetPacket(rc.Conn, packet.Channel, []byte{})
|
||||||
}
|
}
|
||||||
|
@ -403,7 +395,7 @@ func (rc *Connection) controlPacket(handler Handler, res *Protocol_Data_Control.
|
||||||
}
|
}
|
||||||
// Send Error Packet
|
// Send Error Packet
|
||||||
response := rc.messageBuilder.RejectOpenChannel(opm.GetChannelIdentifier(), errorText)
|
response := rc.messageBuilder.RejectOpenChannel(opm.GetChannelIdentifier(), errorText)
|
||||||
rc.traceLog(fmt.Sprintf("sending reject open channel for %v: %v", opm.GetChannelIdentifier(), errorText))
|
log.Degubln(fmt.Sprintf("sending reject open channel for %v: %v", opm.GetChannelIdentifier(), errorText))
|
||||||
rc.SendRicochetPacket(rc.Conn, 0, response)
|
rc.SendRicochetPacket(rc.Conn, 0, response)
|
||||||
|
|
||||||
} else if res.GetChannelResult() != nil {
|
} else if res.GetChannelResult() != nil {
|
||||||
|
@ -412,20 +404,20 @@ func (rc *Connection) controlPacket(handler Handler, res *Protocol_Data_Control.
|
||||||
// XXX Though not currently part of the protocol
|
// XXX Though not currently part of the protocol
|
||||||
// We should likely put these calls behind
|
// We should likely put these calls behind
|
||||||
// authentication.
|
// authentication.
|
||||||
rc.traceLog("received keep alive packet")
|
log.Degubln("received keep alive packet")
|
||||||
respond, data := rc.ctrlChannel.ProcessKeepAlive(res.GetKeepAlive())
|
respond, data := rc.ctrlChannel.ProcessKeepAlive(res.GetKeepAlive())
|
||||||
if respond {
|
if respond {
|
||||||
rc.traceLog("sending keep alive response")
|
log.Degubln("sending keep alive response")
|
||||||
rc.SendRicochetPacket(rc.Conn, 0, data)
|
rc.SendRicochetPacket(rc.Conn, 0, data)
|
||||||
}
|
}
|
||||||
} else if res.GetEnableFeatures() != nil {
|
} else if res.GetEnableFeatures() != nil {
|
||||||
rc.traceLog("received enable features packet")
|
log.Degubln("received enable features packet")
|
||||||
data := rc.ctrlChannel.ProcessEnableFeatures(handler, res.GetEnableFeatures())
|
data := rc.ctrlChannel.ProcessEnableFeatures(handler, res.GetEnableFeatures())
|
||||||
rc.traceLog(fmt.Sprintf("sending featured enabled: %v", data))
|
log.Degubln(fmt.Sprintf("sending featured enabled: %v", data))
|
||||||
rc.SendRicochetPacket(rc.Conn, 0, data)
|
rc.SendRicochetPacket(rc.Conn, 0, data)
|
||||||
} else if res.GetFeaturesEnabled() != nil {
|
} else if res.GetFeaturesEnabled() != nil {
|
||||||
rc.SupportChannels = res.GetFeaturesEnabled().GetFeature()
|
rc.SupportChannels = res.GetFeaturesEnabled().GetFeature()
|
||||||
rc.traceLog(fmt.Sprintf("connection supports: %v", rc.SupportChannels))
|
log.Degubln(fmt.Sprintf("connection supports: %v", rc.SupportChannels))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -437,14 +429,6 @@ func (rc *Connection) EnableFeatures(features []string) {
|
||||||
rc.SendRicochetPacket(rc.Conn, 0, raw)
|
rc.SendRicochetPacket(rc.Conn, 0, raw)
|
||||||
}
|
}
|
||||||
|
|
||||||
// traceLog is an internal function which only logs messages
|
|
||||||
// if the connection is configured to log.
|
|
||||||
func (rc *Connection) traceLog(message string) {
|
|
||||||
if rc.trace {
|
|
||||||
log.Printf(message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Break causes Process() to return, but does not close the underlying connection
|
// Break causes Process() to return, but does not close the underlying connection
|
||||||
// Break returns an error if it would not be valid to call Process() again for
|
// Break returns an error if it would not be valid to call Process() again for
|
||||||
// the connection now. Currently, the only such error is ConnectionClosedError.
|
// the connection now. Currently, the only such error is ConnectionClosedError.
|
||||||
|
@ -455,10 +439,10 @@ func (rc *Connection) Break() error {
|
||||||
rc.processBlockMutex.Lock()
|
rc.processBlockMutex.Lock()
|
||||||
defer rc.processBlockMutex.Unlock()
|
defer rc.processBlockMutex.Unlock()
|
||||||
if rc.closed {
|
if rc.closed {
|
||||||
rc.traceLog("ignoring break because connection is already closed")
|
log.Degubln("ignoring break because connection is already closed")
|
||||||
return utils.ConnectionClosedError
|
return utils.ConnectionClosedError
|
||||||
}
|
}
|
||||||
rc.traceLog("breaking out of process loop")
|
log.Degubln("breaking out of process loop")
|
||||||
rc.breakChannel <- true
|
rc.breakChannel <- true
|
||||||
return <-rc.breakResultChannel // Wait for Process to End
|
return <-rc.breakResultChannel // Wait for Process to End
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,6 @@ func TestProcessAuthAsServer(t *testing.T) {
|
||||||
cconn, _ := net.Dial("tcp", ln.Addr().String())
|
cconn, _ := net.Dial("tcp", ln.Addr().String())
|
||||||
|
|
||||||
orc := NewOutboundConnection(cconn, "kwke2hntvyfqm7dr")
|
orc := NewOutboundConnection(cconn, "kwke2hntvyfqm7dr")
|
||||||
orc.TraceLog(true)
|
|
||||||
privateKey, _ := utils.LoadPrivateKeyFromFile("../testing/private_key")
|
privateKey, _ := utils.LoadPrivateKeyFromFile("../testing/private_key")
|
||||||
|
|
||||||
known, err := HandleOutboundConnection(orc).ProcessAuthAsClient(identity.Initialize("", privateKey))
|
known, err := HandleOutboundConnection(orc).ProcessAuthAsClient(identity.Initialize("", privateKey))
|
||||||
|
@ -65,7 +64,6 @@ func TestProcessAuthAs3DHServer(t *testing.T) {
|
||||||
|
|
||||||
hostname := utils.GetTorV3Hostname(pub)
|
hostname := utils.GetTorV3Hostname(pub)
|
||||||
orc := NewOutboundConnection(cconn, hostname)
|
orc := NewOutboundConnection(cconn, hostname)
|
||||||
orc.TraceLog(true)
|
|
||||||
|
|
||||||
known, err := HandleOutboundConnection(orc).ProcessAuthAsV3Client(identity.InitializeV3("", &cpriv, &cpub))
|
known, err := HandleOutboundConnection(orc).ProcessAuthAsV3Client(identity.InitializeV3("", &cpriv, &cpub))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -100,7 +98,6 @@ func TestProcessAuthAsV3ServerFail(t *testing.T) {
|
||||||
// Setting the RemoteHostname to the client pub key approximates a server sending the wrong public key.
|
// Setting the RemoteHostname to the client pub key approximates a server sending the wrong public key.
|
||||||
hostname := utils.GetTorV3Hostname(cpub)
|
hostname := utils.GetTorV3Hostname(cpub)
|
||||||
orc := NewOutboundConnection(cconn, hostname)
|
orc := NewOutboundConnection(cconn, hostname)
|
||||||
orc.TraceLog(true)
|
|
||||||
|
|
||||||
HandleOutboundConnection(orc).ProcessAuthAsV3Client(identity.InitializeV3("", &cpriv, &cpub))
|
HandleOutboundConnection(orc).ProcessAuthAsV3Client(identity.InitializeV3("", &cpriv, &cpub))
|
||||||
}()
|
}()
|
||||||
|
@ -129,7 +126,6 @@ func TestProcessAuthAsV3ClientFail(t *testing.T) {
|
||||||
|
|
||||||
hostname := utils.GetTorV3Hostname(pub)
|
hostname := utils.GetTorV3Hostname(pub)
|
||||||
orc := NewOutboundConnection(cconn, hostname)
|
orc := NewOutboundConnection(cconn, hostname)
|
||||||
orc.TraceLog(true)
|
|
||||||
|
|
||||||
HandleOutboundConnection(orc).ProcessAuthAsV3Client(identity.InitializeV3("", &cpriv, &cpub))
|
HandleOutboundConnection(orc).ProcessAuthAsV3Client(identity.InitializeV3("", &cpriv, &cpub))
|
||||||
}()
|
}()
|
||||||
|
@ -173,7 +169,7 @@ func TestProcessAuthTimeout(t *testing.T) {
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
net.Dial("tcp", ln.Addr().String())
|
net.Dial("tcp", ln.Addr().String())
|
||||||
time.Sleep(16 * time.Second)
|
time.Sleep(17 * time.Second)
|
||||||
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,8 @@ package connection
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
"git.openprivacy.ca/openprivacy/libricochet-go/wire/control"
|
||||||
)
|
)
|
||||||
|
@ -27,11 +29,11 @@ func (ctrl *ControlChannel) ProcessChannelResult(cr *Protocol_Data_Control.Chann
|
||||||
}
|
}
|
||||||
|
|
||||||
if cr.GetOpened() {
|
if cr.GetOpened() {
|
||||||
//rc.traceLog(fmt.Sprintf("channel of type %v opened on %v", channel.Type, id))
|
log.Degubln(fmt.Sprintf("channel of type %v opened on %v", channel.Type, id))
|
||||||
channel.Handler.OpenOutboundResult(nil, cr)
|
channel.Handler.OpenOutboundResult(nil, cr)
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
//rc.traceLog(fmt.Sprintf("channel of type %v rejected on %v", channel.Type, id))
|
log.Degubln(fmt.Sprintf("channel of type %v rejected on %v", channel.Type, id))
|
||||||
channel.Handler.OpenOutboundResult(errors.New(cr.GetCommonError().String()), cr)
|
channel.Handler.OpenOutboundResult(errors.New(cr.GetCommonError().String()), cr)
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,10 @@ package connectivity
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"github.com/cretz/bine/control"
|
"github.com/cretz/bine/control"
|
||||||
"github.com/cretz/bine/tor"
|
"github.com/cretz/bine/tor"
|
||||||
"log"
|
|
||||||
"net"
|
"net"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"os"
|
"os"
|
||||||
|
@ -155,17 +155,17 @@ func StartTor(appDirectory string, bundledTorPath string) (ACN, error) {
|
||||||
tp := &torProvider{appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*onionListenService), breakChan: make(chan bool)}
|
tp := &torProvider{appDirectory: appDirectory, bundeledTorPath: bundledTorPath, childListeners: make(map[string]*onionListenService), breakChan: make(chan bool)}
|
||||||
|
|
||||||
// attempt connect to system tor
|
// attempt connect to system tor
|
||||||
log.Printf("dialing system tor control port\n")
|
log.Debugf("dialing system tor control port\n")
|
||||||
controlport, err := dialControlPort(9051)
|
controlport, err := dialControlPort(9051)
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
// TODO: configurable auth
|
// TODO: configurable auth
|
||||||
err := controlport.Authenticate("")
|
err := controlport.Authenticate("")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
log.Printf("connected to control port")
|
log.Degubln("connected to control port")
|
||||||
pinfo, err := controlport.ProtocolInfo()
|
pinfo, err := controlport.ProtocolInfo()
|
||||||
if err == nil && minTorVersionReqs(pinfo.TorVersion) {
|
if err == nil && minTorVersionReqs(pinfo.TorVersion) {
|
||||||
log.Println("OK version " + pinfo.TorVersion)
|
log.Degubln("OK version " + pinfo.TorVersion)
|
||||||
tp.t = createFromExisting(controlport, dataDir)
|
tp.t = createFromExisting(controlport, dataDir)
|
||||||
go tp.monitorRestart()
|
go tp.monitorRestart()
|
||||||
return tp, nil
|
return tp, nil
|
||||||
|
@ -182,15 +182,15 @@ func StartTor(appDirectory string, bundledTorPath string) (ACN, error) {
|
||||||
go tp.monitorRestart()
|
go tp.monitorRestart()
|
||||||
return tp, nil
|
return tp, nil
|
||||||
}
|
}
|
||||||
log.Printf("Error connecting to self-run system tor: %v\n", err)
|
log.Debugf("Error connecting to self-run system tor: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// try running bundledTor
|
// try running bundledTor
|
||||||
if bundledTorPath != "" && checkCmdlineTorVersion(bundledTorPath) {
|
if bundledTorPath != "" && checkCmdlineTorVersion(bundledTorPath) {
|
||||||
log.Println("using bundled tor '" + bundledTorPath + "'")
|
log.Degubln("using bundled tor '" + bundledTorPath + "'")
|
||||||
t, err := tor.Start(nil, &tor.StartConf{DataDir: dataDir, ExePath: bundledTorPath, DebugWriter: nil})
|
t, err := tor.Start(nil, &tor.StartConf{DataDir: dataDir, ExePath: bundledTorPath, DebugWriter: nil})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error running bundled tor: %v\n", err)
|
log.Debugf("Error running bundled tor: %v\n", err)
|
||||||
}
|
}
|
||||||
tp.t = t
|
tp.t = t
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
@ -270,7 +270,7 @@ func checkCmdlineTorVersion(torCmd string) bool {
|
||||||
out, err := cmd.CombinedOutput()
|
out, err := cmd.CombinedOutput()
|
||||||
re := regexp.MustCompile("[0-1]\\.[0-9]\\.[0-9]\\.[0-9]")
|
re := regexp.MustCompile("[0-1]\\.[0-9]\\.[0-9]\\.[0-9]")
|
||||||
sysTorVersion := re.Find(out)
|
sysTorVersion := re.Find(out)
|
||||||
log.Println("cmdline tor version: " + string(sysTorVersion))
|
log.Infoln("tor version: " + string(sysTorVersion))
|
||||||
return err == nil && minTorVersionReqs(string(sysTorVersion))
|
return err == nil && minTorVersionReqs(string(sysTorVersion))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +278,7 @@ func checkCmdlineTorVersion(torCmd string) bool {
|
||||||
// min requirment 0.3.5.x
|
// min requirment 0.3.5.x
|
||||||
func minTorVersionReqs(torversion string) bool {
|
func minTorVersionReqs(torversion string) bool {
|
||||||
torversions := strings.Split(torversion, ".") //eg: 0.3.4.8 or 0.3.5.1-alpha
|
torversions := strings.Split(torversion, ".") //eg: 0.3.4.8 or 0.3.5.1-alpha
|
||||||
log.Printf("torversions: %v", torversions)
|
log.Debugf("torversions: %v", torversions)
|
||||||
tva, _ := strconv.Atoi(torversions[0])
|
tva, _ := strconv.Atoi(torversions[0])
|
||||||
tvb, _ := strconv.Atoi(torversions[1])
|
tvb, _ := strconv.Atoi(torversions[1])
|
||||||
tvc, _ := strconv.Atoi(torversions[2])
|
tvc, _ := strconv.Atoi(torversions[2])
|
||||||
|
|
|
@ -0,0 +1,187 @@
|
||||||
|
package log
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
golog "log"
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Level indicates the level a log should be classified at
|
||||||
|
type Level int
|
||||||
|
|
||||||
|
// The possible levels a log can have
|
||||||
|
const (
|
||||||
|
LevelDebug Level = iota + 1
|
||||||
|
LevelInfo
|
||||||
|
LevelWarn
|
||||||
|
LevelError
|
||||||
|
)
|
||||||
|
|
||||||
|
var levelString = map[Level]string{LevelDebug: "[DBUG]", LevelInfo: "[INFO]", LevelWarn: "[WARN]", LevelError: "[ERR ]"}
|
||||||
|
|
||||||
|
// Logger is a go Logger wrapper that adds log levels and pattern filtering
|
||||||
|
// It allows high level 'log level' filtering broadly
|
||||||
|
// It allows allows two addition levels of filtering:
|
||||||
|
// everythingFrom which allows inclusion of packages/patterns along with general logging
|
||||||
|
// nothingExcept which allows focusing on just listed areas
|
||||||
|
type Logger struct {
|
||||||
|
logger *golog.Logger
|
||||||
|
level Level
|
||||||
|
nothingExceptPatterns []string
|
||||||
|
everythingFromPatterns []string
|
||||||
|
}
|
||||||
|
|
||||||
|
// New returns a new Logger with a filter set to the supplied level
|
||||||
|
func New(level Level) *Logger {
|
||||||
|
return &Logger{logger: golog.New(os.Stderr, "", golog.Ldate|golog.Ltime), level: level, everythingFromPatterns: make([]string, 0), nothingExceptPatterns: make([]string, 0)}
|
||||||
|
}
|
||||||
|
|
||||||
|
var std = New(LevelWarn)
|
||||||
|
|
||||||
|
// filter
|
||||||
|
func (l *Logger) filter(level Level) bool {
|
||||||
|
|
||||||
|
_, file, _, ok := runtime.Caller(3)
|
||||||
|
if !ok {
|
||||||
|
file = "???"
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pattern := range l.everythingFromPatterns {
|
||||||
|
if strings.Contains(file, pattern) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, pattern := range l.nothingExceptPatterns {
|
||||||
|
if strings.Contains(file, pattern) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(l.nothingExceptPatterns) > 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return l.aboveLevel(level)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Logger) aboveLevel(level Level) bool {
|
||||||
|
return level >= l.level
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetLevel adjusts the output filter by logging level
|
||||||
|
func (l *Logger) SetLevel(level Level) {
|
||||||
|
l.level = level
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddNothingExceptFilter enables strong filtering showing logs only for things on the approved list, adding this pattern to the list
|
||||||
|
func (l *Logger) AddNothingExceptFilter(pattern string) {
|
||||||
|
l.nothingExceptPatterns = append(l.nothingExceptPatterns, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddEverythingFromPattern adds a pattern to skip log level filtering, guaranteeing all logs matching hte pattern are seen
|
||||||
|
func (l *Logger) AddEverythingFromPattern(pattern string) {
|
||||||
|
l.everythingFromPatterns = append(l.everythingFromPatterns, pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Logger) header(level Level) string {
|
||||||
|
_, file, _, ok := runtime.Caller(3)
|
||||||
|
if !ok {
|
||||||
|
file = "???"
|
||||||
|
} else {
|
||||||
|
short := file
|
||||||
|
count := 0
|
||||||
|
for i := len(file) - 1; i > 0; i-- {
|
||||||
|
if file[i] == '/' {
|
||||||
|
short = file[i+1:]
|
||||||
|
count++
|
||||||
|
if count == 2 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file = short
|
||||||
|
}
|
||||||
|
return file + " " + levelString[level] + " "
|
||||||
|
}
|
||||||
|
|
||||||
|
// Printf outputs the format and variables, assuming it passes the filter levels
|
||||||
|
func (l *Logger) Printf(level Level, format string, v ...interface{}) {
|
||||||
|
if l.filter(level) {
|
||||||
|
l.logger.Output(3, l.header(level)+fmt.Sprintf(format, v...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Println outputs the variables assuming the filter levels are passed
|
||||||
|
func (l *Logger) Println(level Level, v ...interface{}) {
|
||||||
|
if l.filter(level) {
|
||||||
|
l.logger.Output(3, l.header(level)+fmt.Sprintln(v...))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetLevel changes the filtering level of the system logger
|
||||||
|
func SetLevel(level Level) {
|
||||||
|
std.SetLevel(level)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddNothingExceptFilter enables strong filtering showing logs only for things on the approved list, adding this pattern to the list
|
||||||
|
func AddNothingExceptFilter(pattern string) {
|
||||||
|
std.AddNothingExceptFilter(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddEverythingFromPattern adds a pattern to skip log level filtering, guaranteeing all logs matching hte pattern are seen
|
||||||
|
func AddEverythingFromPattern(pattern string) {
|
||||||
|
std.AddEverythingFromPattern(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Printf outputs the format with variables assuming it passes the filter level
|
||||||
|
func Printf(level Level, format string, v ...interface{}) {
|
||||||
|
std.Printf(level, format, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Println outputs the varibles assuming they pass the filter level
|
||||||
|
func Println(level Level, v ...interface{}) {
|
||||||
|
std.Println(level, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Debugf outputs the format and variables at the Debug level
|
||||||
|
func Debugf(format string, v ...interface{}) {
|
||||||
|
std.Printf(LevelDebug, format, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Infof outputs the format and variables at the Info level
|
||||||
|
func Infof(format string, v ...interface{}) {
|
||||||
|
std.Printf(LevelInfo, format, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warnf outputs the format and variables at the Warning level
|
||||||
|
func Warnf(format string, v ...interface{}) {
|
||||||
|
std.Printf(LevelWarn, format, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Errorf outputs the format and variables at the Error level
|
||||||
|
func Errorf(format string, v ...interface{}) {
|
||||||
|
std.Printf(LevelError, format, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Degubln outputs the variables at the Debug level
|
||||||
|
func Degubln(v ...interface{}) {
|
||||||
|
std.Println(LevelDebug, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Infoln outputs the variables at the Info level
|
||||||
|
func Infoln(v ...interface{}) {
|
||||||
|
std.Println(LevelInfo, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Warnln outputs the variables at the Warn level
|
||||||
|
func Warnln(v ...interface{}) {
|
||||||
|
std.Println(LevelWarn, v...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Errorln outputs the variables at the Error level
|
||||||
|
func Errorln(v ...interface{}) {
|
||||||
|
std.Println(LevelError, v...)
|
||||||
|
}
|
|
@ -6,8 +6,9 @@ import (
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
"git.openprivacy.ca/openprivacy/libricochet-go/channels"
|
||||||
"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"
|
||||||
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
"git.openprivacy.ca/openprivacy/libricochet-go/utils"
|
||||||
"log"
|
"os"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
"sync"
|
||||||
|
@ -53,7 +54,7 @@ type ChatEchoBot struct {
|
||||||
|
|
||||||
// We always want bidirectional chat channels
|
// We always want bidirectional chat channels
|
||||||
func (bot *ChatEchoBot) OpenInbound() {
|
func (bot *ChatEchoBot) OpenInbound() {
|
||||||
log.Println("OpenInbound() ChatChannel handler called...")
|
log.Infoln("OpenInbound() ChatChannel handler called...")
|
||||||
outboutChatChannel := bot.rai.Connection.Channel("im.ricochet.chat", channels.Outbound)
|
outboutChatChannel := bot.rai.Connection.Channel("im.ricochet.chat", channels.Outbound)
|
||||||
if outboutChatChannel == nil {
|
if outboutChatChannel == nil {
|
||||||
bot.rai.Connection.Do(func() error {
|
bot.rai.Connection.Do(func() error {
|
||||||
|
@ -67,7 +68,7 @@ func (bot *ChatEchoBot) OpenInbound() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bot *ChatEchoBot) ChatMessage(messageID uint32, when time.Time, message string) bool {
|
func (bot *ChatEchoBot) ChatMessage(messageID uint32, when time.Time, message string) bool {
|
||||||
log.Printf("ChatMessage(from: %v, %v", bot.rai.RemoteHostname, message)
|
log.Infof("ChatMessage(from: %v, %v", bot.rai.RemoteHostname, message)
|
||||||
bot.Messages.Add(bot.rai.RemoteHostname, bot.onion, message)
|
bot.Messages.Add(bot.rai.RemoteHostname, bot.onion, message)
|
||||||
SendMessage(bot.rai, strconv.Itoa(bot.n)+" witty response")
|
SendMessage(bot.rai, strconv.Itoa(bot.n)+" witty response")
|
||||||
bot.n += 1
|
bot.n += 1
|
||||||
|
@ -75,19 +76,19 @@ func (bot *ChatEchoBot) ChatMessage(messageID uint32, when time.Time, message st
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendMessage(rai *application.ApplicationInstance, message string) {
|
func SendMessage(rai *application.ApplicationInstance, message string) {
|
||||||
log.Printf("SendMessage(to: %v, %v)\n", rai.RemoteHostname, message)
|
log.Infof("SendMessage(to: %v, %v)\n", rai.RemoteHostname, message)
|
||||||
rai.Connection.Do(func() error {
|
rai.Connection.Do(func() error {
|
||||||
|
|
||||||
log.Printf("Finding Chat Channel")
|
log.Infof("Finding Chat Channel")
|
||||||
channel := rai.Connection.Channel("im.ricochet.chat", channels.Outbound)
|
channel := rai.Connection.Channel("im.ricochet.chat", channels.Outbound)
|
||||||
if channel != nil {
|
if channel != nil {
|
||||||
log.Printf("Found Chat Channel")
|
log.Infof("Found Chat Channel")
|
||||||
chatchannel, ok := channel.Handler.(*channels.ChatChannel)
|
chatchannel, ok := channel.Handler.(*channels.ChatChannel)
|
||||||
if ok {
|
if ok {
|
||||||
chatchannel.SendMessage(message)
|
chatchannel.SendMessage(message)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Printf("Could not find chat channel")
|
log.Infof("Could not find chat channel")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
@ -98,6 +99,7 @@ func (bot *ChatEchoBot) ChatMessageAck(messageID uint32, accepted bool) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestApplicationIntegration(t *testing.T) {
|
func TestApplicationIntegration(t *testing.T) {
|
||||||
|
log.SetLevel(log.LevelInfo)
|
||||||
startGoRoutines := runtime.NumGoroutine()
|
startGoRoutines := runtime.NumGoroutine()
|
||||||
|
|
||||||
acn, err := connectivity.StartTor(".", "")
|
acn, err := connectivity.StartTor(".", "")
|
||||||
|
@ -179,7 +181,7 @@ func TestApplicationIntegration(t *testing.T) {
|
||||||
alicei.Connection.Do(func() error {
|
alicei.Connection.Do(func() error {
|
||||||
handler, err := alicei.OnOpenChannelRequest("im.ricochet.chat")
|
handler, err := alicei.OnOpenChannelRequest("im.ricochet.chat")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Could not get chat handler!\n")
|
log.Infof("Could not get chat handler!\n")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = alicei.Connection.RequestOpenChannel("im.ricochet.chat", handler)
|
_, err = alicei.Connection.RequestOpenChannel("im.ricochet.chat", handler)
|
||||||
|
@ -191,7 +193,8 @@ func TestApplicationIntegration(t *testing.T) {
|
||||||
SendMessage(alicei, "Hello Bob!")
|
SendMessage(alicei, "Hello Bob!")
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal("Error dialing from Alice to Bob: ", err)
|
log.Errorf("Error dialing from Alice to Bob: ", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
time.Sleep(10 * time.Second)
|
time.Sleep(10 * time.Second)
|
||||||
|
|
Reference in New Issue