Sync read receipt config to linked devices

// FREEBIE
pull/1/head
Michael Kirk 7 years ago
parent be197621ac
commit ab5b090338

@ -11,6 +11,7 @@
#import <SignalServiceKit/ECKeyPair+OWSPrivateKey.h>
#import <SignalServiceKit/OWSDeviceProvisioner.h>
#import <SignalServiceKit/OWSIdentityManager.h>
#import <SignalServiceKit/OWSReadReceiptManager.h>
#import <SignalServiceKit/TSAccountManager.h>
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.");

@ -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;

@ -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];

@ -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;

@ -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];
}

@ -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

@ -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

@ -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);
}

Loading…
Cancel
Save