From c68350f3d826935fe878123ddc274b1f6be8b64b Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 2 Aug 2021 14:49:34 +1000 Subject: [PATCH] store hash value for outgoing messages --- SessionMessagingKit/Messages/Message.swift | 3 +++ SessionMessagingKit/Messages/Signal/TSMessage.h | 1 + SessionMessagingKit/Messages/Signal/TSMessage.m | 1 + SessionMessagingKit/Sending & Receiving/MessageSender.swift | 6 +++++- SessionSnodeKit/SnodeAPI.swift | 2 ++ 5 files changed, 12 insertions(+), 1 deletion(-) diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index f16d13282..b1d8786a2 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -11,6 +11,7 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is public var groupPublicKey: String? public var openGroupServerMessageID: UInt64? public var openGroupServerTimestamp: UInt64? + public var serverHash: String? public var ttl: UInt64 { 14 * 24 * 60 * 60 * 1000 } public var isSelfSendValid: Bool { false } @@ -35,6 +36,7 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is if let groupPublicKey = coder.decodeObject(forKey: "groupPublicKey") as! String? { self.groupPublicKey = groupPublicKey } if let openGroupServerMessageID = coder.decodeObject(forKey: "openGroupServerMessageID") as! UInt64? { self.openGroupServerMessageID = openGroupServerMessageID } if let openGroupServerTimestamp = coder.decodeObject(forKey: "openGroupServerTimestamp") as! UInt64? { self.openGroupServerTimestamp = openGroupServerTimestamp } + if let serverHash = coder.decodeObject(forKey: "serverHash") as! String? { self.serverHash = serverHash } } public func encode(with coder: NSCoder) { @@ -47,6 +49,7 @@ public class Message : NSObject, NSCoding { // NSObject/NSCoding conformance is coder.encode(groupPublicKey, forKey: "groupPublicKey") coder.encode(openGroupServerMessageID, forKey: "openGroupServerMessageID") coder.encode(openGroupServerTimestamp, forKey: "openGroupServerTimestamp") + coder.encode(serverHash, forKey: "serverHash") } // MARK: Proto Conversion diff --git a/SessionMessagingKit/Messages/Signal/TSMessage.h b/SessionMessagingKit/Messages/Signal/TSMessage.h index 9a503aa8b..5046c5a29 100644 --- a/SessionMessagingKit/Messages/Signal/TSMessage.h +++ b/SessionMessagingKit/Messages/Signal/TSMessage.h @@ -38,6 +38,7 @@ extern const NSUInteger kOversizeTextMessageSizeThreshold; @property (nonatomic, readonly) BOOL isOpenGroupMessage; @property (nonatomic, readonly, nullable) NSString *openGroupInvitationName; @property (nonatomic, readonly, nullable) NSString *openGroupInvitationURL; +@property (nonatomic, nullable) NSString *serverHash; - (instancetype)initInteractionWithTimestamp:(uint64_t)timestamp inThread:(TSThread *)thread NS_UNAVAILABLE; diff --git a/SessionMessagingKit/Messages/Signal/TSMessage.m b/SessionMessagingKit/Messages/Signal/TSMessage.m index 5b0634fe8..6230d3bf1 100644 --- a/SessionMessagingKit/Messages/Signal/TSMessage.m +++ b/SessionMessagingKit/Messages/Signal/TSMessage.m @@ -84,6 +84,7 @@ const NSUInteger kOversizeTextMessageSizeThreshold = 2 * 1024; _openGroupServerMessageID = 0; _openGroupInvitationName = openGroupInvitationName; _openGroupInvitationURL = openGroupInvitationURL; + _serverHash = nil; return self; } diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index 198bbaa35..c34c9dde8 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -208,10 +208,13 @@ public final class MessageSender : NSObject { let promiseCount = promises.count var errorCount = 0 promises.forEach { - let _ = $0.done(on: DispatchQueue.global(qos: .userInitiated)) { _ in + let _ = $0.done(on: DispatchQueue.global(qos: .userInitiated)) { rawResponse in guard !isSuccess else { return } // Succeed as soon as the first promise succeeds isSuccess = true storage.write(with: { transaction in + let json = rawResponse as? JSON + let hash = json?["hash"] as? String + message.serverHash = hash MessageSender.handleSuccessfulMessageSend(message, to: destination, isSyncMessage: isSyncMessage, using: transaction) var shouldNotify = ((message is VisibleMessage || message is UnsendRequest) && !isSyncMessage) /* @@ -329,6 +332,7 @@ public final class MessageSender : NSObject { Storage.shared.addReceivedMessageTimestamp(message.sentTimestamp!, using: transaction) // Get the visible message if possible if let tsMessage = TSOutgoingMessage.find(withTimestamp: message.sentTimestamp!) { + tsMessage.serverHash = message.serverHash // Track the open group server message ID tsMessage.openGroupServerMessageID = message.openGroupServerMessageID ?? 0 tsMessage.save(with: transaction) diff --git a/SessionSnodeKit/SnodeAPI.swift b/SessionSnodeKit/SnodeAPI.swift index fe15bccf5..76ab28d67 100644 --- a/SessionSnodeKit/SnodeAPI.swift +++ b/SessionSnodeKit/SnodeAPI.swift @@ -454,6 +454,8 @@ public final class SnodeAPI : NSObject { return promise } +// public static func deleteMessage() -> Promise + /// Clears all the user's data from their swarm. Returns a dictionary of snode public key to deletion confirmation. public static func clearAllData() -> Promise<[String:Bool]> { let storage = SNSnodeKitConfiguration.shared.storage