diff --git a/channels/joinedChannel_test.go b/channels/joinedChannel_test.go index ca0ba9ba8319bb246c05f33e816bfbbb9f8b8b39..e2af5aaa6a4b808300777498e406eb43041ef924 100644 --- a/channels/joinedChannel_test.go +++ b/channels/joinedChannel_test.go @@ -599,8 +599,10 @@ func (m *mockBroadcastClient) SendWithAssembler(*id.ID, return rounds.Round{ID: id.Round(567)}, ephemeral.Id{}, nil } -func (m *mockBroadcastClient) IsHealthy() bool { return true } -func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool) {} +func (m *mockBroadcastClient) IsHealthy() bool { return true } +func (m *mockBroadcastClient) AddIdentity(*id.ID, time.Time, bool) {} +func (m *mockBroadcastClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { +} func (m *mockBroadcastClient) AddService(*id.ID, message.Service, message.Processor) {} func (m *mockBroadcastClient) DeleteClientService(*id.ID) {} func (m *mockBroadcastClient) RemoveIdentity(*id.ID) {} diff --git a/channels/manager.go b/channels/manager.go index b6a474e2fff2f874a12fbbcb2d6333f3eeb4db9e..56926aa1a474c992b48eae10cccedb9a1fd3bb6b 100644 --- a/channels/manager.go +++ b/channels/manager.go @@ -67,6 +67,7 @@ type Client interface { cmixParams cmix.CMIXParams) (rounds.Round, ephemeral.Id, error) IsHealthy() bool AddIdentity(id *id.ID, validUntil time.Time, persistent bool) + AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) AddService(clientID *id.ID, newService message.Service, response message.Processor) DeleteClientService(clientID *id.ID) diff --git a/channels/sendTracker_test.go b/channels/sendTracker_test.go index 6948df3beee69e5ffeed5a119bda3a9240972131..2f564b88cd7f0d2468f1009c2f478de0c2f6a277 100644 --- a/channels/sendTracker_test.go +++ b/channels/sendTracker_test.go @@ -31,6 +31,8 @@ func (mc *mockClient) IsHealthy() bool { return true } func (mc *mockClient) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {} +func (mc *mockClient) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { +} func (mc *mockClient) AddService(clientID *id.ID, newService message.Service, response message.Processor) { } diff --git a/cmix/identity/receptionID/store.go b/cmix/identity/receptionID/store.go index 35efbb2266a03bbe16600766ca452f3a287ff53f..bfd11eece56e01726cfed7bbbfa33e80ab03053f 100644 --- a/cmix/identity/receptionID/store.go +++ b/cmix/identity/receptionID/store.go @@ -210,6 +210,21 @@ func (s *Store) AddIdentity(identity Identity) error { } func (s *Store) addIdentity(identity Identity) error { + err := s.addIdentityNoSave(identity) + if err != nil { + return err + } + if !identity.Ephemeral { + if err = s.save(); err != nil { + jww.FATAL.Panicf("Failed to save reception store after identity "+ + "addition: %+v", err) + } + } + + return nil +} + +func (s *Store) addIdentityNoSave(identity Identity) error { idH := makeIdHash(identity.EphId, identity.Source) // Do not make duplicates of IDs @@ -233,13 +248,6 @@ func (s *Store) addIdentity(identity Identity) error { s.active = append(s.active, reg) s.present[idH] = struct{}{} - if !identity.Ephemeral { - if err = s.save(); err != nil { - jww.FATAL.Panicf("Failed to save reception store after identity "+ - "addition: %+v", err) - } - } - return nil } @@ -318,18 +326,17 @@ func (s *Store) SetToExpire(addressSize uint8) { } func (s *Store) prune(now time.Time) { - lengthBefore := len(s.active) - var pruned []int64 + pruned := make([]int64, 0, len(s.active)) + added := make([]int64, 0, len(s.active)) // Prune the list + toAdd := make([]Identity, 0, len(s.active)) for i := 0; i < len(s.active); i++ { inQuestion := s.active[i] if now.After(inQuestion.End) && inQuestion.ExtraChecks == 0 { if inQuestion.ProcessNext != nil { - if err := s.AddIdentity(*inQuestion.ProcessNext); err != nil { - jww.ERROR.Printf("Failed to add identity to process next "+ - "for %d(%s). The identity chain may be lost", - inQuestion.EphId.Int64(), inQuestion.Source) - } + toAdd = append(toAdd, *inQuestion.ProcessNext) + added = append(added, inQuestion.ProcessNext.EphId.Int64()) + } if err := inQuestion.Delete(); err != nil { jww.ERROR.Printf("Failed to delete Identity for %s: %+v", @@ -343,11 +350,20 @@ func (s *Store) prune(now time.Time) { i-- } } + for i := range toAdd { + next := toAdd[i] + if err := s.addIdentityNoSave(next); err != nil { + jww.ERROR.Printf("Failed to add identity to process next "+ + "for %d(%s). The identity chain may be lost", + next.EphId.Int64(), next.Source) + } + } // Save the list if it changed - if lengthBefore != len(s.active) { + if len(added) > 0 || len(pruned) > 0 { jww.INFO.Printf( - "Pruned %d identities [%+v]", lengthBefore-len(s.active), pruned) + "Pruned %d identities [%+v], added %d [%+v]", len(pruned), pruned, + len(added), added) if err := s.save(); err != nil { jww.FATAL.Panicf("Failed to store reception storage: %+v", err) } diff --git a/connect/utils_test.go b/connect/utils_test.go index 86f190808b95d44e80cff854d87be643339f2f0c..3aab375cca15e1385a2fa7c621751a0ab508d0cf 100644 --- a/connect/utils_test.go +++ b/connect/utils_test.go @@ -172,8 +172,9 @@ func (m *mockCmix) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAss func (m *mockCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) { return rounds.Round{}, []ephemeral.Id{}, nil } -func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {} -func (m *mockCmix) RemoveIdentity(*id.ID) {} +func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {} +func (m *mockCmix) AddIdentityWithHistory(*id.ID, time.Time, time.Time, bool) {} +func (m *mockCmix) RemoveIdentity(*id.ID) {} func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { return identity.TrackedID{Creation: netTime.Now().Add(-time.Minute)}, nil diff --git a/dummy/mockCmix_test.go b/dummy/mockCmix_test.go index 2aca679d0702225c69d01e7449c028ddd57cd7ee..75cdee581be7e2b08de783f8e27d9d58de078093 100644 --- a/dummy/mockCmix_test.go +++ b/dummy/mockCmix_test.go @@ -86,6 +86,11 @@ func (m *mockCmix) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CMIXPara panic("implement me") } +func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + //TODO implement me + panic("implement me") +} + func (m *mockCmix) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) { //TODO implement me panic("implement me") diff --git a/e2e/fpGenerator_test.go b/e2e/fpGenerator_test.go index 249dc5bba79fc07fb38439a64b4266a658215ee0..657fc16462548659dcd8e409c5acb6da928ffeef 100644 --- a/e2e/fpGenerator_test.go +++ b/e2e/fpGenerator_test.go @@ -129,7 +129,9 @@ func (m *mockFpgCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rou return rounds.Round{}, nil, nil } func (m *mockFpgCmix) AddIdentity(*id.ID, time.Time, bool) {} -func (m *mockFpgCmix) RemoveIdentity(*id.ID) {} +func (m *mockFpgCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { +} +func (m *mockFpgCmix) RemoveIdentity(*id.ID) {} func (m *mockFpgCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { return identity.TrackedID{}, nil } diff --git a/e2e/rekey/utils_test.go b/e2e/rekey/utils_test.go index 0b9fd388668ff77f9cbfed8bc7dc6dc6572d3eeb..aeccacbe316832b436901c654981a6d6fc1138e5 100644 --- a/e2e/rekey/utils_test.go +++ b/e2e/rekey/utils_test.go @@ -252,6 +252,9 @@ func (m *mockNetManager) SendMany(messages []cmix.TargetedCmixMessage, p cmix.CM func (m *mockNetManager) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) {} +func (m *mockNetManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { +} + func (m *mockNetManager) RemoveIdentity(id *id.ID) {} func (m *mockNetManager) AddFingerprint(identity *id.ID, fingerprint format.Fingerprint, diff --git a/e2e/utils_test.go b/e2e/utils_test.go index 6d8835b8c51edaf47ca2821521e9e55de95f5db3..78a0eaa7c57a7cd0520f42c260e3968fdbf6ff6a 100644 --- a/e2e/utils_test.go +++ b/e2e/utils_test.go @@ -214,7 +214,9 @@ func (m *mockCmix) SendWithAssembler(recipient *id.ID, assembler cmix.MessageAss func (m *mockCmix) SendMany([]cmix.TargetedCmixMessage, cmix.CMIXParams) (rounds.Round, []ephemeral.Id, error) { return rounds.Round{}, nil, nil } -func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {} +func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) {} +func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { +} func (m *mockCmix) RemoveIdentity(*id.ID) {} func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { return identity.TrackedID{}, nil } diff --git a/fileTransfer/connect/utils_test.go b/fileTransfer/connect/utils_test.go index 6c9de504f42e812ec9bfc7c2c9925667241daa71..5910ac657f1262c741c64d7acd42155885c23452 100644 --- a/fileTransfer/connect/utils_test.go +++ b/fileTransfer/connect/utils_test.go @@ -140,7 +140,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler, panic("implement me") } -func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + panic("implement me") +} func (m *mockCmix) RemoveIdentity(*id.ID) { panic("implement me") } func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") } diff --git a/fileTransfer/e2e/utils_test.go b/fileTransfer/e2e/utils_test.go index 7de4bba2c25ddb23103da9f04c4a6eac8898984c..1c33203a16665ed99d99560477b1ca5f06c78a5e 100644 --- a/fileTransfer/e2e/utils_test.go +++ b/fileTransfer/e2e/utils_test.go @@ -142,7 +142,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler, panic("implement me") } -func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + panic("implement me") +} func (m *mockCmix) RemoveIdentity(*id.ID) { panic("implement me") } func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") } diff --git a/fileTransfer/groupChat/utils_test.go b/fileTransfer/groupChat/utils_test.go index 61dd18006d7d80b35712cc938267a2f5bd2ae4f7..b1f5f18d4e37d8a638caafb87aa739f9ee1aa337 100644 --- a/fileTransfer/groupChat/utils_test.go +++ b/fileTransfer/groupChat/utils_test.go @@ -137,7 +137,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler, panic("implement me") } -func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + panic("implement me") +} func (m *mockCmix) RemoveIdentity(*id.ID) { panic("implement me") } func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") } diff --git a/fileTransfer/utils_test.go b/fileTransfer/utils_test.go index ff7750fcbce0c8d99f260ffdd2c48bb6d64d14a7..a885e4d82139d363ebce7db8051325e642de2220 100644 --- a/fileTransfer/utils_test.go +++ b/fileTransfer/utils_test.go @@ -193,7 +193,10 @@ func (m *mockCmix) SendWithAssembler(*id.ID, cmix.MessageAssembler, panic("implement me") } -func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentity(*id.ID, time.Time, bool) { panic("implement me") } +func (m *mockCmix) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + panic("implement me") +} func (m *mockCmix) RemoveIdentity(*id.ID) { panic("implement me") } func (m *mockCmix) GetIdentity(*id.ID) (identity.TrackedID, error) { panic("implement me") } diff --git a/groupChat/networkManager_test.go b/groupChat/networkManager_test.go index e87b3f655bca1e2d5ccbf3d6547a25c1b1ac471d..934744be0b08341ba95cc8e4e4af25bbcb5bae0d 100644 --- a/groupChat/networkManager_test.go +++ b/groupChat/networkManager_test.go @@ -95,6 +95,11 @@ func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, pers panic("implement me") } +func (tnm *testNetworkManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + //TODO implement me + panic("implement me") +} + func (tnm *testNetworkManager) RemoveIdentity(id *id.ID) { //TODO implement me panic("implement me") diff --git a/ud/networkManager_test.go b/ud/networkManager_test.go index bd3630ebf9016e37535dbba6ea332c5676da4a1a..e58b3cf1fe3ef539e4c19bcb8ca2f95e24a15901 100644 --- a/ud/networkManager_test.go +++ b/ud/networkManager_test.go @@ -127,6 +127,10 @@ func (tnm *testNetworkManager) AddIdentity(id *id.ID, validUntil time.Time, pers return } +func (tnm *testNetworkManager) AddIdentityWithHistory(id *id.ID, validUntil, beginning time.Time, persistent bool) { + return +} + func (tnm *testNetworkManager) DeleteClientFingerprints(identity *id.ID) { return } diff --git a/xxdk/utilsInterfaces_test.go b/xxdk/utilsInterfaces_test.go index 4fbf3852387c7c095934c2fbf65f388cfa046e2f..a6be0ca8d7143ed748efe04058930a47392aa08c 100644 --- a/xxdk/utilsInterfaces_test.go +++ b/xxdk/utilsInterfaces_test.go @@ -160,6 +160,10 @@ func (t *testNetworkManagerGeneric) AddHealthCallback(f func(bool)) uint64 { func (t *testNetworkManagerGeneric) AddIdentity(id *id.ID, validUntil time.Time, persistent bool) { } +func (t *testNetworkManagerGeneric) AddIdentityWithHistory(id *id.ID, validUntil, + beginning time.Time, persistent bool) { +} + func (t *testNetworkManagerGeneric) RemoveIdentity(id *id.ID) {} func (t *testNetworkManagerGeneric) AddService(clientID *id.ID, newService message.Service, response message.Processor) {