From 4b595575f66d89e2a7a667fef0cf6d24a4029e09 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 5 May 2020 11:24:10 +1000 Subject: [PATCH] Fix multi device contact syncing --- .../Protocol/Friend Requests/FriendRequestProtocol.swift | 8 ++++++++ .../Session Management/SessionManagementProtocol.swift | 3 --- .../Protocol/Sync Messages/SyncMessagesProtocol.swift | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift index d9a56b5f3..56eab6554 100644 --- a/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Friend Requests/FriendRequestProtocol.swift @@ -127,6 +127,10 @@ public final class FriendRequestProtocol : NSObject { } } } + // Send a contact sync message + let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey + let syncManager = SSKEnvironment.shared.syncManager + syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction) } @objc(sendFriendRequestAcceptanceMessageToHexEncodedPublicKey:using:) @@ -231,6 +235,10 @@ public final class FriendRequestProtocol : NSObject { guard friendRequestStatus != .none else { return } // Become friends storage.setFriendRequestStatus(.friends, for: hexEncodedPublicKey, transaction: transaction) + // Send a contact sync message + let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: hexEncodedPublicKey, in: transaction) ?? hexEncodedPublicKey + let syncManager = SSKEnvironment.shared.syncManager + syncManager.syncContact(masterHexEncodedPublicKey, transaction: transaction) } @objc(handleFriendRequestMessageIfNeededFromEnvelope:using:) diff --git a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift index 90bd27d02..8b7ec256a 100644 --- a/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Session Management/SessionManagementProtocol.swift @@ -184,9 +184,6 @@ public final class SessionManagementProtocol : NSObject { let thread = TSContactThread.getWithContactId(hexEncodedPublicKey, transaction: transaction), // TODO: Should this be getOrCreate? thread.isContactFriend { receiving_startSessionReset(in: thread, using: transaction) - // Notify our other devices that we've started a session reset - let syncManager = SSKEnvironment.shared.syncManager - syncManager.syncContact(hexEncodedPublicKey, transaction: transaction) } } diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index da00355b5..684edb56e 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -155,9 +155,9 @@ public final class SyncMessagesProtocol : NSObject { public static func handleContactSyncMessageIfNeeded(_ syncMessage: SSKProtoSyncMessage, wrappedIn envelope: SSKProtoEnvelope, using transaction: YapDatabaseReadWriteTransaction) { // The envelope source is set during UD decryption let hexEncodedPublicKey = envelope.source! - guard let masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: getUserHexEncodedPublicKey(), in: transaction) else { return } - let wasSentByMasterDevice = (masterHexEncodedPublicKey == hexEncodedPublicKey) - guard wasSentByMasterDevice, let contacts = syncMessage.contacts, let contactsAsData = contacts.data, contactsAsData.count > 0 else { return } + let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction) + let wasSentByLinkedDevice = linkedDevices.contains(hexEncodedPublicKey) + guard wasSentByLinkedDevice, let contacts = syncMessage.contacts, let contactsAsData = contacts.data, contactsAsData.count > 0 else { return } print("[Loki] Contact sync message received.") handleContactSyncMessageData(contactsAsData, using: transaction) }