From 6685dc0572eca95f799b6bcf5d2bc03c390f1549 Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Mon, 8 May 2023 11:30:36 +1000 Subject: [PATCH] Dropping messages which shouldn't be processed without a thread Removed an extra localised string value --- Session/Conversations/ConversationVC.swift | 5 +++-- .../Translations/fa.lproj/Localizable.strings | 1 - Session/Shared/Views/SessionCell.swift | 2 ++ SessionMessagingKit/Messages/Message.swift | 20 +++++++++++++++++++ .../Errors/MessageReceiverError.swift | 6 ++++-- .../Sending & Receiving/MessageReceiver.swift | 7 +++++++ .../Config Handling/SessionUtil+Shared.swift | 7 ++++--- 7 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index 274d3679a..e9b28fa65 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -549,9 +549,10 @@ final class ConversationVC: BaseVC, SessionUtilRespondingViewController, Convers if viewModel.threadData.threadIsNoteToSelf == false && viewModel.threadData.threadShouldBeVisible == false && - !SessionUtil.conversationVisibleInConfig( + !SessionUtil.conversationInConfig( threadId: threadId, - threadVariant: viewModel.threadData.threadVariant + threadVariant: viewModel.threadData.threadVariant, + visibleOnly: true ) { Storage.shared.writeAsync { db in diff --git a/Session/Meta/Translations/fa.lproj/Localizable.strings b/Session/Meta/Translations/fa.lproj/Localizable.strings index 47ba1eba3..eaefc0060 100644 --- a/Session/Meta/Translations/fa.lproj/Localizable.strings +++ b/Session/Meta/Translations/fa.lproj/Localizable.strings @@ -407,7 +407,6 @@ "MESSAGE_REQUESTS_NOTIFICATION" = "شما درخواست پیام جدیدی دارید"; "TXT_HIDE_TITLE" = "پنهان کردن"; "TXT_DELETE_ACCEPT" = "پذیرفتن"; -"TXT_DECLINE_TITLE" = "رد کردن"; "TXT_BLOCK_USER_TITLE" = "مسدود کردن کاربر"; "ALERT_ERROR_TITLE" = "خطا"; "modal_call_permission_request_title" = "دسترسی تلفن مورد نیاز است"; diff --git a/Session/Shared/Views/SessionCell.swift b/Session/Shared/Views/SessionCell.swift index 90407d4c6..912fb37a9 100644 --- a/Session/Shared/Views/SessionCell.swift +++ b/Session/Shared/Views/SessionCell.swift @@ -345,6 +345,8 @@ public class SessionCell: UITableViewCell { titleTextField.textAlignment = (info.title?.textAlignment ?? .left) titleTextField.placeholder = info.title?.editingPlaceholder titleTextField.isHidden = (info.title == nil) + titleTextField.accessibilityIdentifier = info.accessibility?.identifier + titleTextField.accessibilityLabel = info.accessibility?.label subtitleLabel.isUserInteractionEnabled = (info.subtitle?.interaction == .copy) subtitleLabel.font = info.subtitle?.font subtitleLabel.text = info.subtitle?.text diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index c0171149e..715023e30 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -163,6 +163,26 @@ public extension Message { } } + static func requiresExistingConversation(message: Message, threadVariant: SessionThread.Variant) -> Bool { + switch threadVariant { + case .contact, .community: return false + + case .legacyGroup: + switch message { + case let controlMessage as ClosedGroupControlMessage: + switch controlMessage.kind { + case .new: return false + default: return true + } + + default: return true + } + + case .group: + return false + } + } + static func shouldSync(message: Message) -> Bool { switch message { case is VisibleMessage: return true diff --git a/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift b/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift index b5d43eed6..5a89819cb 100644 --- a/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift +++ b/SessionMessagingKit/Sending & Receiving/Errors/MessageReceiverError.swift @@ -20,13 +20,14 @@ public enum MessageReceiverError: LocalizedError { case invalidGroupPublicKey case noGroupKeyPair case invalidSharedConfigMessageHandling + case requiredThreadNotInConfig public var isRetryable: Bool { switch self { case .duplicateMessage, .duplicateMessageNewSnode, .duplicateControlMessage, .invalidMessage, .unknownMessage, .unknownEnvelopeType, .invalidSignature, .noData, .senderBlocked, .noThread, .selfSend, .decryptionFailed, - .invalidSharedConfigMessageHandling: + .invalidSharedConfigMessageHandling, .requiredThreadNotInConfig: return false default: return true @@ -54,7 +55,8 @@ public enum MessageReceiverError: LocalizedError { case .invalidGroupPublicKey: return "Invalid group public key." case .noGroupKeyPair: return "Missing group key pair." - case .invalidSharedConfigMessageHandling: return "Invalid handling of a shared config message" + case .invalidSharedConfigMessageHandling: return "Invalid handling of a shared config message." + case .requiredThreadNotInConfig: return "Required thread not in config." } } } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 68674434e..a524634df 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -185,6 +185,13 @@ public enum MessageReceiver { associatedWithProto proto: SNProtoContent, dependencies: SMKDependencies = SMKDependencies() ) throws { + // Check if the message requires an existing conversation (if it does and the conversation isn't in + // the config then the message will be dropped) + guard + !Message.requiresExistingConversation(message: message, threadVariant: threadVariant) || + SessionUtil.conversationInConfig(threadId: threadId, threadVariant: threadVariant, visibleOnly: false) + else { throw MessageReceiverError.requiredThreadNotInConfig } + switch message { case let message as ReadReceipt: try MessageReceiver.handleReadReceipt( diff --git a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Shared.swift b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Shared.swift index 93e494262..6444f8744 100644 --- a/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Shared.swift +++ b/SessionMessagingKit/SessionUtil/Config Handling/SessionUtil+Shared.swift @@ -298,9 +298,10 @@ internal extension SessionUtil { // MARK: - External Outgoing Changes public extension SessionUtil { - static func conversationVisibleInConfig( + static func conversationInConfig( threadId: String, - threadVariant: SessionThread.Variant + threadVariant: SessionThread.Variant, + visibleOnly: Bool ) -> Bool { // FIXME: Remove this once `useSharedUtilForUserConfig` is permanent guard SessionUtil.userConfigsEnabled else { return true } @@ -327,7 +328,7 @@ public extension SessionUtil { /// If the user opens a conversation with an existing contact but doesn't send them a message /// then the one-to-one conversation should remain hidden so we want to delete the `SessionThread` /// when leaving the conversation - return SessionUtil.shouldBeVisible(priority: contact.priority) + return (!visibleOnly || SessionUtil.shouldBeVisible(priority: contact.priority)) case .community: let maybeUrlInfo: OpenGroupUrlInfo? = Storage.shared