diff --git a/SignalServiceKit/src/Loki/API/LokiAPI.swift b/SignalServiceKit/src/Loki/API/LokiAPI.swift index 4d4224917..1ee3c63f3 100644 --- a/SignalServiceKit/src/Loki/API/LokiAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiAPI.swift @@ -2,6 +2,7 @@ import PromiseKit @objc(LKAPI) public final class LokiAPI : NSObject { + private static var syncMessageTimestamps: [String:Set] = [:] public static var lastDeviceLinkUpdate: [String:Date] = [:] // Hex encoded public key to date @objc public static var userHexEncodedPublicKeyCache: [String:Set] = [:] // Thread ID to set of user hex encoded public keys @@ -117,7 +118,6 @@ public final class LokiAPI : NSObject { let deviceLinks = storage.getDeviceLinks(for: masterHexEncodedPublicKey, in: transaction) let slaveDestinations = deviceLinks.map { Destination(hexEncodedPublicKey: $0.slave.hexEncodedPublicKey, kind: .slave) } destinations.append(contentsOf: slaveDestinations) - destinations = destinations.filter { $0.hexEncodedPublicKey != userHexEncodedPublicKey } seal.fulfill(destinations) } } @@ -263,6 +263,14 @@ public final class LokiAPI : NSObject { return envelope } } + + @objc public static func isDuplicateSyncMessage(_ syncMessage: SSKProtoSyncMessageSent, from hexEncodedPublicKey: String) -> Bool { + var timestamps: Set = syncMessageTimestamps[hexEncodedPublicKey] ?? [] + let result = timestamps.contains(syncMessage.timestamp) + timestamps.insert(syncMessage.timestamp) + syncMessageTimestamps[hexEncodedPublicKey] = timestamps + return result + } // MARK: Message Hash Caching private static func getLastMessageHashValue(for target: LokiAPITarget) -> String? { diff --git a/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift b/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift index 80304e9aa..263b9338e 100644 --- a/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift +++ b/SignalServiceKit/src/Loki/API/LokiStorageAPI.swift @@ -27,7 +27,7 @@ public final class LokiStorageAPI : LokiDotNetAPI { public static func getDeviceLinks(associatedWith hexEncodedPublicKeys: Set) -> Promise> { let hexEncodedPublicKeysDescription = "[ \(hexEncodedPublicKeys.joined(separator: ", ")) ]" print("[Loki] Getting device links for: \(hexEncodedPublicKeysDescription).") - return getAuthToken(for: server).then(on: DispatchQueue.main) { token -> Promise> in + return getAuthToken(for: server).then(on: DispatchQueue.global()) { token -> Promise> in let queryParameters = "ids=\(hexEncodedPublicKeys.map { "@\($0)" }.joined(separator: ","))&include_user_annotations=1" let url = URL(string: "\(server)/users?\(queryParameters)")! let request = TSRequest(url: url) diff --git a/SignalServiceKit/src/Messages/Interactions/TSMessage.m b/SignalServiceKit/src/Messages/Interactions/TSMessage.m index 23f895734..345803785 100644 --- a/SignalServiceKit/src/Messages/Interactions/TSMessage.m +++ b/SignalServiceKit/src/Messages/Interactions/TSMessage.m @@ -497,7 +497,7 @@ static const NSUInteger OWSMessageSchemaVersion = 4; #pragma mark - Group Chat -- (BOOL) isGroupChatMessage { +- (BOOL)isGroupChatMessage { return self.groupChatServerID > 0; } diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index aa4ff7ebc..94b318583 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -433,6 +433,12 @@ NS_ASSUME_NONNULL_BEGIN } OWSLogInfo(@"handling content: ", [self descriptionForContent:contentProto]); + // Loki: Workaround for duplicate sync transcript issue + if (contentProto.syncMessage != nil && contentProto.syncMessage.sent != nil) { + BOOL isDuplicate = [LKAPI isDuplicateSyncMessage:contentProto.syncMessage.sent from:envelope.source]; + if (isDuplicate) { return; } + } + // Loki: Handle device linking message if needed if (contentProto.lokiDeviceLinkMessage != nil) { NSString *masterHexEncodedPublicKey = contentProto.lokiDeviceLinkMessage.masterHexEncodedPublicKey;