From 1db9c8b344eb987b38d8de8be224165efdf8bb7a Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Thu, 8 Jun 2017 08:11:58 -0400 Subject: [PATCH] prefer archiving vs deleting sessions. This gives us a little resiliency to handling messages out of order across key change. We still *always* print SN when they change. And we still verify that the session used for encrypt/decrypt is the trusted session // FREEBIE --- src/Devices/OWSRecordTranscriptJob.m | 2 +- src/Messages/TSMessagesManager.m | 2 +- .../TSStorageManager+SessionStore.h | 2 ++ .../TSStorageManager+SessionStore.m | 30 +++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/Devices/OWSRecordTranscriptJob.m b/src/Devices/OWSRecordTranscriptJob.m index 2a6bcea7b..70e57b819 100644 --- a/src/Devices/OWSRecordTranscriptJob.m +++ b/src/Devices/OWSRecordTranscriptJob.m @@ -47,7 +47,7 @@ NS_ASSUME_NONNULL_BEGIN if (transcript.isEndSessionMessage) { DDLogInfo(@"%@ EndSession was sent to recipient: %@.", self.tag, transcript.recipientId); - [self.storageManager deleteAllSessionsForContact:transcript.recipientId]; + [self.storageManager archiveAllSessionsForContact:transcript.recipientId]; [[[TSInfoMessage alloc] initWithTimestamp:transcript.timestamp inThread:transcript.thread messageType:TSInfoMessageTypeSessionDidEnd] save]; diff --git a/src/Messages/TSMessagesManager.m b/src/Messages/TSMessagesManager.m index e3bdce81b..6249121e7 100644 --- a/src/Messages/TSMessagesManager.m +++ b/src/Messages/TSMessagesManager.m @@ -721,7 +721,7 @@ NS_ASSUME_NONNULL_BEGIN }]; dispatch_async([OWSDispatch sessionStoreQueue], ^{ - [[TSStorageManager sharedManager] deleteAllSessionsForContact:endSessionEnvelope.source]; + [[TSStorageManager sharedManager] archiveAllSessionsForContact:endSessionEnvelope.source]; }); } diff --git a/src/Storage/AxolotlStore/TSStorageManager+SessionStore.h b/src/Storage/AxolotlStore/TSStorageManager+SessionStore.h index b33f33119..741146204 100644 --- a/src/Storage/AxolotlStore/TSStorageManager+SessionStore.h +++ b/src/Storage/AxolotlStore/TSStorageManager+SessionStore.h @@ -7,6 +7,8 @@ @interface TSStorageManager (SessionStore) +- (void)archiveAllSessionsForContact:(NSString *)contactIdentifier; + #pragma mark - debug - (void)printAllSessions; diff --git a/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m b/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m index 74e26fc53..2e6f3690b 100644 --- a/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m +++ b/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m @@ -3,6 +3,7 @@ // #import "TSStorageManager+SessionStore.h" +#import NSString *const TSStorageManagerSessionStoreCollection = @"TSStorageManagerSessionStoreCollection"; NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; @@ -158,6 +159,35 @@ void AssertIsOnSessionStoreQueue() }]; } +- (void)archiveAllSessionsForContact:(NSString *)contactIdentifier +{ + AssertIsOnSessionStoreQueue(); + + DDLogInfo(@"[TSStorageManager (SessionStore)] archiving all sessions for contact: %@", contactIdentifier); + + __block NSDictionary *sessionRecords; + [self.sessionDBConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + sessionRecords = + [transaction objectForKey:contactIdentifier inCollection:TSStorageManagerSessionStoreCollection]; + + + for (id deviceId in sessionRecords) { + id object = sessionRecords[deviceId]; + if (![object isKindOfClass:[SessionRecord class]]) { + OWSFail(@"Unexpected object in session dict: %@", object); + continue; + } + + SessionRecord *sessionRecord = (SessionRecord *)object; + [sessionRecord archiveCurrentState]; + } + + [transaction setObject:sessionRecords + forKey:contactIdentifier + inCollection:TSStorageManagerSessionStoreCollection]; + }]; +} + #pragma mark - debug - (void)printAllSessions