From a0567c0a8d9869f8ad596bbc8cb73d83a6a67e1a Mon Sep 17 00:00:00 2001 From: josh <josh@elixxir.io> Date: Wed, 9 Jun 2021 10:50:59 -0700 Subject: [PATCH] Fix deletion of relationship sessions --- api/client.go | 2 +- storage/auth/store.go | 4 +-- storage/e2e/manager.go | 14 +++------ storage/e2e/relationship.go | 39 ++++++++++++++++++++++---- storage/e2e/relationshipFingerprint.go | 2 +- storage/e2e/relationship_test.go | 23 +++++++++++---- storage/e2e/session.go | 5 ++-- storage/e2e/store_test.go | 2 +- 8 files changed, 61 insertions(+), 30 deletions(-) diff --git a/api/client.go b/api/client.go index fa635f2e2..83ea0d382 100644 --- a/api/client.go +++ b/api/client.go @@ -564,7 +564,7 @@ func (c *Client) DeleteContact(partnerId *id.ID) error { return err } c.storage.Conversations().Delete(partnerId) - return nil + return nil } // ----- Utility Functions ----- diff --git a/storage/auth/store.go b/storage/auth/store.go index c8116571a..3b74b7d1b 100644 --- a/storage/auth/store.go +++ b/storage/auth/store.go @@ -92,7 +92,7 @@ func LoadStore(kv *versioned.KV, grp *cyclic.Group, privKeys []*cyclic.Int) (*St return nil, errors.WithMessagef(err, "Failed to "+ "unmarshal SentRequestMap") } - jww.DEBUG.Printf("Loading Auth Store for %d contact(s)", len(requestList)) + jww.TRACE.Printf("%d found when loading AuthStore", len(requestList)) for _, rDisk := range requestList { r := &request{ rt: RequestType(rDisk.T), @@ -118,7 +118,6 @@ func LoadStore(kv *versioned.KV, grp *cyclic.Group, privKeys []*cyclic.Int) (*St PrivKey: nil, Request: r, } - jww.DEBUG.Printf("Loaded send request for %s", sr.partner) rid = sr.partner r.sent = sr @@ -127,7 +126,6 @@ func LoadStore(kv *versioned.KV, grp *cyclic.Group, privKeys []*cyclic.Int) (*St if err != nil { jww.FATAL.Panicf("Failed to load stored contact for: %+v", err) } - jww.INFO.Printf("Loaded send request for %s", c.ID) rid = c.ID r.receive = &c diff --git a/storage/e2e/manager.go b/storage/e2e/manager.go index 6434f5283..a978beeae 100644 --- a/storage/e2e/manager.go +++ b/storage/e2e/manager.go @@ -113,20 +113,14 @@ func loadManager(ctx *context, kv *versioned.KV, partnerID *id.ID) (*Manager, er } // clearManager removes the relationship between the partner -// and deletes the Send and Receive sessions +// and deletes the Send and Receive sessions. This includes the +// sessions and the key vectors func clearManager(m *Manager, kv *versioned.KV) error { kv = kv.Prefix(fmt.Sprintf(managerPrefix, m.partner)) - if err := DeleteRelationship(m, Send); err != nil { + if err := DeleteRelationship(m); err != nil { return errors.WithMessage(err, - "Failed to delete remove partner key relationship due to failure to " + - "delete the Send session buffer") - } - - if err := DeleteRelationship(m, Receive); err != nil { - return errors.WithMessage(err, - "Failed to delete remove partner key relationship due to failure to " + - "delete the Receive session buffer") + "Failed to delete relationship") } if err := utility.DeleteCyclicKey(m.kv, originPartnerPubKey); err != nil { diff --git a/storage/e2e/relationship.go b/storage/e2e/relationship.go index 2006cb451..e0e7723d6 100644 --- a/storage/e2e/relationship.go +++ b/storage/e2e/relationship.go @@ -84,14 +84,31 @@ func NewRelationship(manager *Manager, t RelationshipType, return r } -// DeleteRelationship is a function which removes -// the relationship and relationship fingerprint from the store -func DeleteRelationship(manager *Manager, t RelationshipType) error { - kv := manager.kv.Prefix(t.prefix()) - if err := deleteRelationshipFingerprint(kv); err != nil { +// DeleteRelationship removes all relationship and +// relationship adjacent information from storage +func DeleteRelationship(manager *Manager) error { + + // Delete the send information + sendKv := manager.kv.Prefix(Send.prefix()) + manager.send.Delete() + if err := deleteRelationshipFingerprint(sendKv); err != nil { + return err + } + if err := sendKv.Delete(relationshipKey, currentRelationshipVersion); err != nil { + return errors.Errorf("Could not delete send relationship: %v", err) + } + + // Delete the receive information + receiveKv := manager.kv.Prefix(Receive.prefix()) + manager.receive.Delete() + if err := deleteRelationshipFingerprint(receiveKv); err != nil { return err } - return kv.Delete(relationshipKey, currentRelationshipVersion) + if err := receiveKv.Delete(relationshipKey, currentRelationshipVersion); err != nil { + return errors.Errorf("Could not delete receive relationship: %v", err) + } + + return nil } func LoadRelationship(manager *Manager, t RelationshipType) (*relationship, error) { @@ -176,6 +193,16 @@ func (r *relationship) unmarshal(b []byte) error { return nil } +func (r *relationship) Delete() { + r.mux.Lock() + defer r.mux.Unlock() + for _, s := range r.sessions { + delete(r.sessionByID, s.GetID()) + s.Delete() + } + +} + func (r *relationship) AddSession(myPrivKey, partnerPubKey, baseKey *cyclic.Int, trigger SessionID, negotiationStatus Negotiation, e2eParams params.E2ESessionParams) *Session { diff --git a/storage/e2e/relationshipFingerprint.go b/storage/e2e/relationshipFingerprint.go index 367dabdfd..29b80896d 100644 --- a/storage/e2e/relationshipFingerprint.go +++ b/storage/e2e/relationshipFingerprint.go @@ -59,7 +59,7 @@ func loadRelationshipFingerprint(kv *versioned.KV) []byte { } // deleteRelationshipFingerprint is a helper function which deletes a fingerprint from store -func deleteRelationshipFingerprint(kv *versioned.KV) error { +func deleteRelationshipFingerprint(kv *versioned.KV) error { return kv.Delete(relationshipFingerprintKey, currentRelationshipVersion) } diff --git a/storage/e2e/relationship_test.go b/storage/e2e/relationship_test.go index 7ac35b3d4..1ad211fcd 100644 --- a/storage/e2e/relationship_test.go +++ b/storage/e2e/relationship_test.go @@ -71,14 +71,20 @@ func TestLoadRelationship(t *testing.T) { // Shows that a deleted Relationship can no longer be pulled from store func TestDeleteRelationship(t *testing.T) { mgr := makeTestRelationshipManager(t) - sb := NewRelationship(mgr, Send, params.GetDefaultE2ESessionParams()) - err := sb.save() - if err != nil { + // Generate send relationship + mgr.send = NewRelationship(mgr, Send, params.GetDefaultE2ESessionParams()) + if err := mgr.send.save(); err != nil { + t.Fatal(err) + } + + // Generate receive relationship + mgr.receive = NewRelationship(mgr, Receive, params.GetDefaultE2ESessionParams()) + if err := mgr.receive.save(); err != nil { t.Fatal(err) } - err = DeleteRelationship(mgr, Send) + err := DeleteRelationship(mgr) if err != nil { t.Fatalf("DeleteRelationship error: Could not delete manager: %v", err) } @@ -87,10 +93,15 @@ func TestDeleteRelationship(t *testing.T) { if err == nil { t.Fatalf("DeleteRelationship error: Should not have loaded deleted relationship: %v", err) } + + _, err = LoadRelationship(mgr, Receive) + if err == nil { + t.Fatalf("DeleteRelationship error: Should not have loaded deleted relationship: %v", err) + } } // Shows that a deleted relationship fingerprint can no longer be pulled from store -func TestRelationship_deleteRelationshipFingerprint(t *testing.T) { +func TestRelationship_deleteRelationshipFingerprint(t *testing.T) { defer func() { if r := recover(); r == nil { t.Fatalf("deleteRelationshipFingerprint error: " + @@ -108,7 +119,7 @@ func TestRelationship_deleteRelationshipFingerprint(t *testing.T) { err = deleteRelationshipFingerprint(mgr.kv) if err != nil { - t.Fatalf("deleteRelationshipFingerprint error: " + + t.Fatalf("deleteRelationshipFingerprint error: "+ "Could not delete fingerprint: %v", err) } diff --git a/storage/e2e/session.go b/storage/e2e/session.go index 6e85d873e..9f74ebf35 100644 --- a/storage/e2e/session.go +++ b/storage/e2e/session.go @@ -201,7 +201,8 @@ func (s *Session) save() error { /*METHODS*/ // Done all unused key fingerprints -// delete this session and its key states from the storage + +// Delete removes this session and its key states from the storage func (s *Session) Delete() { s.mux.Lock() defer s.mux.Unlock() @@ -221,7 +222,7 @@ func (s *Session) Delete() { } } -//Gets the base key. +// GetBaseKey retrieves the base key. func (s *Session) GetBaseKey() *cyclic.Int { // no lock is needed because this cannot be edited return s.baseKey.DeepCopy() diff --git a/storage/e2e/store_test.go b/storage/e2e/store_test.go index 82a536165..016184b58 100644 --- a/storage/e2e/store_test.go +++ b/storage/e2e/store_test.go @@ -132,7 +132,7 @@ func TestStore_DeletePartner(t *testing.T) { } _, err = s.GetPartner(partnerID) - if err== nil { + if err == nil { t.Errorf("DeletePartner error: Should not be able to pull deleted partner from store") } -- GitLab