forked from cwtch.im/cwtch
Merge branch 'racefuzz' of cwtch.im/cwtch into master
This commit is contained in:
commit
9c718bb68c
|
@ -43,7 +43,7 @@ pipeline:
|
||||||
commands:
|
commands:
|
||||||
- ./tor -f ./torrc
|
- ./tor -f ./torrc
|
||||||
- sleep 15
|
- sleep 15
|
||||||
- go test -v cwtch.im/cwtch/testing
|
- go test -v cwtch.im/cwtch/testing/
|
||||||
notify-email:
|
notify-email:
|
||||||
image: drillster/drone-email
|
image: drillster/drone-email
|
||||||
host: build.openprivacy.ca
|
host: build.openprivacy.ca
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
"git.openprivacy.ca/openprivacy/libricochet-go/connectivity"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
"git.openprivacy.ca/openprivacy/libricochet-go/log"
|
||||||
"git.openprivacy.ca/openprivacy/libricochet-go/policies"
|
"git.openprivacy.ca/openprivacy/libricochet-go/policies"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,6 +19,7 @@ type networkCheck struct {
|
||||||
breakChan chan bool
|
breakChan chan bool
|
||||||
running bool
|
running bool
|
||||||
offline bool
|
offline bool
|
||||||
|
offlineLock sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewNetworkCheck returns a Plugin that when started will attempt various network tests
|
// NewNetworkCheck returns a Plugin that when started will attempt various network tests
|
||||||
|
@ -57,21 +59,25 @@ func (nc *networkCheck) run() {
|
||||||
case event.ServerStateChange:
|
case event.ServerStateChange:
|
||||||
// if we successfully connect / authenticated to a remote server / peer then we obviously have internet
|
// if we successfully connect / authenticated to a remote server / peer then we obviously have internet
|
||||||
connectionState := e.Data[event.ConnectionState]
|
connectionState := e.Data[event.ConnectionState]
|
||||||
|
nc.offlineLock.Lock()
|
||||||
if nc.offline && (connectionState == connections.ConnectionStateName[connections.AUTHENTICATED] || connectionState == connections.ConnectionStateName[connections.CONNECTED]) {
|
if nc.offline && (connectionState == connections.ConnectionStateName[connections.AUTHENTICATED] || connectionState == connections.ConnectionStateName[connections.CONNECTED]) {
|
||||||
lastMessageReceived = time.Now()
|
lastMessageReceived = time.Now()
|
||||||
nc.bus.Publish(event.NewEvent(event.NetworkStatus, map[event.Field]string{event.Error: "", event.Status: "Success"}))
|
nc.bus.Publish(event.NewEvent(event.NetworkStatus, map[event.Field]string{event.Error: "", event.Status: "Success"}))
|
||||||
nc.offline = false
|
nc.offline = false
|
||||||
}
|
}
|
||||||
|
nc.offlineLock.Unlock()
|
||||||
default:
|
default:
|
||||||
// if we receive either an encrypted group message or a peer acknowledgement we can assume the network
|
// if we receive either an encrypted group message or a peer acknowledgement we can assume the network
|
||||||
// is up and running (our onion service might still not be available, but we would aim to detect that
|
// is up and running (our onion service might still not be available, but we would aim to detect that
|
||||||
// through other actions
|
// through other actions
|
||||||
// we reset out timer
|
// we reset out timer
|
||||||
lastMessageReceived = time.Now()
|
lastMessageReceived = time.Now()
|
||||||
|
nc.offlineLock.Lock()
|
||||||
if nc.offline {
|
if nc.offline {
|
||||||
nc.bus.Publish(event.NewEvent(event.NetworkStatus, map[event.Field]string{event.Error: "", event.Status: "Success"}))
|
nc.bus.Publish(event.NewEvent(event.NetworkStatus, map[event.Field]string{event.Error: "", event.Status: "Success"}))
|
||||||
nc.offline = false
|
nc.offline = false
|
||||||
}
|
}
|
||||||
|
nc.offlineLock.Unlock()
|
||||||
}
|
}
|
||||||
case <-time.After(tickTime):
|
case <-time.After(tickTime):
|
||||||
// if we haven't received an action in the last minute...kick off a set of testing
|
// if we haven't received an action in the last minute...kick off a set of testing
|
||||||
|
@ -104,6 +110,8 @@ func (nc *networkCheck) checkConnection(onion string) {
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
|
nc.offlineLock.Lock()
|
||||||
|
defer nc.offlineLock.Unlock()
|
||||||
// regardless of the outcome we want to report a status to let anyone who might care know that we did do a check
|
// regardless of the outcome we want to report a status to let anyone who might care know that we did do a check
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf("publishing network error for %v", onion)
|
log.Debugf("publishing network error for %v", onion)
|
||||||
|
|
|
@ -40,6 +40,7 @@ type manager struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Manager is an interface for an event bus
|
// Manager is an interface for an event bus
|
||||||
|
// FIXME this interface lends itself to race conditions around channels
|
||||||
type Manager interface {
|
type Manager interface {
|
||||||
Subscribe(Type, Queue)
|
Subscribe(Type, Queue)
|
||||||
Publish(Event)
|
Publish(Event)
|
||||||
|
|
7
go.mod
7
go.mod
|
@ -2,20 +2,23 @@ module cwtch.im/cwtch
|
||||||
|
|
||||||
require (
|
require (
|
||||||
cwtch.im/tapir v0.1.11
|
cwtch.im/tapir v0.1.11
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.8
|
||||||
github.com/c-bata/go-prompt v0.2.3
|
github.com/c-bata/go-prompt v0.2.3
|
||||||
github.com/client9/misspell v0.3.4 // indirect
|
github.com/client9/misspell v0.3.4 // indirect
|
||||||
|
github.com/dvyukov/go-fuzz v0.0.0-20191022152526-8cb203812681 // indirect
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.0 // indirect
|
||||||
github.com/golang/protobuf v1.3.2
|
github.com/golang/protobuf v1.3.2
|
||||||
github.com/gordonklaus/ineffassign v0.0.0-20190601041439-ed7b1b5ee0f8 // indirect
|
github.com/gordonklaus/ineffassign v0.0.0-20190601041439-ed7b1b5ee0f8 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.2 // indirect
|
github.com/mattn/go-colorable v0.1.2 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.4 // indirect
|
github.com/mattn/go-runewidth v0.0.4 // indirect
|
||||||
github.com/mattn/go-tty v0.0.0-20190424173100-523744f04859 // indirect
|
github.com/mattn/go-tty v0.0.0-20190424173100-523744f04859 // indirect
|
||||||
github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 // indirect
|
github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 // indirect
|
||||||
|
github.com/stephens2424/writerset v1.0.2 // indirect
|
||||||
github.com/struCoder/pidusage v0.1.2
|
github.com/struCoder/pidusage v0.1.2
|
||||||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
|
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de // indirect
|
||||||
golang.org/x/net v0.0.0-20190628185345-da137c7871d7
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7
|
||||||
golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0 // indirect
|
golang.org/x/tools v0.0.0-20191108175616-46f5a7f28bf0 // indirect
|
||||||
)
|
)
|
||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
12
go.sum
12
go.sum
|
@ -6,6 +6,9 @@ git.openprivacy.ca/openprivacy/libricochet-go v1.0.4 h1:GWLMJ5jBSIC/gFXzdbbeVz7f
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.4/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.4/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6 h1:5o4K2qn3otEE1InC5v5CzU0yL7Wl7DhVp4s8H3K6mXY=
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6 h1:5o4K2qn3otEE1InC5v5CzU0yL7Wl7DhVp4s8H3K6mXY=
|
||||||
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.6/go.mod h1:yMSG1gBaP4f1U+RMZXN85d29D39OK5s8aTpyVRoH5FY=
|
||||||
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.8 h1:HVoyxfivFaEtkfO5K3piD6oq6MQB1qGF5IB2EYXeCW8=
|
||||||
|
git.openprivacy.ca/openprivacy/libricochet-go v1.0.8/go.mod h1:6I+vO9Aagv3/yUWv+e7A57H8tgXgR67FCjfSj9Pp970=
|
||||||
|
github.com/Julusian/godocdown v0.0.0-20170816220326-6d19f8ff2df8/go.mod h1:INZr5t32rG59/5xeltqoCJoNY7e5x/3xoY9WSWVWg74=
|
||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
|
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412 h1:w1UutsfOrms1J05zt7ISrnJIXKzwaspym5BTKGx93EI=
|
||||||
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
|
github.com/agl/ed25519 v0.0.0-20170116200512-5312a6153412/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
|
||||||
github.com/c-bata/go-prompt v0.2.3 h1:jjCS+QhG/sULBhAaBdjb2PlMRVaKXQgn+4yzaauvs2s=
|
github.com/c-bata/go-prompt v0.2.3 h1:jjCS+QhG/sULBhAaBdjb2PlMRVaKXQgn+4yzaauvs2s=
|
||||||
|
@ -16,6 +19,10 @@ github.com/cretz/bine v0.1.0 h1:1/fvhLE+fk0bPzjdO5Ci+0ComYxEMuB1JhM4X5skT3g=
|
||||||
github.com/cretz/bine v0.1.0/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw=
|
github.com/cretz/bine v0.1.0/go.mod h1:6PF6fWAvYtwjRGkAuDEJeWNOv3a2hUouSP/yRYXmvHw=
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dvyukov/go-fuzz v0.0.0-20191022152526-8cb203812681 h1:3WV5aRRj1ELP3RcLlBp/v0WJTuy47OQMkL9GIQq8QEE=
|
||||||
|
github.com/dvyukov/go-fuzz v0.0.0-20191022152526-8cb203812681/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw=
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.0 h1:G/bYguwHIzWq9ZoyUQqrjTmJbbYn3j3CKKpKinvZLFk=
|
||||||
|
github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
|
||||||
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||||
|
@ -34,6 +41,9 @@ github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942 h1:A7GG7zcGjl3jqAqGPmcNjd
|
||||||
github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
|
github.com/pkg/term v0.0.0-20190109203006-aa71e9d9e942/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/robertkrimen/godocdown v0.0.0-20130622164427-0bfa04905481/go.mod h1:C9WhFzY47SzYBIvzFqSvHIR6ROgDo4TtdTuRaOMjF/s=
|
||||||
|
github.com/stephens2424/writerset v1.0.2 h1:znRLgU6g8RS5euYRcy004XeE4W+Tu44kALzy7ghPif8=
|
||||||
|
github.com/stephens2424/writerset v1.0.2/go.mod h1:aS2JhsMn6eA7e82oNmW4rfsgAOp9COBTTl8mzkwADnc=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
@ -66,4 +76,6 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0 h1:+o3suEKE/4hCUt6qjV8SDcVZhz2dO8UWlHliCa+4bvg=
|
golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0 h1:+o3suEKE/4hCUt6qjV8SDcVZhz2dO8UWlHliCa+4bvg=
|
||||||
golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191031220737-6d8f1af9ccc0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191108175616-46f5a7f28bf0 h1:crJFnQNts8HmLQ4G+0O/30eU/J8peLNNKhX1jnzV58s=
|
||||||
|
golang.org/x/tools v0.0.0-20191108175616-46f5a7f28bf0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
|
|
@ -182,7 +182,9 @@ func (g *Group) EncryptMessage(message *protocol.DecryptedGroupMessage) ([]byte,
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
wire, err := proto.Marshal(message)
|
wire, err := proto.Marshal(message)
|
||||||
utils.CheckError(err)
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
encrypted := secretbox.Seal(nonce[:], []byte(wire), &nonce, &g.GroupKey)
|
encrypted := secretbox.Seal(nonce[:], []byte(wire), &nonce, &g.GroupKey)
|
||||||
return encrypted, nil
|
return encrypted, nil
|
||||||
}
|
}
|
||||||
|
@ -190,14 +192,16 @@ func (g *Group) EncryptMessage(message *protocol.DecryptedGroupMessage) ([]byte,
|
||||||
// DecryptMessage takes a ciphertext and returns true and the decrypted message if the
|
// DecryptMessage takes a ciphertext and returns true and the decrypted message if the
|
||||||
// cipher text can be successfully decrypted,else false.
|
// cipher text can be successfully decrypted,else false.
|
||||||
func (g *Group) DecryptMessage(ciphertext []byte) (bool, *protocol.DecryptedGroupMessage) {
|
func (g *Group) DecryptMessage(ciphertext []byte) (bool, *protocol.DecryptedGroupMessage) {
|
||||||
var decryptNonce [24]byte
|
if len(ciphertext) > 24 {
|
||||||
copy(decryptNonce[:], ciphertext[:24])
|
var decryptNonce [24]byte
|
||||||
decrypted, ok := secretbox.Open(nil, ciphertext[24:], &decryptNonce, &g.GroupKey)
|
copy(decryptNonce[:], ciphertext[:24])
|
||||||
if ok {
|
decrypted, ok := secretbox.Open(nil, ciphertext[24:], &decryptNonce, &g.GroupKey)
|
||||||
dm := &protocol.DecryptedGroupMessage{}
|
if ok {
|
||||||
err := proto.Unmarshal(decrypted, dm)
|
dm := &protocol.DecryptedGroupMessage{}
|
||||||
if err == nil {
|
err := proto.Unmarshal(decrypted, dm)
|
||||||
return true, dm
|
if err == nil {
|
||||||
|
return true, dm
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false, nil
|
return false, nil
|
||||||
|
|
|
@ -320,7 +320,7 @@ func (p *Profile) VerifyGroupMessage(onion string, groupID string, message strin
|
||||||
|
|
||||||
m := groupID + group.GroupServer + string(ciphertext)
|
m := groupID + group.GroupServer + string(ciphertext)
|
||||||
decodedPub, err := base32.StdEncoding.DecodeString(strings.ToUpper(onion))
|
decodedPub, err := base32.StdEncoding.DecodeString(strings.ToUpper(onion))
|
||||||
if err == nil {
|
if err == nil && len(decodedPub) >= 32 {
|
||||||
return ed25519.Verify(decodedPub[:32], []byte(m), signature)
|
return ed25519.Verify(decodedPub[:32], []byte(m), signature)
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
|
@ -456,6 +456,7 @@ func (p *Profile) EncryptMessageToGroup(message string, groupID string) ([]byte,
|
||||||
PreviousMessageSig: prevSig,
|
PreviousMessageSig: prevSig,
|
||||||
Padding: padding[:],
|
Padding: padding[:],
|
||||||
}
|
}
|
||||||
|
|
||||||
ciphertext, err := group.EncryptMessage(dm)
|
ciphertext, err := group.EncryptMessage(dm)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
|
|
|
@ -14,6 +14,7 @@ import (
|
||||||
"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/log"
|
||||||
"golang.org/x/crypto/ed25519"
|
"golang.org/x/crypto/ed25519"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -21,6 +22,7 @@ import (
|
||||||
type PeerServerConnection struct {
|
type PeerServerConnection struct {
|
||||||
connection.AutoConnectionHandler
|
connection.AutoConnectionHandler
|
||||||
Server string
|
Server string
|
||||||
|
stateMutex sync.Mutex
|
||||||
state ConnectionState
|
state ConnectionState
|
||||||
connection *connection.Connection
|
connection *connection.Connection
|
||||||
protocolEngine Engine
|
protocolEngine Engine
|
||||||
|
@ -40,11 +42,15 @@ func NewPeerServerConnection(engine Engine, serverhostname string) *PeerServerCo
|
||||||
|
|
||||||
// GetState returns the current connection state
|
// GetState returns the current connection state
|
||||||
func (psc *PeerServerConnection) GetState() ConnectionState {
|
func (psc *PeerServerConnection) GetState() ConnectionState {
|
||||||
|
psc.stateMutex.Lock()
|
||||||
|
defer psc.stateMutex.Unlock()
|
||||||
return psc.state
|
return psc.state
|
||||||
}
|
}
|
||||||
|
|
||||||
func (psc *PeerServerConnection) setState(state ConnectionState) {
|
func (psc *PeerServerConnection) setState(state ConnectionState) {
|
||||||
log.Debugf("Setting State to %v for %v\n", ConnectionStateName[state], psc.Server)
|
log.Debugf("Setting State to %v for %v\n", ConnectionStateName[state], psc.Server)
|
||||||
|
psc.stateMutex.Lock()
|
||||||
|
defer psc.stateMutex.Unlock()
|
||||||
psc.state = state
|
psc.state = state
|
||||||
psc.protocolEngine.EventManager().Publish(event.NewEvent(event.ServerStateChange, map[event.Field]string{
|
psc.protocolEngine.EventManager().Publish(event.NewEvent(event.ServerStateChange, map[event.Field]string{
|
||||||
event.GroupServer: string(psc.Server),
|
event.GroupServer: string(psc.Server),
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package groups
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"cwtch.im/cwtch/event"
|
||||||
|
"cwtch.im/cwtch/peer"
|
||||||
|
"golang.org/x/crypto/nacl/secretbox"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Fuzz various group related functions
|
||||||
|
func Fuzz(data []byte) int {
|
||||||
|
peer := peer.NewCwtchPeer("fuzz")
|
||||||
|
peer.Init(event.NewEventManager())
|
||||||
|
|
||||||
|
inviteid, err := peer.GetProfile().ProcessInvite(string(data), peer.GetProfile().Onion)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
if inviteid != "" {
|
||||||
|
panic("should not have added a group on err")
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
id, _, _ := peer.StartGroup("2c3kmoobnyghj2zw6pwv7d57yzld753auo3ugauezzpvfak3ahc4bdyd")
|
||||||
|
var nonce [24]byte
|
||||||
|
io.ReadFull(rand.Reader, nonce[:])
|
||||||
|
encrypted := secretbox.Seal(nonce[:], data, &nonce, &peer.GetGroup(id).GroupKey)
|
||||||
|
ok, _, _, _ := peer.GetProfile().AttemptDecryption(encrypted, data)
|
||||||
|
if ok {
|
||||||
|
panic("this probably shouldn't happen")
|
||||||
|
}
|
||||||
|
ok = peer.GetProfile().VerifyGroupMessage(string(data), string(data), string(data), 0, encrypted, data)
|
||||||
|
if ok {
|
||||||
|
panic("this probably shouldn't happen")
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package invites
|
||||||
|
|
||||||
|
import (
|
||||||
|
"cwtch.im/cwtch/event"
|
||||||
|
"cwtch.im/cwtch/peer"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Fuzz import group function
|
||||||
|
func Fuzz(data []byte) int {
|
||||||
|
peer := peer.NewCwtchPeer("fuzz")
|
||||||
|
peer.Init(event.NewEventManager())
|
||||||
|
err := peer.ImportGroup(string(data))
|
||||||
|
if err != nil {
|
||||||
|
if len(peer.GetGroups()) > 0 {
|
||||||
|
panic("group added despite error")
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Known race issue with event bus channel closure
|
||||||
|
// +build !race
|
||||||
|
|
||||||
package storage
|
package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// FIXME currently we have channel related races inside the event bus which cause this to trigger. Remove once fixed
|
||||||
|
// +build !race
|
||||||
|
|
||||||
package testing
|
package testing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -2,20 +2,21 @@
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
pwd
|
pwd
|
||||||
go test ${1} -coverprofile=model.cover.out -v ./model
|
GORACE="haltonerror=1"
|
||||||
go test ${1} -coverprofile=event.cover.out -v ./event
|
go test -race ${1} -coverprofile=model.cover.out -v ./model
|
||||||
|
go test -race ${1} -coverprofile=event.cover.out -v ./event
|
||||||
go test ${1} -coverprofile=storage.cover.out -v ./storage
|
go test ${1} -coverprofile=storage.cover.out -v ./storage
|
||||||
go test ${1} -coverprofile=peer.connections.cover.out -v ./protocol/connections
|
go test -race ${1} -coverprofile=peer.connections.cover.out -v ./protocol/connections
|
||||||
go test ${1} -coverprofile=protocol.spam.cover.out -v ./protocol/connections/spam
|
go test -race ${1} -coverprofile=protocol.spam.cover.out -v ./protocol/connections/spam
|
||||||
go test ${1} -coverprofile=peer.fetch.cover.out -v ./protocol/connections/fetch
|
go test -race ${1} -coverprofile=peer.fetch.cover.out -v ./protocol/connections/fetch
|
||||||
go test ${1} -coverprofile=peer.listen.cover.out -v ./protocol/connections/listen
|
go test -race ${1} -coverprofile=peer.listen.cover.out -v ./protocol/connections/listen
|
||||||
go test ${1} -coverprofile=peer.send.cover.out -v ./protocol/connections/send
|
go test -race ${1} -coverprofile=peer.send.cover.out -v ./protocol/connections/send
|
||||||
go test ${1} -coverprofile=peer.cover.out -v ./peer
|
go test -race ${1} -coverprofile=peer.cover.out -v ./peer
|
||||||
go test ${1} -coverprofile=server.fetch.cover.out -v ./server/fetch
|
go test -race ${1} -coverprofile=server.fetch.cover.out -v ./server/fetch
|
||||||
go test ${1} -coverprofile=server.listen.cover.out -v ./server/listen
|
go test -race ${1} -coverprofile=server.listen.cover.out -v ./server/listen
|
||||||
go test ${1} -coverprofile=server.send.cover.out -v ./server/send
|
go test -race ${1} -coverprofile=server.send.cover.out -v ./server/send
|
||||||
go test ${1} -coverprofile=server.metrics.cover.out -v ./server/metrics
|
go test -race ${1} -coverprofile=server.metrics.cover.out -v ./server/metrics
|
||||||
go test ${1} -coverprofile=server.cover.out -v ./server
|
go test -race ${1} -coverprofile=server.cover.out -v ./server
|
||||||
echo "mode: set" > coverage.out && cat *.cover.out | grep -v mode: | sort -r | \
|
echo "mode: set" > coverage.out && cat *.cover.out | grep -v mode: | sort -r | \
|
||||||
awk '{if($1 != last) {print $0;last=$1}}' >> coverage.out
|
awk '{if($1 != last) {print $0;last=$1}}' >> coverage.out
|
||||||
rm -rf *.cover.out
|
rm -rf *.cover.out
|
||||||
|
|
Loading…
Reference in New Issue