mirror of
https://github.com/status-im/status-go.git
synced 2025-01-13 08:05:40 +00:00
move shared secrets to subscription
This commit is contained in:
parent
dd3cf55556
commit
b557a64612
@ -17,7 +17,6 @@ import (
|
|||||||
"github.com/status-im/status-go/eth-node/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
"github.com/status-im/status-go/eth-node/types"
|
"github.com/status-im/status-go/eth-node/types"
|
||||||
"github.com/status-im/status-go/protocol/encryption"
|
"github.com/status-im/status-go/protocol/encryption"
|
||||||
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
|
||||||
"github.com/status-im/status-go/protocol/protobuf"
|
"github.com/status-im/status-go/protocol/protobuf"
|
||||||
"github.com/status-im/status-go/protocol/sqlite"
|
"github.com/status-im/status-go/protocol/sqlite"
|
||||||
transport "github.com/status-im/status-go/protocol/transport/whisper"
|
transport "github.com/status-im/status-go/protocol/transport/whisper"
|
||||||
@ -62,12 +61,10 @@ func (s *MessageProcessorSuite) SetupTest() {
|
|||||||
database, err := sqlite.Open(filepath.Join(s.tmpDir, "processor-test.sql"), "some-key")
|
database, err := sqlite.Open(filepath.Join(s.tmpDir, "processor-test.sql"), "some-key")
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
onNewSharedSecret := func([]*sharedsecret.Secret) {}
|
|
||||||
onSendContactCode := func(*encryption.ProtocolMessageSpec) {}
|
onSendContactCode := func(*encryption.ProtocolMessageSpec) {}
|
||||||
encryptionProtocol := encryption.New(
|
encryptionProtocol := encryption.New(
|
||||||
database,
|
database,
|
||||||
"installation-1",
|
"installation-1",
|
||||||
onNewSharedSecret,
|
|
||||||
onSendContactCode,
|
onSendContactCode,
|
||||||
s.logger,
|
s.logger,
|
||||||
)
|
)
|
||||||
@ -203,7 +200,6 @@ func (s *MessageProcessorSuite) TestHandleDecodedMessagesDatasyncEncrypted() {
|
|||||||
senderEncryptionProtocol := encryption.New(
|
senderEncryptionProtocol := encryption.New(
|
||||||
senderDatabase,
|
senderDatabase,
|
||||||
"installation-2",
|
"installation-2",
|
||||||
func([]*sharedsecret.Secret) {},
|
|
||||||
func(*encryption.ProtocolMessageSpec) {},
|
func(*encryption.ProtocolMessageSpec) {},
|
||||||
s.logger,
|
s.logger,
|
||||||
)
|
)
|
||||||
|
@ -16,7 +16,6 @@ import (
|
|||||||
"github.com/status-im/status-go/eth-node/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
"github.com/status-im/status-go/protocol/encryption/multidevice"
|
||||||
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -65,7 +64,6 @@ func setupUser(user string, s *EncryptionServiceMultiDeviceSuite, n int) error {
|
|||||||
protocol := New(
|
protocol := New(
|
||||||
db,
|
db,
|
||||||
installationID,
|
installationID,
|
||||||
func(s []*sharedsecret.Secret) {},
|
|
||||||
func(*ProtocolMessageSpec) {},
|
func(*ProtocolMessageSpec) {},
|
||||||
s.logger.With(zap.String("user", user)),
|
s.logger.With(zap.String("user", user)),
|
||||||
)
|
)
|
||||||
|
@ -18,8 +18,6 @@ import (
|
|||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/status-im/status-go/eth-node/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var cleartext = []byte("hello")
|
var cleartext = []byte("hello")
|
||||||
@ -56,7 +54,6 @@ func (s *EncryptionServiceTestSuite) initDatabases(config encryptorConfig) {
|
|||||||
db,
|
db,
|
||||||
aliceInstallationID,
|
aliceInstallationID,
|
||||||
config,
|
config,
|
||||||
func(s []*sharedsecret.Secret) {},
|
|
||||||
func(*ProtocolMessageSpec) {},
|
func(*ProtocolMessageSpec) {},
|
||||||
s.logger.With(zap.String("user", "alice")),
|
s.logger.With(zap.String("user", "alice")),
|
||||||
)
|
)
|
||||||
@ -68,7 +65,6 @@ func (s *EncryptionServiceTestSuite) initDatabases(config encryptorConfig) {
|
|||||||
db,
|
db,
|
||||||
bobInstallationID,
|
bobInstallationID,
|
||||||
config,
|
config,
|
||||||
func(s []*sharedsecret.Secret) {},
|
|
||||||
func(*ProtocolMessageSpec) {},
|
func(*ProtocolMessageSpec) {},
|
||||||
s.logger.With(zap.String("user", "bob")),
|
s.logger.With(zap.String("user", "bob")),
|
||||||
)
|
)
|
||||||
|
@ -73,7 +73,6 @@ type Protocol struct {
|
|||||||
publisher *publisher.Publisher
|
publisher *publisher.Publisher
|
||||||
subscriptions *Subscriptions
|
subscriptions *Subscriptions
|
||||||
|
|
||||||
onNewSharedSecretHandler func([]*sharedsecret.Secret)
|
|
||||||
onSendContactCodeHandler func(*ProtocolMessageSpec)
|
onSendContactCodeHandler func(*ProtocolMessageSpec)
|
||||||
|
|
||||||
logger *zap.Logger
|
logger *zap.Logger
|
||||||
@ -88,7 +87,6 @@ var (
|
|||||||
func New(
|
func New(
|
||||||
db *sql.DB,
|
db *sql.DB,
|
||||||
installationID string,
|
installationID string,
|
||||||
onNewSharedSecretHandler func([]*sharedsecret.Secret),
|
|
||||||
onSendContactCodeHandler func(*ProtocolMessageSpec),
|
onSendContactCodeHandler func(*ProtocolMessageSpec),
|
||||||
logger *zap.Logger,
|
logger *zap.Logger,
|
||||||
) *Protocol {
|
) *Protocol {
|
||||||
@ -96,7 +94,6 @@ func New(
|
|||||||
db,
|
db,
|
||||||
installationID,
|
installationID,
|
||||||
defaultEncryptorConfig(installationID, logger),
|
defaultEncryptorConfig(installationID, logger),
|
||||||
onNewSharedSecretHandler,
|
|
||||||
onSendContactCodeHandler,
|
onSendContactCodeHandler,
|
||||||
logger,
|
logger,
|
||||||
)
|
)
|
||||||
@ -108,7 +105,6 @@ func NewWithEncryptorConfig(
|
|||||||
db *sql.DB,
|
db *sql.DB,
|
||||||
installationID string,
|
installationID string,
|
||||||
encryptorConfig encryptorConfig,
|
encryptorConfig encryptorConfig,
|
||||||
onNewSharedSecretHandler func([]*sharedsecret.Secret),
|
|
||||||
onSendContactCodeHandler func(*ProtocolMessageSpec),
|
onSendContactCodeHandler func(*ProtocolMessageSpec),
|
||||||
logger *zap.Logger,
|
logger *zap.Logger,
|
||||||
) *Protocol {
|
) *Protocol {
|
||||||
@ -121,7 +117,6 @@ func NewWithEncryptorConfig(
|
|||||||
InstallationID: installationID,
|
InstallationID: installationID,
|
||||||
}),
|
}),
|
||||||
publisher: publisher.New(logger),
|
publisher: publisher.New(logger),
|
||||||
onNewSharedSecretHandler: onNewSharedSecretHandler,
|
|
||||||
onSendContactCodeHandler: onSendContactCodeHandler,
|
onSendContactCodeHandler: onSendContactCodeHandler,
|
||||||
logger: logger.With(zap.Namespace("Protocol")),
|
logger: logger.With(zap.Namespace("Protocol")),
|
||||||
}
|
}
|
||||||
@ -129,7 +124,7 @@ func NewWithEncryptorConfig(
|
|||||||
|
|
||||||
type Subscriptions struct {
|
type Subscriptions struct {
|
||||||
NewInstallations chan []*multidevice.Installation
|
NewInstallations chan []*multidevice.Installation
|
||||||
NewSharedSecret chan []*sharedsecret.Secret
|
NewSharedSecrets chan []*sharedsecret.Secret
|
||||||
SendContactCode <-chan struct{}
|
SendContactCode <-chan struct{}
|
||||||
Quit chan struct{}
|
Quit chan struct{}
|
||||||
}
|
}
|
||||||
@ -142,11 +137,13 @@ func (p *Protocol) Start(myIdentity *ecdsa.PrivateKey) (*Subscriptions, error) {
|
|||||||
}
|
}
|
||||||
p.subscriptions = &Subscriptions{
|
p.subscriptions = &Subscriptions{
|
||||||
NewInstallations: make(chan []*multidevice.Installation, subscriptionsChannelSize),
|
NewInstallations: make(chan []*multidevice.Installation, subscriptionsChannelSize),
|
||||||
NewSharedSecret: make(chan []*sharedsecret.Secret, subscriptionsChannelSize),
|
NewSharedSecrets: make(chan []*sharedsecret.Secret, subscriptionsChannelSize),
|
||||||
SendContactCode: p.publisher.Start(),
|
SendContactCode: p.publisher.Start(),
|
||||||
Quit: make(chan struct{}),
|
Quit: make(chan struct{}),
|
||||||
}
|
}
|
||||||
p.onNewSharedSecretHandler(secrets)
|
if len(secrets) > 0 {
|
||||||
|
p.publishNewSharedSecrets(secrets)
|
||||||
|
}
|
||||||
|
|
||||||
// Handle Publisher system messages.
|
// Handle Publisher system messages.
|
||||||
publisherCh := p.publisher.Start()
|
publisherCh := p.publisher.Start()
|
||||||
@ -271,9 +268,9 @@ func (p *Protocol) BuildDirectMessage(myIdentityKey *ecdsa.PrivateKey, publicKey
|
|||||||
zap.Bool("has-shared-secret", sharedSecret != nil),
|
zap.Bool("has-shared-secret", sharedSecret != nil),
|
||||||
zap.Bool("agreed", agreed))
|
zap.Bool("agreed", agreed))
|
||||||
|
|
||||||
// Call handler
|
// Publish shared secrets
|
||||||
if sharedSecret != nil {
|
if sharedSecret != nil {
|
||||||
p.onNewSharedSecretHandler([]*sharedsecret.Secret{sharedSecret})
|
p.publishNewSharedSecrets([]*sharedsecret.Secret{sharedSecret})
|
||||||
}
|
}
|
||||||
|
|
||||||
spec := &ProtocolMessageSpec{
|
spec := &ProtocolMessageSpec{
|
||||||
@ -428,6 +425,26 @@ func (p *Protocol) ConfirmMessageProcessed(messageID []byte) error {
|
|||||||
return p.encryptor.ConfirmMessageProcessed(messageID)
|
return p.encryptor.ConfirmMessageProcessed(messageID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Protocol) publishNewInstallations(installations []*multidevice.Installation) {
|
||||||
|
if p.subscriptions != nil {
|
||||||
|
select {
|
||||||
|
case p.subscriptions.NewInstallations <- installations:
|
||||||
|
default:
|
||||||
|
p.logger.Warn("new installations channel full, dropping message")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Protocol) publishNewSharedSecrets(secrets []*sharedsecret.Secret) {
|
||||||
|
if p.subscriptions != nil {
|
||||||
|
select {
|
||||||
|
case p.subscriptions.NewSharedSecrets <- secrets:
|
||||||
|
default:
|
||||||
|
p.logger.Warn("new sharedsecrets channel full, dropping message")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// HandleMessage unmarshals a message and processes it, decrypting it if it is a 1:1 message.
|
// HandleMessage unmarshals a message and processes it, decrypting it if it is a 1:1 message.
|
||||||
func (p *Protocol) HandleMessage(
|
func (p *Protocol) HandleMessage(
|
||||||
myIdentityKey *ecdsa.PrivateKey,
|
myIdentityKey *ecdsa.PrivateKey,
|
||||||
@ -452,13 +469,7 @@ func (p *Protocol) HandleMessage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Publish without blocking if channel is full
|
// Publish without blocking if channel is full
|
||||||
if p.subscriptions != nil {
|
p.publishNewInstallations(addedBundles)
|
||||||
select {
|
|
||||||
case p.subscriptions.NewInstallations <- addedBundles:
|
|
||||||
default:
|
|
||||||
p.logger.Warn("new installations channel full, dropping message")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if it's a public message
|
// Check if it's a public message
|
||||||
@ -493,7 +504,7 @@ func (p *Protocol) HandleMessage(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
p.onNewSharedSecretHandler([]*sharedsecret.Secret{sharedSecret})
|
p.publishNewSharedSecrets([]*sharedsecret.Secret{sharedSecret})
|
||||||
}
|
}
|
||||||
return message, nil
|
return message, nil
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/tt"
|
"github.com/status-im/status-go/protocol/tt"
|
||||||
|
|
||||||
@ -13,7 +14,6 @@ import (
|
|||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
"github.com/status-im/status-go/eth-node/crypto"
|
"github.com/status-im/status-go/eth-node/crypto"
|
||||||
|
|
||||||
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
"github.com/status-im/status-go/protocol/encryption/sharedsecret"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -43,14 +43,11 @@ func (s *ProtocolServiceTestSuite) SetupTest() {
|
|||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
bobDBKey := "bob"
|
bobDBKey := "bob"
|
||||||
|
|
||||||
onNewSharedSecretHandler := func(secret []*sharedsecret.Secret) {}
|
|
||||||
|
|
||||||
db, err := sqlite.Open(s.aliceDBPath.Name(), aliceDBKey)
|
db, err := sqlite.Open(s.aliceDBPath.Name(), aliceDBKey)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.alice = New(
|
s.alice = New(
|
||||||
db,
|
db,
|
||||||
"1",
|
"1",
|
||||||
onNewSharedSecretHandler,
|
|
||||||
func(*ProtocolMessageSpec) {},
|
func(*ProtocolMessageSpec) {},
|
||||||
s.logger.With(zap.String("user", "alice")),
|
s.logger.With(zap.String("user", "alice")),
|
||||||
)
|
)
|
||||||
@ -60,7 +57,6 @@ func (s *ProtocolServiceTestSuite) SetupTest() {
|
|||||||
s.bob = New(
|
s.bob = New(
|
||||||
db,
|
db,
|
||||||
"2",
|
"2",
|
||||||
onNewSharedSecretHandler,
|
|
||||||
func(*ProtocolMessageSpec) {},
|
func(*ProtocolMessageSpec) {},
|
||||||
s.logger.With(zap.String("user", "bob")),
|
s.logger.With(zap.String("user", "bob")),
|
||||||
)
|
)
|
||||||
@ -146,9 +142,9 @@ func (s *ProtocolServiceTestSuite) TestSecretNegotiation() {
|
|||||||
|
|
||||||
payload := []byte("test")
|
payload := []byte("test")
|
||||||
|
|
||||||
s.bob.onNewSharedSecretHandler = func(secret []*sharedsecret.Secret) {
|
subscriptions, err := s.bob.Start(bobKey)
|
||||||
secretResponse = secret
|
s.Require().NoError(err)
|
||||||
}
|
|
||||||
msgSpec, err := s.alice.BuildDirectMessage(aliceKey, &bobKey.PublicKey, payload)
|
msgSpec, err := s.alice.BuildDirectMessage(aliceKey, &bobKey.PublicKey, payload)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.NotNil(msgSpec, "It creates a message spec")
|
s.NotNil(msgSpec, "It creates a message spec")
|
||||||
@ -167,7 +163,14 @@ func (s *ProtocolServiceTestSuite) TestSecretNegotiation() {
|
|||||||
_, err = s.bob.HandleMessage(bobKey, &aliceKey.PublicKey, msgSpec.Message, []byte("message-id"))
|
_, err = s.bob.HandleMessage(bobKey, &aliceKey.PublicKey, msgSpec.Message, []byte("message-id"))
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-time.After(2 * time.Second):
|
||||||
|
case secretResponse = <-subscriptions.NewSharedSecrets:
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
s.Require().NotNil(secretResponse)
|
s.Require().NotNil(secretResponse)
|
||||||
|
s.Require().NoError(s.bob.Stop())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ProtocolServiceTestSuite) TestPropagatingSavedSharedSecretsOnStart() {
|
func (s *ProtocolServiceTestSuite) TestPropagatingSavedSharedSecretsOnStart() {
|
||||||
@ -182,15 +185,17 @@ func (s *ProtocolServiceTestSuite) TestPropagatingSavedSharedSecretsOnStart() {
|
|||||||
generatedSecret, err := s.alice.secret.Generate(aliceKey, &bobKey.PublicKey, "installation-1")
|
generatedSecret, err := s.alice.secret.Generate(aliceKey, &bobKey.PublicKey, "installation-1")
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
s.alice.onNewSharedSecretHandler = func(secret []*sharedsecret.Secret) {
|
subscriptions, err := s.alice.Start(aliceKey)
|
||||||
secretResponse = secret
|
s.Require().NoError(err)
|
||||||
}
|
|
||||||
|
|
||||||
_, err = s.alice.Start(aliceKey)
|
select {
|
||||||
s.NoError(err)
|
case <-time.After(2 * time.Second):
|
||||||
|
case secretResponse = <-subscriptions.NewSharedSecrets:
|
||||||
|
}
|
||||||
|
|
||||||
s.Require().NotNil(secretResponse)
|
s.Require().NotNil(secretResponse)
|
||||||
s.Require().Len(secretResponse, 1)
|
s.Require().Len(secretResponse, 1)
|
||||||
s.Equal(crypto.FromECDSAPub(generatedSecret.Identity), crypto.FromECDSAPub(secretResponse[0].Identity))
|
s.Equal(crypto.FromECDSAPub(generatedSecret.Identity), crypto.FromECDSAPub(secretResponse[0].Identity))
|
||||||
s.Equal(generatedSecret.Key, secretResponse[0].Key)
|
s.Equal(generatedSecret.Key, secretResponse[0].Key)
|
||||||
|
s.Require().NoError(s.alice.Stop())
|
||||||
}
|
}
|
||||||
|
@ -56,6 +56,7 @@ var (
|
|||||||
// mailservers because they can also be managed by the user.
|
// mailservers because they can also be managed by the user.
|
||||||
type Messenger struct {
|
type Messenger struct {
|
||||||
node types.Node
|
node types.Node
|
||||||
|
config *config
|
||||||
identity *ecdsa.PrivateKey
|
identity *ecdsa.PrivateKey
|
||||||
persistence *sqlitePersistence
|
persistence *sqlitePersistence
|
||||||
transport transport.Transport
|
transport transport.Transport
|
||||||
@ -127,18 +128,6 @@ func NewMessenger(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set default config fields.
|
|
||||||
onNewSharedSecretHandler := func(secrets []*sharedsecret.Secret) {
|
|
||||||
filters, err := messenger.handleSharedSecrets(secrets)
|
|
||||||
if err != nil {
|
|
||||||
slogger := logger.With(zap.String("site", "onNewSharedSecretHandler"))
|
|
||||||
slogger.Warn("failed to process secrets", zap.Error(err))
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.onNegotiatedFilters != nil {
|
|
||||||
c.onNegotiatedFilters(filters)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if c.onSendContactCodeHandler == nil {
|
if c.onSendContactCodeHandler == nil {
|
||||||
c.onSendContactCodeHandler = func(messageSpec *encryption.ProtocolMessageSpec) {
|
c.onSendContactCodeHandler = func(messageSpec *encryption.ProtocolMessageSpec) {
|
||||||
slogger := logger.With(zap.String("site", "onSendContactCodeHandler"))
|
slogger := logger.With(zap.String("site", "onSendContactCodeHandler"))
|
||||||
@ -221,7 +210,6 @@ func NewMessenger(
|
|||||||
encryptionProtocol := encryption.New(
|
encryptionProtocol := encryption.New(
|
||||||
database,
|
database,
|
||||||
installationID,
|
installationID,
|
||||||
onNewSharedSecretHandler,
|
|
||||||
c.onSendContactCodeHandler,
|
c.onSendContactCodeHandler,
|
||||||
logger,
|
logger,
|
||||||
)
|
)
|
||||||
@ -263,6 +251,7 @@ func NewMessenger(
|
|||||||
handler := newMessageHandler(identity, logger, &sqlitePersistence{db: database})
|
handler := newMessageHandler(identity, logger, &sqlitePersistence{db: database})
|
||||||
|
|
||||||
messenger = &Messenger{
|
messenger = &Messenger{
|
||||||
|
config: &c,
|
||||||
node: node,
|
node: node,
|
||||||
identity: identity,
|
identity: identity,
|
||||||
persistence: &sqlitePersistence{db: database},
|
persistence: &sqlitePersistence{db: database},
|
||||||
@ -325,6 +314,24 @@ func (m *Messenger) Start() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Messenger) handleSharedSecrets(secrets []*sharedsecret.Secret) ([]*transport.Filter, error) {
|
||||||
|
logger := m.logger.With(zap.String("site", "handleSharedSecrets"))
|
||||||
|
var result []*transport.Filter
|
||||||
|
for _, secret := range secrets {
|
||||||
|
logger.Debug("received shared secret", zap.Binary("identity", crypto.FromECDSAPub(secret.Identity)))
|
||||||
|
fSecret := types.NegotiatedSecret{
|
||||||
|
PublicKey: secret.Identity,
|
||||||
|
Key: secret.Key,
|
||||||
|
}
|
||||||
|
filter, err := m.transport.ProcessNegotiatedSecret(fSecret)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result = append(result, filter)
|
||||||
|
}
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Messenger) handleNewInstallations(installations []*multidevice.Installation) {
|
func (m *Messenger) handleNewInstallations(installations []*multidevice.Installation) {
|
||||||
for _, installation := range installations {
|
for _, installation := range installations {
|
||||||
if installation.Identity == contactIDFromPublicKey(&m.identity.PublicKey) {
|
if installation.Identity == contactIDFromPublicKey(&m.identity.PublicKey) {
|
||||||
@ -336,17 +343,28 @@ func (m *Messenger) handleNewInstallations(installations []*multidevice.Installa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// handleEncryptionLayerSubscriptions handles events from the encryption layer
|
||||||
func (m *Messenger) handleEncryptionLayerSubscriptions(subscriptions *encryption.Subscriptions) {
|
func (m *Messenger) handleEncryptionLayerSubscriptions(subscriptions *encryption.Subscriptions) {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
case secrets := <-subscriptions.NewSharedSecrets:
|
||||||
|
m.logger.Debug("handling new shared secrets")
|
||||||
|
filters, err := m.handleSharedSecrets(secrets)
|
||||||
|
if err != nil {
|
||||||
|
m.logger.Warn("failed to process secrets", zap.Error(err))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.config.onNegotiatedFilters != nil {
|
||||||
|
m.config.onNegotiatedFilters(filters)
|
||||||
|
}
|
||||||
case newInstallations := <-subscriptions.NewInstallations:
|
case newInstallations := <-subscriptions.NewInstallations:
|
||||||
m.logger.Debug("handling new installations")
|
m.logger.Debug("handling new installations")
|
||||||
m.handleNewInstallations(newInstallations)
|
m.handleNewInstallations(newInstallations)
|
||||||
case <-subscriptions.Quit:
|
case <-subscriptions.Quit:
|
||||||
m.logger.Debug("quitting encryption subscription loop")
|
m.logger.Debug("quitting encryption subscription loop")
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@ -455,24 +473,6 @@ func (m *Messenger) Shutdown() (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Messenger) handleSharedSecrets(secrets []*sharedsecret.Secret) ([]*transport.Filter, error) {
|
|
||||||
logger := m.logger.With(zap.String("site", "handleSharedSecrets"))
|
|
||||||
var result []*transport.Filter
|
|
||||||
for _, secret := range secrets {
|
|
||||||
logger.Debug("received shared secret", zap.Binary("identity", crypto.FromECDSAPub(secret.Identity)))
|
|
||||||
fSecret := types.NegotiatedSecret{
|
|
||||||
PublicKey: secret.Identity,
|
|
||||||
Key: secret.Key,
|
|
||||||
}
|
|
||||||
filter, err := m.transport.ProcessNegotiatedSecret(fSecret)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
result = append(result, filter)
|
|
||||||
}
|
|
||||||
return result, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Messenger) EnableInstallation(id string) error {
|
func (m *Messenger) EnableInstallation(id string) error {
|
||||||
m.mutex.Lock()
|
m.mutex.Lock()
|
||||||
defer m.mutex.Unlock()
|
defer m.mutex.Unlock()
|
||||||
|
@ -44,6 +44,11 @@ func (s *MessengerContactUpdateSuite) SetupTest() {
|
|||||||
|
|
||||||
s.m = s.newMessenger(s.shh)
|
s.m = s.newMessenger(s.shh)
|
||||||
s.privateKey = s.m.identity
|
s.privateKey = s.m.identity
|
||||||
|
s.Require().NoError(s.m.Start())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MessengerContactUpdateSuite) TearDownTest() {
|
||||||
|
s.Require().NoError(s.m.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerContactUpdateSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
func (s *MessengerContactUpdateSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
||||||
@ -85,6 +90,7 @@ func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() {
|
|||||||
contactID := types.EncodeHex(crypto.FromECDSAPub(&s.m.identity.PublicKey))
|
contactID := types.EncodeHex(crypto.FromECDSAPub(&s.m.identity.PublicKey))
|
||||||
|
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirContactID := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirContactID := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
response, err := theirMessenger.SendContactUpdate(context.Background(), contactID, theirName, theirPicture)
|
response, err := theirMessenger.SendContactUpdate(context.Background(), contactID, theirName, theirPicture)
|
||||||
@ -136,4 +142,5 @@ func (s *MessengerContactUpdateSuite) TestReceiveContactUpdate() {
|
|||||||
s.Require().False(receivedContact.ENSVerified)
|
s.Require().False(receivedContact.ENSVerified)
|
||||||
s.Require().True(receivedContact.HasBeenAdded())
|
s.Require().True(receivedContact.HasBeenAdded())
|
||||||
s.Require().NotEmpty(receivedContact.LastUpdated)
|
s.Require().NotEmpty(receivedContact.LastUpdated)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,11 @@ func (s *MessengerEmojiSuite) SetupTest() {
|
|||||||
|
|
||||||
s.m = s.newMessenger(s.shh)
|
s.m = s.newMessenger(s.shh)
|
||||||
s.privateKey = s.m.identity
|
s.privateKey = s.m.identity
|
||||||
|
s.Require().NoError(s.m.Start())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MessengerEmojiSuite) TearDownTest() {
|
||||||
|
s.Require().NoError(s.m.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerEmojiSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
func (s *MessengerEmojiSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
||||||
@ -89,6 +94,7 @@ func (s *MessengerEmojiSuite) TestSendEmoji() {
|
|||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
bob := s.newMessengerWithKey(s.shh, key)
|
bob := s.newMessengerWithKey(s.shh, key)
|
||||||
|
s.Require().NoError(bob.Start())
|
||||||
|
|
||||||
chatID := statusChatID
|
chatID := statusChatID
|
||||||
|
|
||||||
@ -162,11 +168,13 @@ func (s *MessengerEmojiSuite) TestSendEmoji() {
|
|||||||
s.Require().Equal(response.EmojiReactions[0].ID(), emojiID)
|
s.Require().Equal(response.EmojiReactions[0].ID(), emojiID)
|
||||||
s.Require().Equal(response.EmojiReactions[0].Type, protobuf.EmojiReaction_SAD)
|
s.Require().Equal(response.EmojiReactions[0].Type, protobuf.EmojiReaction_SAD)
|
||||||
s.Require().True(response.EmojiReactions[0].Retracted)
|
s.Require().True(response.EmojiReactions[0].Retracted)
|
||||||
|
s.Require().NoError(bob.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerEmojiSuite) TestEmojiPrivateGroup() {
|
func (s *MessengerEmojiSuite) TestEmojiPrivateGroup() {
|
||||||
bob := s.m
|
bob := s.m
|
||||||
alice := s.newMessenger(s.shh)
|
alice := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(alice.Start())
|
||||||
response, err := bob.CreateGroupChatWithMembers(context.Background(), "test", []string{})
|
response, err := bob.CreateGroupChatWithMembers(context.Background(), "test", []string{})
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
|
|
||||||
@ -217,4 +225,5 @@ func (s *MessengerEmojiSuite) TestEmojiPrivateGroup() {
|
|||||||
"no emoji reaction received",
|
"no emoji reaction received",
|
||||||
)
|
)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
s.Require().NoError(alice.Shutdown())
|
||||||
}
|
}
|
||||||
|
@ -94,6 +94,7 @@ func (s *MessengerInstallationSuite) newMessenger(shh types.Waku) *Messenger {
|
|||||||
|
|
||||||
func (s *MessengerInstallationSuite) TestReceiveInstallation() {
|
func (s *MessengerInstallationSuite) TestReceiveInstallation() {
|
||||||
theirMessenger := s.newMessengerWithKey(s.shh, s.privateKey)
|
theirMessenger := s.newMessengerWithKey(s.shh, s.privateKey)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
|
|
||||||
err := theirMessenger.SetInstallationMetadata(theirMessenger.installationID, &multidevice.InstallationMetadata{
|
err := theirMessenger.SetInstallationMetadata(theirMessenger.installationID, &multidevice.InstallationMetadata{
|
||||||
Name: "their-name",
|
Name: "their-name",
|
||||||
@ -159,6 +160,7 @@ func (s *MessengerInstallationSuite) TestReceiveInstallation() {
|
|||||||
actualChat := response.Chats[0]
|
actualChat := response.Chats[0]
|
||||||
s.Require().Equal(statusChatID, actualChat.ID)
|
s.Require().Equal(statusChatID, actualChat.ID)
|
||||||
s.Require().True(actualChat.Active)
|
s.Require().True(actualChat.Active)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerInstallationSuite) TestSyncInstallation() {
|
func (s *MessengerInstallationSuite) TestSyncInstallation() {
|
||||||
@ -180,6 +182,7 @@ func (s *MessengerInstallationSuite) TestSyncInstallation() {
|
|||||||
|
|
||||||
// pair
|
// pair
|
||||||
theirMessenger := s.newMessengerWithKey(s.shh, s.privateKey)
|
theirMessenger := s.newMessengerWithKey(s.shh, s.privateKey)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
|
|
||||||
err = theirMessenger.SetInstallationMetadata(theirMessenger.installationID, &multidevice.InstallationMetadata{
|
err = theirMessenger.SetInstallationMetadata(theirMessenger.installationID, &multidevice.InstallationMetadata{
|
||||||
Name: "their-name",
|
Name: "their-name",
|
||||||
@ -246,6 +249,7 @@ func (s *MessengerInstallationSuite) TestSyncInstallation() {
|
|||||||
s.Require().NotNil(statusChat)
|
s.Require().NotNil(statusChat)
|
||||||
|
|
||||||
s.Require().True(actualContact.IsAdded())
|
s.Require().True(actualContact.IsAdded())
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerInstallationSuite) TestSyncInstallationNewMessages() {
|
func (s *MessengerInstallationSuite) TestSyncInstallationNewMessages() {
|
||||||
@ -253,7 +257,9 @@ func (s *MessengerInstallationSuite) TestSyncInstallationNewMessages() {
|
|||||||
bob1 := s.m
|
bob1 := s.m
|
||||||
// pair
|
// pair
|
||||||
bob2 := s.newMessengerWithKey(s.shh, s.privateKey)
|
bob2 := s.newMessengerWithKey(s.shh, s.privateKey)
|
||||||
|
s.Require().NoError(bob2.Start())
|
||||||
alice := s.newMessenger(s.shh)
|
alice := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(alice.Start())
|
||||||
|
|
||||||
err := bob2.SetInstallationMetadata(bob2.installationID, &multidevice.InstallationMetadata{
|
err := bob2.SetInstallationMetadata(bob2.installationID, &multidevice.InstallationMetadata{
|
||||||
Name: "their-name",
|
Name: "their-name",
|
||||||
@ -296,4 +302,6 @@ func (s *MessengerInstallationSuite) TestSyncInstallationNewMessages() {
|
|||||||
"message not received",
|
"message not received",
|
||||||
)
|
)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
s.Require().NoError(bob2.Shutdown())
|
||||||
|
s.Require().NoError(alice.Shutdown())
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,11 @@ func (s *MessengerMuteSuite) SetupTest() {
|
|||||||
|
|
||||||
s.m = s.newMessenger(s.shh)
|
s.m = s.newMessenger(s.shh)
|
||||||
s.privateKey = s.m.identity
|
s.privateKey = s.m.identity
|
||||||
|
s.Require().NoError(s.m.Start())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *MessengerMuteSuite) TearDownTest() {
|
||||||
|
s.Require().NoError(s.m.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerMuteSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
func (s *MessengerMuteSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
||||||
@ -86,6 +91,7 @@ func (s *MessengerMuteSuite) TestSetMute() {
|
|||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
|
|
||||||
theirMessenger := s.newMessengerWithKey(s.shh, key)
|
theirMessenger := s.newMessengerWithKey(s.shh, key)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
|
|
||||||
chatID := "status"
|
chatID := "status"
|
||||||
|
|
||||||
@ -107,4 +113,5 @@ func (s *MessengerMuteSuite) TestSetMute() {
|
|||||||
|
|
||||||
s.Require().NoError(s.m.UnmuteChat(chatID))
|
s.Require().NoError(s.m.UnmuteChat(chatID))
|
||||||
s.Require().False(s.m.Chats()[0].Muted)
|
s.Require().False(s.m.Chats()[0].Muted)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
@ -102,6 +102,7 @@ func (s *MessengerSuite) SetupTest() {
|
|||||||
|
|
||||||
s.m = s.newMessenger(s.shh)
|
s.m = s.newMessenger(s.shh)
|
||||||
s.privateKey = s.m.identity
|
s.privateKey = s.m.identity
|
||||||
|
s.Require().NoError(s.m.Start())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
func (s *MessengerSuite) newMessengerWithKey(shh types.Waku, privateKey *ecdsa.PrivateKey) *Messenger {
|
||||||
@ -503,6 +504,7 @@ func (s *MessengerSuite) TestRetrieveOwnPublic() {
|
|||||||
// Retrieve their public message
|
// Retrieve their public message
|
||||||
func (s *MessengerSuite) TestRetrieveTheirPublic() {
|
func (s *MessengerSuite) TestRetrieveTheirPublic() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirChat := CreatePublicChat("status", s.m.transport)
|
theirChat := CreatePublicChat("status", s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&theirChat)
|
err := theirMessenger.SaveChat(&theirChat)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
@ -539,10 +541,12 @@ func (s *MessengerSuite) TestRetrieveTheirPublic() {
|
|||||||
s.Require().Equal(sentMessage.Clock, actualChat.LastClockValue)
|
s.Require().Equal(sentMessage.Clock, actualChat.LastClockValue)
|
||||||
// It sets the last message
|
// It sets the last message
|
||||||
s.Require().NotNil(actualChat.LastMessage)
|
s.Require().NotNil(actualChat.LastMessage)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestDeletedAtClockValue() {
|
func (s *MessengerSuite) TestDeletedAtClockValue() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirChat := CreatePublicChat("status", s.m.transport)
|
theirChat := CreatePublicChat("status", s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&theirChat)
|
err := theirMessenger.SaveChat(&theirChat)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
@ -568,10 +572,12 @@ func (s *MessengerSuite) TestDeletedAtClockValue() {
|
|||||||
response, err := s.m.RetrieveAll()
|
response, err := s.m.RetrieveAll()
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
s.Require().Len(response.Messages, 0)
|
s.Require().Len(response.Messages, 0)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestRetrieveBlockedContact() {
|
func (s *MessengerSuite) TestRetrieveBlockedContact() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirChat := CreatePublicChat("status", s.m.transport)
|
theirChat := CreatePublicChat("status", s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&theirChat)
|
err := theirMessenger.SaveChat(&theirChat)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
@ -610,6 +616,7 @@ func (s *MessengerSuite) TestRetrieveBlockedContact() {
|
|||||||
// Resend their public message, receive only once
|
// Resend their public message, receive only once
|
||||||
func (s *MessengerSuite) TestResendPublicMessage() {
|
func (s *MessengerSuite) TestResendPublicMessage() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirChat := CreatePublicChat("status", s.m.transport)
|
theirChat := CreatePublicChat("status", s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&theirChat)
|
err := theirMessenger.SaveChat(&theirChat)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
@ -663,6 +670,7 @@ func (s *MessengerSuite) TestResendPublicMessage() {
|
|||||||
// Test receiving a message on an existing private chat
|
// Test receiving a message on an existing private chat
|
||||||
func (s *MessengerSuite) TestRetrieveTheirPrivateChatExisting() {
|
func (s *MessengerSuite) TestRetrieveTheirPrivateChatExisting() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirChat := CreateOneToOneChat("XXX", &s.privateKey.PublicKey, s.m.transport)
|
theirChat := CreateOneToOneChat("XXX", &s.privateKey.PublicKey, s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&theirChat)
|
err := theirMessenger.SaveChat(&theirChat)
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
@ -698,11 +706,13 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateChatExisting() {
|
|||||||
// It sets the last message
|
// It sets the last message
|
||||||
s.Require().NotNil(actualChat.LastMessage)
|
s.Require().NotNil(actualChat.LastMessage)
|
||||||
s.Require().True(actualChat.Active)
|
s.Require().True(actualChat.Active)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test receiving a message on an non-existing private chat
|
// Test receiving a message on an non-existing private chat
|
||||||
func (s *MessengerSuite) TestRetrieveTheirPrivateChatNonExisting() {
|
func (s *MessengerSuite) TestRetrieveTheirPrivateChatNonExisting() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
chat := CreateOneToOneChat("XXX", &s.privateKey.PublicKey, s.m.transport)
|
chat := CreateOneToOneChat("XXX", &s.privateKey.PublicKey, s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&chat)
|
err := theirMessenger.SaveChat(&chat)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
@ -739,6 +749,7 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateChatNonExisting() {
|
|||||||
// Test receiving a message on an non-existing public chat
|
// Test receiving a message on an non-existing public chat
|
||||||
func (s *MessengerSuite) TestRetrieveTheirPublicChatNonExisting() {
|
func (s *MessengerSuite) TestRetrieveTheirPublicChatNonExisting() {
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
chat := CreatePublicChat("test-chat", s.m.transport)
|
chat := CreatePublicChat("test-chat", s.m.transport)
|
||||||
err := theirMessenger.SaveChat(&chat)
|
err := theirMessenger.SaveChat(&chat)
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
@ -756,12 +767,14 @@ func (s *MessengerSuite) TestRetrieveTheirPublicChatNonExisting() {
|
|||||||
|
|
||||||
s.Require().Equal(len(response.Messages), 0)
|
s.Require().Equal(len(response.Messages), 0)
|
||||||
s.Require().Equal(len(response.Chats), 0)
|
s.Require().Equal(len(response.Chats), 0)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test receiving a message on an existing private group chat
|
// Test receiving a message on an existing private group chat
|
||||||
func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
||||||
var response *MessengerResponse
|
var response *MessengerResponse
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "id", []string{})
|
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "id", []string{})
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
@ -823,6 +836,7 @@ func (s *MessengerSuite) TestRetrieveTheirPrivateGroupChat() {
|
|||||||
func (s *MessengerSuite) TestChangeNameGroupChat() {
|
func (s *MessengerSuite) TestChangeNameGroupChat() {
|
||||||
var response *MessengerResponse
|
var response *MessengerResponse
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "old-name", []string{})
|
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "old-name", []string{})
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
@ -869,12 +883,14 @@ func (s *MessengerSuite) TestChangeNameGroupChat() {
|
|||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
actualChat := response.Chats[0]
|
actualChat := response.Chats[0]
|
||||||
s.Require().Equal(newName, actualChat.Name)
|
s.Require().Equal(newName, actualChat.Name)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test being re-invited to a group chat
|
// Test being re-invited to a group chat
|
||||||
func (s *MessengerSuite) TestReInvitedToGroupChat() {
|
func (s *MessengerSuite) TestReInvitedToGroupChat() {
|
||||||
var response *MessengerResponse
|
var response *MessengerResponse
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "old-name", []string{})
|
response, err := s.m.CreateGroupChatWithMembers(context.Background(), "old-name", []string{})
|
||||||
s.NoError(err)
|
s.NoError(err)
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
@ -928,6 +944,7 @@ func (s *MessengerSuite) TestReInvitedToGroupChat() {
|
|||||||
|
|
||||||
s.Require().Len(response.Chats, 1)
|
s.Require().Len(response.Chats, 1)
|
||||||
s.Require().True(response.Chats[0].Active)
|
s.Require().True(response.Chats[0].Active)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestChatPersistencePublic() {
|
func (s *MessengerSuite) TestChatPersistencePublic() {
|
||||||
@ -1434,6 +1451,7 @@ func (s *MessengerSuite) TestDeclineRequestAddressForTransaction() {
|
|||||||
value := testValue
|
value := testValue
|
||||||
contract := testContract
|
contract := testContract
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
chat := CreateOneToOneChat(theirPkString, &theirMessenger.identity.PublicKey, s.m.transport)
|
chat := CreateOneToOneChat(theirPkString, &theirMessenger.identity.PublicKey, s.m.transport)
|
||||||
@ -1516,6 +1534,7 @@ func (s *MessengerSuite) TestDeclineRequestAddressForTransaction() {
|
|||||||
s.Require().Equal(CommandStateRequestAddressForTransactionDeclined, receiverMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestAddressForTransactionDeclined, receiverMessage.CommandParameters.CommandState)
|
||||||
s.Require().Equal(initialCommandID, receiverMessage.CommandParameters.ID)
|
s.Require().Equal(initialCommandID, receiverMessage.CommandParameters.ID)
|
||||||
s.Require().Equal(initialCommandID, receiverMessage.Replace)
|
s.Require().Equal(initialCommandID, receiverMessage.Replace)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestSendEthTransaction() {
|
func (s *MessengerSuite) TestSendEthTransaction() {
|
||||||
@ -1523,6 +1542,7 @@ func (s *MessengerSuite) TestSendEthTransaction() {
|
|||||||
contract := testContract
|
contract := testContract
|
||||||
|
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
receiverAddress := crypto.PubkeyToAddress(theirMessenger.identity.PublicKey)
|
receiverAddress := crypto.PubkeyToAddress(theirMessenger.identity.PublicKey)
|
||||||
@ -1617,6 +1637,7 @@ func (s *MessengerSuite) TestSendEthTransaction() {
|
|||||||
s.Require().Equal(CommandStateTransactionSent, receiverMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateTransactionSent, receiverMessage.CommandParameters.CommandState)
|
||||||
s.Require().Equal(senderMessage.ID, receiverMessage.ID)
|
s.Require().Equal(senderMessage.ID, receiverMessage.ID)
|
||||||
s.Require().Equal("", receiverMessage.Replace)
|
s.Require().Equal("", receiverMessage.Replace)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestSendTokenTransaction() {
|
func (s *MessengerSuite) TestSendTokenTransaction() {
|
||||||
@ -1624,6 +1645,7 @@ func (s *MessengerSuite) TestSendTokenTransaction() {
|
|||||||
contract := testContract
|
contract := testContract
|
||||||
|
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
receiverAddress := crypto.PubkeyToAddress(theirMessenger.identity.PublicKey)
|
receiverAddress := crypto.PubkeyToAddress(theirMessenger.identity.PublicKey)
|
||||||
@ -1718,12 +1740,14 @@ func (s *MessengerSuite) TestSendTokenTransaction() {
|
|||||||
s.Require().Equal(CommandStateTransactionSent, receiverMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateTransactionSent, receiverMessage.CommandParameters.CommandState)
|
||||||
s.Require().Equal(senderMessage.ID, receiverMessage.ID)
|
s.Require().Equal(senderMessage.ID, receiverMessage.ID)
|
||||||
s.Require().Equal(senderMessage.Replace, senderMessage.Replace)
|
s.Require().Equal(senderMessage.Replace, senderMessage.Replace)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestAcceptRequestAddressForTransaction() {
|
func (s *MessengerSuite) TestAcceptRequestAddressForTransaction() {
|
||||||
value := testValue
|
value := testValue
|
||||||
contract := testContract
|
contract := testContract
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
myAddress := crypto.PubkeyToAddress(s.m.identity.PublicKey)
|
myAddress := crypto.PubkeyToAddress(s.m.identity.PublicKey)
|
||||||
@ -1808,6 +1832,7 @@ func (s *MessengerSuite) TestAcceptRequestAddressForTransaction() {
|
|||||||
s.Require().Equal(initialCommandID, receiverMessage.CommandParameters.ID)
|
s.Require().Equal(initialCommandID, receiverMessage.CommandParameters.ID)
|
||||||
s.Require().Equal("some-address", receiverMessage.CommandParameters.Address)
|
s.Require().Equal("some-address", receiverMessage.CommandParameters.Address)
|
||||||
s.Require().Equal(initialCommandID, receiverMessage.Replace)
|
s.Require().Equal(initialCommandID, receiverMessage.Replace)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestDeclineRequestTransaction() {
|
func (s *MessengerSuite) TestDeclineRequestTransaction() {
|
||||||
@ -1816,6 +1841,7 @@ func (s *MessengerSuite) TestDeclineRequestTransaction() {
|
|||||||
receiverAddress := crypto.PubkeyToAddress(s.m.identity.PublicKey)
|
receiverAddress := crypto.PubkeyToAddress(s.m.identity.PublicKey)
|
||||||
receiverAddressString := strings.ToLower(receiverAddress.Hex())
|
receiverAddressString := strings.ToLower(receiverAddress.Hex())
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
chat := CreateOneToOneChat(theirPkString, &theirMessenger.identity.PublicKey, s.m.transport)
|
chat := CreateOneToOneChat(theirPkString, &theirMessenger.identity.PublicKey, s.m.transport)
|
||||||
@ -1895,6 +1921,7 @@ func (s *MessengerSuite) TestDeclineRequestTransaction() {
|
|||||||
s.Require().Equal(initialCommandID, receiverMessage.CommandParameters.ID)
|
s.Require().Equal(initialCommandID, receiverMessage.CommandParameters.ID)
|
||||||
s.Require().Equal(initialCommandID, receiverMessage.Replace)
|
s.Require().Equal(initialCommandID, receiverMessage.Replace)
|
||||||
s.Require().Equal(CommandStateRequestTransactionDeclined, receiverMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateRequestTransactionDeclined, receiverMessage.CommandParameters.CommandState)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerSuite) TestRequestTransaction() {
|
func (s *MessengerSuite) TestRequestTransaction() {
|
||||||
@ -1903,6 +1930,7 @@ func (s *MessengerSuite) TestRequestTransaction() {
|
|||||||
receiverAddress := crypto.PubkeyToAddress(s.m.identity.PublicKey)
|
receiverAddress := crypto.PubkeyToAddress(s.m.identity.PublicKey)
|
||||||
receiverAddressString := strings.ToLower(receiverAddress.Hex())
|
receiverAddressString := strings.ToLower(receiverAddress.Hex())
|
||||||
theirMessenger := s.newMessenger(s.shh)
|
theirMessenger := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(theirMessenger.Start())
|
||||||
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
theirPkString := types.EncodeHex(crypto.FromECDSAPub(&theirMessenger.identity.PublicKey))
|
||||||
|
|
||||||
chat := CreateOneToOneChat(theirPkString, &theirMessenger.identity.PublicKey, s.m.transport)
|
chat := CreateOneToOneChat(theirPkString, &theirMessenger.identity.PublicKey, s.m.transport)
|
||||||
@ -2039,6 +2067,7 @@ func (s *MessengerSuite) TestRequestTransaction() {
|
|||||||
s.Require().Equal(CommandStateTransactionSent, receiverMessage.CommandParameters.CommandState)
|
s.Require().Equal(CommandStateTransactionSent, receiverMessage.CommandParameters.CommandState)
|
||||||
s.Require().Equal(senderMessage.ID, receiverMessage.ID)
|
s.Require().Equal(senderMessage.ID, receiverMessage.ID)
|
||||||
s.Require().Equal(senderMessage.Replace, senderMessage.Replace)
|
s.Require().Equal(senderMessage.Replace, senderMessage.Replace)
|
||||||
|
s.Require().NoError(theirMessenger.Shutdown())
|
||||||
}
|
}
|
||||||
|
|
||||||
type MockTransaction struct {
|
type MockTransaction struct {
|
||||||
|
@ -56,6 +56,7 @@ func (s *MessengerPushNotificationSuite) SetupTest() {
|
|||||||
|
|
||||||
s.m = s.newMessenger(s.shh)
|
s.m = s.newMessenger(s.shh)
|
||||||
s.privateKey = s.m.identity
|
s.privateKey = s.m.identity
|
||||||
|
s.Require().NoError(s.m.Start())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *MessengerPushNotificationSuite) TearDownTest() {
|
func (s *MessengerPushNotificationSuite) TearDownTest() {
|
||||||
@ -126,6 +127,7 @@ func (s *MessengerPushNotificationSuite) TestReceivePushNotification() {
|
|||||||
|
|
||||||
bob1 := s.m
|
bob1 := s.m
|
||||||
bob2 := s.newMessengerWithKey(s.shh, s.m.identity)
|
bob2 := s.newMessengerWithKey(s.shh, s.m.identity)
|
||||||
|
s.Require().NoError(bob2.Start())
|
||||||
|
|
||||||
serverKey, err := crypto.GenerateKey()
|
serverKey, err := crypto.GenerateKey()
|
||||||
s.Require().NoError(err)
|
s.Require().NoError(err)
|
||||||
@ -432,6 +434,7 @@ func (s *MessengerPushNotificationSuite) TestReceivePushNotificationRetries() {
|
|||||||
alice := s.newMessenger(s.shh)
|
alice := s.newMessenger(s.shh)
|
||||||
// another contact to invalidate the token
|
// another contact to invalidate the token
|
||||||
frank := s.newMessenger(s.shh)
|
frank := s.newMessenger(s.shh)
|
||||||
|
s.Require().NoError(frank.Start())
|
||||||
// start alice and enable push notifications
|
// start alice and enable push notifications
|
||||||
s.Require().NoError(alice.Start())
|
s.Require().NoError(alice.Start())
|
||||||
s.Require().NoError(alice.EnableSendingPushNotifications())
|
s.Require().NoError(alice.EnableSendingPushNotifications())
|
||||||
|
@ -169,10 +169,14 @@ func (s *Service) InitProtocol(identity *ecdsa.PrivateKey, db *sql.DB, logger *z
|
|||||||
func (s *Service) StartMessenger() error {
|
func (s *Service) StartMessenger() error {
|
||||||
// Start a loop that retrieves all messages and propagates them to status-react.
|
// Start a loop that retrieves all messages and propagates them to status-react.
|
||||||
s.cancelMessenger = make(chan struct{})
|
s.cancelMessenger = make(chan struct{})
|
||||||
|
err := s.messenger.Start()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
go s.retrieveMessagesLoop(time.Second, s.cancelMessenger)
|
go s.retrieveMessagesLoop(time.Second, s.cancelMessenger)
|
||||||
go s.verifyTransactionLoop(30*time.Second, s.cancelMessenger)
|
go s.verifyTransactionLoop(30*time.Second, s.cancelMessenger)
|
||||||
go s.verifyENSLoop(30*time.Second, s.cancelMessenger)
|
go s.verifyENSLoop(30*time.Second, s.cancelMessenger)
|
||||||
return s.messenger.Start()
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) retrieveMessagesLoop(tick time.Duration, cancel <-chan struct{}) {
|
func (s *Service) retrieveMessagesLoop(tick time.Duration, cancel <-chan struct{}) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user