From 4b595575f66d89e2a7a667fef0cf6d24a4029e09 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 5 May 2020 11:24:10 +1000 Subject: [PATCH 1/3] 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) } From 3889c0af3958410b6fae83a80974e289a5b2690d Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 5 May 2020 11:24:28 +1000 Subject: [PATCH 2/3] Fix multi device open group syncing --- .../src/Loki/View Controllers/JoinPublicChatVC.swift | 2 ++ .../Loki/API/Open Groups/LokiPublicChatManager.swift | 2 +- .../Protocol/Sync Messages/SyncMessagesProtocol.swift | 10 ++++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/Signal/src/Loki/View Controllers/JoinPublicChatVC.swift b/Signal/src/Loki/View Controllers/JoinPublicChatVC.swift index 68e6160af..e65772e6b 100644 --- a/Signal/src/Loki/View Controllers/JoinPublicChatVC.swift +++ b/Signal/src/Loki/View Controllers/JoinPublicChatVC.swift @@ -152,6 +152,8 @@ final class JoinPublicChatVC : BaseVC, UIPageViewControllerDataSource, UIPageVie let _ = LokiPublicChatAPI.getMessages(for: channelID, on: urlAsString) let _ = LokiPublicChatAPI.setDisplayName(to: displayName, on: urlAsString) let _ = LokiPublicChatAPI.join(channelID, on: urlAsString) + let syncManager = SSKEnvironment.shared.syncManager + let _ = syncManager.syncAllOpenGroups() self?.presentingViewController!.dismiss(animated: true, completion: nil) } .catch(on: .main) { [weak self] _ in diff --git a/SignalServiceKit/src/Loki/API/Open Groups/LokiPublicChatManager.swift b/SignalServiceKit/src/Loki/API/Open Groups/LokiPublicChatManager.swift index 53bed33c7..1d1bf5e0e 100644 --- a/SignalServiceKit/src/Loki/API/Open Groups/LokiPublicChatManager.swift +++ b/SignalServiceKit/src/Loki/API/Open Groups/LokiPublicChatManager.swift @@ -125,7 +125,7 @@ public final class LokiPublicChatManager : NSObject { refreshChatsAndPollers() } - private func getChat(server: String, channel: UInt64) -> LokiPublicChat? { + public func getChat(server: String, channel: UInt64) -> LokiPublicChat? { return chats.values.first { chat in return chat.server == server && chat.channel == channel } diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index 684edb56e..9da85bb14 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -223,14 +223,16 @@ public final class SyncMessagesProtocol : NSObject { public static func handleOpenGroupSyncMessageIfNeeded(_ syncMessage: SSKProtoSyncMessage, wrappedIn envelope: SSKProtoEnvelope, using transaction: YapDatabaseReadTransaction) { // 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 else { return } + let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction) + let wasSentByLinkedDevice = linkedDevices.contains(hexEncodedPublicKey) + guard wasSentByLinkedDevice else { return } let groups = syncMessage.openGroups guard groups.count > 0 else { return } print("[Loki] Open group sync message received.") for openGroup in groups { - LokiPublicChatManager.shared.addChat(server: openGroup.url, channel: openGroup.channel) + let openGroupManager = LokiPublicChatManager.shared + guard openGroupManager.getChat(server: openGroup.url, channel: openGroup.channel) == nil else { return } + openGroupManager.addChat(server: openGroup.url, channel: openGroup.channel) } } } From 415d03318377c578cfdbaf8e183ace5f9ea67bd4 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 5 May 2020 11:24:39 +1000 Subject: [PATCH 3/3] Fix multi device closed group syncing --- .../Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift index 9da85bb14..b091b11b8 100644 --- a/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift +++ b/SignalServiceKit/src/Loki/Protocol/Sync Messages/SyncMessagesProtocol.swift @@ -201,9 +201,9 @@ public final class SyncMessagesProtocol : NSObject { public static func handleClosedGroupSyncMessageIfNeeded(_ 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 groups = syncMessage.groups, let groupsAsData = groups.data, groupsAsData.count > 0 else { return } + let linkedDevices = LokiDatabaseUtilities.getLinkedDeviceHexEncodedPublicKeys(for: hexEncodedPublicKey, in: transaction) + let wasSentByLinkedDevice = linkedDevices.contains(hexEncodedPublicKey) + guard wasSentByLinkedDevice, let groups = syncMessage.groups, let groupsAsData = groups.data, groupsAsData.count > 0 else { return } print("[Loki] Closed group sync message received.") let parser = ClosedGroupParser(data: groupsAsData) let groupModels = parser.parseGroupModels()