diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 0f92d8fef..f5944b262 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -157,6 +157,7 @@ 7BCD116C27016062006330F1 /* WebRTCSession+DataChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BCD116B27016062006330F1 /* WebRTCSession+DataChannel.swift */; }; 7BD01B122921BDDF00E7D9E6 /* MessageSender+TTL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01B112921BDDF00E7D9E6 /* MessageSender+TTL.swift */; }; 7BD01B142921FD9900E7D9E6 /* SyncedExpiriesMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */; }; + 7BD01B1629233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD01B1529233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift */; }; 7BD477A827EC39F5004E2822 /* Atomic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BD477A727EC39F5004E2822 /* Atomic.swift */; }; 7BDCFC08242186E700641C39 /* NotificationServiceExtensionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BDCFC07242186E700641C39 /* NotificationServiceExtensionContext.swift */; }; 7BDCFC0B2421EB7600641C39 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6F509951AA53F760068F56A /* Localizable.strings */; }; @@ -1229,6 +1230,7 @@ 7BCD116B27016062006330F1 /* WebRTCSession+DataChannel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WebRTCSession+DataChannel.swift"; sourceTree = ""; }; 7BD01B112921BDDF00E7D9E6 /* MessageSender+TTL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageSender+TTL.swift"; sourceTree = ""; }; 7BD01B132921FD9900E7D9E6 /* SyncedExpiriesMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncedExpiriesMessage.swift; sourceTree = ""; }; + 7BD01B1529233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MessageReceiver+SyncedExpiriesMessage.swift"; sourceTree = ""; }; 7BD477A727EC39F5004E2822 /* Atomic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Atomic.swift; sourceTree = ""; }; 7BD477A927F15F24004E2822 /* OpenGroupServerIdLookup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenGroupServerIdLookup.swift; sourceTree = ""; }; 7BDCFC0424206E7300641C39 /* SessionNotificationServiceExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SessionNotificationServiceExtension.entitlements; sourceTree = ""; }; @@ -3902,6 +3904,7 @@ FD5C7304284F0FF30029977D /* MessageReceiver+VisibleMessages.swift */, C32C5A87256DBCF9003C73A2 /* MessageReceiver+ClosedGroups.swift */, FD5C7306284F103B0029977D /* MessageReceiver+MessageRequests.swift */, + 7BD01B1529233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift */, ); path = "Message Handling"; sourceTree = ""; @@ -5517,6 +5520,7 @@ B8D0A25925E367AC00C1835E /* Notification+MessageReceiver.swift in Sources */, FD245C53285065DB00B966DD /* ProximityMonitoringManager.swift in Sources */, FD245C55285065E500B966DD /* OpenGroupManager.swift in Sources */, + 7BD01B1629233F3B00E7D9E6 /* MessageReceiver+SyncedExpiriesMessage.swift in Sources */, FDC4387227B5BB3B00C60D73 /* FileUploadResponse.swift in Sources */, C32C599E256DB02B003C73A2 /* TypingIndicators.swift in Sources */, FD716E682850318E00C96BF4 /* CallMode.swift in Sources */, diff --git a/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift b/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift index cafc4645f..9c1809f2a 100644 --- a/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift +++ b/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift @@ -40,6 +40,7 @@ public struct ControlMessageProcessRecord: Codable, FetchableRecord, Persistable case unsendRequest = 7 case messageRequestResponse = 8 case call = 9 + case syncedExpiries = 10 } /// The id for the thread the control message is associated to @@ -106,6 +107,7 @@ public struct ControlMessageProcessRecord: Codable, FetchableRecord, Persistable case is UnsendRequest: return .unsendRequest case is MessageRequestResponse: return .messageRequestResponse case is CallMessage: return .call + case is SyncedExpiriesMessage: return .syncedExpiries default: preconditionFailure("[ControlMessageProcessRecord] Unsupported message type") } }() diff --git a/SessionMessagingKit/Jobs/Types/DisappearingMessagesJob.swift b/SessionMessagingKit/Jobs/Types/DisappearingMessagesJob.swift index c61a64cc4..d07fe7e88 100644 --- a/SessionMessagingKit/Jobs/Types/DisappearingMessagesJob.swift +++ b/SessionMessagingKit/Jobs/Types/DisappearingMessagesJob.swift @@ -94,9 +94,35 @@ public extension DisappearingMessagesJob { let serverHashes = interactions.compactMap { $0.serverHash } guard let expiresInSeconds = expiresInSeconds, !serverHashes.isEmpty else { return } + let expirationTimestamp: Int64 = Int64(ceil(startedAtMs + expiresInSeconds)) + let userPublicKey: String = getUserHexEncodedPublicKey(db) + let threadId: String = interactions[0].threadId + + // Send SyncExpiriesMessage + let syncTarget: String = interactions[0].authorId + let syncExpiries: [SyncedExpiriesMessage.SyncedExpiry] = serverHashes.map { serverHash in + return SyncedExpiriesMessage.SyncedExpiry( + serverHash: serverHash, + expirationTimestamp: expirationTimestamp) + } + + let syncExpiriesMessage = SyncedExpiriesMessage( + conversationExpiries: [syncTarget: syncExpiries] + ) + + MessageSender + .send( + db, + message: syncExpiriesMessage, + threadId: threadId, + interactionId: nil, + to: .contact(publicKey: userPublicKey) + ) + + // Update the ttls SnodeAPI.updateExpiry( - publicKey: getUserHexEncodedPublicKey(db), - updatedExpiryMs: Int64(ceil(startedAtMs + expiresInSeconds)), + publicKey: userPublicKey, + updatedExpiryMs: expirationTimestamp, serverHashes: serverHashes ) .retainUntilComplete() diff --git a/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift b/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift index 63c1ea4c6..95f7ababa 100644 --- a/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift +++ b/SessionMessagingKit/Messages/Control Messages/SyncedExpiriesMessage.swift @@ -23,6 +23,8 @@ public final class SyncedExpiriesMessage: ControlMessage { return conversationExpiries.count > 0 } + override public var isSelfSendValid: Bool { true } + // MARK: - Codable required init(from decoder: Decoder) throws { diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index c42eb56f1..0764dbbb4 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -114,6 +114,7 @@ public extension Message { case messageRequestResponse case visibleMessage case callMessage + case syncedExpiriesMessage init?(from type: Message) { switch type { @@ -127,6 +128,7 @@ public extension Message { case is MessageRequestResponse: self = .messageRequestResponse case is VisibleMessage: self = .visibleMessage case is CallMessage: self = .callMessage + case is SyncedExpiriesMessage: self = .syncedExpiriesMessage default: return nil } } @@ -143,6 +145,7 @@ public extension Message { case .messageRequestResponse: return MessageRequestResponse.self case .visibleMessage: return VisibleMessage.self case .callMessage: return CallMessage.self + case .syncedExpiriesMessage: return SyncedExpiriesMessage.self } } @@ -163,6 +166,7 @@ public extension Message { case .messageRequestResponse: return try container.decode(MessageRequestResponse.self, forKey: key) case .visibleMessage: return try container.decode(VisibleMessage.self, forKey: key) case .callMessage: return try container.decode(CallMessage.self, forKey: key) + case .syncedExpiriesMessage: return try container.decode(SyncedExpiriesMessage.self, forKey: key) } } } @@ -180,7 +184,8 @@ public extension Message { .unsendRequest, .messageRequestResponse, .visibleMessage, - .callMessage + .callMessage, + .syncedExpiriesMessage ] return prioritisedVariants diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+SyncedExpiriesMessage.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+SyncedExpiriesMessage.swift new file mode 100644 index 000000000..d95ffb84b --- /dev/null +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+SyncedExpiriesMessage.swift @@ -0,0 +1,16 @@ +// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. + +import Foundation +import GRDB +import SignalCoreKit +import SessionUtilitiesKit + +extension MessageReceiver { + internal static func handleSyncedExpiriesMessage( + _ db: Database, + message: SyncedExpiriesMessage, + dependencies: SMKDependencies + ) throws { + print("Ryan Test: Receive SyncedExpiriesMessage") + } +} diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift index 351e2b126..fad08fc7a 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver.swift @@ -221,6 +221,9 @@ public enum MessageReceiver { case let message as MessageRequestResponse: try MessageReceiver.handleMessageRequestResponse(db, message: message, dependencies: dependencies) + + case let message as SyncedExpiriesMessage: + try MessageReceiver.handleSyncedExpiriesMessage(db, message: message, dependencies: dependencies) case let message as VisibleMessage: try MessageReceiver.handleVisibleMessage(