From 1d33b62790addbc185ddcdb2eda73633d3173f13 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Fri, 15 Nov 2019 13:56:35 +1100 Subject: [PATCH] Fix public chat attachment syncing --- .../Loki/Messaging/LokiRSSFeedPoller.swift | 2 +- .../src/Devices/OWSRecordTranscriptJob.h | 1 + .../src/Devices/OWSRecordTranscriptJob.m | 9 + .../API/Public Chat/LokiPublicChatAPI.swift | 8 + .../Public Chat/LokiPublicChatPoller.swift | 220 +++++++----------- .../src/Messages/OWSBatchMessageProcessor.m | 3 +- .../src/Messages/OWSMessageManager.h | 3 +- .../src/Messages/OWSMessageManager.m | 13 +- 8 files changed, 123 insertions(+), 136 deletions(-) diff --git a/Signal/src/Loki/Messaging/LokiRSSFeedPoller.swift b/Signal/src/Loki/Messaging/LokiRSSFeedPoller.swift index 2f2d3818e..8e06b9a0a 100644 --- a/Signal/src/Loki/Messaging/LokiRSSFeedPoller.swift +++ b/Signal/src/Loki/Messaging/LokiRSSFeedPoller.swift @@ -62,7 +62,7 @@ public final class LokiRSSFeedPoller : NSObject { envelope.setSourceDevice(OWSDevicePrimaryDeviceId) envelope.setContent(try! content.build().serializedData()) OWSPrimaryStorage.shared().dbReadWriteConnection.readWrite { transaction in - SSKEnvironment.shared.messageManager.throws_processEnvelope(try! envelope.build(), plaintextData: try! content.build().serializedData(), wasReceivedByUD: false, transaction: transaction) + SSKEnvironment.shared.messageManager.throws_processEnvelope(try! envelope.build(), plaintextData: try! content.build().serializedData(), wasReceivedByUD: false, transaction: transaction, serverID: 0) } } } diff --git a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.h b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.h index c8ff5ef94..464db81e9 100644 --- a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.h +++ b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.h @@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)init NS_UNAVAILABLE; + (void)processIncomingSentMessageTranscript:(OWSIncomingSentMessageTranscript *)incomingSentMessageTranscript + serverID:(uint64_t)serverID attachmentHandler:(void (^)( NSArray *attachmentStreams))attachmentHandler transaction:(YapDatabaseReadWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m index a619dd832..362eadad6 100644 --- a/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m +++ b/SignalServiceKit/src/Devices/OWSRecordTranscriptJob.m @@ -17,6 +17,7 @@ #import "TSQuotedMessage.h" #import "TSThread.h" #import +#import "OWSPrimaryStorage+Loki.h" NS_ASSUME_NONNULL_BEGIN @@ -60,6 +61,7 @@ NS_ASSUME_NONNULL_BEGIN #pragma mark - + (void)processIncomingSentMessageTranscript:(OWSIncomingSentMessageTranscript *)transcript + serverID:(uint64_t)serverID attachmentHandler:(void (^)( NSArray *attachmentStreams))attachmentHandler transaction:(YapDatabaseReadWriteTransaction *)transaction @@ -102,6 +104,10 @@ NS_ASSUME_NONNULL_BEGIN quotedMessage:transcript.quotedMessage contactShare:transcript.contact linkPreview:transcript.linkPreview]; + + if (serverID != 0) { + outgoingMessage.groupChatServerID = serverID; + } NSArray *attachmentPointers = [TSAttachmentPointer attachmentPointersFromProtos:transcript.attachmentPointerProtos @@ -129,6 +135,9 @@ NS_ASSUME_NONNULL_BEGIN readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [outgoingMessage setQuotedMessageThumbnailAttachmentStream:attachmentStream]; [outgoingMessage saveWithTransaction:transaction]; + if (serverID != 0) { + [OWSPrimaryStorage.sharedManager setIDForMessageWithServerID:serverID to:outgoingMessage.uniqueId in:transaction]; + } }]; } failure:^(NSError *error) { diff --git a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatAPI.swift b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatAPI.swift index 51044b96e..d991fb249 100644 --- a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatAPI.swift +++ b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatAPI.swift @@ -130,6 +130,14 @@ public final class LokiPublicChatAPI : LokiDotNetAPI { print("[Loki] Ignoring public chat message with invalid signature.") return nil } + var existingMessageID: String? = nil + storage.dbReadConnection.read { transaction in + existingMessageID = storage.getIDForMessage(withServerID: UInt(result.serverID!), in: transaction) + } + guard existingMessageID == nil else { + print("[Loki] Ignorning duplicate message.") + return nil + } return result }.sorted { $0.timestamp < $1.timestamp } } diff --git a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift index 1e2da8a55..35f49bd13 100644 --- a/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift +++ b/SignalServiceKit/src/Loki/API/Public Chat/LokiPublicChatPoller.swift @@ -48,135 +48,8 @@ public final class LokiPublicChatPoller : NSObject { // MARK: Polling private func pollForNewMessages() { - // Prepare let publicChat = self.publicChat let userHexEncodedPublicKey = self.userHexEncodedPublicKey - // Processing logic for incoming messages - func processIncomingMessage(_ message: LokiPublicChatMessage) { - let storage = OWSPrimaryStorage.shared() - var masterHexEncodedPublicKey: String? = nil - storage.dbReadConnection.read { transaction in - masterHexEncodedPublicKey = storage.getMasterHexEncodedPublicKey(for: message.hexEncodedPublicKey, in: transaction) - } - let senderHexEncodedPublicKey = masterHexEncodedPublicKey ?? message.hexEncodedPublicKey - func generateDisplayName(from rawDisplayName: String) -> String { - let endIndex = senderHexEncodedPublicKey.endIndex - let cutoffIndex = senderHexEncodedPublicKey.index(endIndex, offsetBy: -8) - return "\(rawDisplayName) (...\(senderHexEncodedPublicKey[cutoffIndex.. String { + let endIndex = senderHexEncodedPublicKey.endIndex + let cutoffIndex = senderHexEncodedPublicKey.index(endIndex, offsetBy: -8) + return "\(rawDisplayName) (...\(senderHexEncodedPublicKey[cutoffIndex.. *attachmentStreams) { OWSAssertDebug(attachmentStreams.count == 1); TSAttachmentStream *attachmentStream = attachmentStreams.firstObject; @@ -955,6 +961,7 @@ NS_ASSUME_NONNULL_BEGIN } else { [OWSRecordTranscriptJob processIncomingSentMessageTranscript:transcript + serverID:serverID attachmentHandler:^(NSArray *attachmentStreams) { OWSLogDebug(@"successfully fetched transcript attachments: %lu", (unsigned long)attachmentStreams.count); @@ -1836,7 +1843,7 @@ NS_ASSUME_NONNULL_BEGIN SignalRecipient *_Nullable recipient = [SignalRecipient registeredRecipientForRecipientId:localNumber mustHaveDevices:NO transaction:transaction]; if (!recipient) { - OWSFailDebug(@"No local SignalRecipient."); +// OWSFailDebug(@"No local SignalRecipient."); } else { BOOL isRecipientDevice = [recipient.devices containsObject:@(envelope.sourceDevice)]; if (!isRecipientDevice) {