From 5e253f1c266dccb3df631d28c4c29481d3da0579 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 5 Oct 2018 15:56:21 -0400 Subject: [PATCH] Always include "local user" in contacts sync messages. --- .../DeviceSyncing/OWSSyncContactsMessage.m | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index f660ac0a1..4c398c2b3 100644 --- a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -10,12 +10,15 @@ #import "ProfileManagerProtocol.h" #import "SSKEnvironment.h" #import "SignalAccount.h" +#import "TSAccountManager.h" #import "TSAttachment.h" #import "TSAttachmentStream.h" #import "TSContactThread.h" #import #import +@import Contacts; + NS_ASSUME_NONNULL_BEGIN @interface OWSSyncContactsMessage () @@ -49,6 +52,18 @@ NS_ASSUME_NONNULL_BEGIN return [super initWithCoder:coder]; } +#pragma mark - Dependencies + +- (id)contactsManager { + return SSKEnvironment.shared.contactsManager; +} + +- (TSAccountManager *)tsAccountManager { + return TSAccountManager.sharedInstance; +} + +#pragma mark - + - (nullable SSKProtoSyncMessageBuilder *)syncMessageBuilder { if (self.attachmentIds.count != 1) { @@ -79,7 +94,22 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSData *)buildPlainTextAttachmentDataWithTransaction:(YapDatabaseReadTransaction *)transaction { - id contactsManager = SSKEnvironment.shared.contactsManager; + NSMutableArray *signalAccounts = [self.signalAccounts mutableCopy]; + + NSString *_Nullable localNumber = self.tsAccountManager.localNumber; + OWSAssertDebug(localNumber); + if (localNumber) { + BOOL hasLocalNumber = NO; + for (SignalAccount *signalAccount in signalAccounts) { + hasLocalNumber |= [signalAccount.recipientId isEqualToString:localNumber]; + } + if (!hasLocalNumber) { + SignalAccount *signalAccount = [[SignalAccount alloc] initWithRecipientId:localNumber]; + // OWSContactsOutputStream requires all signalAccount to have a contact. + signalAccount.contact = [[Contact alloc] initWithSystemContact:[CNContact new]]; + [signalAccounts addObject:signalAccount]; + } + } // TODO use temp file stream to avoid loading everything into memory at once // First though, we need to re-engineer our attachment process to accept streams (encrypting with stream, @@ -87,14 +117,13 @@ NS_ASSUME_NONNULL_BEGIN NSOutputStream *dataOutputStream = [NSOutputStream outputStreamToMemory]; [dataOutputStream open]; OWSContactsOutputStream *contactsOutputStream = - [[OWSContactsOutputStream alloc] initWithOutputStream:dataOutputStream]; + [[OWSContactsOutputStream alloc] initWithOutputStream:dataOutputStream]; - for (SignalAccount *signalAccount in self.signalAccounts) { + for (SignalAccount *signalAccount in signalAccounts) { OWSRecipientIdentity *_Nullable recipientIdentity = [self.identityManager recipientIdentityForRecipientId:signalAccount.recipientId]; NSData *_Nullable profileKeyData = [self.profileManager profileKeyDataForRecipientId:signalAccount.recipientId]; - OWSDisappearingMessagesConfiguration *_Nullable disappearingMessagesConfiguration; NSString *conversationColorName; @@ -109,11 +138,11 @@ NS_ASSUME_NONNULL_BEGIN [contactsOutputStream writeSignalAccount:signalAccount recipientIdentity:recipientIdentity profileKeyData:profileKeyData - contactsManager:contactsManager + contactsManager:self.contactsManager conversationColorName:conversationColorName disappearingMessagesConfiguration:disappearingMessagesConfiguration]; } - + [dataOutputStream close]; if (contactsOutputStream.hasError) {