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

@ -152,7 +152,8 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
self.contactsSyncing = [[OWSContactsSyncing alloc] initWithContactsManager:[Environment getCurrent].contactsManager self.contactsSyncing = [[OWSContactsSyncing alloc] initWithContactsManager:[Environment getCurrent].contactsManager
identityManager:[OWSIdentityManager sharedManager] identityManager:[OWSIdentityManager sharedManager]
messageSender:[Environment getCurrent].messageSender]; messageSender:[Environment getCurrent].messageSender
profileManager:[OWSProfileManager sharedManager]];
[[NSNotificationCenter defaultCenter] addObserver:self [[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(databaseViewRegistrationComplete) 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) OWSMessageSender *messageSender;
@property (nonatomic, readonly) YapDatabaseConnection *dbConnection; @property (nonatomic, readonly) YapDatabaseConnection *dbConnection;
@property (nonatomic, readonly) TSNetworkManager *networkManager; @property (nonatomic, readonly) TSNetworkManager *networkManager;
@property (nonatomic, readonly) OWSIdentityManager *identityManager;
// This property can be accessed on any thread, while synchronized on self. // This property can be accessed on any thread, while synchronized on self.
@property (nonatomic, readonly) UserProfile *localUserProfile; @property (nonatomic, readonly) UserProfile *localUserProfile;
@ -199,6 +200,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
return [OWSSignalService sharedInstance].CDNSessionManager; return [OWSSignalService sharedInstance].CDNSessionManager;
} }
- (OWSIdentityManager *)identityManager
{
return [OWSIdentityManager sharedManager];
}
#pragma mark - User Profile Accessor #pragma mark - User Profile Accessor
// This method can be safely called from any thread. // This method can be safely called from any thread.
@ -236,6 +242,11 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640;
dispatch_async(dispatch_get_main_queue(), ^{ dispatch_async(dispatch_get_main_queue(), ^{
if (isLocalUserProfile) { if (isLocalUserProfile) {
[MultiDeviceProfileKeyUpdateJob runWithProfileKey:userProfile.profileKey
identityManager:self.identityManager
messageSender:self.messageSender
profileManager:self];
[[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_LocalProfileDidChange [[NSNotificationCenter defaultCenter] postNotificationName:kNSNotificationName_LocalProfileDidChange
object:nil object:nil
userInfo: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 - (nullable OWSAES256Key *)profileKeyForRecipientId:(NSString *)recipientId
{ {
OWSAssert(recipientId.length > 0); OWSAssert(recipientId.length > 0);

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

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

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

@ -4,6 +4,7 @@
#import "OWSContactsSyncing.h" #import "OWSContactsSyncing.h"
#import "OWSContactsManager.h" #import "OWSContactsManager.h"
#import "OWSProfileManager.h"
#import "TSAccountManager.h" #import "TSAccountManager.h"
#import <SignalServiceKit/MIMETypeUtil.h> #import <SignalServiceKit/MIMETypeUtil.h>
#import <SignalServiceKit/OWSMessageSender.h> #import <SignalServiceKit/OWSMessageSender.h>
@ -24,6 +25,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
@property (nonatomic, readonly) OWSContactsManager *contactsManager; @property (nonatomic, readonly) OWSContactsManager *contactsManager;
@property (nonatomic, readonly) OWSIdentityManager *identityManager; @property (nonatomic, readonly) OWSIdentityManager *identityManager;
@property (nonatomic, readonly) OWSMessageSender *messageSender; @property (nonatomic, readonly) OWSMessageSender *messageSender;
@property (nonatomic, readonly) OWSProfileManager *profileManager;
@property (nonatomic) BOOL isRequestInFlight; @property (nonatomic) BOOL isRequestInFlight;
@ -34,6 +36,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
- (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager - (instancetype)initWithContactsManager:(OWSContactsManager *)contactsManager
identityManager:(OWSIdentityManager *)identityManager identityManager:(OWSIdentityManager *)identityManager
messageSender:(OWSMessageSender *)messageSender messageSender:(OWSMessageSender *)messageSender
profileManager:(OWSProfileManager *)profileManager
{ {
self = [super init]; self = [super init];
@ -48,6 +51,7 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
_contactsManager = contactsManager; _contactsManager = contactsManager;
_identityManager = identityManager; _identityManager = identityManager;
_messageSender = messageSender; _messageSender = messageSender;
_profileManager = profileManager;
OWSSingletonAssert(); OWSSingletonAssert();
@ -90,8 +94,10 @@ NSString *const kTSStorageManagerOWSContactsSyncingLastMessageKey =
return; return;
} }
OWSSyncContactsMessage *syncContactsMessage = [[OWSSyncContactsMessage alloc] initWithContactsManager:self.contactsManager OWSSyncContactsMessage *syncContactsMessage =
identityManager:self.identityManager]; [[OWSSyncContactsMessage alloc] initWithSignalAccounts:self.contactsManager.signalAccounts
identityManager:self.identityManager
profileManager:self.profileManager];
NSData *messageData = [syncContactsMessage buildPlainTextAttachmentData]; 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; package signalservice;
option java_package = "org.whispersystems.signalservice.internal.push"; option java_package = "org.whispersystems.signalservice.internal.push";
@ -17,4 +23,5 @@ message ProvisionMessage {
optional string number = 3; optional string number = 3;
optional string provisioningCode = 4; optional string provisioningCode = 4;
optional string userAgent = 5; optional string userAgent = 5;
optional bytes profileKey = 6;
} }

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

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

@ -4,6 +4,7 @@
#import "OWSContactsOutputStream.h" #import "OWSContactsOutputStream.h"
#import "Contact.h" #import "Contact.h"
#import "Cryptography.h"
#import "MIMETypeUtil.h" #import "MIMETypeUtil.h"
#import "NSData+keyVersionByte.h" #import "NSData+keyVersionByte.h"
#import "OWSRecipientIdentity.h" #import "OWSRecipientIdentity.h"
@ -17,9 +18,11 @@ NS_ASSUME_NONNULL_BEGIN
- (void)writeSignalAccount:(SignalAccount *)signalAccount - (void)writeSignalAccount:(SignalAccount *)signalAccount
recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity recipientIdentity:(nullable OWSRecipientIdentity *)recipientIdentity
profileKeyData:(nullable NSData *)profileKeyData
{ {
OWSAssert(signalAccount); OWSAssert(signalAccount);
OWSAssert(signalAccount.contact); OWSAssert(signalAccount.contact);
OWSAssert(profileKeyData.length == kAES256_KeyByteLength);
OWSSignalServiceProtosContactDetailsBuilder *contactBuilder = [OWSSignalServiceProtosContactDetailsBuilder new]; OWSSignalServiceProtosContactDetailsBuilder *contactBuilder = [OWSSignalServiceProtosContactDetailsBuilder new];
[contactBuilder setName:signalAccount.contact.fullName]; [contactBuilder setName:signalAccount.contact.fullName];
@ -44,6 +47,10 @@ NS_ASSUME_NONNULL_BEGIN
[contactBuilder setAvatarBuilder:avatarBuilder]; [contactBuilder setAvatarBuilder:avatarBuilder];
} }
if (profileKeyData) {
[contactBuilder setProfileKey:profileKeyData];
}
NSData *contactData = [[contactBuilder build] data]; NSData *contactData = [[contactBuilder build] data];
uint32_t contactDataLength = (uint32_t)contactData.length; 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 NS_ASSUME_NONNULL_BEGIN
@ -14,14 +16,16 @@ NS_ASSUME_NONNULL_BEGIN
theirPublicKey:(NSData *)theirPublicKey theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService
provisioningService:(OWSDeviceProvisioningService *)provisioningService NS_DESIGNATED_INITIALIZER; provisioningService:(OWSDeviceProvisioningService *)provisioningService NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithMyPublicKey:(NSData *)myPublicKey - (instancetype)initWithMyPublicKey:(NSData *)myPublicKey
myPrivateKey:(NSData *)myPrivateKey myPrivateKey:(NSData *)myPrivateKey
theirPublicKey:(NSData *)theirEncodedPublicKey theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier; accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey;
- (void)provisionWithSuccess:(void (^)())successCallback failure:(void (^)(NSError *))failureCallback; - (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 *myPrivateKey;
@property (nonatomic, readonly) NSData *theirPublicKey; @property (nonatomic, readonly) NSData *theirPublicKey;
@property (nonatomic, readonly) NSString *accountIdentifier; @property (nonatomic, readonly) NSString *accountIdentifier;
@property (nonatomic, readonly) NSData *profileKey;
@property (nonatomic, nullable) NSString *ephemeralDeviceId; @property (nonatomic, nullable) NSString *ephemeralDeviceId;
@property (nonatomic, readonly) OWSDeviceProvisioningCodeService *provisioningCodeService; @property (nonatomic, readonly) OWSDeviceProvisioningCodeService *provisioningCodeService;
@property (nonatomic, readonly) OWSDeviceProvisioningService *provisioningService; @property (nonatomic, readonly) OWSDeviceProvisioningService *provisioningService;
@ -26,6 +27,7 @@ NS_ASSUME_NONNULL_BEGIN
theirPublicKey:(NSData *)theirPublicKey theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService provisioningCodeService:(OWSDeviceProvisioningCodeService *)provisioningCodeService
provisioningService:(OWSDeviceProvisioningService *)provisioningService provisioningService:(OWSDeviceProvisioningService *)provisioningService
{ {
@ -38,6 +40,7 @@ NS_ASSUME_NONNULL_BEGIN
_myPrivateKey = myPrivateKey; _myPrivateKey = myPrivateKey;
_theirPublicKey = theirPublicKey; _theirPublicKey = theirPublicKey;
_accountIdentifier = accountIdentifier; _accountIdentifier = accountIdentifier;
_profileKey = profileKey;
_ephemeralDeviceId = ephemeralDeviceId; _ephemeralDeviceId = ephemeralDeviceId;
_provisioningCodeService = provisioningCodeService; _provisioningCodeService = provisioningCodeService;
_provisioningService = provisioningService; _provisioningService = provisioningService;
@ -50,12 +53,14 @@ NS_ASSUME_NONNULL_BEGIN
theirPublicKey:(NSData *)theirPublicKey theirPublicKey:(NSData *)theirPublicKey
theirEphemeralDeviceId:(NSString *)ephemeralDeviceId theirEphemeralDeviceId:(NSString *)ephemeralDeviceId
accountIdentifier:(NSString *)accountIdentifier accountIdentifier:(NSString *)accountIdentifier
profileKey:(NSData *)profileKey
{ {
return [self initWithMyPublicKey:myPublicKey return [self initWithMyPublicKey:myPublicKey
myPrivateKey:myPrivateKey myPrivateKey:myPrivateKey
theirPublicKey:theirPublicKey theirPublicKey:theirPublicKey
theirEphemeralDeviceId:ephemeralDeviceId theirEphemeralDeviceId:ephemeralDeviceId
accountIdentifier:accountIdentifier accountIdentifier:accountIdentifier
profileKey:profileKey
provisioningCodeService:[OWSDeviceProvisioningCodeService new] provisioningCodeService:[OWSDeviceProvisioningCodeService new]
provisioningService:[OWSDeviceProvisioningService new]]; provisioningService:[OWSDeviceProvisioningService new]];
} }
@ -80,6 +85,7 @@ NS_ASSUME_NONNULL_BEGIN
myPrivateKey:self.myPrivateKey myPrivateKey:self.myPrivateKey
theirPublicKey:self.theirPublicKey theirPublicKey:self.theirPublicKey
accountIdentifier:self.accountIdentifier accountIdentifier:self.accountIdentifier
profileKey:self.profileKey
provisioningCode:provisioningCode]; provisioningCode:provisioningCode];
[self.provisioningService provisionWithMessageBody:[message buildEncryptedMessageBody] [self.provisioningService provisionWithMessageBody:[message buildEncryptedMessageBody]

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

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

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

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

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

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

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

@ -109,6 +109,14 @@ typedef NS_ENUM(SInt32, OWSSignalServiceProtosEnvelopeType) {
BOOL OWSSignalServiceProtosEnvelopeTypeIsValidValue(OWSSignalServiceProtosEnvelopeType value); BOOL OWSSignalServiceProtosEnvelopeTypeIsValidValue(OWSSignalServiceProtosEnvelopeType value);
NSString *NSStringFromOWSSignalServiceProtosEnvelopeType(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) { typedef NS_ENUM(SInt32, OWSSignalServiceProtosVerifiedState) {
OWSSignalServiceProtosVerifiedStateDefault = 0, OWSSignalServiceProtosVerifiedStateDefault = 0,
OWSSignalServiceProtosVerifiedStateVerified = 1, OWSSignalServiceProtosVerifiedStateVerified = 1,
@ -118,14 +126,6 @@ typedef NS_ENUM(SInt32, OWSSignalServiceProtosVerifiedState) {
BOOL OWSSignalServiceProtosVerifiedStateIsValidValue(OWSSignalServiceProtosVerifiedState value); BOOL OWSSignalServiceProtosVerifiedStateIsValidValue(OWSSignalServiceProtosVerifiedState value);
NSString *NSStringFromOWSSignalServiceProtosVerifiedState(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) { typedef NS_ENUM(SInt32, OWSSignalServiceProtosSyncMessageRequestType) {
OWSSignalServiceProtosSyncMessageRequestTypeUnknown = 0, OWSSignalServiceProtosSyncMessageRequestTypeUnknown = 0,
OWSSignalServiceProtosSyncMessageRequestTypeContacts = 1, OWSSignalServiceProtosSyncMessageRequestTypeContacts = 1,
@ -359,136 +359,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (OWSSignalServiceProtosContentBuilder*) clearNullMessage; - (OWSSignalServiceProtosContentBuilder*) clearNullMessage;
@end @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_offer @"offer"
#define CallMessage_answer @"answer" #define CallMessage_answer @"answer"
#define CallMessage_iceUpdate @"iceUpdate" #define CallMessage_iceUpdate @"iceUpdate"
@ -999,6 +869,136 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (OWSSignalServiceProtosDataMessageBuilder*) clearProfileKey; - (OWSSignalServiceProtosDataMessageBuilder*) clearProfileKey;
@end @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_sent @"sent"
#define SyncMessage_contacts @"contacts" #define SyncMessage_contacts @"contacts"
#define SyncMessage_groups @"groups" #define SyncMessage_groups @"groups"
@ -1007,7 +1007,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
#define SyncMessage_blocked @"blocked" #define SyncMessage_blocked @"blocked"
#define SyncMessage_verified @"verified" #define SyncMessage_verified @"verified"
#define SyncMessage_padding @"padding" #define SyncMessage_padding @"padding"
#define SyncMessage_profileKey @"profileKey"
@interface OWSSignalServiceProtosSyncMessage : PBGeneratedMessage<GeneratedMessageProtocol> { @interface OWSSignalServiceProtosSyncMessage : PBGeneratedMessage<GeneratedMessageProtocol> {
@private @private
BOOL hasSent_:1; BOOL hasSent_:1;
@ -1017,7 +1016,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
BOOL hasBlocked_:1; BOOL hasBlocked_:1;
BOOL hasVerified_:1; BOOL hasVerified_:1;
BOOL hasPadding_:1; BOOL hasPadding_:1;
BOOL hasProfileKey_:1;
OWSSignalServiceProtosSyncMessageSent* sent; OWSSignalServiceProtosSyncMessageSent* sent;
OWSSignalServiceProtosSyncMessageContacts* contacts; OWSSignalServiceProtosSyncMessageContacts* contacts;
OWSSignalServiceProtosSyncMessageGroups* groups; OWSSignalServiceProtosSyncMessageGroups* groups;
@ -1025,7 +1023,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
OWSSignalServiceProtosSyncMessageBlocked* blocked; OWSSignalServiceProtosSyncMessageBlocked* blocked;
OWSSignalServiceProtosVerified* verified; OWSSignalServiceProtosVerified* verified;
NSData* padding; NSData* padding;
NSData* profileKey;
NSMutableArray * readArray; NSMutableArray * readArray;
} }
- (BOOL) hasSent; - (BOOL) hasSent;
@ -1035,7 +1032,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (BOOL) hasBlocked; - (BOOL) hasBlocked;
- (BOOL) hasVerified; - (BOOL) hasVerified;
- (BOOL) hasPadding; - (BOOL) hasPadding;
- (BOOL) hasProfileKey;
@property (readonly, strong) OWSSignalServiceProtosSyncMessageSent* sent; @property (readonly, strong) OWSSignalServiceProtosSyncMessageSent* sent;
@property (readonly, strong) OWSSignalServiceProtosSyncMessageContacts* contacts; @property (readonly, strong) OWSSignalServiceProtosSyncMessageContacts* contacts;
@property (readonly, strong) OWSSignalServiceProtosSyncMessageGroups* groups; @property (readonly, strong) OWSSignalServiceProtosSyncMessageGroups* groups;
@ -1044,7 +1040,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
@property (readonly, strong) OWSSignalServiceProtosSyncMessageBlocked* blocked; @property (readonly, strong) OWSSignalServiceProtosSyncMessageBlocked* blocked;
@property (readonly, strong) OWSSignalServiceProtosVerified* verified; @property (readonly, strong) OWSSignalServiceProtosVerified* verified;
@property (readonly, strong) NSData* padding; @property (readonly, strong) NSData* padding;
@property (readonly, strong) NSData* profileKey;
- (OWSSignalServiceProtosSyncMessageRead*)readAtIndex:(NSUInteger)index; - (OWSSignalServiceProtosSyncMessageRead*)readAtIndex:(NSUInteger)index;
+ (instancetype) defaultInstance; + (instancetype) defaultInstance;
@ -1490,11 +1485,6 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (NSData*) padding; - (NSData*) padding;
- (OWSSignalServiceProtosSyncMessageBuilder*) setPadding:(NSData*) value; - (OWSSignalServiceProtosSyncMessageBuilder*) setPadding:(NSData*) value;
- (OWSSignalServiceProtosSyncMessageBuilder*) clearPadding; - (OWSSignalServiceProtosSyncMessageBuilder*) clearPadding;
- (BOOL) hasProfileKey;
- (NSData*) profileKey;
- (OWSSignalServiceProtosSyncMessageBuilder*) setProfileKey:(NSData*) value;
- (OWSSignalServiceProtosSyncMessageBuilder*) clearProfileKey;
@end @end
#define AttachmentPointer_id @"id" #define AttachmentPointer_id @"id"
@ -1714,6 +1704,7 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
#define ContactDetails_avatar @"avatar" #define ContactDetails_avatar @"avatar"
#define ContactDetails_color @"color" #define ContactDetails_color @"color"
#define ContactDetails_verified @"verified" #define ContactDetails_verified @"verified"
#define ContactDetails_profileKey @"profileKey"
@interface OWSSignalServiceProtosContactDetails : PBGeneratedMessage<GeneratedMessageProtocol> { @interface OWSSignalServiceProtosContactDetails : PBGeneratedMessage<GeneratedMessageProtocol> {
@private @private
BOOL hasNumber_:1; BOOL hasNumber_:1;
@ -1721,22 +1712,26 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
BOOL hasColor_:1; BOOL hasColor_:1;
BOOL hasAvatar_:1; BOOL hasAvatar_:1;
BOOL hasVerified_:1; BOOL hasVerified_:1;
BOOL hasProfileKey_:1;
NSString* number; NSString* number;
NSString* name; NSString* name;
NSString* color; NSString* color;
OWSSignalServiceProtosContactDetailsAvatar* avatar; OWSSignalServiceProtosContactDetailsAvatar* avatar;
OWSSignalServiceProtosVerified* verified; OWSSignalServiceProtosVerified* verified;
NSData* profileKey;
} }
- (BOOL) hasNumber; - (BOOL) hasNumber;
- (BOOL) hasName; - (BOOL) hasName;
- (BOOL) hasAvatar; - (BOOL) hasAvatar;
- (BOOL) hasColor; - (BOOL) hasColor;
- (BOOL) hasVerified; - (BOOL) hasVerified;
- (BOOL) hasProfileKey;
@property (readonly, strong) NSString* number; @property (readonly, strong) NSString* number;
@property (readonly, strong) NSString* name; @property (readonly, strong) NSString* name;
@property (readonly, strong) OWSSignalServiceProtosContactDetailsAvatar* avatar; @property (readonly, strong) OWSSignalServiceProtosContactDetailsAvatar* avatar;
@property (readonly, strong) NSString* color; @property (readonly, strong) NSString* color;
@property (readonly, strong) OWSSignalServiceProtosVerified* verified; @property (readonly, strong) OWSSignalServiceProtosVerified* verified;
@property (readonly, strong) NSData* profileKey;
+ (instancetype) defaultInstance; + (instancetype) defaultInstance;
- (instancetype) defaultInstance; - (instancetype) defaultInstance;
@ -1861,6 +1856,11 @@ NSString *NSStringFromOWSSignalServiceProtosGroupContextType(OWSSignalServicePro
- (OWSSignalServiceProtosContactDetailsBuilder*) setVerifiedBuilder:(OWSSignalServiceProtosVerifiedBuilder*) builderForValue; - (OWSSignalServiceProtosContactDetailsBuilder*) setVerifiedBuilder:(OWSSignalServiceProtosVerifiedBuilder*) builderForValue;
- (OWSSignalServiceProtosContactDetailsBuilder*) mergeVerified:(OWSSignalServiceProtosVerified*) value; - (OWSSignalServiceProtosContactDetailsBuilder*) mergeVerified:(OWSSignalServiceProtosVerified*) value;
- (OWSSignalServiceProtosContactDetailsBuilder*) clearVerified; - (OWSSignalServiceProtosContactDetailsBuilder*) clearVerified;
- (BOOL) hasProfileKey;
- (NSData*) profileKey;
- (OWSSignalServiceProtosContactDetailsBuilder*) setProfileKey:(NSData*) value;
- (OWSSignalServiceProtosContactDetailsBuilder*) clearProfileKey;
@end @end
#define GroupDetails_id @"id" #define GroupDetails_id @"id"

File diff suppressed because it is too large Load Diff

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

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

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

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

Loading…
Cancel
Save