From d6604c10ffa6293c3ae80be9ea59c478b32c4b2e Mon Sep 17 00:00:00 2001 From: Ryan ZHAO Date: Wed, 26 Aug 2020 14:11:42 +1000 Subject: [PATCH] use timestamp instead of date --- .../src/Loki/API/Open Groups/PublicChatAPI.swift | 7 ++++--- .../Loki/API/Open Groups/PublicChatMessage.swift | 14 +++++++------- .../Loki/API/Open Groups/PublicChatPoller.swift | 2 +- SignalServiceKit/src/Messages/OWSMessageSender.m | 2 +- 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/SignalServiceKit/src/Loki/API/Open Groups/PublicChatAPI.swift b/SignalServiceKit/src/Loki/API/Open Groups/PublicChatAPI.swift index 4f5e25b54..268175ba1 100644 --- a/SignalServiceKit/src/Loki/API/Open Groups/PublicChatAPI.swift +++ b/SignalServiceKit/src/Loki/API/Open Groups/PublicChatAPI.swift @@ -131,6 +131,7 @@ public final class PublicChatAPI : DotNetAPI { print("[Loki] Couldn't parse message for public chat channel with ID: \(channel) on server: \(server) from: \(message).") return nil } + let servertTimestamp = UInt64(date.timeIntervalSince1970) * 1000 var profilePicture: PublicChatMessage.ProfilePicture? = nil let displayName = user["name"] as? String ?? NSLocalizedString("Anonymous", comment: "") if let userAnnotations = user["annotations"] as? [JSON], let profilePictureAnnotation = userAnnotations.first(where: { $0["type"] as? String == profilePictureType }), @@ -170,7 +171,7 @@ public final class PublicChatAPI : DotNetAPI { width: width, height: height, caption: caption, url: url, linkPreviewURL: linkPreviewURL, linkPreviewTitle: linkPreviewTitle) } let result = PublicChatMessage(serverID: serverID, senderPublicKey: hexEncodedPublicKey, displayName: displayName, profilePicture: profilePicture, - body: body, type: publicChatMessageType, timestamp: timestamp, quote: quote, attachments: attachments, signature: signature, serverTime: date) + body: body, type: publicChatMessageType, timestamp: timestamp, quote: quote, attachments: attachments, signature: signature, serverTimestamp: servertTimestamp) guard result.hasValidSignature() else { print("[Loki] Ignoring public chat message with invalid signature.") return nil @@ -184,7 +185,7 @@ public final class PublicChatAPI : DotNetAPI { return nil } return result - }.sorted { $0.serverTime!.compare($1.serverTime!) == ComparisonResult.orderedAscending } + }.sorted { $0.serverTimestamp < $1.serverTimestamp} } } }.handlingInvalidAuthTokenIfNeeded(for: server) @@ -219,7 +220,7 @@ public final class PublicChatAPI : DotNetAPI { throw DotNetAPIError.parsingFailed } let timestamp = UInt64(date.timeIntervalSince1970) * 1000 - return PublicChatMessage(serverID: serverID, senderPublicKey: getUserHexEncodedPublicKey(), displayName: displayName, profilePicture: signedMessage.profilePicture, body: body, type: publicChatMessageType, timestamp: timestamp, quote: signedMessage.quote, attachments: signedMessage.attachments, signature: signedMessage.signature, serverTime: date) + return PublicChatMessage(serverID: serverID, senderPublicKey: getUserHexEncodedPublicKey(), displayName: displayName, profilePicture: signedMessage.profilePicture, body: body, type: publicChatMessageType, timestamp: timestamp, quote: signedMessage.quote, attachments: signedMessage.attachments, signature: signedMessage.signature, serverTimestamp: timestamp) } } }.handlingInvalidAuthTokenIfNeeded(for: server) diff --git a/SignalServiceKit/src/Loki/API/Open Groups/PublicChatMessage.swift b/SignalServiceKit/src/Loki/API/Open Groups/PublicChatMessage.swift index ab05a0e34..780f1fa52 100644 --- a/SignalServiceKit/src/Loki/API/Open Groups/PublicChatMessage.swift +++ b/SignalServiceKit/src/Loki/API/Open Groups/PublicChatMessage.swift @@ -14,8 +14,8 @@ public final class PublicChatMessage : NSObject { public var attachments: [Attachment] = [] public let signature: Signature? - // MARK: Server Time (use for sorting) - public let serverTime: Date? + // MARK: Server Timestamp (use for sorting) + public let serverTimestamp: UInt64 @objc(serverID) public var objc_serverID: UInt64 { return serverID ?? 0 } @@ -75,7 +75,7 @@ public final class PublicChatMessage : NSObject { } // MARK: Initialization - public init(serverID: UInt64?, senderPublicKey: String, displayName: String, profilePicture: ProfilePicture?, body: String, type: String, timestamp: UInt64, quote: Quote?, attachments: [Attachment], signature: Signature?, serverTime: Date? = nil) { + public init(serverID: UInt64?, senderPublicKey: String, displayName: String, profilePicture: ProfilePicture?, body: String, type: String, timestamp: UInt64, quote: Quote?, attachments: [Attachment], signature: Signature?, serverTimestamp: UInt64) { self.serverID = serverID self.senderPublicKey = senderPublicKey self.displayName = displayName @@ -86,11 +86,11 @@ public final class PublicChatMessage : NSObject { self.quote = quote self.attachments = attachments self.signature = signature - self.serverTime = serverTime + self.serverTimestamp = serverTimestamp super.init() } - @objc public convenience init(senderPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64, quotedMessageTimestamp: UInt64, quoteePublicKey: String?, quotedMessageBody: String?, quotedMessageServerID: UInt64, signatureData: Data?, signatureVersion: UInt64, serverTime: Date? = nil) { + @objc public convenience init(senderPublicKey: String, displayName: String, body: String, type: String, timestamp: UInt64, quotedMessageTimestamp: UInt64, quoteePublicKey: String?, quotedMessageBody: String?, quotedMessageServerID: UInt64, signatureData: Data?, signatureVersion: UInt64, serverTimestamp: UInt64) { let quote: Quote? if quotedMessageTimestamp != 0, let quoteeHexEncodedPublicKey = quoteePublicKey, let quotedMessageBody = quotedMessageBody { let quotedMessageServerID = (quotedMessageServerID != 0) ? quotedMessageServerID : nil @@ -104,7 +104,7 @@ public final class PublicChatMessage : NSObject { } else { signature = nil } - self.init(serverID: nil, senderPublicKey: senderPublicKey, displayName: displayName, profilePicture: nil, body: body, type: type, timestamp: timestamp, quote: quote, attachments: [], signature: signature, serverTime: serverTime) + self.init(serverID: nil, senderPublicKey: senderPublicKey, displayName: displayName, profilePicture: nil, body: body, type: type, timestamp: timestamp, quote: quote, attachments: [], signature: signature, serverTimestamp: serverTimestamp) } // MARK: Crypto @@ -119,7 +119,7 @@ public final class PublicChatMessage : NSObject { return nil } let signature = Signature(data: signatureData, version: signatureVersion) - return PublicChatMessage(serverID: serverID, senderPublicKey: senderPublicKey, displayName: displayName, profilePicture: profilePicture, body: body, type: type, timestamp: timestamp, quote: quote, attachments: attachments, signature: signature, serverTime: serverTime) + return PublicChatMessage(serverID: serverID, senderPublicKey: senderPublicKey, displayName: displayName, profilePicture: profilePicture, body: body, type: type, timestamp: timestamp, quote: quote, attachments: attachments, signature: signature, serverTimestamp: serverTimestamp) } internal func hasValidSignature() -> Bool { diff --git a/SignalServiceKit/src/Loki/API/Open Groups/PublicChatPoller.swift b/SignalServiceKit/src/Loki/API/Open Groups/PublicChatPoller.swift index 7e63ca214..5779c3e1d 100644 --- a/SignalServiceKit/src/Loki/API/Open Groups/PublicChatPoller.swift +++ b/SignalServiceKit/src/Loki/API/Open Groups/PublicChatPoller.swift @@ -75,7 +75,7 @@ public final class PublicChatPoller : NSObject { } */ // Sorting the messages by timestamp before importing them fixes an issue where messages that quote older messages can't find those older messages - messages.sorted { $0.serverTime!.compare($1.serverTime!) == ComparisonResult.orderedAscending }.forEach { message in + messages.sorted { $0.serverTimestamp < $1.serverTimestamp }.forEach { message in var wasSentByCurrentUser = false OWSPrimaryStorage.shared().dbReadConnection.read { transaction in wasSentByCurrentUser = LokiDatabaseUtilities.isUserLinkedDevice(message.senderPublicKey, transaction: transaction) diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 4374f69fa..f87c8ab6b 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -1043,7 +1043,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } NSString *body = (message.body != nil && message.body.length > 0) ? message.body : [NSString stringWithFormat:@"%@", @(message.timestamp)]; // Workaround for the fact that the back-end doesn't accept messages without a body LKPublicChatMessage *groupMessage = [[LKPublicChatMessage alloc] initWithSenderPublicKey:userPublicKey displayName:displayName body:body type:LKPublicChatAPI.publicChatMessageType - timestamp:message.timestamp quotedMessageTimestamp:quoteID quoteePublicKey:quoteePublicKey quotedMessageBody:quote.body quotedMessageServerID:quotedMessageServerID signatureData:nil signatureVersion:0 serverTime:nil]; + timestamp:message.timestamp quotedMessageTimestamp:quoteID quoteePublicKey:quoteePublicKey quotedMessageBody:quote.body quotedMessageServerID:quotedMessageServerID signatureData:nil signatureVersion:0 serverTimestamp:0]; OWSLinkPreview *linkPreview = message.linkPreview; if (linkPreview != nil) { TSAttachmentStream *attachment = [TSAttachmentStream fetchObjectWithUniqueID:linkPreview.imageAttachmentId];