From 94c7b72361a68525b470be9cef805e3782755773 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Fri, 19 Oct 2018 14:26:33 -0400 Subject: [PATCH] Only send "sent message transcript" sync messages using UD. --- .../AppSettings/OWSLinkDeviceViewController.m | 26 +++++++++++++++++++ SignalServiceKit/src/Devices/OWSDevice.m | 15 +++++++++++ .../src/Messages/OWSMessageSend.swift | 8 ++++-- .../src/Messages/OWSMessageSender.m | 6 +++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/Signal/src/ViewControllers/AppSettings/OWSLinkDeviceViewController.m b/Signal/src/ViewControllers/AppSettings/OWSLinkDeviceViewController.m index 5312a5082..79c01657b 100644 --- a/Signal/src/ViewControllers/AppSettings/OWSLinkDeviceViewController.m +++ b/Signal/src/ViewControllers/AppSettings/OWSLinkDeviceViewController.m @@ -46,6 +46,8 @@ NS_ASSUME_NONNULL_BEGIN = NSLocalizedString(@"LINK_NEW_DEVICE_TITLE", "Navigation title when scanning QR code to add new device."); } +#pragma mark - Dependencies + - (OWSProfileManager *)profileManager { return [OWSProfileManager sharedManager]; @@ -56,6 +58,23 @@ NS_ASSUME_NONNULL_BEGIN return [OWSReadReceiptManager sharedManager]; } +- (id)udManager +{ + return SSKEnvironment.shared.udManager; +} + +- (TSAccountManager *)tsAccountManager +{ + return TSAccountManager.sharedInstance; +} + +- (TSSocketManager *)socketManager +{ + return SSKEnvironment.shared.socketManager; +} + +#pragma mark - + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -173,6 +192,13 @@ NS_ASSUME_NONNULL_BEGIN // The service implementation of the socket connection caches the linked device state, // so all sync message sends will fail on the socket until it is cycled. [TSSocketManager.shared cycleSocket]; + + [self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeUnknown + recipientId:self.tsAccountManager.localNumber]; + + // Fetch the local profile to determine if all + // linked devices support UD. + [self.profileManager fetchLocalUsersProfile]; }); } failure:^(NSError *error) { diff --git a/SignalServiceKit/src/Devices/OWSDevice.m b/SignalServiceKit/src/Devices/OWSDevice.m index 87b41d4e8..18a63aad1 100644 --- a/SignalServiceKit/src/Devices/OWSDevice.m +++ b/SignalServiceKit/src/Devices/OWSDevice.m @@ -5,6 +5,8 @@ #import "OWSDevice.h" #import "OWSError.h" #import "OWSPrimaryStorage.h" +#import "ProfileManagerProtocol.h" +#import "SSKEnvironment.h" #import "YapDatabaseConnection+OWS.h" #import "YapDatabaseConnection.h" #import "YapDatabaseTransaction.h" @@ -112,6 +114,11 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma @implementation OWSDevice +- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + [super saveWithTransaction:transaction]; +} + + (nullable instancetype)deviceFromJSONDictionary:(NSDictionary *)deviceAttributes error:(NSError **)error { OWSDevice *device = [MTLJSONAdapter modelOfClass:[self class] fromJSONDictionary:deviceAttributes error:error]; @@ -145,16 +152,19 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma + (void)replaceAll:(NSArray *)currentDevices { + BOOL didChange = NO; NSMutableArray *existingDevices = [[self allObjectsInCollection] mutableCopy]; for (OWSDevice *currentDevice in currentDevices) { NSUInteger existingDeviceIndex = [existingDevices indexOfObject:currentDevice]; if (existingDeviceIndex == NSNotFound) { // New Device [currentDevice save]; + didChange = YES; } else { OWSDevice *existingDevice = existingDevices[existingDeviceIndex]; if ([existingDevice updateAttributesWithDevice:currentDevice]) { [existingDevice save]; + didChange = YES; } [existingDevices removeObjectAtIndex:existingDeviceIndex]; } @@ -163,6 +173,11 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma // Since we removed existing devices as we went, only stale devices remain for (OWSDevice *staleDevice in existingDevices) { [staleDevice remove]; + didChange = YES; + } + + if (didChange) { + [SSKEnvironment.shared.profileManager fetchLocalUsersProfile]; } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSend.swift b/SignalServiceKit/src/Messages/OWSMessageSend.swift index b192f8bf9..6832f53ee 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSend.swift +++ b/SignalServiceKit/src/Messages/OWSMessageSend.swift @@ -79,9 +79,13 @@ public class OWSMessageSend: NSObject { } @objc - public func setHasUDAuthFailed() { - // We "fail over" to non-UD sends after auth errors sending via UD. + public func disableUD() { unidentifiedAccess = nil } + @objc + public func setHasUDAuthFailed() { + // We "fail over" to non-UD sends after auth errors sending via UD. + disableUD() + } } diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 181878f02..c3051a517 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1016,6 +1016,12 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; OWSLogWarn(@"Sending a message with no device messages."); } + OWSLogVerbose(@"sending to recipient.recipientId: %@", recipient.recipientId); + if ([message isKindOfClass:[OWSOutgoingSyncMessage class]] + && ![message isKindOfClass:[OWSOutgoingSentMessageTranscript class]]) { + [messageSend disableUD]; + } + OWSRequestMaker *requestMaker = [[OWSRequestMaker alloc] initWithRequestFactoryBlock:^(SSKUnidentifiedAccess *_Nullable unidentifiedAccess) { return [OWSRequestFactory submitMessageRequestWithRecipient:recipient.recipientId