Merge branch 'mkirk/profile-key-sync'

pull/1/head
Michael Kirk 8 years ago
commit fb42077db4

@ -115,6 +115,8 @@
4509E79A1DD653700025A59F /* WebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4509E7991DD653700025A59F /* WebRTC.framework */; };
450DF2051E0D74AC003D14BE /* Platform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450DF2041E0D74AC003D14BE /* Platform.swift */; };
450DF2091E0DD2C6003D14BE /* UserNotificationsAdaptee.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450DF2081E0DD2C6003D14BE /* UserNotificationsAdaptee.swift */; };
451686AB1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451686AA1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift */; };
451686AC1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451686AA1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift */; };
4516E3FF1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4516E3FE1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m */; };
4517642A1DE939FD00EDB8B9 /* ContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 451764281DE939FD00EDB8B9 /* ContactCell.xib */; };
4517642B1DE939FD00EDB8B9 /* ContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451764291DE939FD00EDB8B9 /* ContactCell.swift */; };
@ -578,6 +580,7 @@
4509E7991DD653700025A59F /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = Carthage/Build/iOS/WebRTC.framework; sourceTree = "<group>"; };
450DF2041E0D74AC003D14BE /* Platform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Platform.swift; sourceTree = "<group>"; };
450DF2081E0DD2C6003D14BE /* UserNotificationsAdaptee.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = UserNotificationsAdaptee.swift; path = UserInterface/Notifications/UserNotificationsAdaptee.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
451686AA1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiDeviceProfileKeyUpdateJob.swift; sourceTree = "<group>"; };
4516E3FD1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWS101ExistingUsersBlockOnIdentityChange.h; path = Migrations/OWS101ExistingUsersBlockOnIdentityChange.h; sourceTree = "<group>"; };
4516E3FE1DD2193B00DC4206 /* OWS101ExistingUsersBlockOnIdentityChange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWS101ExistingUsersBlockOnIdentityChange.m; path = Migrations/OWS101ExistingUsersBlockOnIdentityChange.m; sourceTree = "<group>"; };
451764281DE939FD00EDB8B9 /* ContactCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ContactCell.xib; sourceTree = "<group>"; };
@ -1276,6 +1279,7 @@
45D231761DC7E8F10034FA89 /* SessionResetJob.swift */,
452ECA4C1E087E7200E2F016 /* MessageFetcherJob.swift */,
4585C4651ED5DF7A00896AEA /* ProfileFetcherJob.swift */,
451686AA1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift */,
);
name = Jobs;
sourceTree = "<group>";
@ -2247,6 +2251,7 @@
34CE88E71F2FB9A10098030F /* ProfileViewController.m in Sources */,
348F2EAE1F0D21BC00D4ECE0 /* DeviceSleepManager.swift in Sources */,
34E3EF101EFC2684007F6822 /* DebugUIPage.m in Sources */,
451686AB1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift in Sources */,
76EB058A18170B33006006FC /* Release.m in Sources */,
45D231771DC7E8F10034FA89 /* SessionResetJob.swift in Sources */,
4563ADF11F22BD7100DEB8C7 /* OWS106EnsureProfileComplete.swift in Sources */,
@ -2462,6 +2467,7 @@
B660F6E01C29868000687D6E /* UtilTest.m in Sources */,
45F3AEB71DFDE7900080CE33 /* AvatarImageView.swift in Sources */,
B660F6DA1C29868000687D6E /* ExceptionsTest.m in Sources */,
451686AC1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift in Sources */,
45C9DEB91DF4E35A0065CA84 /* WebRTCCallMessageHandler.swift in Sources */,
B660F6DB1C29868000687D6E /* FunctionalUtilTest.m in Sources */,
45E7A6A81E71CA7E00D44FB5 /* DisplayableTextFilterTest.swift in Sources */,

@ -152,7 +152,8 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
self.contactsSyncing = [[OWSContactsSyncing alloc] initWithContactsManager:[Environment getCurrent].contactsManager
identityManager:[OWSIdentityManager sharedManager]
messageSender:[Environment getCurrent].messageSender];
messageSender:[Environment getCurrent].messageSender
profileManager:[OWSProfileManager sharedManager]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(databaseViewRegistrationComplete)

@ -0,0 +1,59 @@
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
import Foundation
import PromiseKit
/**
* Used to distribute our profile key to legacy linked devices, newly linked devices will have our profile key as part of provisioning.
* Syncing is accomplished via the existing contact syncing mechanism, except the only contact synced is ourself. It's incumbent on the linked device
* to treat this "self contact" record specially.
*/
@objc class MultiDeviceProfileKeyUpdateJob: NSObject {
let TAG = "[MultiDeviceProfileKeyUpdateJob]"
let profileKey: OWSAES256Key
let identityManager: OWSIdentityManager
let messageSender: MessageSender
let profileManager: OWSProfileManager
required init(profileKey: OWSAES256Key, identityManager: OWSIdentityManager, messageSender: MessageSender, profileManager: OWSProfileManager) {
self.profileKey = profileKey
self.identityManager = identityManager
self.messageSender = messageSender
self.profileManager = profileManager
}
class func run(profileKey: OWSAES256Key, identityManager: OWSIdentityManager, messageSender: MessageSender, profileManager: OWSProfileManager) {
return self.init(profileKey: profileKey, identityManager: identityManager, messageSender: messageSender, profileManager: profileManager).run()
}
func run(retryDelay: TimeInterval = 1) {
guard let localNumber = TSAccountManager.localNumber() else {
owsFail("\(self.TAG) localNumber was unexpectedly nil")
return
}
let localSignalAccount = SignalAccount(recipientId: localNumber)
localSignalAccount.contact = Contact()
let syncContactsMessage = OWSSyncContactsMessage(signalAccounts: [localSignalAccount],
identityManager: self.identityManager,
profileManager: self.profileManager)
self.messageSender.sendTemporaryAttachmentData(syncContactsMessage.buildPlainTextAttachmentData(),
contentType: OWSMimeTypeApplicationOctetStream,
in: syncContactsMessage,
success: {
Logger.info("\(self.TAG) Successfully synced profile key")
},
failure: { error in
Logger.error("\(self.TAG) in \(#function) failed with error: \(error) retrying in \(retryDelay)s.")
after(seconds: retryDelay).then {
self.run(retryDelay: retryDelay * 2)
}.retainUntilComplete()
})
}
}

@ -105,6 +105,7 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
@property (nonatomic, readonly) OWSMessageSender *messageSender;
@property (nonatomic, readonly) YapDatabaseConnection *dbConnection;
@property (nonatomic, readonly) TSNetworkManager *networkManager;
@property (nonatomic, readonly) OWSIdentityManager *identityManager;
// This property can be accessed on any thread, while synchronized on self.
@property (nonatomic, readonly) UserProfile *localUserProfile;
@ -199,6 +200,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
return [OWSSignalService sharedInstance].CDNSessionManager;
}
- (OWSIdentityManager *)identityManager
{
return [OWSIdentityManager sharedManager];
}
#pragma mark - User Profile Accessor
// This method can be safely called from any thread.
@ -236,6 +242,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
dispatch_async(dispatch_get_main_queue(), ^{
if (isLocalUserProfile) {
[MultiDeviceProfileKeyUpdateJob runWithProfileKey:userProfile.profileKey
identityManager:self.identityManager
messageSender:self.messageSender
profileManager:self];
[[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_LocalProfileDidChange
object:nil
userInfo:nil];
@ -919,6 +930,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
});
}
- (nullable NSData *)profileKeyDataForRecipientId:(NSString *)recipientId
{
return [self profileKeyForRecipientId:recipientId].keyData;
}
- (nullable OWSAES256Key *)profileKeyForRecipientId:(NSString *)recipientId
{
OWSAssert(recipientId.length > 0);

@ -60,6 +60,7 @@
#import <SignalServiceKit/OWSCallIceUpdateMessage.h>
#import <SignalServiceKit/OWSCallMessageHandler.h>
#import <SignalServiceKit/OWSCallOfferMessage.h>
#import <SignalServiceKit/OWSContactsOutputStream.h>
#import <SignalServiceKit/OWSDispatch.h>
#import <SignalServiceKit/OWSEndSessionMessage.h>
#import <SignalServiceKit/OWSError.h>
@ -71,6 +72,7 @@
#import <SignalServiceKit/OWSOutgoingCallMessage.h>
#import <SignalServiceKit/OWSRecipientIdentity.h>
#import <SignalServiceKit/OWSSignalService.h>
#import <SignalServiceKit/OWSSyncContactsMessage.h>
#import <SignalServiceKit/OWSTurnServerInfoRequest.h>
#import <SignalServiceKit/PhoneNumber.h>
#import <SignalServiceKit/SignalAccount.h>

@ -3,8 +3,10 @@
//
#import "OWSLinkDeviceViewController.h"
#import "Cryptography.h"
#import "OWSDeviceProvisioningURLParser.h"
#import "OWSLinkedDevicesTableViewController.h"
#import "OWSProfileManager.h"
#import <SignalServiceKit/ECKeyPair+OWSPrivateKey.h>
#import <SignalServiceKit/OWSDeviceProvisioner.h>
#import <SignalServiceKit/OWSIdentityManager.h>
@ -38,6 +40,11 @@ NS_ASSUME_NONNULL_BEGIN
= NSLocalizedString(@"LINK_NEW_DEVICE_TITLE", "Navigation title when scanning QR code to add new device.");
}
- (OWSProfileManager *)profileManager
{
return [OWSProfileManager sharedManager];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
@ -132,12 +139,14 @@ NS_ASSUME_NONNULL_BEGIN
NSData *myPublicKey = identityKeyPair.publicKey;
NSData *myPrivateKey = identityKeyPair.ows_privateKey;
NSString *accountIdentifier = [TSAccountManager localNumber];
NSData *myProfileKeyData = self.profileManager.localProfileKey.keyData;
OWSDeviceProvisioner *provisioner = [[OWSDeviceProvisioner alloc] initWithMyPublicKey:myPublicKey
myPrivateKey:myPrivateKey
theirPublicKey:parser.publicKey
theirEphemeralDeviceId:parser.ephemeralDeviceId
accountIdentifier:accountIdentifier];
accountIdentifier:accountIdentifier
profileKey:myProfileKeyData];
[provisioner provisionWithSuccess:^{
DDLogInfo(@"Successfully provisioned device.");

@ -9,12 +9,14 @@ NS_ASSUME_NONNULL_BEGIN
@class OWSContactsManager;
@class OWSMessageSender;
@class OWSIdentityManager;
@class OWSProfileManager;
@interface OWSContactsSyncing : NSObject
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
identityManager:(OWSIdentityManager *)identityManager
messageSender:(OWSMessageSender *)messageSender;
messageSender:(OWSMessageSender *)messageSender
profileManager:(OWSProfileManager *)profileManager;
@end

@ -4,6 +4,7 @@
#import "OWSContactsSyncing.h"
#import "OWSContactsManager.h"
#import "OWSProfileManager.h"
#import "TSAccountManager.h"
#import <SignalServiceKit/MIMETypeUtil.h>
#import <SignalServiceKit/OWSMessageSender.h>
@ -24,6 +25,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
@property (nonatomic, readonly) OWSContactsManager *contactsManager;
@property (nonatomic, readonly) OWSIdentityManager *identityManager;
@property (nonatomic, readonly) OWSMessageSender *messageSender;
@property (nonatomic, readonly) OWSProfileManager *profileManager;
@property (nonatomic) BOOL isRequestInFlight;
@ -34,6 +36,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
identityManager:(OWSIdentityManager *)identityManager
messageSender:(OWSMessageSender *)messageSender
profileManager:(OWSProfileManager *)profileManager
{
self = [super init];
@ -48,6 +51,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
_contactsManager = contactsManager;
_identityManager = identityManager;
_messageSender = messageSender;
_profileManager = profileManager;
OWSSingletonAssert();
@ -90,8 +94,10 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
return;
}
OWSSyncContactsMessage *syncContactsMessage = [[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager
identityManager:self.identityManager];
OWSSyncContactsMessage *syncContactsMessage =
[[OWSSyncContactsMessage alloc] initWithSignalAccounts:self.contactsManager.signalAccounts
identityManager:self.identityManager
profileManager:self.profileManager];
NSData *messageData = [syncContactsMessage buildPlainTextAttachmentData];

@ -1,3 +1,9 @@
/**
* Copyright (C) 2014-2016 Open Whisper Systems
*
* Licensed according to the LICENSE file in this repository.
*/
package signalservice;
option java_package = "org.whispersystems.signalservice.internal.push";
@ -17,4 +23,5 @@ message ProvisionMessage {
optional string number = 3;
optional string provisioningCode = 4;
optional string userAgent = 5;
optional bytes profileKey = 6;
}

@ -37,35 +37,18 @@ message Content {
optional NullMessage nullMessage = 4;
}
message NullMessage {
optional bytes padding = 1;
}
message Verified {
enum State {
DEFAULT = 0;
VERIFIED = 1;
UNVERIFIED = 2;
}
optional string destination = 1;
optional bytes identityKey = 2;
optional State state = 3;
optional bytes nullMessage = 4;
}
message CallMessage {
message Offer {
optional uint64 id = 1;
// We've renamed the description field on iOS to avoid
// conflicts with [NSObject description].
// Signal-iOS renamed the description field to avoid
// conflicts with [NSObject description].
optional string sessionDescription = 2;
}
message Answer {
optional uint64 id = 1;
// We've renamed the description field on iOS to avoid
// conflicts with [NSObject description].
// Signal-iOS renamed the description field to avoid
// conflicts with [NSObject description].
optional string sessionDescription = 2;
}
@ -84,11 +67,14 @@ message CallMessage {
optional uint64 id = 1;
}
optional Offer offer = 1;
optional Answer answer = 2;
repeated IceUpdate iceUpdate = 3;
optional Hangup hangup = 4;
optional Busy busy = 5;
optional Offer offer = 1;
optional Answer answer = 2;
repeated IceUpdate iceUpdate = 3;
optional Hangup hangup = 4;
optional Busy busy = 5;
// Signal-iOS sends profile key with call messages
// for earlier discovery
optional bytes profileKey = 6;
}
@ -106,6 +92,23 @@ message DataMessage {
optional bytes profileKey = 6;
}
message NullMessage {
optional bytes padding = 1;
}
message Verified {
enum State {
DEFAULT = 0;
VERIFIED = 1;
UNVERIFIED = 2;
}
optional string destination = 1;
optional bytes identityKey = 2;
optional State state = 3;
optional bytes nullMessage = 4;
}
message SyncMessage {
message Sent {
optional string destination = 1;
@ -143,15 +146,14 @@ message SyncMessage {
optional uint64 timestamp = 2;
}
optional Sent sent = 1;
optional Contacts contacts = 2;
optional Groups groups = 3;
optional Request request = 4;
repeated Read read = 5;
optional Blocked blocked = 6;
optional Verified verified = 7;
optional bytes padding = 8;
optional bytes profileKey = 9;
optional Sent sent = 1;
optional Contacts contacts = 2;
optional Groups groups = 3;
optional Request request = 4;
repeated Read read = 5;
optional Blocked blocked = 6;
optional Verified verified = 7;
optional bytes padding = 8;
}
message AttachmentPointer {
@ -166,7 +168,7 @@ message AttachmentPointer {
optional bytes thumbnail = 5;
optional bytes digest = 6;
optional string fileName = 7;
optional uint32 flags = 8;
optional uint32 flags = 8;
}
message GroupContext {
@ -190,11 +192,12 @@ message ContactDetails {
optional uint32 length = 2;
}
optional string number = 1;
optional string name = 2;
optional Avatar avatar = 3;
optional string color = 4;
optional Verified verified = 5;
optional string number = 1;
optional string name = 2;
optional Avatar avatar = 3;
optional string color = 4;
optional Verified verified = 5;
optional bytes profileKey = 6;
}
message GroupDetails {

@ -12,7 +12,8 @@ NS_ASSUME_NONNULL_BEGIN
@interface OWSContactsOutputStream : OWSChunkedOutputStream
- (void)writeSignalAccount:(SignalAccount *)signalAccount
recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity;
recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity
profileKeyData:(nullable NSData *)profileKeyData;
@end

@ -4,6 +4,7 @@
#import "OWSContactsOutputStream.h"
#import "Contact.h"
#import "Cryptography.h"
#import "MIMETypeUtil.h"
#import "NSData+keyVersionByte.h"
#import "OWSRecipientIdentity.h"
@ -17,9 +18,11 @@ NS_ASSUME_NONNULL_BEGIN
- (void)writeSignalAccount:(SignalAccount *)signalAccount
recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity
profileKeyData:(nullable NSData *)profileKeyData
{
OWSAssert(signalAccount);
OWSAssert(signalAccount.contact);
OWSAssert(profileKeyData.length == kAES256_KeyByteLength);
OWSSignalServiceProtosContactDetailsBuilder *contactBuilder = [OWSSignalServiceProtosContactDetailsBuilder new];
[contactBuilder setName:signalAccount.contact.fullName];
@ -44,6 +47,10 @@ NS_ASSUME_NONNULL_BEGIN
[contactBuilder setAvatarBuilder:avatarBuilder];
}
if (profileKeyData) {
[contactBuilder setProfileKey:profileKeyData];
}
NSData *contactData = [[contactBuilder build] data];
uint32_t contactDataLength = (uint32_t)contactData.length;

@ -1,4 +1,6 @@
// Copyright © 2016 Open Whisper Systems. All rights reserved.
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
NS_ASSUME_NONNULL_BEGIN
@ -14,14 +16,16 @@ NS_ASSUME_NONNULL_BEGIN
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService
provisioningService:(OWSDeviceProvisioningService *)provisioningService NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirEncodedPublicKey
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier;
accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey;
- (void)provisionWithSuccess:(void (^)())successCallback failure:(void (^)(NSError *))failureCallback;

@ -13,6 +13,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) NSData *myPrivateKey;
@property (nonatomic, readonly) NSData *theirPublicKey;
@property (nonatomic, readonly) NSString *accountIdentifier;
@property (nonatomic, readonly) NSData *profileKey;
@property (nonatomic, nullable) NSString *ephemeralDeviceId;
@property (nonatomic, readonly) OWSDeviceProvisioningCodeService *provisioningCodeService;
@property (nonatomic, readonly) OWSDeviceProvisioningService *provisioningService;
@ -26,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService
provisioningService:(OWSDeviceProvisioningService *)provisioningService
{
@ -38,6 +40,7 @@ NS_ASSUME_NONNULL_BEGIN
_myPrivateKey = myPrivateKey;
_theirPublicKey = theirPublicKey;
_accountIdentifier = accountIdentifier;
_profileKey = profileKey;
_ephemeralDeviceId = ephemeralDeviceId;
_provisioningCodeService = provisioningCodeService;
_provisioningService = provisioningService;
@ -50,12 +53,14 @@ NS_ASSUME_NONNULL_BEGIN
theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
{
return [self initWithMyPublicKey:myPublicKey
myPrivateKey:myPrivateKey
theirPublicKey:theirPublicKey
theirEphemeralDeviceId:ephemeralDeviceId
accountIdentifier:accountIdentifier
profileKey:profileKey
provisioningCodeService:[OWSDeviceProvisioningCodeService new]
provisioningService:[OWSDeviceProvisioningService new]];
}
@ -80,6 +85,7 @@ NS_ASSUME_NONNULL_BEGIN
myPrivateKey:self.myPrivateKey
theirPublicKey:self.theirPublicKey
accountIdentifier:self.accountIdentifier
profileKey:self.profileKey
provisioningCode:provisioningCode];
[self.provisioningService provisionWithMessageBody:[message buildEncryptedMessageBody]

@ -8,6 +8,7 @@ NS_ASSUME_NONNULL_BEGIN
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
provisioningCode:(NSString *)provisioningCode;
- (NSData *)buildEncryptedMessageBody;

@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, readonly) NSData *myPrivateKey;
@property (nonatomic, readonly) NSString *accountIdentifier;
@property (nonatomic, readonly) NSData *theirPublicKey;
@property (nonatomic, readonly) NSData *profileKey;
@property (nonatomic, readonly) NSString *provisioningCode;
@end
@ -25,6 +26,7 @@ NS_ASSUME_NONNULL_BEGIN
myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirPublicKey
accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
provisioningCode:(NSString *)provisioningCode
{
self = [super init];
@ -34,8 +36,9 @@ NS_ASSUME_NONNULL_BEGIN
_myPublicKey = myPublicKey;
_myPrivateKey = myPrivateKey;
_accountIdentifier = accountIdentifier;
_theirPublicKey = theirPublicKey;
_accountIdentifier = accountIdentifier;
_profileKey = profileKey;
_provisioningCode = provisioningCode;
return self;
@ -49,6 +52,7 @@ NS_ASSUME_NONNULL_BEGIN
[messageBuilder setNumber:self.accountIdentifier];
[messageBuilder setProvisioningCode:self.provisioningCode];
[messageBuilder setUserAgent:@"OWI"];
[messageBuilder setProfileKey:self.profileKey];
NSData *plainTextProvisionMessage = [[messageBuilder build] data];

@ -126,6 +126,7 @@
#define ProvisionMessage_number @"number"
#define ProvisionMessage_provisioningCode @"provisioningCode"
#define ProvisionMessage_userAgent @"userAgent"
#define ProvisionMessage_profileKey @"profileKey"
@interface OWSProvisioningProtosProvisionMessage : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasNumber_:1;
@ -133,22 +134,26 @@
BOOL hasUserAgent_:1;
BOOL hasIdentityKeyPublic_:1;
BOOL hasIdentityKeyPrivate_:1;
BOOL hasProfileKey_:1;
NSString* number;
NSString* provisioningCode;
NSString* userAgent;
NSData* identityKeyPublic;
NSData* identityKeyPrivate;
NSData* profileKey;
}
- (BOOL) hasIdentityKeyPublic;
- (BOOL) hasIdentityKeyPrivate;
- (BOOL) hasNumber;
- (BOOL) hasProvisioningCode;
- (BOOL) hasUserAgent;
- (BOOL) hasProfileKey;
@property (readonly, strong) NSData* identityKeyPublic;
@property (readonly, strong) NSData* identityKeyPrivate;
@property (readonly, strong) NSString* number;
@property (readonly, strong) NSString* provisioningCode;
@property (readonly, strong) NSString* userAgent;
@property (readonly, strong) NSData* profileKey;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
@ -209,6 +214,11 @@
- (NSString*) userAgent;
- (OWSProvisioningProtosProvisionMessageBuilder*) setUserAgent:(NSString*) value;
- (OWSProvisioningProtosProvisionMessageBuilder*) clearUserAgent;
- (BOOL) hasProfileKey;
- (NSData*) profileKey;
- (OWSProvisioningProtosProvisionMessageBuilder*) setProfileKey:(NSData*) value;
- (OWSProvisioningProtosProvisionMessageBuilder*) clearProfileKey;
@end

@ -282,6 +282,7 @@ static OWSProvisioningProtosProvisionEnvelope* defaultOWSProvisioningProtosProvi
@property (strong) NSString* number;
@property (strong) NSString* provisioningCode;
@property (strong) NSString* userAgent;
@property (strong) NSData* profileKey;
@end
@implementation OWSProvisioningProtosProvisionMessage
@ -321,6 +322,13 @@ static OWSProvisioningProtosProvisionEnvelope* defaultOWSProvisioningProtosProvi
hasUserAgent_ = !!_value_;
}
@synthesize userAgent;
- (BOOL) hasProfileKey {
return !!hasProfileKey_;
}
- (void) setHasProfileKey:(BOOL) _value_ {
hasProfileKey_ = !!_value_;
}
@synthesize profileKey;
- (instancetype) init {
if ((self = [super init])) {
self.identityKeyPublic = [NSData data];
@ -328,6 +336,7 @@ static OWSProvisioningProtosProvisionEnvelope* defaultOWSProvisioningProtosProvi
self.number = @"";
self.provisioningCode = @"";
self.userAgent = @"";
self.profileKey = [NSData data];
}
return self;
}
@ -362,6 +371,9 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
if (self.hasUserAgent) {
[output writeString:5 value:self.userAgent];
}
if (self.hasProfileKey) {
[output writeData:6 value:self.profileKey];
}
[self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
@ -386,6 +398,9 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
if (self.hasUserAgent) {
size_ += computeStringSize(5, self.userAgent);
}
if (self.hasProfileKey) {
size_ += computeDataSize(6, self.profileKey);
}
size_ += self.unknownFields.serializedSize;
memoizedSerializedSize = size_;
return size_;
@ -436,6 +451,9 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
if (self.hasUserAgent) {
[output appendFormat:@"%@%@: %@\n", indent, @"userAgent", self.userAgent];
}
if (self.hasProfileKey) {
[output appendFormat:@"%@%@: %@\n", indent, @"profileKey", self.profileKey];
}
[self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (void) storeInDictionary:(NSMutableDictionary *)dictionary {
@ -454,6 +472,9 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
if (self.hasUserAgent) {
[dictionary setObject: self.userAgent forKey: @"userAgent"];
}
if (self.hasProfileKey) {
[dictionary setObject: self.profileKey forKey: @"profileKey"];
}
[self.unknownFields storeInDictionary:dictionary];
}
- (BOOL) isEqual:(id)other {
@ -475,6 +496,8 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
(!self.hasProvisioningCode || [self.provisioningCode isEqual:otherMessage.provisioningCode]) &&
self.hasUserAgent == otherMessage.hasUserAgent &&
(!self.hasUserAgent || [self.userAgent isEqual:otherMessage.userAgent]) &&
self.hasProfileKey == otherMessage.hasProfileKey &&
(!self.hasProfileKey || [self.profileKey isEqual:otherMessage.profileKey]) &&
(self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
@ -494,6 +517,9 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
if (self.hasUserAgent) {
hashCode = hashCode * 31 + [self.userAgent hash];
}
if (self.hasProfileKey) {
hashCode = hashCode * 31 + [self.profileKey hash];
}
hashCode = hashCode * 31 + [self.unknownFields hash];
return hashCode;
}
@ -552,6 +578,9 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
if (other.hasUserAgent) {
[self setUserAgent:other.userAgent];
}
if (other.hasProfileKey) {
[self setProfileKey:other.profileKey];
}
[self mergeUnknownFields:other.unknownFields];
return self;
}
@ -593,6 +622,10 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
[self setUserAgent:[input readString]];
break;
}
case 50: {
[self setProfileKey:[input readData]];
break;
}
}
}
}
@ -676,6 +709,22 @@ static OWSProvisioningProtosProvisionMessage* defaultOWSProvisioningProtosProvis
resultProvisionMessage.userAgent = @"";
return self;
}
- (BOOL) hasProfileKey {
return resultProvisionMessage.hasProfileKey;
}
- (NSData*) profileKey {
return resultProvisionMessage.profileKey;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) setProfileKey:(NSData*) value {
resultProvisionMessage.hasProfileKey = YES;
resultProvisionMessage.profileKey = value;
return self;
}
- (OWSProvisioningProtosProvisionMessageBuilder*) clearProfileKey {
resultProvisionMessage.hasProfileKey = NO;
resultProvisionMessage.profileKey = [NSData data];
return self;
}
@end

@ -32,8 +32,6 @@ NS_ASSUME_NONNULL_BEGIN
size_t paddingBytesLength = arc4random_uniform(512) + 1;
builder.padding = [Cryptography generateRandomBytes:paddingBytesLength];
[builder addLocalProfileKey];
return [builder build];
}

@ -6,14 +6,15 @@
NS_ASSUME_NONNULL_BEGIN
@class YapDatabaseReadWriteTransaction;
@protocol ContactsManagerProtocol;
@protocol ProfileManagerProtocol;
@class SignalAccount;
@class OWSIdentityManager;
@interface OWSSyncContactsMessage : OWSOutgoingSyncMessage
- (instancetype)initWithContactsManager:(id<ContactsManagerProtocol>)contactsManager
identityManager:(OWSIdentityManager *)identityManager;
- (instancetype)initWithSignalAccounts:(NSArray<SignalAccount *> *)signalAccounts
identityManager:(OWSIdentityManager *)identityManager
profileManager:(id<ProfileManagerProtocol>)profileManager;
- (NSData *)buildPlainTextAttachmentData;

@ -12,28 +12,32 @@
#import "SignalAccount.h"
#import "TSAttachment.h"
#import "TSAttachmentStream.h"
#import "ProfileManagerProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface OWSSyncContactsMessage ()
@property (nonatomic, readonly) id<ContactsManagerProtocol> contactsManager;
@property (nonatomic, readonly) NSArray<SignalAccount *> *signalAccounts;
@property (nonatomic, readonly) OWSIdentityManager *identityManager;
@property (nonatomic, readonly) id<ProfileManagerProtocol> profileManager;
@end
@implementation OWSSyncContactsMessage
- (instancetype)initWithContactsManager:(id<ContactsManagerProtocol>)contactsManager
identityManager:(OWSIdentityManager *)identityManager
- (instancetype)initWithSignalAccounts:(NSArray<SignalAccount *> *)signalAccounts
identityManager:(OWSIdentityManager *)identityManager
profileManager:(id<ProfileManagerProtocol>)profileManager
{
self = [super initWithTimestamp:[NSDate ows_millisecondTimeStamp]];
if (!self) {
return self;
}
_contactsManager = contactsManager;
_signalAccounts = signalAccounts;
_identityManager = identityManager;
_profileManager = profileManager;
return self;
}
@ -69,10 +73,14 @@ NS_ASSUME_NONNULL_BEGIN
[dataOutputStream open];
OWSContactsOutputStream *contactsOutputStream = [OWSContactsOutputStream streamWithOutputStream:dataOutputStream];
for (SignalAccount *signalAccount in self.contactsManager.signalAccounts) {
OWSRecipientIdentity *recipientIdentity = [self.identityManager recipientIdentityForRecipientId:signalAccount.recipientId];
for (SignalAccount *signalAccount in self.signalAccounts) {
OWSRecipientIdentity *_Nullable recipientIdentity =
[self.identityManager recipientIdentityForRecipientId:signalAccount.recipientId];
NSData *_Nullable profileKeyData = [self.profileManager profileKeyDataForRecipientId:signalAccount.recipientId];
[contactsOutputStream writeSignalAccount:signalAccount recipientIdentity:recipientIdentity];
[contactsOutputStream writeSignalAccount:signalAccount
recipientIdentity:recipientIdentity
profileKeyData:profileKeyData];
}
[contactsOutputStream flush];

@ -109,6 +109,14 @@ typedef NS_ENUM(SInt32, OWSSignalServiceProtosEnvelopeType) {
BOOL OWSSignalServiceProtosEnvelopeTypeIsValidValue(OWSSignalServiceProtosEnvelopeType value);
NSString *NSStringFromOWSSignalServiceProtosEnvelopeType(OWSSignalServiceProtosEnvelopeType value);
typedef NS_ENUM(SInt32, OWSSignalServiceProtosDataMessageFlags) {
OWSSignalServiceProtosDataMessageFlagsEndSession = 1,
OWSSignalServiceProtosDataMessageFlagsExpirationTimerUpdate = 2,
};
BOOL OWSSignalServiceProtosDataMessageFlagsIsValidValue(OWSSignalServiceProtosDataMessageFlags value);
NSString *NSStringFromOWSSignalServiceProtosDataMessageFlags(OWSSignalServiceProtosDataMessageFlags value);
typedef NS_ENUM(SInt32, OWSSignalServiceProtosVerifiedState) {
OWSSignalServiceProtosVerifiedStateDefault = 0,
OWSSignalServiceProtosVerifiedStateVerified = 1,
@ -118,14 +126,6 @@ typedef NS_ENUM(SInt32, OWSSignalServiceProtosVerifiedState) {
BOOL OWSSignalServiceProtosVerifiedStateIsValidValue(OWSSignalServiceProtosVerifiedState value);
NSString *NSStringFromOWSSignalServiceProtosVerifiedState(OWSSignalServiceProtosVerifiedState value);
typedef NS_ENUM(SInt32, OWSSignalServiceProtosDataMessageFlags) {
OWSSignalServiceProtosDataMessageFlagsEndSession = 1,
OWSSignalServiceProtosDataMessageFlagsExpirationTimerUpdate = 2,
};
BOOL OWSSignalServiceProtosDataMessageFlagsIsValidValue(OWSSignalServiceProtosDataMessageFlags value);
NSString *NSStringFromOWSSignalServiceProtosDataMessageFlags(OWSSignalServiceProtosDataMessageFlags value);
typedef NS_ENUM(SInt32, OWSSignalServiceProtosSyncMessageRequestType) {
OWSSignalServiceProtosSyncMessageRequestTypeUnknown = 0,
OWSSignalServiceProtosSyncMessageRequestTypeContacts = 1,
@ -359,136 +359,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (OWSSignalServiceProtosContentBuilder*) clearNullMessage;
@end
#define NullMessage_padding @"padding"
@interface OWSSignalServiceProtosNullMessage : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasPadding_:1;
NSData* padding;
}
- (BOOL) hasPadding;
@property (readonly, strong) NSData* padding;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSSignalServiceProtosNullMessageBuilder*) builder;
+ (OWSSignalServiceProtosNullMessageBuilder*) builder;
+ (OWSSignalServiceProtosNullMessageBuilder*) builderWithPrototype:(OWSSignalServiceProtosNullMessage*) prototype;
- (OWSSignalServiceProtosNullMessageBuilder*) toBuilder;
+ (OWSSignalServiceProtosNullMessage*) parseFromData:(NSData*) data;
+ (OWSSignalServiceProtosNullMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosNullMessage*) parseFromInputStream:(NSInputStream*) input;
+ (OWSSignalServiceProtosNullMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosNullMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSSignalServiceProtosNullMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end
@interface OWSSignalServiceProtosNullMessageBuilder : PBGeneratedMessageBuilder {
@private
OWSSignalServiceProtosNullMessage* resultNullMessage;
}
- (OWSSignalServiceProtosNullMessage*) defaultInstance;
- (OWSSignalServiceProtosNullMessageBuilder*) clear;
- (OWSSignalServiceProtosNullMessageBuilder*) clone;
- (OWSSignalServiceProtosNullMessage*) build;
- (OWSSignalServiceProtosNullMessage*) buildPartial;
- (OWSSignalServiceProtosNullMessageBuilder*) mergeFrom:(OWSSignalServiceProtosNullMessage*) other;
- (OWSSignalServiceProtosNullMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSSignalServiceProtosNullMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasPadding;
- (NSData*) padding;
- (OWSSignalServiceProtosNullMessageBuilder*) setPadding:(NSData*) value;
- (OWSSignalServiceProtosNullMessageBuilder*) clearPadding;
@end
#define Verified_destination @"destination"
#define Verified_identityKey @"identityKey"
#define Verified_state @"state"
#define Verified_nullMessage @"nullMessage"
@interface OWSSignalServiceProtosVerified : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasDestination_:1;
BOOL hasIdentityKey_:1;
BOOL hasNullMessage_:1;
BOOL hasState_:1;
NSString* destination;
NSData* identityKey;
NSData* nullMessage;
OWSSignalServiceProtosVerifiedState state;
}
- (BOOL) hasDestination;
- (BOOL) hasIdentityKey;
- (BOOL) hasState;
- (BOOL) hasNullMessage;
@property (readonly, strong) NSString* destination;
@property (readonly, strong) NSData* identityKey;
@property (readonly) OWSSignalServiceProtosVerifiedState state;
@property (readonly, strong) NSData* nullMessage;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSSignalServiceProtosVerifiedBuilder*) builder;
+ (OWSSignalServiceProtosVerifiedBuilder*) builder;
+ (OWSSignalServiceProtosVerifiedBuilder*) builderWithPrototype:(OWSSignalServiceProtosVerified*) prototype;
- (OWSSignalServiceProtosVerifiedBuilder*) toBuilder;
+ (OWSSignalServiceProtosVerified*) parseFromData:(NSData*) data;
+ (OWSSignalServiceProtosVerified*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosVerified*) parseFromInputStream:(NSInputStream*) input;
+ (OWSSignalServiceProtosVerified*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosVerified*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSSignalServiceProtosVerified*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end
@interface OWSSignalServiceProtosVerifiedBuilder : PBGeneratedMessageBuilder {
@private
OWSSignalServiceProtosVerified* resultVerified;
}
- (OWSSignalServiceProtosVerified*) defaultInstance;
- (OWSSignalServiceProtosVerifiedBuilder*) clear;
- (OWSSignalServiceProtosVerifiedBuilder*) clone;
- (OWSSignalServiceProtosVerified*) build;
- (OWSSignalServiceProtosVerified*) buildPartial;
- (OWSSignalServiceProtosVerifiedBuilder*) mergeFrom:(OWSSignalServiceProtosVerified*) other;
- (OWSSignalServiceProtosVerifiedBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSSignalServiceProtosVerifiedBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasDestination;
- (NSString*) destination;
- (OWSSignalServiceProtosVerifiedBuilder*) setDestination:(NSString*) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearDestination;
- (BOOL) hasIdentityKey;
- (NSData*) identityKey;
- (OWSSignalServiceProtosVerifiedBuilder*) setIdentityKey:(NSData*) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearIdentityKey;
- (BOOL) hasState;
- (OWSSignalServiceProtosVerifiedState) state;
- (OWSSignalServiceProtosVerifiedBuilder*) setState:(OWSSignalServiceProtosVerifiedState) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearState;
- (BOOL) hasNullMessage;
- (NSData*) nullMessage;
- (OWSSignalServiceProtosVerifiedBuilder*) setNullMessage:(NSData*) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearNullMessage;
@end
#define CallMessage_offer @"offer"
#define CallMessage_answer @"answer"
#define CallMessage_iceUpdate @"iceUpdate"
@ -999,6 +869,136 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (OWSSignalServiceProtosDataMessageBuilder*) clearProfileKey;
@end
#define NullMessage_padding @"padding"
@interface OWSSignalServiceProtosNullMessage : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasPadding_:1;
NSData* padding;
}
- (BOOL) hasPadding;
@property (readonly, strong) NSData* padding;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSSignalServiceProtosNullMessageBuilder*) builder;
+ (OWSSignalServiceProtosNullMessageBuilder*) builder;
+ (OWSSignalServiceProtosNullMessageBuilder*) builderWithPrototype:(OWSSignalServiceProtosNullMessage*) prototype;
- (OWSSignalServiceProtosNullMessageBuilder*) toBuilder;
+ (OWSSignalServiceProtosNullMessage*) parseFromData:(NSData*) data;
+ (OWSSignalServiceProtosNullMessage*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosNullMessage*) parseFromInputStream:(NSInputStream*) input;
+ (OWSSignalServiceProtosNullMessage*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosNullMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSSignalServiceProtosNullMessage*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end
@interface OWSSignalServiceProtosNullMessageBuilder : PBGeneratedMessageBuilder {
@private
OWSSignalServiceProtosNullMessage* resultNullMessage;
}
- (OWSSignalServiceProtosNullMessage*) defaultInstance;
- (OWSSignalServiceProtosNullMessageBuilder*) clear;
- (OWSSignalServiceProtosNullMessageBuilder*) clone;
- (OWSSignalServiceProtosNullMessage*) build;
- (OWSSignalServiceProtosNullMessage*) buildPartial;
- (OWSSignalServiceProtosNullMessageBuilder*) mergeFrom:(OWSSignalServiceProtosNullMessage*) other;
- (OWSSignalServiceProtosNullMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSSignalServiceProtosNullMessageBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasPadding;
- (NSData*) padding;
- (OWSSignalServiceProtosNullMessageBuilder*) setPadding:(NSData*) value;
- (OWSSignalServiceProtosNullMessageBuilder*) clearPadding;
@end
#define Verified_destination @"destination"
#define Verified_identityKey @"identityKey"
#define Verified_state @"state"
#define Verified_nullMessage @"nullMessage"
@interface OWSSignalServiceProtosVerified : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasDestination_:1;
BOOL hasIdentityKey_:1;
BOOL hasNullMessage_:1;
BOOL hasState_:1;
NSString* destination;
NSData* identityKey;
NSData* nullMessage;
OWSSignalServiceProtosVerifiedState state;
}
- (BOOL) hasDestination;
- (BOOL) hasIdentityKey;
- (BOOL) hasState;
- (BOOL) hasNullMessage;
@property (readonly, strong) NSString* destination;
@property (readonly, strong) NSData* identityKey;
@property (readonly) OWSSignalServiceProtosVerifiedState state;
@property (readonly, strong) NSData* nullMessage;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
- (BOOL) isInitialized;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (OWSSignalServiceProtosVerifiedBuilder*) builder;
+ (OWSSignalServiceProtosVerifiedBuilder*) builder;
+ (OWSSignalServiceProtosVerifiedBuilder*) builderWithPrototype:(OWSSignalServiceProtosVerified*) prototype;
- (OWSSignalServiceProtosVerifiedBuilder*) toBuilder;
+ (OWSSignalServiceProtosVerified*) parseFromData:(NSData*) data;
+ (OWSSignalServiceProtosVerified*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosVerified*) parseFromInputStream:(NSInputStream*) input;
+ (OWSSignalServiceProtosVerified*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
+ (OWSSignalServiceProtosVerified*) parseFromCodedInputStream:(PBCodedInputStream*) input;
+ (OWSSignalServiceProtosVerified*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
@end
@interface OWSSignalServiceProtosVerifiedBuilder : PBGeneratedMessageBuilder {
@private
OWSSignalServiceProtosVerified* resultVerified;
}
- (OWSSignalServiceProtosVerified*) defaultInstance;
- (OWSSignalServiceProtosVerifiedBuilder*) clear;
- (OWSSignalServiceProtosVerifiedBuilder*) clone;
- (OWSSignalServiceProtosVerified*) build;
- (OWSSignalServiceProtosVerified*) buildPartial;
- (OWSSignalServiceProtosVerifiedBuilder*) mergeFrom:(OWSSignalServiceProtosVerified*) other;
- (OWSSignalServiceProtosVerifiedBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input;
- (OWSSignalServiceProtosVerifiedBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry;
- (BOOL) hasDestination;
- (NSString*) destination;
- (OWSSignalServiceProtosVerifiedBuilder*) setDestination:(NSString*) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearDestination;
- (BOOL) hasIdentityKey;
- (NSData*) identityKey;
- (OWSSignalServiceProtosVerifiedBuilder*) setIdentityKey:(NSData*) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearIdentityKey;
- (BOOL) hasState;
- (OWSSignalServiceProtosVerifiedState) state;
- (OWSSignalServiceProtosVerifiedBuilder*) setState:(OWSSignalServiceProtosVerifiedState) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearState;
- (BOOL) hasNullMessage;
- (NSData*) nullMessage;
- (OWSSignalServiceProtosVerifiedBuilder*) setNullMessage:(NSData*) value;
- (OWSSignalServiceProtosVerifiedBuilder*) clearNullMessage;
@end
#define SyncMessage_sent @"sent"
#define SyncMessage_contacts @"contacts"
#define SyncMessage_groups @"groups"
@ -1007,7 +1007,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
#define SyncMessage_blocked @"blocked"
#define SyncMessage_verified @"verified"
#define SyncMessage_padding @"padding"
#define SyncMessage_profileKey @"profileKey"
@interface OWSSignalServiceProtosSyncMessage : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasSent_:1;
@ -1017,7 +1016,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
BOOL hasBlocked_:1;
BOOL hasVerified_:1;
BOOL hasPadding_:1;
BOOL hasProfileKey_:1;
OWSSignalServiceProtosSyncMessageSent* sent;
OWSSignalServiceProtosSyncMessageContacts* contacts;
OWSSignalServiceProtosSyncMessageGroups* groups;
@ -1025,7 +1023,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
OWSSignalServiceProtosSyncMessageBlocked* blocked;
OWSSignalServiceProtosVerified* verified;
NSData* padding;
NSData* profileKey;
NSMutableArray * readArray;
}
- (BOOL) hasSent;
@ -1035,7 +1032,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (BOOL) hasBlocked;
- (BOOL) hasVerified;
- (BOOL) hasPadding;
- (BOOL) hasProfileKey;
@property (readonly, strong) OWSSignalServiceProtosSyncMessageSent* sent;
@property (readonly, strong) OWSSignalServiceProtosSyncMessageContacts* contacts;
@property (readonly, strong) OWSSignalServiceProtosSyncMessageGroups* groups;
@ -1044,7 +1040,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
@property (readonly, strong) OWSSignalServiceProtosSyncMessageBlocked* blocked;
@property (readonly, strong) OWSSignalServiceProtosVerified* verified;
@property (readonly, strong) NSData* padding;
@property (readonly, strong) NSData* profileKey;
- (OWSSignalServiceProtosSyncMessageRead*)readAtIndex:(NSUInteger)index;
+ (instancetype) defaultInstance;
@ -1490,11 +1485,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (NSData*) padding;
- (OWSSignalServiceProtosSyncMessageBuilder*) setPadding:(NSData*) value;
- (OWSSignalServiceProtosSyncMessageBuilder*) clearPadding;
- (BOOL) hasProfileKey;
- (NSData*) profileKey;
- (OWSSignalServiceProtosSyncMessageBuilder*) setProfileKey:(NSData*) value;
- (OWSSignalServiceProtosSyncMessageBuilder*) clearProfileKey;
@end
#define AttachmentPointer_id @"id"
@ -1714,6 +1704,7 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
#define ContactDetails_avatar @"avatar"
#define ContactDetails_color @"color"
#define ContactDetails_verified @"verified"
#define ContactDetails_profileKey @"profileKey"
@interface OWSSignalServiceProtosContactDetails : PBGeneratedMessage<GeneratedMessageProtocol> {
@private
BOOL hasNumber_:1;
@ -1721,22 +1712,26 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
BOOL hasColor_:1;
BOOL hasAvatar_:1;
BOOL hasVerified_:1;
BOOL hasProfileKey_:1;
NSString* number;
NSString* name;
NSString* color;
OWSSignalServiceProtosContactDetailsAvatar* avatar;
OWSSignalServiceProtosVerified* verified;
NSData* profileKey;
}
- (BOOL) hasNumber;
- (BOOL) hasName;
- (BOOL) hasAvatar;
- (BOOL) hasColor;
- (BOOL) hasVerified;
- (BOOL) hasProfileKey;
@property (readonly, strong) NSString* number;
@property (readonly, strong) NSString* name;
@property (readonly, strong) OWSSignalServiceProtosContactDetailsAvatar* avatar;
@property (readonly, strong) NSString* color;
@property (readonly, strong) OWSSignalServiceProtosVerified* verified;
@property (readonly, strong) NSData* profileKey;
+ (instancetype) defaultInstance;
- (instancetype) defaultInstance;
@ -1861,6 +1856,11 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (OWSSignalServiceProtosContactDetailsBuilder*) setVerifiedBuilder:(OWSSignalServiceProtosVerifiedBuilder*) builderForValue;
- (OWSSignalServiceProtosContactDetailsBuilder*) mergeVerified:(OWSSignalServiceProtosVerified*) value;
- (OWSSignalServiceProtosContactDetailsBuilder*) clearVerified;
- (BOOL) hasProfileKey;
- (NSData*) profileKey;
- (OWSSignalServiceProtosContactDetailsBuilder*) setProfileKey:(NSData*) value;
- (OWSSignalServiceProtosContactDetailsBuilder*) clearProfileKey;
@end
#define GroupDetails_id @"id"

File diff suppressed because it is too large Load Diff

@ -5,6 +5,7 @@
#import "TSMessagesManager.h"
#import "ContactsManagerProtocol.h"
#import "ContactsUpdater.h"
#import "Cryptography.h"
#import "MimeTypeUtil.h"
#import "NSData+messagePadding.h"
#import "NSDate+millisecondTimeStamp.h"
@ -515,8 +516,12 @@ NS_ASSUME_NONNULL_BEGIN
if ([dataMessage hasProfileKey]) {
NSData *profileKey = [dataMessage profileKey];
NSString *recipientId = incomingEnvelope.source;
id<ProfileManagerProtocol> profileManager = [TextSecureKitEnv sharedEnv].profileManager;
[profileManager setProfileKeyData:profileKey forRecipientId:recipientId];
if (profileKey.length == kAES256_KeyByteLength) {
[self.profileManager setProfileKeyData:profileKey forRecipientId:recipientId];
} else {
OWSFail(
@"Unexpected profile key length:%lu on message from:%@", (unsigned long)profileKey.length, recipientId);
}
}
if (dataMessage.hasGroup) {
@ -580,6 +585,11 @@ NS_ASSUME_NONNULL_BEGIN
}
}
- (id<ProfileManagerProtocol>)profileManager
{
return [TextSecureKitEnv sharedEnv].profileManager;
}
- (void)handleIncomingEnvelope:(OWSSignalServiceProtosEnvelope *)incomingEnvelope
withCallMessage:(OWSSignalServiceProtosCallMessage *)callMessage
{
@ -589,8 +599,7 @@ NS_ASSUME_NONNULL_BEGIN
if ([callMessage hasProfileKey]) {
NSData *profileKey = [callMessage profileKey];
NSString *recipientId = incomingEnvelope.source;
id<ProfileManagerProtocol> profileManager = [TextSecureKitEnv sharedEnv].profileManager;
[profileManager setProfileKeyData:profileKey forRecipientId:recipientId];
[self.profileManager setProfileKeyData:profileKey forRecipientId:recipientId];
}
if (callMessage.hasOffer) {
@ -707,8 +716,7 @@ NS_ASSUME_NONNULL_BEGIN
if (dataMessage && destination.length > 0 && [dataMessage hasProfileKey]) {
// If we observe a linked device sending our profile key to another
// user, we can infer that that user belongs in our profile whitelist.
id<ProfileManagerProtocol> profileManager = [TextSecureKitEnv sharedEnv].profileManager;
[profileManager addUserToProfileWhitelist:destination];
[self.profileManager addUserToProfileWhitelist:destination];
// TODO: Can we also infer when groups are added to the whitelist
// from sent messages to groups?
@ -728,9 +736,10 @@ NS_ASSUME_NONNULL_BEGIN
} else if (syncMessage.hasRequest) {
if (syncMessage.request.type == OWSSignalServiceProtosSyncMessageRequestTypeContacts) {
OWSSyncContactsMessage *syncContactsMessage =
[[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager
identityManager:self.identityManager];
[[OWSSyncContactsMessage alloc] initWithSignalAccounts:self.contactsManager.signalAccounts
identityManager:self.identityManager
profileManager:self.profileManager];
[self.messageSender sendTemporaryAttachmentData:[syncContactsMessage buildPlainTextAttachmentData]
contentType:OWSMimeTypeApplicationOctetStream
inMessage:syncContactsMessage
@ -1085,7 +1094,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSFail(@"%@ Failed to trust identity on incoming message from: %@.%d",
self.tag,
envelope.source,
envelope.sourceDevice);
(unsigned int)envelope.sourceDevice);
return;
} else {
OWSProdErrorWEnvelope([OWSAnalyticsEvents messageManagerErrorCorruptMessage], envelope);

@ -5,10 +5,13 @@
@class TSThread;
@class OWSAES256Key;
NS_ASSUME_NONNULL_BEGIN
@protocol ProfileManagerProtocol <NSObject>
- (OWSAES256Key *)localProfileKey;
- (nullable NSData *)profileKeyDataForRecipientId:(NSString *)recipientId;
- (void)setProfileKeyData:(NSData *)profileKeyData forRecipientId:(NSString *)recipientId;
- (BOOL)isUserInProfileWhitelist:(NSString *)recipientId;
@ -18,3 +21,5 @@
- (void)addUserToProfileWhitelist:(NSString *)recipientId;
@end
NS_ASSUME_NONNULL_END

@ -28,12 +28,4 @@ NS_ASSUME_NONNULL_BEGIN
@end
#pragma mark -
@interface OWSSignalServiceProtosSyncMessageBuilder (OWS)
- (void)addLocalProfileKey;
@end
NS_ASSUME_NONNULL_END

@ -90,15 +90,4 @@ NS_ASSUME_NONNULL_BEGIN
@end
#pragma mark -
@implementation OWSSignalServiceProtosSyncMessageBuilder (OWS)
- (void)addLocalProfileKey
{
[self setProfileKey:self.localProfileKey.keyData];
}
@end
NS_ASSUME_NONNULL_END

Loading…
Cancel
Save