From 6b19b2180bcf2cdbc5154a8fe71f40e5cf5fc43e Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Fri, 19 Jun 2020 11:11:44 +1000 Subject: [PATCH] Make database utility play nice with legacy Signal code --- SignalMessaging/profiles/OWSProfileManager.h | 2 ++ SignalMessaging/profiles/OWSProfileManager.m | 8 ++++++++ SignalMessaging/profiles/OWSUserProfile.m | 10 ++++++++++ .../Protocol/Multi Device/MultiDeviceProtocol.swift | 3 ++- .../Session Management/SessionManagementProtocol.swift | 3 ++- .../src/Protocols/ProfileManagerProtocol.h | 1 + 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/SignalMessaging/profiles/OWSProfileManager.h b/SignalMessaging/profiles/OWSProfileManager.h index 073c1d7a1..d52ba1a78 100644 --- a/SignalMessaging/profiles/OWSProfileManager.h +++ b/SignalMessaging/profiles/OWSProfileManager.h @@ -84,6 +84,8 @@ extern const NSUInteger kOWSProfileManager_MaxAvatarDiameter; profileNameEncrypted:(nullable NSData *)profileNameEncrypted avatarUrlPath:(nullable NSString *)avatarUrlPath; +- (void)ensureProfileCachedForContactWithID:(NSString *)contactID with:(YapDatabaseReadWriteTransaction *)transaction; + #pragma mark - User Interface - (void)presentAddThreadToProfileWhitelist:(TSThread *)thread diff --git a/SignalMessaging/profiles/OWSProfileManager.m b/SignalMessaging/profiles/OWSProfileManager.m index 93f851627..5cb47adfa 100644 --- a/SignalMessaging/profiles/OWSProfileManager.m +++ b/SignalMessaging/profiles/OWSProfileManager.m @@ -178,6 +178,8 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error); - (OWSUserProfile *)localUserProfile { + if (_localUserProfile) { return _localUserProfile; } + __block OWSUserProfile *userProfile; [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { userProfile = [self getLocalUserProfileWithTransaction:transaction]; @@ -1277,6 +1279,12 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error); [userProfile updateWithProfileName:displayName avatarUrlPath:userProfile.avatarUrlPath avatarFileName:userProfile.avatarFileName transaction:transaction completion:nil]; } +- (void)ensureProfileCachedForContactWithID:(NSString *)contactID with:(YapDatabaseReadWriteTransaction *)transaction +{ + OWSUserProfile *userProfile = [OWSUserProfile getOrBuildUserProfileForRecipientId:contactID transaction:transaction]; + [userProfile saveWithTransaction:transaction]; +} + - (BOOL)isNullableDataEqual:(NSData *_Nullable)left toData:(NSData *_Nullable)right { if (left == nil && right == nil) { diff --git a/SignalMessaging/profiles/OWSUserProfile.m b/SignalMessaging/profiles/OWSUserProfile.m index 1cef30919..5fd1311bb 100644 --- a/SignalMessaging/profiles/OWSUserProfile.m +++ b/SignalMessaging/profiles/OWSUserProfile.m @@ -55,9 +55,19 @@ NSString *const kLocalProfileUniqueId = @"kLocalProfileUniqueId"; dbConnection:(YapDatabaseConnection *)dbConnection { __block OWSUserProfile *userProfile; + + [dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { + userProfile = [OWSUserProfile fetchObjectWithUniqueID:recipientId transaction:transaction]; + }]; + + if (userProfile != nil) { + return userProfile; + } + [LKStorage writeSyncWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { userProfile = [OWSUserProfile getOrBuildUserProfileForRecipientId:recipientId transaction:transaction]; } error:nil]; + return userProfile; } diff --git a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift index 087ed3b96..ddee84e3d 100644 --- a/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Multi Device/MultiDeviceProtocol.swift @@ -168,7 +168,8 @@ public final class MultiDeviceProtocol : NSObject { let (promise, seal) = Promise.pending() var recipientUDAccess: OWSUDAccess? if let senderCertificate = senderCertificate { - recipientUDAccess = udManager.udAccess(forRecipientId: hexEncodedPublicKey, requireSyncAccess: true) // Starts a new write transaction internally + SSKEnvironment.shared.profileManager.ensureProfileCachedForContact(withID: hexEncodedPublicKey, with: transaction) // Prevent the line below from starting a write transaction + recipientUDAccess = udManager.udAccess(forRecipientId: hexEncodedPublicKey, requireSyncAccess: true) } let messageSend = OWSMessageSend(message: message, thread: thread, recipient: recipient, senderCertificate: senderCertificate, udAccess: recipientUDAccess, localNumber: getUserHexEncodedPublicKey(), success: { diff --git a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift index 27cc29f67..90f461239 100644 --- a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift @@ -117,7 +117,8 @@ public final class SessionManagementProtocol : NSObject { let (promise, seal) = Promise.pending() var recipientUDAccess: OWSUDAccess? if let senderCertificate = senderCertificate { - recipientUDAccess = udManager.udAccess(forRecipientId: hexEncodedPublicKey, requireSyncAccess: true) // Starts a new write transaction internally + SSKEnvironment.shared.profileManager.ensureProfileCachedForContact(withID: hexEncodedPublicKey, with: transaction) // Prevent the line below from starting a write transaction + recipientUDAccess = udManager.udAccess(forRecipientId: hexEncodedPublicKey, requireSyncAccess: true) } let messageSend = OWSMessageSend(message: message, thread: thread, recipient: recipient, senderCertificate: senderCertificate, udAccess: recipientUDAccess, localNumber: getUserHexEncodedPublicKey(), success: { diff --git a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h index 1a5c6e3e7..cb117afa6 100644 --- a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h +++ b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h @@ -37,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)updateServiceWithProfileName:(nullable NSString *)localProfileName avatarURL:(nullable NSString *)avatarURL; - (void)ensureLocalProfileCached; +- (void)ensureProfileCachedForContactWithID:(NSString *)contactID with:(YapDatabaseReadWriteTransaction *)transaction; @end