|
|
|
@ -925,6 +925,52 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (syncMessage.sent) {
|
|
|
|
|
NSString *userHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey;
|
|
|
|
|
NSString *masterHexEncodedPublicKey = [LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:userHexEncodedPublicKey in:transaction];
|
|
|
|
|
BOOL wasSentByMasterDevice = [masterHexEncodedPublicKey isEqual:envelope.source];
|
|
|
|
|
|
|
|
|
|
// Loki: Try to update using the provided profile
|
|
|
|
|
if (wasSentByMasterDevice) {
|
|
|
|
|
dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
|
|
SSKProtoDataMessageLokiProfile *profile = syncMessage.sent.message.profile;
|
|
|
|
|
NSString *displayName = profile.displayName;
|
|
|
|
|
NSString *profilePictureURL = profile.profilePicture;
|
|
|
|
|
[self.profileManager updateUserProfileWithDisplayName:displayName profilePictureURL:profilePictureURL transaction:transaction];
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Loki: Handle contact sync if needed
|
|
|
|
|
if (syncMessage.contacts != nil) {
|
|
|
|
|
if (wasSentByMasterDevice) {
|
|
|
|
|
NSLog(@"[Loki] Received contact sync message.");
|
|
|
|
|
NSData *data = syncMessage.contacts.data;
|
|
|
|
|
ContactParser *parser = [[ContactParser alloc] initWithData:data];
|
|
|
|
|
NSArray<NSString *> *hexEncodedPublicKeys = [parser parseHexEncodedPublicKeys];
|
|
|
|
|
// Try to establish sessions
|
|
|
|
|
for (NSString *hexEncodedPublicKey in hexEncodedPublicKeys) {
|
|
|
|
|
TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:hexEncodedPublicKey transaction:transaction];
|
|
|
|
|
LKThreadFriendRequestStatus friendRequestStatus = thread.friendRequestStatus;
|
|
|
|
|
switch (friendRequestStatus) {
|
|
|
|
|
case LKThreadFriendRequestStatusNone: {
|
|
|
|
|
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
|
|
|
|
|
OWSMessageSend *automatedFriendRequestMessage = [messageSender getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:hexEncodedPublicKey];
|
|
|
|
|
dispatch_async(OWSDispatch.sendingQueue, ^{
|
|
|
|
|
[messageSender sendMessage:automatedFriendRequestMessage];
|
|
|
|
|
});
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case LKThreadFriendRequestStatusRequestReceived: {
|
|
|
|
|
[thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:transaction];
|
|
|
|
|
// The two lines below are equivalent to calling [ThreadUtil enqueueFriendRequestAcceptanceMessageInThread:thread]
|
|
|
|
|
LKEphemeralMessage *backgroundMessage = [[LKEphemeralMessage alloc] initInThread:thread];
|
|
|
|
|
[self.messageSenderJobQueue addMessage:backgroundMessage transaction:transaction];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default: break; // Do nothing
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
OWSIncomingSentMessageTranscript *transcript =
|
|
|
|
|
[[OWSIncomingSentMessageTranscript alloc] initWithProto:syncMessage.sent transaction:transaction];
|
|
|
|
|
|
|
|
|
@ -976,6 +1022,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
}
|
|
|
|
|
transaction:transaction];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else if (syncMessage.request) {
|
|
|
|
|
if (syncMessage.request.type == SSKProtoSyncMessageRequestTypeContacts) {
|
|
|
|
|
// We respond asynchronously because populating the sync message will
|
|
|
|
@ -1023,34 +1070,6 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
|
|
} else if (syncMessage.verified) {
|
|
|
|
|
OWSLogInfo(@"Received verification state for %@", syncMessage.verified.destination);
|
|
|
|
|
[self.identityManager throws_processIncomingSyncMessage:syncMessage.verified transaction:transaction];
|
|
|
|
|
} else if (syncMessage.contacts) {
|
|
|
|
|
NSLog(@"[Loki] Received contact sync message.");
|
|
|
|
|
NSData *data = syncMessage.contacts.data;
|
|
|
|
|
ContactParser *parser = [[ContactParser alloc] initWithData:data];
|
|
|
|
|
NSArray<NSString *> *hexEncodedPublicKeys = [parser parseHexEncodedPublicKeys];
|
|
|
|
|
// Try to establish sessions
|
|
|
|
|
for (NSString *hexEncodedPublicKey in hexEncodedPublicKeys) {
|
|
|
|
|
TSContactThread *thread = [TSContactThread getOrCreateThreadWithContactId:hexEncodedPublicKey transaction:transaction];
|
|
|
|
|
LKThreadFriendRequestStatus friendRequestStatus = thread.friendRequestStatus;
|
|
|
|
|
switch (friendRequestStatus) {
|
|
|
|
|
case LKThreadFriendRequestStatusNone: {
|
|
|
|
|
OWSMessageSender *messageSender = SSKEnvironment.shared.messageSender;
|
|
|
|
|
OWSMessageSend *automatedFriendRequestMessage = [messageSender getMultiDeviceFriendRequestMessageForHexEncodedPublicKey:hexEncodedPublicKey];
|
|
|
|
|
dispatch_async(OWSDispatch.sendingQueue, ^{
|
|
|
|
|
[messageSender sendMessage:automatedFriendRequestMessage];
|
|
|
|
|
});
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case LKThreadFriendRequestStatusRequestReceived: {
|
|
|
|
|
[thread saveFriendRequestStatus:LKThreadFriendRequestStatusFriends withTransaction:transaction];
|
|
|
|
|
// The two lines below are equivalent to calling [ThreadUtil enqueueFriendRequestAcceptanceMessageInThread:thread]
|
|
|
|
|
LKEphemeralMessage *backgroundMessage = [[LKEphemeralMessage alloc] initInThread:thread];
|
|
|
|
|
[self.messageSenderJobQueue addMessage:backgroundMessage transaction:transaction];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
default: break; // Do nothing
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
OWSLogWarn(@"Ignoring unsupported sync message.");
|
|
|
|
|
}
|
|
|
|
|