From a4dba2f2d3a63420971fedd491df7d10a32fd7cb Mon Sep 17 00:00:00 2001 From: Benjamin Wenger <ben@elixxir.ioo> Date: Wed, 30 Mar 2022 12:59:39 -0700 Subject: [PATCH] finished parse --- e2e/fpGenerator.go | 25 +++++++++++ e2e/interface.go | 2 - e2e/manager.go | 23 +++++++++++ .../parse}/conversation/message.go | 0 .../parse}/conversation/message_test.go | 0 .../parse}/conversation/partner.go | 0 .../parse}/conversation/partner_test.go | 0 {storage => e2e/parse}/conversation/ring.go | 0 .../parse}/conversation/ring_test.go | 0 {storage => e2e/parse}/conversation/store.go | 0 .../parse}/conversation/store_test.go | 0 e2e/parse/partition.go | 22 ++++++---- .../parse}/partition/multiPartMessage.go | 17 ++++---- .../parse}/partition/multiPartMessage_test.go | 0 {storage => e2e/parse}/partition/part.go | 0 {storage => e2e/parse}/partition/part_test.go | 0 {storage => e2e/parse}/partition/store.go | 19 +++------ .../parse}/partition/store_test.go | 4 +- e2e/parse/partition_test.go | 3 -- e2e/processor.go | 41 +++++++++++++++++++ e2e/ratchet/partner/session/cypher.go | 4 +- e2e/ratchet/partner/session/cypher_test.go | 6 +-- 22 files changed, 123 insertions(+), 43 deletions(-) create mode 100644 e2e/fpGenerator.go create mode 100644 e2e/manager.go rename {storage => e2e/parse}/conversation/message.go (100%) rename {storage => e2e/parse}/conversation/message_test.go (100%) rename {storage => e2e/parse}/conversation/partner.go (100%) rename {storage => e2e/parse}/conversation/partner_test.go (100%) rename {storage => e2e/parse}/conversation/ring.go (100%) rename {storage => e2e/parse}/conversation/ring_test.go (100%) rename {storage => e2e/parse}/conversation/store.go (100%) rename {storage => e2e/parse}/conversation/store_test.go (100%) rename {storage => e2e/parse}/partition/multiPartMessage.go (95%) rename {storage => e2e/parse}/partition/multiPartMessage_test.go (100%) rename {storage => e2e/parse}/partition/part.go (100%) rename {storage => e2e/parse}/partition/part_test.go (100%) rename {storage => e2e/parse}/partition/store.go (90%) rename {storage => e2e/parse}/partition/store_test.go (97%) create mode 100644 e2e/processor.go diff --git a/e2e/fpGenerator.go b/e2e/fpGenerator.go new file mode 100644 index 000000000..81479a451 --- /dev/null +++ b/e2e/fpGenerator.go @@ -0,0 +1,25 @@ +package e2e + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" +) + +type fpGenerator struct { + *Manager +} + +func (fp *fpGenerator) AddKey(k *session.Cypher) { + err := fp.net.AddFingerprint(fp.myID, k.Fingerprint(), &processor{ + cy: k, + m: fp.Manager, + }) + if err != nil { + jww.ERROR.Printf("Could not add fingerprint %s: %+v", + k.Fingerprint(), err) + } +} + +func (fp *fpGenerator) DeleteKey(k *session.Cypher) { + fp.net.DeleteFingerprint(fp.myID, k.Fingerprint()) +} diff --git a/e2e/interface.go b/e2e/interface.go index 2ccf9f607..8546eef3b 100644 --- a/e2e/interface.go +++ b/e2e/interface.go @@ -24,5 +24,3 @@ type Handler interface { AddService(tag string, source []byte, processor message2.Processor) RemoveService(tag string, source []byte) } -type Manager interface { -} diff --git a/e2e/manager.go b/e2e/manager.go new file mode 100644 index 000000000..5871e7b06 --- /dev/null +++ b/e2e/manager.go @@ -0,0 +1,23 @@ +package e2e + +import ( + "gitlab.com/elixxir/client/e2e/parse" + "gitlab.com/elixxir/client/e2e/ratchet" + "gitlab.com/elixxir/client/e2e/receive" + "gitlab.com/elixxir/client/network" + "gitlab.com/elixxir/client/storage/versioned" + "gitlab.com/elixxir/crypto/cyclic" + "gitlab.com/xx_network/primitives/id" +) + +type Manager struct { + *ratchet.Ratchet + *receive.Switchboard + partitioner parse.Partitioner + net network.Manager + myID *id.ID +} + +func InitManager(kv *versioned.KV, myID *id.ID, privKey *cyclic.Int) { + +} diff --git a/storage/conversation/message.go b/e2e/parse/conversation/message.go similarity index 100% rename from storage/conversation/message.go rename to e2e/parse/conversation/message.go diff --git a/storage/conversation/message_test.go b/e2e/parse/conversation/message_test.go similarity index 100% rename from storage/conversation/message_test.go rename to e2e/parse/conversation/message_test.go diff --git a/storage/conversation/partner.go b/e2e/parse/conversation/partner.go similarity index 100% rename from storage/conversation/partner.go rename to e2e/parse/conversation/partner.go diff --git a/storage/conversation/partner_test.go b/e2e/parse/conversation/partner_test.go similarity index 100% rename from storage/conversation/partner_test.go rename to e2e/parse/conversation/partner_test.go diff --git a/storage/conversation/ring.go b/e2e/parse/conversation/ring.go similarity index 100% rename from storage/conversation/ring.go rename to e2e/parse/conversation/ring.go diff --git a/storage/conversation/ring_test.go b/e2e/parse/conversation/ring_test.go similarity index 100% rename from storage/conversation/ring_test.go rename to e2e/parse/conversation/ring_test.go diff --git a/storage/conversation/store.go b/e2e/parse/conversation/store.go similarity index 100% rename from storage/conversation/store.go rename to e2e/parse/conversation/store.go diff --git a/storage/conversation/store_test.go b/e2e/parse/conversation/store_test.go similarity index 100% rename from storage/conversation/store_test.go rename to e2e/parse/conversation/store_test.go diff --git a/e2e/parse/partition.go b/e2e/parse/partition.go index ad4ab21fc..06e10bcae 100644 --- a/e2e/parse/partition.go +++ b/e2e/parse/partition.go @@ -10,8 +10,10 @@ package parse import ( "github.com/pkg/errors" "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e/parse/conversation" + "gitlab.com/elixxir/client/e2e/parse/partition" "gitlab.com/elixxir/client/e2e/receive" - "gitlab.com/elixxir/client/storage" + "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" "time" @@ -25,16 +27,18 @@ type Partitioner struct { partContentsSize int deltaFirstPart int maxSize int - session *storage.Session + conversation *conversation.Store + partition *partition.Store } -func NewPartitioner(messageSize int, session *storage.Session) Partitioner { +func NewPartitioner(messageSize int, kv *versioned.KV) Partitioner { p := Partitioner{ baseMessageSize: messageSize, firstContentsSize: messageSize - firstHeaderLen, partContentsSize: messageSize - headerLen, deltaFirstPart: firstHeaderLen - headerLen, - session: session, + conversation: conversation.NewStore(kv), + partition: partition.NewOrLoad(kv), } p.maxSize = p.firstContentsSize + (MaxMessageParts-1)*p.partContentsSize return p @@ -49,7 +53,7 @@ func (p Partitioner) Partition(recipient *id.ID, mt catalog.MessageType, } // Get the ID of the sent message - fullMessageID, messageID := p.session.Conversations().Get(recipient).GetNextSendID() + fullMessageID, messageID := p.conversation.Get(recipient).GetNextSendID() // Get the number of parts of the message; this equates to just a linear // equation @@ -80,19 +84,19 @@ func (p Partitioner) HandlePartition(sender *id.ID, fm := FirstMessagePartFromBytes(contents) // Handle the message ID - messageID := p.session.Conversations().Get(sender). + messageID := p.conversation.Get(sender). ProcessReceivedMessageID(fm.GetID()) storeageTimestamp := netTime.Now() - return p.session.Partition().AddFirst(sender, fm.GetType(), + return p.partition.AddFirst(sender, fm.GetType(), messageID, fm.GetPart(), fm.GetNumParts(), fm.GetTimestamp(), storeageTimestamp, fm.GetSizedContents(), relationshipFingerprint) } else { // If it is a subsequent message part, handle it as so mp := messagePartFromBytes(contents) - messageID := p.session.Conversations().Get(sender). + messageID := p.conversation.Get(sender). ProcessReceivedMessageID(mp.GetID()) - return p.session.Partition().Add(sender, messageID, mp.GetPart(), + return p.partition.Add(sender, messageID, mp.GetPart(), mp.GetSizedContents(), relationshipFingerprint) } } diff --git a/storage/partition/multiPartMessage.go b/e2e/parse/partition/multiPartMessage.go similarity index 95% rename from storage/partition/multiPartMessage.go rename to e2e/parse/partition/multiPartMessage.go index 3aa8cffb5..581689984 100644 --- a/storage/partition/multiPartMessage.go +++ b/e2e/parse/partition/multiPartMessage.go @@ -12,7 +12,8 @@ import ( "fmt" "github.com/pkg/errors" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e/receive" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/e2e" "gitlab.com/elixxir/ekv" @@ -34,7 +35,7 @@ type multiPartMessage struct { SenderTimestamp time.Time // Timestamp in which message was stored in RAM StorageTimestamp time.Time - MessageType message.Type + MessageType catalog.MessageType parts [][]byte kv *versioned.KV @@ -121,7 +122,7 @@ func (mpm *multiPartMessage) Add(partNumber uint8, part []byte) { } } -func (mpm *multiPartMessage) AddFirst(mt message.Type, partNumber uint8, +func (mpm *multiPartMessage) AddFirst(mt catalog.MessageType, partNumber uint8, numParts uint8, senderTimestamp, storageTimestamp time.Time, part []byte) { mpm.mux.Lock() defer mpm.mux.Unlock() @@ -151,11 +152,11 @@ func (mpm *multiPartMessage) AddFirst(mt message.Type, partNumber uint8, } } -func (mpm *multiPartMessage) IsComplete(relationshipFingerprint []byte) (message.Receive, bool) { +func (mpm *multiPartMessage) IsComplete(relationshipFingerprint []byte) (receive.Message, bool) { mpm.mux.Lock() if mpm.NumParts == 0 || mpm.NumParts != mpm.PresentParts { mpm.mux.Unlock() - return message.Receive{}, false + return receive.Message{}, false } // Make sure the parts buffer is large enough to load all parts from disk @@ -181,14 +182,12 @@ func (mpm *multiPartMessage) IsComplete(relationshipFingerprint []byte) (message } // Return the message - m := message.Receive{ + m := receive.Message{ Payload: reconstructed, MessageType: mpm.MessageType, Sender: mpm.Sender, Timestamp: mpm.SenderTimestamp, - // Encryption will be set externally - Encryption: 0, - ID: mid, + ID: mid, } return m, true diff --git a/storage/partition/multiPartMessage_test.go b/e2e/parse/partition/multiPartMessage_test.go similarity index 100% rename from storage/partition/multiPartMessage_test.go rename to e2e/parse/partition/multiPartMessage_test.go diff --git a/storage/partition/part.go b/e2e/parse/partition/part.go similarity index 100% rename from storage/partition/part.go rename to e2e/parse/partition/part.go diff --git a/storage/partition/part_test.go b/e2e/parse/partition/part_test.go similarity index 100% rename from storage/partition/part_test.go rename to e2e/parse/partition/part_test.go diff --git a/storage/partition/store.go b/e2e/parse/partition/store.go similarity index 90% rename from storage/partition/store.go rename to e2e/parse/partition/store.go index f8a0e8e2c..6ad8cb4fb 100644 --- a/storage/partition/store.go +++ b/e2e/parse/partition/store.go @@ -11,7 +11,8 @@ import ( "encoding/binary" "encoding/json" jww "github.com/spf13/jwalterweatherman" - "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/catalog" + "gitlab.com/elixxir/client/e2e/receive" "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/xx_network/primitives/id" "gitlab.com/xx_network/primitives/netTime" @@ -34,15 +35,7 @@ type Store struct { mux sync.Mutex } -func New(kv *versioned.KV) *Store { - return &Store{ - multiParts: make(map[multiPartID]*multiPartMessage), - activeParts: make(map[*multiPartMessage]bool), - kv: kv.Prefix(packagePrefix), - } -} - -func Load(kv *versioned.KV) *Store { +func NewOrLoad(kv *versioned.KV) *Store { partitionStore := &Store{ multiParts: make(map[multiPartID]*multiPartMessage), activeParts: make(map[*multiPartMessage]bool), @@ -56,9 +49,9 @@ func Load(kv *versioned.KV) *Store { return partitionStore } -func (s *Store) AddFirst(partner *id.ID, mt message.Type, messageID uint64, +func (s *Store) AddFirst(partner *id.ID, mt catalog.MessageType, messageID uint64, partNum, numParts uint8, senderTimestamp, storageTimestamp time.Time, - part []byte, relationshipFingerprint []byte) (message.Receive, bool) { + part []byte, relationshipFingerprint []byte) (receive.Message, bool) { mpm := s.load(partner, messageID) @@ -78,7 +71,7 @@ func (s *Store) AddFirst(partner *id.ID, mt message.Type, messageID uint64, } func (s *Store) Add(partner *id.ID, messageID uint64, partNum uint8, - part []byte, relationshipFingerprint []byte) (message.Receive, bool) { + part []byte, relationshipFingerprint []byte) (receive.Message, bool) { mpm := s.load(partner, messageID) diff --git a/storage/partition/store_test.go b/e2e/parse/partition/store_test.go similarity index 97% rename from storage/partition/store_test.go rename to e2e/parse/partition/store_test.go index 0b05232ca..1fcd8c54a 100644 --- a/storage/partition/store_test.go +++ b/e2e/parse/partition/store_test.go @@ -27,7 +27,7 @@ func TestNew(t *testing.T) { kv: rootKv.Prefix(packagePrefix), } - store := New(rootKv) + store := NewOrLoad(rootKv) if !reflect.DeepEqual(expectedStore, store) { t.Errorf("New() did not return the expecte Store."+ @@ -38,7 +38,7 @@ func TestNew(t *testing.T) { // Tests happy path of Store.AddFirst(). func TestStore_AddFirst(t *testing.T) { part := []byte("Test message.") - s := New(versioned.NewKV(ekv.Memstore{})) + s := NewOrLoad(versioned.NewKV(ekv.Memstore{})) msg, complete := s.AddFirst(id.NewIdFromString("User", id.User, t), message.XxMessage, 5, 0, 1, netTime.Now(), netTime.Now(), part, diff --git a/e2e/parse/partition_test.go b/e2e/parse/partition_test.go index 7c063f2d2..4d1f64c82 100644 --- a/e2e/parse/partition_test.go +++ b/e2e/parse/partition_test.go @@ -56,9 +56,6 @@ func TestNewPartitioner(t *testing.T) { 4088, p.partContentsSize) } - if p.session != storeSession { - t.Errorf("session content mismatch") - } } // Test that no error is returned running Partition diff --git a/e2e/processor.go b/e2e/processor.go new file mode 100644 index 000000000..e86e1a20b --- /dev/null +++ b/e2e/processor.go @@ -0,0 +1,41 @@ +package e2e + +import ( + jww "github.com/spf13/jwalterweatherman" + "gitlab.com/elixxir/client/e2e/ratchet/partner/session" + "gitlab.com/elixxir/client/network/historical" + "gitlab.com/elixxir/client/network/identity/receptionID" + "gitlab.com/elixxir/primitives/format" +) + +type processor struct { + cy *session.Cypher + m *Manager +} + +func (p *processor) Process(ecrMsg format.Message, receptionID receptionID.EphemeralIdentity, + round historical.Round) { + //ensure the key is used before returning + defer p.cy.Use() + + //decrypt + msg, err := p.cy.Decrypt(ecrMsg) + if err != nil { + jww.ERROR.Printf("Decryption Failed of %s (fp: %s), dropping: %+v", + ecrMsg.Digest(), p.cy.Fingerprint(), err) + return + } + + //Parse + sess := p.cy.GetSession() + message, done := p.m.partitioner.HandlePartition(sess.GetPartner(), + msg.GetContents(), sess.GetRelationshipFingerprint()) + + if done { + message.RecipientID = receptionID.Source + message.EphemeralID = receptionID.EphId + message.Round = round + message.Encrypted = true + p.m.Switchboard.Speak(message) + } +} diff --git a/e2e/ratchet/partner/session/cypher.go b/e2e/ratchet/partner/session/cypher.go index 34ee21885..5a8f352b9 100644 --- a/e2e/ratchet/partner/session/cypher.go +++ b/e2e/ratchet/partner/session/cypher.go @@ -127,8 +127,8 @@ func (k *Cypher) Decrypt(msg format.Message) (format.Message, error) { return msg, nil } -// Sets the key as used -func (k *Cypher) denoteUse() { +// Use sets the key as used. It cannot be used again. +func (k *Cypher) Use() { k.session.useKey(k.keyNum) } diff --git a/e2e/ratchet/partner/session/cypher_test.go b/e2e/ratchet/partner/session/cypher_test.go index 26d3b104a..47f9d5289 100644 --- a/e2e/ratchet/partner/session/cypher_test.go +++ b/e2e/ratchet/partner/session/cypher_test.go @@ -172,16 +172,16 @@ func TestKey_EncryptDecrypt(t *testing.T) { } } -// Happy path of Key.denoteUse() +// Happy path of Key.Use() func TestKey_denoteUse(t *testing.T) { keyNum := uint32(rand.Int31n(31)) k := newKey(getSession(t), keyNum) - k.denoteUse() + k.Use() if !k.session.keyState.Used(keyNum) { - t.Errorf("denoteUse() did not use the key") + t.Errorf("Use() did not use the key") } } -- GitLab