diff --git a/Signal/src/ViewControllers/OWSLinkDeviceViewController.m b/Signal/src/ViewControllers/OWSLinkDeviceViewController.m index 04eb52320..20f9242cf 100644 --- a/Signal/src/ViewControllers/OWSLinkDeviceViewController.m +++ b/Signal/src/ViewControllers/OWSLinkDeviceViewController.m @@ -11,6 +11,7 @@ #import #import #import +#import #import NS_ASSUME_NONNULL_BEGIN @@ -20,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @property (strong, nonatomic) IBOutlet UIView *qrScanningView; @property (strong, nonatomic) IBOutlet UILabel *scanningInstructionsLabel; @property (strong, nonatomic) OWSQRCodeScanningViewController *qrScanningController; +@property (nonatomic, readonly) OWSReadReceiptManager *readReceiptManager; @end @@ -46,6 +48,11 @@ NS_ASSUME_NONNULL_BEGIN return [OWSProfileManager sharedManager]; } +- (OWSReadReceiptManager *)readReceiptManager +{ + return [OWSReadReceiptManager sharedManager]; +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -141,13 +148,15 @@ NS_ASSUME_NONNULL_BEGIN NSData *myPrivateKey = identityKeyPair.ows_privateKey; NSString *accountIdentifier = [TSAccountManager localNumber]; NSData *myProfileKeyData = self.profileManager.localProfileKey.keyData; + BOOL areReadReceiptsEnabled = self.readReceiptManager.areReadReceiptsEnabled; OWSDeviceProvisioner *provisioner = [[OWSDeviceProvisioner alloc] initWithMyPublicKey:myPublicKey myPrivateKey:myPrivateKey theirPublicKey:parser.publicKey theirEphemeralDeviceId:parser.ephemeralDeviceId accountIdentifier:accountIdentifier - profileKey:myProfileKeyData]; + profileKey:myProfileKeyData + readReceiptsEnabled:areReadReceiptsEnabled]; [provisioner provisionWithSuccess:^{ DDLogInfo(@"Successfully provisioned device."); diff --git a/SignalServiceKit/src/Devices/OWSDeviceProvisioner.h b/SignalServiceKit/src/Devices/OWSDeviceProvisioner.h index b9eef635a..d4b61fd5d 100644 --- a/SignalServiceKit/src/Devices/OWSDeviceProvisioner.h +++ b/SignalServiceKit/src/Devices/OWSDeviceProvisioner.h @@ -17,6 +17,7 @@ NS_ASSUME_NONNULL_BEGIN theirEphemeralDeviceId:(NSString *)ephemeralDeviceId accountIdentifier:(NSString *)accountIdentifier profileKey:(NSData *)profileKey + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService provisioningService:(OWSDeviceProvisioningService *)provisioningService NS_DESIGNATED_INITIALIZER; @@ -25,7 +26,8 @@ NS_ASSUME_NONNULL_BEGIN theirPublicKey:(NSData *)theirPublicKey theirEphemeralDeviceId:(NSString *)ephemeralDeviceId accountIdentifier:(NSString *)accountIdentifier - profileKey:(NSData *)profileKey; + profileKey:(NSData *)profileKey + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled; - (void)provisionWithSuccess:(void (^)())successCallback failure:(void (^)(NSError *))failureCallback; diff --git a/SignalServiceKit/src/Devices/OWSDeviceProvisioner.m b/SignalServiceKit/src/Devices/OWSDeviceProvisioner.m index 7816b5495..ba369cbda 100644 --- a/SignalServiceKit/src/Devices/OWSDeviceProvisioner.m +++ b/SignalServiceKit/src/Devices/OWSDeviceProvisioner.m @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) NSString *accountIdentifier; @property (nonatomic, readonly) NSData *profileKey; @property (nonatomic, nullable) NSString *ephemeralDeviceId; +@property (nonatomic, readonly) BOOL areReadReceiptsEnabled; @property (nonatomic, readonly) OWSDeviceProvisioningCodeService *provisioningCodeService; @property (nonatomic, readonly) OWSDeviceProvisioningService *provisioningService; @@ -31,6 +32,7 @@ NS_ASSUME_NONNULL_BEGIN theirEphemeralDeviceId:(NSString *)ephemeralDeviceId accountIdentifier:(NSString *)accountIdentifier profileKey:(NSData *)profileKey + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService provisioningService:(OWSDeviceProvisioningService *)provisioningService { @@ -45,6 +47,7 @@ NS_ASSUME_NONNULL_BEGIN _accountIdentifier = accountIdentifier; _profileKey = profileKey; _ephemeralDeviceId = ephemeralDeviceId; + _areReadReceiptsEnabled = areReadReceiptsEnabled; _provisioningCodeService = provisioningCodeService; _provisioningService = provisioningService; @@ -57,6 +60,7 @@ NS_ASSUME_NONNULL_BEGIN theirEphemeralDeviceId:(NSString *)ephemeralDeviceId accountIdentifier:(NSString *)accountIdentifier profileKey:(NSData *)profileKey + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled { return [self initWithMyPublicKey:myPublicKey myPrivateKey:myPrivateKey @@ -64,6 +68,7 @@ NS_ASSUME_NONNULL_BEGIN theirEphemeralDeviceId:ephemeralDeviceId accountIdentifier:accountIdentifier profileKey:profileKey + readReceiptsEnabled:areReadReceiptsEnabled provisioningCodeService:[OWSDeviceProvisioningCodeService new] provisioningService:[OWSDeviceProvisioningService new]]; } @@ -89,6 +94,7 @@ NS_ASSUME_NONNULL_BEGIN theirPublicKey:self.theirPublicKey accountIdentifier:self.accountIdentifier profileKey:self.profileKey + readReceiptsEnabled:self.areReadReceiptsEnabled provisioningCode:provisioningCode]; NSData *_Nullable messageBody = [message buildEncryptedMessageBody]; diff --git a/SignalServiceKit/src/Devices/OWSProvisioningMessage.h b/SignalServiceKit/src/Devices/OWSProvisioningMessage.h index 37d46902f..652fc4a09 100644 --- a/SignalServiceKit/src/Devices/OWSProvisioningMessage.h +++ b/SignalServiceKit/src/Devices/OWSProvisioningMessage.h @@ -11,6 +11,7 @@ NS_ASSUME_NONNULL_BEGIN theirPublicKey:(NSData *)theirPublicKey accountIdentifier:(NSString *)accountIdentifier profileKey:(NSData *)profileKey + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled provisioningCode:(NSString *)provisioningCode; - (nullable NSData *)buildEncryptedMessageBody; diff --git a/SignalServiceKit/src/Devices/OWSProvisioningMessage.m b/SignalServiceKit/src/Devices/OWSProvisioningMessage.m index abb02aeb4..832759089 100644 --- a/SignalServiceKit/src/Devices/OWSProvisioningMessage.m +++ b/SignalServiceKit/src/Devices/OWSProvisioningMessage.m @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, readonly) NSString *accountIdentifier; @property (nonatomic, readonly) NSData *theirPublicKey; @property (nonatomic, readonly) NSData *profileKey; +@property (nonatomic, readonly) BOOL areReadReceiptsEnabled; @property (nonatomic, readonly) NSString *provisioningCode; @end @@ -29,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN theirPublicKey:(NSData *)theirPublicKey accountIdentifier:(NSString *)accountIdentifier profileKey:(NSData *)profileKey + readReceiptsEnabled:(BOOL)areReadReceiptsEnabled provisioningCode:(NSString *)provisioningCode { self = [super init]; @@ -41,6 +43,7 @@ NS_ASSUME_NONNULL_BEGIN _theirPublicKey = theirPublicKey; _accountIdentifier = accountIdentifier; _profileKey = profileKey; + _areReadReceiptsEnabled = areReadReceiptsEnabled; _provisioningCode = provisioningCode; return self; @@ -49,12 +52,13 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSData *)buildEncryptedMessageBody { OWSProvisioningProtosProvisionMessageBuilder *messageBuilder = [OWSProvisioningProtosProvisionMessageBuilder new]; - [messageBuilder setIdentityKeyPublic:self.myPublicKey]; - [messageBuilder setIdentityKeyPrivate:self.myPrivateKey]; - [messageBuilder setNumber:self.accountIdentifier]; - [messageBuilder setProvisioningCode:self.provisioningCode]; - [messageBuilder setUserAgent:@"OWI"]; - [messageBuilder setProfileKey:self.profileKey]; + messageBuilder.identityKeyPublic = self.myPublicKey; + messageBuilder.identityKeyPrivate = self.myPrivateKey; + messageBuilder.number = self.accountIdentifier; + messageBuilder.provisioningCode = self.provisioningCode; + messageBuilder.userAgent = @"OWI"; + messageBuilder.readReceipts = self.areReadReceiptsEnabled; + messageBuilder.profileKey = self.profileKey; NSData *plainTextProvisionMessage = [[messageBuilder build] data]; @@ -67,8 +71,8 @@ NS_ASSUME_NONNULL_BEGIN OWSProvisioningProtosProvisionEnvelopeBuilder *envelopeBuilder = [OWSProvisioningProtosProvisionEnvelopeBuilder new]; // Note that this is a one-time-use *cipher* public key, not our Signal *identity* public key - [envelopeBuilder setPublicKey:[cipher.ourPublicKey prependKeyType]]; - [envelopeBuilder setBody:encryptedProvisionMessage]; + envelopeBuilder.publicKey = [cipher.ourPublicKey prependKeyType]; + envelopeBuilder.body = encryptedProvisionMessage; return [[envelopeBuilder build] data]; } diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h new file mode 100644 index 000000000..7f15795ff --- /dev/null +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.h @@ -0,0 +1,15 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "OWSOutgoingSyncMessage.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSSyncConfigurationMessage : OWSOutgoingSyncMessage + +- (instancetype)initWithReadReceiptsEnabled:(BOOL)readReceiptsEnabled; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m new file mode 100644 index 000000000..cfcbdfebd --- /dev/null +++ b/SignalServiceKit/src/Messages/DeviceSyncing/OWSSyncConfigurationMessage.m @@ -0,0 +1,46 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "OWSSyncConfigurationMessage.h" +#import "OWSSignalServiceProtos.pb.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSSyncConfigurationMessage () + +@property (nonatomic, readonly) BOOL areReadReceiptsEnabled; + +@end + +@implementation OWSSyncConfigurationMessage + +- (instancetype)initWithReadReceiptsEnabled:(BOOL)areReadReceiptsEnabled +{ + self = [super init]; + if (!self) { + return nil; + } + + _areReadReceiptsEnabled = areReadReceiptsEnabled; + + return self; +} + +- (OWSSignalServiceProtosSyncMessageBuilder *)syncMessageBuilder +{ + + OWSSignalServiceProtosSyncMessageConfigurationBuilder *configurationBuilder = + [OWSSignalServiceProtosSyncMessageConfigurationBuilder new]; + configurationBuilder.readReceipts = self.areReadReceiptsEnabled; + + OWSSignalServiceProtosSyncMessageBuilder *builder = [OWSSignalServiceProtosSyncMessageBuilder new]; + + builder.configurationBuilder = configurationBuilder; + + return builder; +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 7e465d0af..6b7192213 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -20,6 +20,7 @@ #import "OWSMessageSender.h" #import "OWSReadReceiptManager.h" #import "OWSRecordTranscriptJob.h" +#import "OWSSyncConfigurationMessage.h" #import "OWSSyncContactsMessage.h" #import "OWSSyncGroupsMessage.h" #import "OWSSyncGroupsRequestMessage.h" @@ -600,6 +601,20 @@ NS_ASSUME_NONNULL_BEGIN failure:^(NSError *error) { DDLogError(@"%@ Failed to send Groups response syncMessage with error: %@", self.tag, error); }]; + } else if (syncMessage.request.type == OWSSignalServiceProtosSyncMessageRequestTypeBlocked) { + // TODO + DDLogWarn(@"%@ Received unsupported request for block list", self.tag); + } else if (syncMessage.request.type == OWSSignalServiceProtosSyncMessageRequestTypeConfiguration) { + BOOL areReadReceiptsEnabled = [[OWSReadReceiptManager sharedManager] areReadReceiptsEnabled]; + OWSSyncConfigurationMessage *syncConfigurationMessage = + [[OWSSyncConfigurationMessage alloc] initWithReadReceiptsEnabled:areReadReceiptsEnabled]; + [self.messageSender sendMessage:syncConfigurationMessage + success:^{ + DDLogInfo(@"%@ Successfully sent Configuration response syncMessage.", self.tag); + } + failure:^(NSError *error) { + DDLogError(@"%@ Failed to send Configuration response syncMessage with error: %@", self.tag, error); + }]; } else { DDLogWarn(@"%@ ignoring unsupported sync request message", self.tag); }