From c247064fa8624f4024d5c704156bd836cab33c40 Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 5 Dec 2022 13:20:47 +1100 Subject: [PATCH] feat: check contacts client version based on protobuf --- Session/Conversations/ConversationVC.swift | 2 +- SessionMessagingKit/Database/Models/Contact.swift | 2 +- .../Control Messages/ExpirationTimerUpdate.swift | 4 ++-- SessionMessagingKit/Messages/Message.swift | 1 - .../Sending & Receiving/MessageReceiver.swift | 15 ++++++++++++++- SessionUtilitiesKit/General/Version.swift | 4 ++-- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Session/Conversations/ConversationVC.swift b/Session/Conversations/ConversationVC.swift index ece7d77e5..0b6ecc0ea 100644 --- a/Session/Conversations/ConversationVC.swift +++ b/Session/Conversations/ConversationVC.swift @@ -688,7 +688,7 @@ final class ConversationVC: BaseVC, ConversationSearchControllerDelegate, UITabl } if initialLoad || viewModel.threadData.contactLastKnownClientVersion != updatedThreadData.contactLastKnownClientVersion { - addOrRemoveOutdatedClientBanner(contactIsUsingOutdatedClient: updatedThreadData.contactLastKnownClientVersion == .preDisappearingMessagesRedesign) + addOrRemoveOutdatedClientBanner(contactIsUsingOutdatedClient: updatedThreadData.contactLastKnownClientVersion == .legacyDisappearingMessages) } if initialLoad || viewModel.threadData.threadIsBlocked != updatedThreadData.threadIsBlocked { diff --git a/SessionMessagingKit/Database/Models/Contact.swift b/SessionMessagingKit/Database/Models/Contact.swift index 0ea74fc36..ef9138fda 100644 --- a/SessionMessagingKit/Database/Models/Contact.swift +++ b/SessionMessagingKit/Database/Models/Contact.swift @@ -79,7 +79,7 @@ public extension Contact { isTrusted: Updatable = .existing, isApproved: Updatable = .existing, isBlocked: Updatable = .existing, - lastKnownClientVersion: Updatable = .existing, + lastKnownClientVersion: SessionVersion.FeatureVersion? = nil, didApproveMe: Updatable = .existing ) -> Contact { return Contact( diff --git a/SessionMessagingKit/Messages/Control Messages/ExpirationTimerUpdate.swift b/SessionMessagingKit/Messages/Control Messages/ExpirationTimerUpdate.swift index 3bda8a61f..196d51276 100644 --- a/SessionMessagingKit/Messages/Control Messages/ExpirationTimerUpdate.swift +++ b/SessionMessagingKit/Messages/Control Messages/ExpirationTimerUpdate.swift @@ -20,7 +20,7 @@ public final class ExpirationTimerUpdate: ControlMessage { // MARK: - Initialization - public init(syncTarget: String?, duration: UInt32) { + public init(syncTarget: String?, duration: UInt32?) { super.init() self.syncTarget = syncTarget @@ -64,7 +64,7 @@ public final class ExpirationTimerUpdate: ControlMessage { return ExpirationTimerUpdate( syncTarget: dataMessageProto.syncTarget, - duration: proto.hasExpirationTimer ? proto.expirationTimer : 0 + duration: proto.hasExpirationTimer ? proto.expirationTimer : dataMessageProto.expireTimer ) } diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index b418de5cf..72feb6cd3 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -65,7 +65,6 @@ public class Message: Codable { public func setDisappearingMessagesConfigurationIfNeeded(_ db: Database, on proto: SNProtoContent.SNProtoContentBuilder) throws { guard - DisappearingMessagesConfiguration.isNewConfigurationEnabled, let threadId: String = threadId, let disappearingMessagesConfiguration = try? DisappearingMessagesConfiguration.fetchOne(db, id: threadId) else { return } diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 39a64106d..e4a2a95bd 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -332,9 +332,22 @@ public enum MessageReceiver { openGroupId: String?, proto: SNProtoContent ) throws { + guard let sender: String = message.sender else { return } + + // Check the contact's client version based on this received message + let contact: Contact = Contact.fetchOrCreate(db, id: sender) + let lastKnowClientVersion: SessionVersion.FeatureVersion = ( + !proto.hasExpirationType && + !proto.hasExpirationTimer && + !proto.hasLastDisappearingMessageChangeTimestamp + ) ? .legacyDisappearingMessages : .newDisappearingMessages + _ = try? contact + .with(lastKnownClientVersion: lastKnowClientVersion) + .saved(db) + guard + DisappearingMessagesConfiguration.isNewConfigurationEnabled, let (threadId, _) = MessageReceiver.threadInfo(db, message: message, openGroupId: openGroupId), - let sender = message.sender, proto.hasLastDisappearingMessageChangeTimestamp else { return } diff --git a/SessionUtilitiesKit/General/Version.swift b/SessionUtilitiesKit/General/Version.swift index 37ac08558..583ff9199 100644 --- a/SessionUtilitiesKit/General/Version.swift +++ b/SessionUtilitiesKit/General/Version.swift @@ -5,7 +5,7 @@ import DifferenceKit public class SessionVersion { public enum FeatureVersion: Int, Codable, Equatable, Hashable { - case preDisappearingMessagesRedesign - case disappearingMessageRedesign + case legacyDisappearingMessages + case newDisappearingMessages } }