Merge branch 'charlesmchen/udSyncVsDeviceLinking'

pull/1/head
Matthew Chen 7 years ago
commit 9cb7f1a4f8

@ -46,6 +46,8 @@ NS_ASSUME_NONNULL_BEGIN
= NSLocalizedString(@"LINK_NEW_DEVICE_TITLE", "Navigation title when scanning QR code to add new device."); = NSLocalizedString(@"LINK_NEW_DEVICE_TITLE", "Navigation title when scanning QR code to add new device.");
} }
#pragma mark - Dependencies
- (OWSProfileManager *)profileManager - (OWSProfileManager *)profileManager
{ {
return [OWSProfileManager sharedManager]; return [OWSProfileManager sharedManager];
@ -56,6 +58,23 @@ NS_ASSUME_NONNULL_BEGIN
return [OWSReadReceiptManager sharedManager]; return [OWSReadReceiptManager sharedManager];
} }
- (id<OWSUDManager>)udManager
{
return SSKEnvironment.shared.udManager;
}
- (TSAccountManager *)tsAccountManager
{
return TSAccountManager.sharedInstance;
}
- (TSSocketManager *)socketManager
{
return SSKEnvironment.shared.socketManager;
}
#pragma mark -
- (void)viewWillAppear:(BOOL)animated - (void)viewWillAppear:(BOOL)animated
{ {
[super viewWillAppear:animated]; [super viewWillAppear:animated];
@ -173,6 +192,13 @@ NS_ASSUME_NONNULL_BEGIN
// The service implementation of the socket connection caches the linked device state, // 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. // so all sync message sends will fail on the socket until it is cycled.
[TSSocketManager.shared cycleSocket]; [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) { failure:^(NSError *error) {

@ -525,7 +525,14 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error);
if (!localNumber) { if (!localNumber) {
return; return;
} }
[ProfileFetcherJob runWithRecipientId:localNumber ignoreThrottling:YES]; [self fetchProfileForRecipientId:localNumber];
}
- (void)fetchProfileForRecipientId:(NSString *)recipientId
{
OWSAssertIsOnMainThread();
[ProfileFetcherJob runWithRecipientId:recipientId ignoreThrottling:YES];
} }
#pragma mark - Profile Key Rotation #pragma mark - Profile Key Rotation
@ -997,8 +1004,7 @@ typedef void (^ProfileManagerFailureBlock)(NSError *error);
dbConnection:self.dbConnection dbConnection:self.dbConnection
completion:^{ completion:^{
dispatch_async(dispatch_get_main_queue(), ^(void) { dispatch_async(dispatch_get_main_queue(), ^(void) {
[ProfileFetcherJob runWithRecipientId:recipientId [self fetchProfileForRecipientId:recipientId];
ignoreThrottling:YES];
}); });
}]; }];
}); });

@ -4,7 +4,10 @@
#import "SignalRecipient.h" #import "SignalRecipient.h"
#import "OWSDevice.h" #import "OWSDevice.h"
#import "ProfileManagerProtocol.h"
#import "SSKEnvironment.h"
#import "TSAccountManager.h" #import "TSAccountManager.h"
#import <SignalServiceKit/SignalServiceKit-Swift.h>
#import <YapDatabase/YapDatabaseConnection.h> #import <YapDatabase/YapDatabaseConnection.h>
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -19,6 +22,20 @@ NS_ASSUME_NONNULL_BEGIN
@implementation SignalRecipient @implementation SignalRecipient
#pragma mark - Dependencies
- (id<ProfileManagerProtocol>)profileManager
{
return SSKEnvironment.shared.profileManager;
}
- (id<OWSUDManager>)udManager
{
return SSKEnvironment.shared.udManager;
}
#pragma mark -
+ (instancetype)getOrBuildUnsavedRecipientForRecipientId:(NSString *)recipientId + (instancetype)getOrBuildUnsavedRecipientForRecipientId:(NSString *)recipientId
transaction:(YapDatabaseReadTransaction *)transaction transaction:(YapDatabaseReadTransaction *)transaction
{ {
@ -127,6 +144,17 @@ NS_ASSUME_NONNULL_BEGIN
if (devicesToRemove.count > 0) { if (devicesToRemove.count > 0) {
[self removeDevicesFromRecipient:[NSSet setWithArray:devicesToRemove] transaction:transaction]; [self removeDevicesFromRecipient:[NSSet setWithArray:devicesToRemove] transaction:transaction];
} }
// Device changes
dispatch_async(dispatch_get_main_queue(), ^{
// Device changes can affect the UD access mode for a recipient,
// so we need to:
//
// * Mark the UD access mode as "unknown".
// * Fetch the profile for this user to update UD access mode.
[self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeUnknown recipientId:self.recipientId];
[self.profileManager fetchProfileForRecipientId:self.recipientId];
});
} }
- (void)addDevicesToRegisteredRecipient:(NSSet *)devices transaction:(YapDatabaseReadWriteTransaction *)transaction - (void)addDevicesToRegisteredRecipient:(NSSet *)devices transaction:(YapDatabaseReadWriteTransaction *)transaction

@ -5,11 +5,15 @@
#import "OWSDevice.h" #import "OWSDevice.h"
#import "OWSError.h" #import "OWSError.h"
#import "OWSPrimaryStorage.h" #import "OWSPrimaryStorage.h"
#import "ProfileManagerProtocol.h"
#import "SSKEnvironment.h"
#import "TSAccountManager.h"
#import "YapDatabaseConnection+OWS.h" #import "YapDatabaseConnection+OWS.h"
#import "YapDatabaseConnection.h" #import "YapDatabaseConnection.h"
#import "YapDatabaseTransaction.h" #import "YapDatabaseTransaction.h"
#import <Mantle/MTLValueTransformer.h> #import <Mantle/MTLValueTransformer.h>
#import <SignalCoreKit/NSDate+OWS.h> #import <SignalCoreKit/NSDate+OWS.h>
#import <SignalServiceKit/SignalServiceKit-Swift.h>
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@ -112,6 +116,30 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma
@implementation OWSDevice @implementation OWSDevice
#pragma mark - Dependencies
+ (id<ProfileManagerProtocol>)profileManager
{
return SSKEnvironment.shared.profileManager;
}
+ (id<OWSUDManager>)udManager
{
return SSKEnvironment.shared.udManager;
}
+ (TSAccountManager *)tsAccountManager
{
return TSAccountManager.sharedInstance;
}
#pragma mark -
- (void)saveWithTransaction:(YapDatabaseReadWriteTransaction *)transaction
{
[super saveWithTransaction:transaction];
}
+ (nullable instancetype)deviceFromJSONDictionary:(NSDictionary *)deviceAttributes error:(NSError **)error + (nullable instancetype)deviceFromJSONDictionary:(NSDictionary *)deviceAttributes error:(NSError **)error
{ {
OWSDevice *device = [MTLJSONAdapter modelOfClass:[self class] fromJSONDictionary:deviceAttributes error:error]; OWSDevice *device = [MTLJSONAdapter modelOfClass:[self class] fromJSONDictionary:deviceAttributes error:error];
@ -145,16 +173,19 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma
+ (void)replaceAll:(NSArray<OWSDevice *> *)currentDevices + (void)replaceAll:(NSArray<OWSDevice *> *)currentDevices
{ {
BOOL didChange = NO;
NSMutableArray<OWSDevice *> *existingDevices = [[self allObjectsInCollection] mutableCopy]; NSMutableArray<OWSDevice *> *existingDevices = [[self allObjectsInCollection] mutableCopy];
for (OWSDevice *currentDevice in currentDevices) { for (OWSDevice *currentDevice in currentDevices) {
NSUInteger existingDeviceIndex = [existingDevices indexOfObject:currentDevice]; NSUInteger existingDeviceIndex = [existingDevices indexOfObject:currentDevice];
if (existingDeviceIndex == NSNotFound) { if (existingDeviceIndex == NSNotFound) {
// New Device // New Device
[currentDevice save]; [currentDevice save];
didChange = YES;
} else { } else {
OWSDevice *existingDevice = existingDevices[existingDeviceIndex]; OWSDevice *existingDevice = existingDevices[existingDeviceIndex];
if ([existingDevice updateAttributesWithDevice:currentDevice]) { if ([existingDevice updateAttributesWithDevice:currentDevice]) {
[existingDevice save]; [existingDevice save];
didChange = YES;
} }
[existingDevices removeObjectAtIndex:existingDeviceIndex]; [existingDevices removeObjectAtIndex:existingDeviceIndex];
} }
@ -163,6 +194,20 @@ NSString *const kOWSPrimaryStorage_MayHaveLinkedDevices = @"kTSStorageManager_Ma
// Since we removed existing devices as we went, only stale devices remain // Since we removed existing devices as we went, only stale devices remain
for (OWSDevice *staleDevice in existingDevices) { for (OWSDevice *staleDevice in existingDevices) {
[staleDevice remove]; [staleDevice remove];
didChange = YES;
}
if (didChange) {
dispatch_async(dispatch_get_main_queue(), ^{
// Device changes can affect the UD access mode for a recipient,
// so we need to:
//
// * Mark the UD access mode as "unknown".
// * Fetch the profile for this user to update UD access mode.
[self.udManager setUnidentifiedAccessMode:UnidentifiedAccessModeUnknown
recipientId:self.tsAccountManager.localNumber];
[self.profileManager fetchLocalUsersProfile];
});
} }
} }

@ -79,9 +79,13 @@ public class OWSMessageSend: NSObject {
} }
@objc @objc
public func setHasUDAuthFailed() { public func disableUD() {
// We "fail over" to non-UD sends after auth errors sending via UD.
unidentifiedAccess = nil unidentifiedAccess = nil
} }
@objc
public func setHasUDAuthFailed() {
// We "fail over" to non-UD sends after auth errors sending via UD.
disableUD()
}
} }

@ -1016,6 +1016,11 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException";
OWSLogWarn(@"Sending a message with no device messages."); OWSLogWarn(@"Sending a message with no device messages.");
} }
if ([message isKindOfClass:[OWSOutgoingSyncMessage class]]
&& ![message isKindOfClass:[OWSOutgoingSentMessageTranscript class]]) {
[messageSend disableUD];
}
OWSRequestMaker *requestMaker = [[OWSRequestMaker alloc] OWSRequestMaker *requestMaker = [[OWSRequestMaker alloc]
initWithRequestFactoryBlock:^(SSKUnidentifiedAccess *_Nullable unidentifiedAccess) { initWithRequestFactoryBlock:^(SSKUnidentifiedAccess *_Nullable unidentifiedAccess) {
return [OWSRequestFactory submitMessageRequestWithRecipient:recipient.recipientId return [OWSRequestFactory submitMessageRequestWithRecipient:recipient.recipientId

@ -23,6 +23,8 @@ NS_ASSUME_NONNULL_BEGIN
- (void)fetchLocalUsersProfile; - (void)fetchLocalUsersProfile;
- (void)fetchProfileForRecipientId:(NSString *)recipientId;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

Loading…
Cancel
Save