From f653bc36a895369ba4908dbd2b4c9844ae786afd Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Wed, 21 Jun 2017 21:04:16 -0400 Subject: [PATCH] sync verification state with contacts // FREEBIE --- src/Devices/OWSContactsOutputStream.h | 4 +- src/Devices/OWSContactsOutputStream.m | 14 ++- .../DeviceSyncing/OWSSyncContactsMessage.h | 9 +- .../DeviceSyncing/OWSSyncContactsMessage.m | 8 +- src/Messages/OWSIdentityManager.m | 86 +++++++++---------- src/Messages/TSMessagesManager.m | 21 +++-- 6 files changed, 87 insertions(+), 55 deletions(-) diff --git a/src/Devices/OWSContactsOutputStream.h b/src/Devices/OWSContactsOutputStream.h index 0db555900..298fcdb10 100644 --- a/src/Devices/OWSContactsOutputStream.h +++ b/src/Devices/OWSContactsOutputStream.h @@ -7,10 +7,12 @@ NS_ASSUME_NONNULL_BEGIN @class SignalAccount; +@class OWSRecipientIdentity; @interface OWSContactsOutputStream : OWSChunkedOutputStream -- (void)writeSignalAccount:(SignalAccount *)signalAccount; +- (void)writeSignalAccount:(SignalAccount *)signalAccount + recipientIdentity:(OWSRecipientIdentity *)recipientIdentity; @end diff --git a/src/Devices/OWSContactsOutputStream.m b/src/Devices/OWSContactsOutputStream.m index 81487940e..da662a03b 100644 --- a/src/Devices/OWSContactsOutputStream.m +++ b/src/Devices/OWSContactsOutputStream.m @@ -7,6 +7,7 @@ #import "MIMETypeUtil.h" #import "OWSSignalServiceProtos.pb.h" #import "SignalAccount.h" +#import "OWSRecipientIdentity.h" #import NS_ASSUME_NONNULL_BEGIN @@ -14,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN @implementation OWSContactsOutputStream - (void)writeSignalAccount:(SignalAccount *)signalAccount + recipientIdentity:(OWSRecipientIdentity *)recipientIdentity { OWSAssert(signalAccount); OWSAssert(signalAccount.contact); @@ -21,7 +23,17 @@ NS_ASSUME_NONNULL_BEGIN OWSSignalServiceProtosContactDetailsBuilder *contactBuilder = [OWSSignalServiceProtosContactDetailsBuilder new]; [contactBuilder setName:signalAccount.contact.fullName]; [contactBuilder setNumber:signalAccount.recipientId]; - + + // Don't sync default or no-longer-verified state in contact sync. + if (recipientIdentity.verificationState == OWSVerificationStateVerified) { + OWSSignalServiceProtosVerifiedBuilder *verifiedBuilder = [OWSSignalServiceProtosVerifiedBuilder new]; + verifiedBuilder.state = OWSSignalServiceProtosVerifiedStateVerified; + verifiedBuilder.destination = recipientIdentity.recipientId; + verifiedBuilder.identityKey = recipientIdentity.identityKey; + // TODO do we need to set null message here? + contactBuilder.verified = [verifiedBuilder build]; + } + NSData *avatarPng; if (signalAccount.contact.image) { OWSSignalServiceProtosContactDetailsAvatarBuilder *avatarBuilder = diff --git a/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h b/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h index 848b45c3d..db810f8c9 100644 --- a/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h +++ b/src/Messages/DeviceSyncing/OWSSyncContactsMessage.h @@ -1,4 +1,6 @@ -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// #import "OWSOutgoingSyncMessage.h" @@ -6,10 +8,13 @@ NS_ASSUME_NONNULL_BEGIN @class YapDatabaseReadWriteTransaction; @protocol ContactsManagerProtocol; +@class OWSIdentityManager; @interface OWSSyncContactsMessage : OWSOutgoingSyncMessage -- (instancetype)initWithContactsManager:(id)contactsManager; +- (instancetype)initWithContactsManager:(id)contactsManager + identityManager:(OWSIdentityManager *)identityManager; + - (NSData *)buildPlainTextAttachmentData; @end diff --git a/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m b/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m index 9e9fd365b..39e17004c 100644 --- a/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m +++ b/src/Messages/DeviceSyncing/OWSSyncContactsMessage.m @@ -8,6 +8,7 @@ #import "NSDate+millisecondTimeStamp.h" #import "OWSContactsOutputStream.h" #import "OWSSignalServiceProtos.pb.h" +#import "OWSIdentityManager.h" #import "SignalAccount.h" #import "TSAttachment.h" #import "TSAttachmentStream.h" @@ -17,12 +18,14 @@ NS_ASSUME_NONNULL_BEGIN @interface OWSSyncContactsMessage () @property (nonatomic, readonly) id contactsManager; +@property (nonatomic, readonly) OWSIdentityManager *identityManager; @end @implementation OWSSyncContactsMessage - (instancetype)initWithContactsManager:(id)contactsManager + identityManager:(OWSIdentityManager *)identityManager { self = [super initWithTimestamp:[NSDate ows_millisecondTimeStamp]]; if (!self) { @@ -30,6 +33,7 @@ NS_ASSUME_NONNULL_BEGIN } _contactsManager = contactsManager; + _identityManager = identityManager; return self; } @@ -66,7 +70,9 @@ NS_ASSUME_NONNULL_BEGIN OWSContactsOutputStream *contactsOutputStream = [OWSContactsOutputStream streamWithOutputStream:dataOutputStream]; for (SignalAccount *signalAccount in self.contactsManager.signalAccounts) { - [contactsOutputStream writeSignalAccount:signalAccount]; + OWSRecipientIdentity *recipientIdentity = [self.identityManager recipientIdentityForRecipientId:signalAccount.recipientId]; + + [contactsOutputStream writeSignalAccount:signalAccount recipientIdentity:recipientIdentity]; } [contactsOutputStream flush]; diff --git a/src/Messages/OWSIdentityManager.m b/src/Messages/OWSIdentityManager.m index 24e600848..65fcc1a0b 100644 --- a/src/Messages/OWSIdentityManager.m +++ b/src/Messages/OWSIdentityManager.m @@ -500,49 +500,49 @@ NSString *const kNSNotificationName_IdentityStateDidChange = @"kNSNotificationNa }); } -- (void)syncAllVerificationStates -{ - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - @synchronized(self) - { - - NSMutableArray *messages = [NSMutableArray new]; - [OWSRecipientIdentity enumerateCollectionObjectsUsingBlock:^(OWSRecipientIdentity *recipientIdentity, BOOL *stop) { - OWSAssert(recipientIdentity); - OWSAssert(recipientIdentity.recipientId.length > 0); - OWSAssert(recipientIdentity.identityKey.length == kStoredIdentityKeyLength); - - if (recipientIdentity.recipientId.length < 1) { - OWSFail(@"Invalid recipient identity for recipientId: %@", recipientIdentity.recipientId); - return; - } - - // Prepend key type for transit. - // TODO we should just be storing the key type so we don't have to juggle re-adding it. - NSData *identityKey = [recipientIdentity.identityKey prependKeyType]; - if (identityKey.length != kIdentityKeyLength) { - OWSFail(@"Invalid recipient identitykey for recipientId: %@ key: %@", - recipientIdentity.recipientId, - identityKey); - return; - } - - OWSVerificationStateSyncMessage *message = [[OWSVerificationStateSyncMessage alloc] - initWithVerificationState:recipientIdentity.verificationState - identityKey:identityKey - verificationForRecipientId:recipientIdentity.recipientId]; - [messages addObject:message]; - }]; - if (messages.count > 0) { - dispatch_async(dispatch_get_main_queue(), ^{ - for (OWSVerificationStateSyncMessage *message in messages) { - [self sendSyncVerificationStateMessage:message]; - } - }); - } - } - }); -} +//- (void)syncAllVerificationStates +//{ +// dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ +// @synchronized(self) +// { +// +// NSMutableArray *messages = [NSMutableArray new]; +// [OWSRecipientIdentity enumerateCollectionObjectsUsingBlock:^(OWSRecipientIdentity *recipientIdentity, BOOL *stop) { +// OWSAssert(recipientIdentity); +// OWSAssert(recipientIdentity.recipientId.length > 0); +// OWSAssert(recipientIdentity.identityKey.length == kStoredIdentityKeyLength); +// +// if (recipientIdentity.recipientId.length < 1) { +// OWSFail(@"Invalid recipient identity for recipientId: %@", recipientIdentity.recipientId); +// return; +// } +// +// // Prepend key type for transit. +// // TODO we should just be storing the key type so we don't have to juggle re-adding it. +// NSData *identityKey = [recipientIdentity.identityKey prependKeyType]; +// if (identityKey.length != kIdentityKeyLength) { +// OWSFail(@"Invalid recipient identitykey for recipientId: %@ key: %@", +// recipientIdentity.recipientId, +// identityKey); +// return; +// } +// +// OWSVerificationStateSyncMessage *message = [[OWSVerificationStateSyncMessage alloc] +// initWithVerificationState:recipientIdentity.verificationState +// identityKey:identityKey +// verificationForRecipientId:recipientIdentity.recipientId]; +// [messages addObject:message]; +// }]; +// if (messages.count > 0) { +// dispatch_async(dispatch_get_main_queue(), ^{ +// for (OWSVerificationStateSyncMessage *message in messages) { +// [self sendSyncVerificationStateMessage:message]; +// } +// }); +// } +// } +// }); +//} - (void)sendSyncVerificationStateMessage:(OWSVerificationStateSyncMessage *)message { diff --git a/src/Messages/TSMessagesManager.m b/src/Messages/TSMessagesManager.m index 49078e6e3..fa5de03a8 100644 --- a/src/Messages/TSMessagesManager.m +++ b/src/Messages/TSMessagesManager.m @@ -50,6 +50,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) OWSMessageSender *messageSender; @property (nonatomic, readonly) OWSIncomingMessageFinder *incomingMessageFinder; @property (nonatomic, readonly) OWSBlockingManager *blockingManager; +@property (nonatomic, readonly) OWSIdentityManager *identityManager; @end @@ -73,13 +74,16 @@ NS_ASSUME_NONNULL_BEGIN id contactsManager = [TextSecureKitEnv sharedEnv].contactsManager; id callMessageHandler = [TextSecureKitEnv sharedEnv].callMessageHandler; ContactsUpdater *contactsUpdater = [ContactsUpdater sharedUpdater]; + OWSIdentityManager *identityManager = [OWSIdentityManager sharedManager]; OWSMessageSender *messageSender = [TextSecureKitEnv sharedEnv].messageSender; + return [self initWithNetworkManager:networkManager storageManager:storageManager callMessageHandler:callMessageHandler contactsManager:contactsManager contactsUpdater:contactsUpdater + identityManager:identityManager messageSender:messageSender]; } @@ -88,6 +92,7 @@ NS_ASSUME_NONNULL_BEGIN callMessageHandler:(id)callMessageHandler contactsManager:(id)contactsManager contactsUpdater:(ContactsUpdater *)contactsUpdater + identityManager:(OWSIdentityManager *)identityManager messageSender:(OWSMessageSender *)messageSender { self = [super init]; @@ -101,6 +106,7 @@ NS_ASSUME_NONNULL_BEGIN _callMessageHandler = callMessageHandler; _contactsManager = contactsManager; _contactsUpdater = contactsUpdater; + _identityManager = identityManager; _messageSender = messageSender; _dbConnection = storageManager.newDatabaseConnection; @@ -364,7 +370,7 @@ NS_ASSUME_NONNULL_BEGIN SessionCipher *cipher = [[SessionCipher alloc] initWithSessionStore:storageManager preKeyStore:storageManager signedPreKeyStore:storageManager - identityKeyStore:[OWSIdentityManager sharedManager] + identityKeyStore:self.identityManager recipientId:recipientId deviceId:deviceId]; @@ -416,7 +422,7 @@ NS_ASSUME_NONNULL_BEGIN SessionCipher *cipher = [[SessionCipher alloc] initWithSessionStore:storageManager preKeyStore:storageManager signedPreKeyStore:storageManager - identityKeyStore:[OWSIdentityManager sharedManager] + identityKeyStore:self.identityManager recipientId:recipientId deviceId:deviceId]; @@ -450,7 +456,7 @@ NS_ASSUME_NONNULL_BEGIN sourceId:envelope.source sourceDeviceId:envelope.sourceDevice]; if (duplicateEnvelope) { - DDLogInfo(@"%@ Ignoring previously received envelope with timestamp: %llu", self.tag, envelope.timestamp); + DDLogInfo(@"%@ Ignoring previously received envelope from %@.%d with timestamp: %llu", self.tag, envelope.source, (unsigned int)envelope.sourceDevice, envelope.timestamp); return; } @@ -649,7 +655,8 @@ NS_ASSUME_NONNULL_BEGIN } else if (syncMessage.hasRequest) { if (syncMessage.request.type == OWSSignalServiceProtosSyncMessageRequestTypeContacts) { OWSSyncContactsMessage *syncContactsMessage = - [[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager]; + [[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager + identityManager:self.identityManager]; [self.messageSender sendTemporaryAttachmentData:[syncContactsMessage buildPlainTextAttachmentData] contentType:OWSMimeTypeApplicationOctetStream @@ -661,8 +668,8 @@ NS_ASSUME_NONNULL_BEGIN DDLogError(@"%@ Failed to send Contacts response syncMessage with error: %@", self.tag, error); }]; - // Also sync all verification state after syncing contacts. - [[OWSIdentityManager sharedManager] syncAllVerificationStates]; +// // Also sync all verification state after syncing contacts. +// [[OWSIdentityManager sharedManager] syncAllVerificationStates]; } else if (syncMessage.request.type == OWSSignalServiceProtosSyncMessageRequestTypeGroups) { OWSSyncGroupsMessage *syncGroupsMessage = [[OWSSyncGroupsMessage alloc] init]; @@ -690,7 +697,7 @@ NS_ASSUME_NONNULL_BEGIN [readReceiptsProcessor process]; } else if (syncMessage.hasVerified) { DDLogInfo(@"%@ Received verification state for %@", self.tag, syncMessage.verified.destination); - [[OWSIdentityManager sharedManager] processIncomingSyncMessage:syncMessage.verified]; + [self.identityManager processIncomingSyncMessage:syncMessage.verified]; } else { DDLogWarn(@"%@ Ignoring unsupported sync message.", self.tag); }