From 43765ef3b5a3fb8b2d6f36d9e6e45891a800e6e3 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 2 Feb 2018 12:32:23 -0500 Subject: [PATCH] Respond to CR. --- Scripts/ClearDerivedData.sh | 3 + .../ConversationViewController.m | 2 +- .../ViewControllers/DebugUI/DebugUIMessages.m | 2 +- .../MessageDetailViewController.swift | 3 +- .../profiles/ProfileFetcherJob.swift | 2 +- .../src/Messages/OWSBatchMessageProcessor.m | 8 +-- .../src/Messages/OWSMessageDecrypter.m | 9 ++- .../src/Messages/OWSMessageSender.m | 9 ++- .../src/Security/OWSRecipientIdentity.m | 59 ------------------- .../TSStorageManager+SessionStore.m | 12 ---- SignalServiceKit/src/Storage/OWSStorage.h | 2 +- SignalServiceKit/src/Storage/OWSStorage.m | 7 ++- 12 files changed, 25 insertions(+), 93 deletions(-) create mode 100755 Scripts/ClearDerivedData.sh diff --git a/Scripts/ClearDerivedData.sh b/Scripts/ClearDerivedData.sh new file mode 100755 index 000000000..f4a9064a2 --- /dev/null +++ b/Scripts/ClearDerivedData.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +rm -rf ~/Library/Developer/Xcode/DerivedData \ No newline at end of file diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 911dee6b4..1744efb32 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -926,7 +926,7 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { continue; } - [TSStorageManager.protocolStoreDBConnection + [self.editingDatabaseConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [OWSIdentityManager.sharedManager setVerificationState:OWSVerificationStateDefault identityKey:identityKey diff --git a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m index 1e982b778..a5e4ae058 100644 --- a/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m +++ b/Signal/src/ViewControllers/DebugUI/DebugUIMessages.m @@ -1258,7 +1258,7 @@ NS_ASSUME_NONNULL_BEGIN NSData *envelopeData = [envelopeBuilder build].data; OWSAssert(envelopeData); - [TSStorageManager.protocolStoreDBConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [TSStorageManager.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [[OWSBatchMessageProcessor sharedInstance] enqueueEnvelopeData:envelopeData plaintextData:plaintextData transaction:transaction]; diff --git a/Signal/src/ViewControllers/MessageDetailViewController.swift b/Signal/src/ViewControllers/MessageDetailViewController.swift index 2b959393b..20b19313a 100644 --- a/Signal/src/ViewControllers/MessageDetailViewController.swift +++ b/Signal/src/ViewControllers/MessageDetailViewController.swift @@ -60,7 +60,8 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate, Medi self.viewItem = viewItem self.message = message self.mode = mode - self.databaseConnection = TSStorageManager.shared().newDatabaseConnection()! + self.databaseConnection = TSStorageManager.shared().newDatabaseConnection() + super.init(nibName: nil, bundle: nil) } diff --git a/SignalMessaging/profiles/ProfileFetcherJob.swift b/SignalMessaging/profiles/ProfileFetcherJob.swift index 2a36487f1..8ccf253b3 100644 --- a/SignalMessaging/profiles/ProfileFetcherJob.swift +++ b/SignalMessaging/profiles/ProfileFetcherJob.swift @@ -130,7 +130,7 @@ public class ProfileFetcherJob: NSObject { } private func verifyIdentityUpToDateAsync(recipientId: String, latestIdentityKey: Data) { - TSStorageManager.protocolStoreDBConnection().asyncReadWrite { (transaction) in + storageManager.newDatabaseConnection().asyncReadWrite { (transaction) in if OWSIdentityManager.shared().saveRemoteIdentity(latestIdentityKey, recipientId: recipientId, protocolContext: transaction) { Logger.info("\(self.TAG) updated identity key with fetched profile for recipient: \(recipientId)") self.storageManager.archiveAllSessions(forContact: recipientId, protocolContext: transaction) diff --git a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m index e79a58d6f..4232a9455 100644 --- a/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m +++ b/SignalServiceKit/src/Messages/OWSBatchMessageProcessor.m @@ -234,7 +234,7 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo @interface OWSMessageContentQueue : NSObject @property (nonatomic, readonly) OWSMessageManager *messagesManager; -@property (nonatomic, readonly) YapDatabaseConnection *dbReadWriteConnection; +@property (nonatomic, readonly) YapDatabaseConnection *dbConnection; @property (nonatomic, readonly) OWSMessageContentJobFinder *finder; @property (nonatomic) BOOL isDrainingQueue; @@ -261,7 +261,7 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo } _messagesManager = messagesManager; - _dbReadWriteConnection = [storageManager newDatabaseConnection]; + _dbConnection = [storageManager newDatabaseConnection]; _finder = finder; _isDrainingQueue = NO; @@ -369,9 +369,7 @@ NSString *const OWSMessageContentJobFinderExtensionGroup = @"OWSMessageContentJo { AssertOnDispatchQueue(self.serialQueue); - // Note that we use the protocolStoreDBConnection to process incoming messages, - // to ensure session & identity store consistency. - [TSStorageManager.protocolStoreDBConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { for (OWSMessageContentJob *job in jobs) { [self.messagesManager processEnvelope:job.envelopeProto plaintextData:job.plaintextData diff --git a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m index 4d9b4d5a2..4b580e944 100644 --- a/SignalServiceKit/src/Messages/OWSMessageDecrypter.m +++ b/SignalServiceKit/src/Messages/OWSMessageDecrypter.m @@ -156,10 +156,9 @@ NS_ASSUME_NONNULL_BEGIN case OWSSignalServiceProtosEnvelopeTypeReceipt: case OWSSignalServiceProtosEnvelopeTypeKeyExchange: case OWSSignalServiceProtosEnvelopeTypeUnknown: { - [TSStorageManager.protocolStoreDBConnection - readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { - successBlock(nil, transaction); - }]; + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { + successBlock(nil, transaction); + }]; // Return to avoid double-acknowledging. return; } @@ -236,7 +235,7 @@ NS_ASSUME_NONNULL_BEGIN return; } - [TSStorageManager.protocolStoreDBConnection + [self.dbConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { @try { id cipherMessage = cipherMessageBlock(encryptedData); diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index a7f6485c2..523b21b68 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -904,7 +904,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSData *newIdentityKey = [newIdentityKeyWithVersion removeKeyType]; - [TSStorageManager.protocolStoreDBConnection + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { [[OWSIdentityManager sharedManager] saveRemoteIdentity:newIdentityKey recipientId:recipient.recipientId @@ -1104,7 +1104,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } } - [TSStorageManager.protocolStoreDBConnection + [self.dbConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { if (extraDevices.count < 1 && missingDevices.count < 1) { OWSProdFail([OWSAnalyticsEvents messageSenderErrorNoMissingOrExtraDevices]); @@ -1256,7 +1256,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; @try { __block NSDictionary *messageDict; __block NSException *encryptionException; - [TSStorageManager.protocolStoreDBConnection + [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { @try { messageDict = [self encryptedMessageWithPlaintext:plainText @@ -1436,8 +1436,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; return; } - [TSStorageManager.protocolStoreDBConnection asyncReadWriteWithBlock:^( - YapDatabaseReadWriteTransaction *transaction) { + [self.dbConnection asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { for (NSUInteger i = 0; i < [devices count]; i++) { int deviceNumber = [devices[i] intValue]; [[TSStorageManager sharedManager] deleteSessionForContact:identifier diff --git a/SignalServiceKit/src/Security/OWSRecipientIdentity.m b/SignalServiceKit/src/Security/OWSRecipientIdentity.m index d4fa4959a..d5fd76f80 100644 --- a/SignalServiceKit/src/Security/OWSRecipientIdentity.m +++ b/SignalServiceKit/src/Security/OWSRecipientIdentity.m @@ -126,65 +126,6 @@ OWSSignalServiceProtosVerifiedState OWSVerificationStateToProtoState(OWSVerifica }]; } -- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction -{ - // For consistency, we should only access instances of this class on - // non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); - - [super saveWithTransaction:transaction]; -} - -- (void)removeWithTransaction:(YapDatabaseReadWriteTransaction *)transaction -{ - // For consistency, we should only access instances of this class on - // non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); - - [super removeWithTransaction:transaction]; -} - -- (void)touchWithTransaction:(YapDatabaseReadWriteTransaction *)transaction -{ - // For consistency, we should only access instances of this class on - // non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); - - [super touchWithTransaction:transaction]; -} - -+ (nullable instancetype)fetchObjectWithUniqueID:(NSString *)uniqueID - transaction:(YapDatabaseReadTransaction *)transaction -{ - // For consistency, we should only access instances of this class on - // non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); - - return [super fetchObjectWithUniqueID:uniqueID transaction:transaction]; -} - -#pragma mark - Database Connections - -+ (YapDatabaseConnection *)dbReadConnection -{ - return self.dbReadWriteConnection; -} - -+ (YapDatabaseConnection *)dbReadWriteConnection -{ - return TSStorageManager.protocolStoreDBConnection; -} - -- (YapDatabaseConnection *)dbReadConnection -{ - return OWSRecipientIdentity.dbReadConnection; -} - -- (YapDatabaseConnection *)dbReadWriteConnection -{ - return OWSRecipientIdentity.dbReadWriteConnection; -} - #pragma mark - debug + (void)printAllIdentities diff --git a/SignalServiceKit/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m b/SignalServiceKit/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m index d52890ae5..f40711c6c 100644 --- a/SignalServiceKit/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m +++ b/SignalServiceKit/src/Storage/AxolotlStore/TSStorageManager+SessionStore.m @@ -49,8 +49,6 @@ NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; OWSAssert([protocolContext isKindOfClass:[YapDatabaseReadWriteTransaction class]]); YapDatabaseReadWriteTransaction *transaction = protocolContext; - // For consistency, we should only access session state on non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); NSDictionary *_Nullable dictionary = [transaction objectForKey:contactIdentifier inCollection:TSStorageManagerSessionStoreCollection]; @@ -78,8 +76,6 @@ NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; OWSFail(@"%@ subDevicesSessions is deprecated", self.logTag); YapDatabaseReadWriteTransaction *transaction = protocolContext; - // For consistency, we should only access session state on non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); NSDictionary *_Nullable dictionary = [transaction objectForKey:contactIdentifier inCollection:TSStorageManagerSessionStoreCollection]; @@ -97,8 +93,6 @@ NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; OWSAssert([protocolContext isKindOfClass:[YapDatabaseReadWriteTransaction class]]); YapDatabaseReadWriteTransaction *transaction = protocolContext; - // For consistency, we should only access session state on non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); // We need to ensure subsequent usage of this SessionRecord does not consider this session as "fresh". Normally this // is achieved by marking things as "not fresh" at the point of deserialization - when we fetch a SessionRecord from @@ -142,8 +136,6 @@ NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; OWSAssert([protocolContext isKindOfClass:[YapDatabaseReadWriteTransaction class]]); YapDatabaseReadWriteTransaction *transaction = protocolContext; - // For consistency, we should only access session state on non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); DDLogInfo( @"[TSStorageManager (SessionStore)] deleting session for contact: %@ device: %d", contactIdentifier, deviceId); @@ -167,8 +159,6 @@ NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; OWSAssert([protocolContext isKindOfClass:[YapDatabaseReadWriteTransaction class]]); YapDatabaseReadWriteTransaction *transaction = protocolContext; - // For consistency, we should only access session state on non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); DDLogInfo(@"[TSStorageManager (SessionStore)] deleting all sessions for contact:%@", contactIdentifier); @@ -181,8 +171,6 @@ NSString *const kSessionStoreDBConnectionKey = @"kSessionStoreDBConnectionKey"; OWSAssert([protocolContext isKindOfClass:[YapDatabaseReadWriteTransaction class]]); YapDatabaseReadWriteTransaction *transaction = protocolContext; - // For consistency, we should only access session state on non-caching connections. - OWSAssert(!transaction.connection.objectCacheEnabled); DDLogInfo(@"[TSStorageManager (SessionStore)] archiving all sessions for contact: %@", contactIdentifier); diff --git a/SignalServiceKit/src/Storage/OWSStorage.h b/SignalServiceKit/src/Storage/OWSStorage.h index 83db4afb1..93a969340 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.h +++ b/SignalServiceKit/src/Storage/OWSStorage.h @@ -51,7 +51,7 @@ extern NSString *const StorageIsReadyNotification; + (void)resetAllStorage; // TODO: Deprecate? -- (nullable YapDatabaseConnection *)newDatabaseConnection; +- (YapDatabaseConnection *)newDatabaseConnection; #ifdef DEBUG - (BOOL)registerExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName; diff --git a/SignalServiceKit/src/Storage/OWSStorage.m b/SignalServiceKit/src/Storage/OWSStorage.m index 756ef7a7e..902528e2a 100644 --- a/SignalServiceKit/src/Storage/OWSStorage.m +++ b/SignalServiceKit/src/Storage/OWSStorage.m @@ -451,9 +451,12 @@ typedef NSData *_Nullable (^CreateDatabaseMetadataBlock)(void); }; } -- (nullable YapDatabaseConnection *)newDatabaseConnection +- (YapDatabaseConnection *)newDatabaseConnection { - return self.database.newConnection; + YapDatabaseConnection *dbConnection = self.database.newConnection; + OWSRaiseException( + @"OWSStorageExceptionName_CouldNotOpenConnection", @"Storage could not open new database connection."); + return dbConnection; } - (BOOL)registerExtension:(YapDatabaseExtension *)extension withName:(NSString *)extensionName