diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index a86d066eb..8a9632a0e 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -152,7 +152,8 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; self.contactsSyncing = [[OWSContactsSyncing alloc] initWithContactsManager:[Environment getCurrent].contactsManager identityManager:[OWSIdentityManager sharedManager] - messageSender:[Environment getCurrent].messageSender]; + messageSender:[Environment getCurrent].messageSender + profileManager:[OWSProfileManager sharedManager]]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(databaseViewRegistrationComplete) diff --git a/Signal/src/Profiles/OWSProfileManager.m b/Signal/src/Profiles/OWSProfileManager.m index 1509ee993..0a4fc99d5 100644 --- a/Signal/src/Profiles/OWSProfileManager.m +++ b/Signal/src/Profiles/OWSProfileManager.m @@ -919,6 +919,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640; }); } +- (nullable NSData *)profileKeyDataForRecipientId:(NSString *)recipientId +{ + return [self profileKeyForRecipientId:recipientId].keyData; +} + - (nullable OWSAES256Key *)profileKeyForRecipientId:(NSString *)recipientId { OWSAssert(recipientId.length > 0); diff --git a/Signal/src/util/OWSContactsSyncing.h b/Signal/src/util/OWSContactsSyncing.h index 5c6d00453..0203a1f89 100644 --- a/Signal/src/util/OWSContactsSyncing.h +++ b/Signal/src/util/OWSContactsSyncing.h @@ -9,12 +9,14 @@ NS_ASSUME_NONNULL_BEGIN @class OWSContactsManager; @class OWSMessageSender; @class OWSIdentityManager; +@class OWSProfileManager; @interface OWSContactsSyncing : NSObject - (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager identityManager:(OWSIdentityManager *)identityManager - messageSender:(OWSMessageSender *)messageSender; + messageSender:(OWSMessageSender *)messageSender + profileManager:(OWSProfileManager *)profileManager; @end diff --git a/Signal/src/util/OWSContactsSyncing.m b/Signal/src/util/OWSContactsSyncing.m index 16243c69c..d4f4ad301 100644 --- a/Signal/src/util/OWSContactsSyncing.m +++ b/Signal/src/util/OWSContactsSyncing.m @@ -4,6 +4,7 @@ #import "OWSContactsSyncing.h" #import "OWSContactsManager.h" +#import "OWSProfileManager.h" #import "TSAccountManager.h" #import #import @@ -24,6 +25,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey = @property (nonatomic, readonly) OWSContactsManager *contactsManager; @property (nonatomic, readonly) OWSIdentityManager *identityManager; @property (nonatomic, readonly) OWSMessageSender *messageSender; +@property (nonatomic, readonly) OWSProfileManager *profileManager; @property (nonatomic) BOOL isRequestInFlight; @@ -34,6 +36,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey = - (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager identityManager:(OWSIdentityManager *)identityManager messageSender:(OWSMessageSender *)messageSender + profileManager:(OWSProfileManager *)profileManager { self = [super init]; @@ -48,6 +51,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey = _contactsManager = contactsManager; _identityManager = identityManager; _messageSender = messageSender; + _profileManager = profileManager; OWSSingletonAssert(); @@ -91,7 +95,8 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey = } OWSSyncContactsMessage *syncContactsMessage = [[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager - identityManager:self.identityManager]; + identityManager:self.identityManager + profileManager:self.profileManager]; NSData *messageData = [syncContactsMessage buildPlainTextAttachmentData]; diff --git a/SignalServiceKit/src/Devices/OWSContactsOutputStream.h b/SignalServiceKit/src/Devices/OWSContactsOutputStream.h index 41717aafc..4f59766c7 100644 --- a/SignalServiceKit/src/Devices/OWSContactsOutputStream.h +++ b/SignalServiceKit/src/Devices/OWSContactsOutputStream.h @@ -12,7 +12,8 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSContactsOutputStream : OWSChunkedOutputStream - (void)writeSignalAccount:(SignalAccount *)signalAccount - recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity; + recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity + profileKeyData:(nullable NSData *)profileKeyData; @end diff --git a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m index bd95e57b1..5ac039d9d 100644 --- a/SignalServiceKit/src/Devices/OWSContactsOutputStream.m +++ b/SignalServiceKit/src/Devices/OWSContactsOutputStream.m @@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)writeSignalAccount:(SignalAccount *)signalAccount recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity + profileKeyData:(nullable NSData *)profileKeyData { OWSAssert(signalAccount); OWSAssert(signalAccount.contact); @@ -44,6 +45,10 @@ NS_ASSUME_NONNULL_BEGIN [contactBuilder setAvatarBuilder:avatarBuilder]; } + if (profileKeyData) { + [contactBuilder setProfileKey:profileKeyData]; + } + NSData *contactData = [[contactBuilder build] data]; uint32_t contactDataLength = (uint32_t)contactData.length; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h index db810f8c9..d948751e1 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h @@ -6,14 +6,15 @@ NS_ASSUME_NONNULL_BEGIN -@class YapDatabaseReadWriteTransaction; @protocol ContactsManagerProtocol; +@protocol ProfileManagerProtocol; @class OWSIdentityManager; @interface OWSSyncContactsMessage : OWSOutgoingSyncMessage - (instancetype)initWithContactsManager:(id)contactsManager - identityManager:(OWSIdentityManager *)identityManager; + identityManager:(OWSIdentityManager *)identityManager + profileManager:(id)profileManager; - (NSData *)buildPlainTextAttachmentData; diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 28c2b394c..df43c163c 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -12,6 +12,7 @@ #import "SignalAccount.h" #import "TSAttachment.h" #import "TSAttachmentStream.h" +#import "ProfileManagerProtocol.h" NS_ASSUME_NONNULL_BEGIN @@ -19,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) id contactsManager; @property (nonatomic, readonly) OWSIdentityManager *identityManager; +@property (nonatomic, readonly) id profileManager; @end @@ -26,6 +28,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithContactsManager:(id)contactsManager identityManager:(OWSIdentityManager *)identityManager + profileManager:(id)profileManager { self = [super initWithTimestamp:[NSDate ows_millisecondTimeStamp]]; if (!self) { @@ -34,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN _contactsManager = contactsManager; _identityManager = identityManager; + _profileManager = profileManager; return self; } @@ -71,8 +75,11 @@ NS_ASSUME_NONNULL_BEGIN for (SignalAccount *signalAccount in self.contactsManager.signalAccounts) { OWSRecipientIdentity *recipientIdentity = [self.identityManager recipientIdentityForRecipientId:signalAccount.recipientId]; + NSData *_Nullable profileKeyData = [self.profileManager profileKeyDataForRecipientId:signalAccount.recipientId]; - [contactsOutputStream writeSignalAccount:signalAccount recipientIdentity:recipientIdentity]; + [contactsOutputStream writeSignalAccount:signalAccount + recipientIdentity:recipientIdentity + profileKeyData:profileKeyData]; } [contactsOutputStream flush]; diff --git a/SignalServiceKit/src/Messages/TSMessagesManager.m b/SignalServiceKit/src/Messages/TSMessagesManager.m index d0a001ac7..a36a34b07 100644 --- a/SignalServiceKit/src/Messages/TSMessagesManager.m +++ b/SignalServiceKit/src/Messages/TSMessagesManager.m @@ -515,8 +515,7 @@ NS_ASSUME_NONNULL_BEGIN if ([dataMessage hasProfileKey]) { NSData *profileKey = [dataMessage profileKey]; NSString *recipientId = incomingEnvelope.source; - id profileManager = [TextSecureKitEnv sharedEnv].profileManager; - [profileManager setProfileKeyData:profileKey forRecipientId:recipientId]; + [self.profileManager setProfileKeyData:profileKey forRecipientId:recipientId]; } if (dataMessage.hasGroup) { @@ -580,6 +579,12 @@ NS_ASSUME_NONNULL_BEGIN } } +- (id)profileManager +{ + // TODO inject at init? + return [TextSecureKitEnv sharedEnv].profileManager; +} + - (void)handleIncomingEnvelope:(OWSSignalServiceProtosEnvelope *)incomingEnvelope withCallMessage:(OWSSignalServiceProtosCallMessage *)callMessage { @@ -589,8 +594,7 @@ NS_ASSUME_NONNULL_BEGIN if ([callMessage hasProfileKey]) { NSData *profileKey = [callMessage profileKey]; NSString *recipientId = incomingEnvelope.source; - id profileManager = [TextSecureKitEnv sharedEnv].profileManager; - [profileManager setProfileKeyData:profileKey forRecipientId:recipientId]; + [self.profileManager setProfileKeyData:profileKey forRecipientId:recipientId]; } if (callMessage.hasOffer) { @@ -707,8 +711,7 @@ NS_ASSUME_NONNULL_BEGIN if (dataMessage && destination.length > 0 && [dataMessage hasProfileKey]) { // If we observe a linked device sending our profile key to another // user, we can infer that that user belongs in our profile whitelist. - id profileManager = [TextSecureKitEnv sharedEnv].profileManager; - [profileManager addUserToProfileWhitelist:destination]; + [self.profileManager addUserToProfileWhitelist:destination]; // TODO: Can we also infer when groups are added to the whitelist // from sent messages to groups? @@ -729,7 +732,8 @@ NS_ASSUME_NONNULL_BEGIN if (syncMessage.request.type == OWSSignalServiceProtosSyncMessageRequestTypeContacts) { OWSSyncContactsMessage *syncContactsMessage = [[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager - identityManager:self.identityManager]; + identityManager:self.identityManager + profileManager:self.profileManager]; [self.messageSender sendTemporaryAttachmentData:[syncContactsMessage buildPlainTextAttachmentData] contentType:OWSMimeTypeApplicationOctetStream diff --git a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h index 72b21ba8b..4a27de4f4 100644 --- a/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h +++ b/SignalServiceKit/src/Protocols/ProfileManagerProtocol.h @@ -5,10 +5,13 @@ @class TSThread; @class OWSAES256Key; +NS_ASSUME_NONNULL_BEGIN + @protocol ProfileManagerProtocol - (OWSAES256Key *)localProfileKey; +- (nullable NSData *)profileKeyDataForRecipientId:(NSString *)recipientId; - (void)setProfileKeyData:(NSData *)profileKeyData forRecipientId:(NSString *)recipientId; - (BOOL)isUserInProfileWhitelist:(NSString *)recipientId; @@ -18,3 +21,5 @@ - (void)addUserToProfileWhitelist:(NSString *)recipientId; @end + +NS_ASSUME_NONNULL_END