From ff36b3eeaba5e35e54cb7ae0b351f32b26d8e140 Mon Sep 17 00:00:00 2001 From: Morgan Pretty Date: Tue, 21 Feb 2023 17:10:02 +1100 Subject: [PATCH] Resolved a number of TODOs and a couple of crashes Updated the logic to always fetch all config messages (and not de-dupe them) Updated the onboarding to fallback to fetch the legacy config if the there is no updated user config Added sorting to config message processing to reduce the turn-around time for certain edge-cases to resolve Removed some redundant code Fixed a database re-entrancy crash Fixed a crash when merging config messages Fixed an issue which could occur by registering too many 'afterTransaction' closures --- Session/Notifications/SyncPushTokensJob.swift | 7 +- Session/Onboarding/Onboarding.swift | 76 +++++++-- Session/Onboarding/PNModeVC.swift | 2 +- Session/Utilities/BackgroundPoller.swift | 6 +- .../Models/ControlMessageProcessRecord.swift | 8 +- .../Database/Models/SharedConfigDump.swift | 15 +- .../LibSessionUtil/SessionUtil.swift | 14 +- .../libsession-util.xcframework/Info.plist | 10 +- .../ios-arm64/libsession-util.a | Bin 2034440 -> 2034896 bytes .../libsession-util.a | Bin 4484472 -> 4485400 bytes .../session/config/contacts.h | 3 + .../session/config/profile_pic.h | 3 + .../session/config/user_groups.h | 19 ++- SessionMessagingKit/Messages/Message.swift | 4 + .../Sending & Receiving/MessageSender.swift | 24 ++- .../Sending & Receiving/Pollers/Poller.swift | 154 +++++++++--------- .../Utilities/ProfileManager.swift | 6 +- SessionSnodeKit/Models/SnodeMessage.swift | 5 +- .../Models/SnodeReceivedMessage.swift | 2 + SessionSnodeKit/Networking/SnodeAPI.swift | 49 +----- SessionSnodeKit/Types/SnodeAPINamespace.swift | 18 ++ SessionUtilitiesKit/JobRunner/JobRunner.swift | 4 +- 22 files changed, 262 insertions(+), 167 deletions(-) diff --git a/Session/Notifications/SyncPushTokensJob.swift b/Session/Notifications/SyncPushTokensJob.swift index 5ca477831..b9d3cdf3a 100644 --- a/Session/Notifications/SyncPushTokensJob.swift +++ b/Session/Notifications/SyncPushTokensJob.swift @@ -21,8 +21,11 @@ public enum SyncPushTokensJob: JobExecutor { failure: @escaping (Job, Error?, Bool) -> (), deferred: @escaping (Job) -> () ) { - // Don't run when inactive or not in main app - guard (UserDefaults.sharedLokiProject?[.isMainAppActive]).defaulting(to: false) else { + // Don't run when inactive or not in main app or if the user doesn't exist yet + guard + (UserDefaults.sharedLokiProject?[.isMainAppActive]).defaulting(to: false), + Identity.userExists() + else { deferred(job) // Don't need to do anything if it's not the main app return } diff --git a/Session/Onboarding/Onboarding.swift b/Session/Onboarding/Onboarding.swift index acdf75b68..9d4913b2f 100644 --- a/Session/Onboarding/Onboarding.swift +++ b/Session/Onboarding/Onboarding.swift @@ -26,16 +26,72 @@ enum Onboarding { .tryFlatMap { swarm -> AnyPublisher in guard let snode = swarm.randomElement() else { throw SnodeAPIError.generic } - return CurrentUserPoller.poll( - namespaces: [.configUserProfile], - from: snode, - for: userPublicKey, - on: DispatchQueue.global(qos: .userInitiated), - // Note: These values mean the received messages will be - // processed immediately rather than async as part of a Job - calledFromBackgroundPoller: true, - isBackgroundPollValid: { true } - ) + return CurrentUserPoller + .poll( + namespaces: [.configUserProfile], + from: snode, + for: userPublicKey, + on: DispatchQueue.global(qos: .userInitiated), + // Note: These values mean the received messages will be + // processed immediately rather than async as part of a Job + calledFromBackgroundPoller: true, + isBackgroundPollValid: { true } + ) + .tryFlatMap { receivedMessageTypes -> AnyPublisher in + // FIXME: Remove this entire 'tryFlatMap' once the updated user config has been released for long enough + guard !receivedMessageTypes.isEmpty else { + return Just(()) + .setFailureType(to: Error.self) + .eraseToAnyPublisher() + } + + SNLog("Onboarding failed to retrieve user config, checking for legacy config") + + return CurrentUserPoller + .poll( + namespaces: [.default], + from: snode, + for: userPublicKey, + on: DispatchQueue.global(qos: .userInitiated), + // Note: These values mean the received messages will be + // processed immediately rather than async as part of a Job + calledFromBackgroundPoller: true, + isBackgroundPollValid: { true } + ) + .tryMap { receivedMessageTypes -> Void in + guard + let message: ConfigurationMessage = receivedMessageTypes + .last(where: { $0 is ConfigurationMessage }) + .asType(ConfigurationMessage.self), + let displayName: String = message.displayName + else { return () } + + // Handle user profile changes + Storage.shared.write { db in + try ProfileManager.updateProfileIfNeeded( + db, + publicKey: userPublicKey, + name: displayName, + avatarUpdate: { + guard + let profilePictureUrl: String = message.profilePictureUrl, + let profileKey: Data = message.profileKey + else { return .none } + + return .updateTo( + url: profilePictureUrl, + key: profileKey, + fileName: nil + ) + }(), + sentTimestamp: TimeInterval((message.sentTimestamp ?? 0) / 1000), + calledFromConfigHandling: false + ) + } + return () + } + .eraseToAnyPublisher() + } } .flatMap { _ -> AnyPublisher in Storage.shared.readPublisher(receiveOn: DispatchQueue.global(qos: .userInitiated)) { db in diff --git a/Session/Onboarding/PNModeVC.swift b/Session/Onboarding/PNModeVC.swift index 8906f75cb..6bc15d8d2 100644 --- a/Session/Onboarding/PNModeVC.swift +++ b/Session/Onboarding/PNModeVC.swift @@ -176,7 +176,7 @@ final class PNModeVC: BaseVC, OptionViewDelegate { // If we don't have one then show a loading indicator and try to retrieve the existing name ModalActivityIndicatorViewController.present(fromViewController: self) { viewController in Onboarding.profileNamePublisher - .timeout(.seconds(10), scheduler: DispatchQueue.main, customError: { HTTPError.timeout }) + .timeout(.seconds(15), scheduler: DispatchQueue.main, customError: { HTTPError.timeout }) .catch { _ -> AnyPublisher in SNLog("Onboarding failed to retrieve existing profile information") return Just(nil) diff --git a/Session/Utilities/BackgroundPoller.swift b/Session/Utilities/BackgroundPoller.swift index b5391a23a..d468e8c0c 100644 --- a/Session/Utilities/BackgroundPoller.swift +++ b/Session/Utilities/BackgroundPoller.swift @@ -67,7 +67,7 @@ public final class BackgroundPoller { return SnodeAPI.getSwarm(for: userPublicKey) .subscribeOnMain(immediately: true) .receiveOnMain(immediately: true) - .tryFlatMap { swarm -> AnyPublisher in + .tryFlatMap { swarm -> AnyPublisher<[Message], Error> in guard let snode = swarm.randomElement() else { throw SnodeAPIError.generic } return CurrentUserPoller.poll( @@ -79,6 +79,7 @@ public final class BackgroundPoller { isBackgroundPollValid: { BackgroundPoller.isValid } ) } + .map { _ in () } .eraseToAnyPublisher() } @@ -101,7 +102,7 @@ public final class BackgroundPoller { SnodeAPI.getSwarm(for: groupPublicKey) .subscribeOnMain(immediately: true) .receiveOnMain(immediately: true) - .tryFlatMap { swarm -> AnyPublisher in + .tryFlatMap { swarm -> AnyPublisher<[Message], Error> in guard let snode: Snode = swarm.randomElement() else { throw OnionRequestAPIError.insufficientSnodes } @@ -115,6 +116,7 @@ public final class BackgroundPoller { isBackgroundPollValid: { BackgroundPoller.isValid } ) } + .map { _ in () } .eraseToAnyPublisher() } } diff --git a/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift b/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift index 481a5f59e..3890df232 100644 --- a/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift +++ b/SessionMessagingKit/Database/Models/ControlMessageProcessRecord.swift @@ -83,6 +83,12 @@ public struct ControlMessageProcessRecord: Codable, FetchableRecord, Persistable // message handling to make sure the messages are for the same ongoing call if message is CallMessage { return nil } + // We don't want to do any de-duping for SharedConfigMessages as libSession will handle + // the deduping for us, it also gives libSession more options to potentially recover from + // invalid data, conflicts or even process new changes which weren't supported from older + // versions of the library as it will always re-process messages + if message is SharedConfigMessage { return nil } + // Allow '.new' and 'encryptionKeyPair' closed group control message duplicates to avoid // the following situation: // • The app performed a background poll or received a push notification @@ -103,7 +109,7 @@ public struct ControlMessageProcessRecord: Codable, FetchableRecord, Persistable case is ClosedGroupControlMessage: return .closedGroupControlMessage case is DataExtractionNotification: return .dataExtractionNotification case is ExpirationTimerUpdate: return .expirationTimerUpdate - case is ConfigurationMessage, is SharedConfigMessage: return .configurationMessage // TODO: Confirm this is desired + case is ConfigurationMessage, is SharedConfigMessage: return .configurationMessage case is UnsendRequest: return .unsendRequest case is MessageRequestResponse: return .messageRequestResponse case is CallMessage: return .call diff --git a/SessionMessagingKit/Database/Models/SharedConfigDump.swift b/SessionMessagingKit/Database/Models/SharedConfigDump.swift index db2fae388..8468dcf74 100644 --- a/SessionMessagingKit/Database/Models/SharedConfigDump.swift +++ b/SessionMessagingKit/Database/Models/SharedConfigDump.swift @@ -66,7 +66,9 @@ public extension ConfigDump { } public extension ConfigDump.Variant { - static let userVariants: [ConfigDump.Variant] = [ .userProfile, .contacts, .convoInfoVolatile, .userGroups ] + static let userVariants: [ConfigDump.Variant] = [ + .userProfile, .contacts, .convoInfoVolatile, .userGroups + ] var configMessageKind: SharedConfigMessage.Kind { switch self { @@ -85,4 +87,15 @@ public extension ConfigDump.Variant { case .userGroups: return SnodeAPI.Namespace.configUserGroups } } + + /// This value defines the order that the SharedConfigMessages should be processed in, while we re-process config + /// messages every time we poll this will prevent an edge-case where we have `convoInfoVolatile` data related + /// to a new conversation which hasn't been created yet because it's associated `contacts`/`userGroups` message + /// hasn't yet been processed (without this we would have to wait until the next poll for it to be processed correctly) + var processingOrder: Int { + switch self { + case .userProfile, .contacts, .userGroups: return 0 + case .convoInfoVolatile: return 1 + } + } } diff --git a/SessionMessagingKit/LibSessionUtil/SessionUtil.swift b/SessionMessagingKit/LibSessionUtil/SessionUtil.swift index b16038aa2..dedc595f8 100644 --- a/SessionMessagingKit/LibSessionUtil/SessionUtil.swift +++ b/SessionMessagingKit/LibSessionUtil/SessionUtil.swift @@ -317,13 +317,13 @@ public enum SessionUtil { guard !messages.isEmpty else { return } guard !publicKey.isEmpty else { throw MessageReceiverError.noThread } - let groupedMessages: [SharedConfigMessage.Kind: [SharedConfigMessage]] = messages - .grouped(by: \.kind) - + let groupedMessages: [ConfigDump.Variant: [SharedConfigMessage]] = messages + .grouped(by: \.kind.configDumpVariant) // Merge the config messages into the current state let mergeResults: [ConfigDump.Variant: IncomingConfResult] = groupedMessages + .sorted { lhs, rhs in lhs.key.processingOrder < rhs.key.processingOrder } .reduce(into: [:]) { result, next in - let key: ConfigKey = ConfigKey(variant: next.key.configDumpVariant, publicKey: publicKey) + let key: ConfigKey = ConfigKey(variant: next.key, publicKey: publicKey) let atomicConf: Atomic?> = ( SessionUtil.configStore.wrappedValue[key] ?? Atomic(nil) @@ -340,8 +340,8 @@ public enum SessionUtil { var mergeData: [UnsafePointer?] = next.value .map { message -> [UInt8] in message.data.bytes } .unsafeCopy() - var mergeSize: [Int] = messages.map { $0.data.count } - config_merge(conf, &mergeData, &mergeSize, messages.count) + var mergeSize: [Int] = next.value.map { $0.data.count } + config_merge(conf, &mergeData, &mergeSize, next.value.count) mergeData.forEach { $0?.deallocate() } // Get the state of this variant @@ -350,7 +350,7 @@ public enum SessionUtil { } // Return the current state of the config - result[next.key.configDumpVariant] = IncomingConfResult( + result[next.key] = IncomingConfResult( needsPush: needsPush, needsDump: needsDump, messageHashes: messageHashes, diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/Info.plist b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/Info.plist index c9a2d9b3e..97310ed4d 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/Info.plist +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/Info.plist @@ -6,30 +6,30 @@ LibraryIdentifier - ios-arm64 + ios-arm64_x86_64-simulator LibraryPath libsession-util.a SupportedArchitectures arm64 + x86_64 SupportedPlatform ios + SupportedPlatformVariant + simulator LibraryIdentifier - ios-arm64_x86_64-simulator + ios-arm64 LibraryPath libsession-util.a SupportedArchitectures arm64 - x86_64 SupportedPlatform ios - SupportedPlatformVariant - simulator CFBundlePackageType diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64/libsession-util.a b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64/libsession-util.a index 3f7bee4866f4335c016eb5b69d3b158242fccb27..2ad2f5c1107e9947f969ef59dc701bf6f2855c93 100644 GIT binary patch delta 47938 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 diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64_x86_64-simulator/libsession-util.a b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/ios-arm64_x86_64-simulator/libsession-util.a index de85c6780954b6555140a492a4b4815bc1a7b18a..496ccbf153497ad3e0ce4c8d472808ff29df5a92 100644 GIT binary patch delta 98919 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

47Y4MJ^aa9+g;gYivjn1#0~ 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 V#e!4AGprvi-1h5Njo5e7{{RJ%f3yGq delta 98855 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 I +// Maximum length of the profile pic URL (not including the null terminator) +extern const size_t PROFILE_PIC_MAX_URL_LENGTH; + typedef struct user_profile_pic { // Null-terminated C string containing the uploaded URL of the pic. Will be length 0 if there // is no profile pic. diff --git a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_groups.h b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_groups.h index a4897da6f..232e67977 100644 --- a/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_groups.h +++ b/SessionMessagingKit/LibSessionUtil/libsession-util.xcframework/session/config/user_groups.h @@ -7,15 +7,26 @@ extern "C" { #include "base.h" #include "util.h" +// Maximum length of a group name, in bytes +extern const size_t GROUP_NAME_MAX_LENGTH; + +// Maximum length of a community full URL +extern const size_t COMMUNITY_URL_MAX_LENGTH; + +// Maximum length of a community room token +extern const size_t COMMUNITY_ROOM_MAX_LENGTH; + typedef struct ugroups_legacy_group_info { char session_id[67]; // in hex; 66 hex chars + null terminator. - char name[101]; // Null-terminated C string (human-readable). Max length is 511. Will always - // be set (even if an empty string). + char name[101]; // Null-terminated C string (human-readable). Max length is 100 (plus 1 for + // null). Will always be set (even if an empty string). bool have_enc_keys; // Will be true if we have an encryption keypair, false if not. - unsigned char enc_pubkey[32]; // If `have_enc_keys`, this is the 32-byte pubkey - unsigned char enc_seckey[32]; // If `have_enc_keys`, this is the 32-byte secret key + unsigned char enc_pubkey[32]; // If `have_enc_keys`, this is the 32-byte pubkey (no NULL + // terminator). + unsigned char enc_seckey[32]; // If `have_enc_keys`, this is the 32-byte secret key (no NULL + // terminator). int64_t disappearing_timer; // Minutes. 0 == disabled. bool hidden; // true if hidden from the convo list diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index 2f2767632..4c6333c45 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -209,6 +209,10 @@ public extension Message { handleClosedGroupKeyUpdateMessages: true ) + // Ensure we actually want to de-dupe messages for this namespace, otherwise just + // succeed early + guard rawMessage.namespace.shouldDedupeMessages else { return processedMessage } + // Retrieve the number of entries we have for the hash of this message let numExistingHashes: Int = (try? SnodeReceivedMessageInfo .filter(SnodeReceivedMessageInfo.Columns.hash == rawMessage.info.hash) diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index 22143d133..6b409b121 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -1088,21 +1088,19 @@ public final class MessageSender { if let message = message as? VisibleMessage { message.syncTarget = publicKey } if let message = message as? ExpirationTimerUpdate { message.syncTarget = publicKey } - Storage.shared.write { db in - JobRunner.add( - db, - job: Job( - variant: .messageSend, - threadId: threadId, - interactionId: interactionId, - details: MessageSendJob.Details( - destination: .contact(publicKey: currentUserPublicKey), - message: message, - isSyncMessage: true - ) + JobRunner.add( + db, + job: Job( + variant: .messageSend, + threadId: threadId, + interactionId: interactionId, + details: MessageSendJob.Details( + destination: .contact(publicKey: currentUserPublicKey), + message: message, + isSyncMessage: true ) ) - } + ) } } } diff --git a/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift b/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift index 230218237..799c9f0a5 100644 --- a/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift +++ b/SessionMessagingKit/Sending & Receiving/Pollers/Poller.swift @@ -88,7 +88,7 @@ public class Poller { getSnodeForPolling(for: publicKey) .subscribe(on: Threading.pollerQueue) - .flatMap { snode -> AnyPublisher in + .flatMap { snode -> AnyPublisher<[Message], Error> in Poller.poll( namespaces: namespaces, from: snode, @@ -126,7 +126,7 @@ public class Poller { self?.getSnodeForPolling(for: publicKey) .subscribe(on: Threading.pollerQueue) - .flatMap { snode -> AnyPublisher in + .flatMap { snode -> AnyPublisher<[Message], Error> in Poller.poll( namespaces: namespaces, from: snode, @@ -177,6 +177,11 @@ public class Poller { } } + /// Polls the specified namespaces and processes any messages, returning an array of messages that were + /// successfully processed + /// + /// **Note:** The returned messages will have already been processed by the `Poller`, they are only returned + /// for cases where we need explicit/custom behaviours to occur (eg. Onboarding) public static func poll( namespaces: [SnodeAPI.Namespace], from snode: Snode, @@ -185,13 +190,13 @@ public class Poller { calledFromBackgroundPoller: Bool = false, isBackgroundPollValid: @escaping (() -> Bool) = { true }, poller: Poller? = nil - ) -> AnyPublisher { + ) -> AnyPublisher<[Message], Error> { // If the polling has been cancelled then don't continue guard (calledFromBackgroundPoller && isBackgroundPollValid()) || poller?.isPolling.wrappedValue[publicKey] == true else { - return Just(()) + return Just([]) .setFailureType(to: Error.self) .eraseToAnyPublisher() } @@ -210,26 +215,25 @@ public class Poller { from: snode, associatedWith: publicKey ) - .flatMap { namespacedResults -> AnyPublisher in + .flatMap { namespacedResults -> AnyPublisher<[Message], Error> in guard (calledFromBackgroundPoller && isBackgroundPollValid()) || poller?.isPolling.wrappedValue[publicKey] == true else { - return Just(()) + return Just([]) .setFailureType(to: Error.self) .eraseToAnyPublisher() } - let allMessagesCount: Int = namespacedResults - .map { $0.value.data?.messages.count ?? 0 } - .reduce(0, +) + let allMessages: [SnodeReceivedMessage] = namespacedResults + .compactMap { _, result -> [SnodeReceivedMessage]? in result.data?.messages } + .flatMap { $0 } // No need to do anything if there are no messages - guard allMessagesCount > 0 else { - if !calledFromBackgroundPoller { - SNLog("Received no new messages in \(pollerName)") - } - return Just(()) + guard !allMessages.isEmpty else { + if !calledFromBackgroundPoller { SNLog("Received no new messages in \(pollerName)") } + + return Just([]) .setFailureType(to: Error.self) .eraseToAnyPublisher() } @@ -237,90 +241,92 @@ public class Poller { // Otherwise process the messages and add them to the queue for handling let lastHashes: [String] = namespacedResults .compactMap { $0.value.data?.lastHash } + let otherKnownHashes: [String] = namespacedResults + .filter { $0.key.shouldDedupeMessages } + .compactMap { $0.value.data?.messages.map { $0.info.hash } } + .reduce([], +) var messageCount: Int = 0 + var processedMessages: [Message] = [] var hadValidHashUpdate: Bool = false var jobsToRun: [Job] = [] Storage.shared.write { db in - namespacedResults.forEach { namespace, result in - result.data?.messages - .compactMap { message -> ProcessedMessage? in - do { - return try Message.processRawReceivedMessage(db, rawMessage: message) - } - catch { - switch error { - // Ignore duplicate & selfSend message errors (and don't bother logging - // them as there will be a lot since we each service node duplicates messages) - case DatabaseError.SQLITE_CONSTRAINT_UNIQUE, - MessageReceiverError.duplicateMessage, - MessageReceiverError.duplicateControlMessage, - MessageReceiverError.selfSend: - break - - case MessageReceiverError.duplicateMessageNewSnode: - hadValidHashUpdate = true - break - - case DatabaseError.SQLITE_ABORT: - // In the background ignore 'SQLITE_ABORT' (it generally means - // the BackgroundPoller has timed out - if !calledFromBackgroundPoller { - SNLog("Failed to the database being suspended (running in background with no background task).") - } - break - - default: SNLog("Failed to deserialize envelope due to error: \(error).") - } - - return nil - } + allMessages + .compactMap { message -> ProcessedMessage? in + do { + return try Message.processRawReceivedMessage(db, rawMessage: message) } - .grouped { threadId, _, _ in (threadId ?? Message.nonThreadMessageId) } - .forEach { threadId, threadMessages in - messageCount += threadMessages.count - - let jobToRun: Job? = Job( - variant: .messageReceive, - behaviour: .runOnce, - threadId: threadId, - details: MessageReceiveJob.Details( - messages: threadMessages.map { $0.messageInfo }, - calledFromBackgroundPoller: calledFromBackgroundPoller - ) - ) - jobsToRun = jobsToRun.appending(jobToRun) + catch { + switch error { + // Ignore duplicate & selfSend message errors (and don't bother logging + // them as there will be a lot since we each service node duplicates messages) + case DatabaseError.SQLITE_CONSTRAINT_UNIQUE, + MessageReceiverError.duplicateMessage, + MessageReceiverError.duplicateControlMessage, + MessageReceiverError.selfSend: + break + + case MessageReceiverError.duplicateMessageNewSnode: + hadValidHashUpdate = true + break + + case DatabaseError.SQLITE_ABORT: + // In the background ignore 'SQLITE_ABORT' (it generally means + // the BackgroundPoller has timed out + if !calledFromBackgroundPoller { + SNLog("Failed to the database being suspended (running in background with no background task).") + } + break + + default: SNLog("Failed to deserialize envelope due to error: \(error).") + } - // If we are force-polling then add to the JobRunner so they are - // persistent and will retry on the next app run if they fail but - // don't let them auto-start - JobRunner.add(db, job: jobToRun, canStartJob: !calledFromBackgroundPoller) + return nil } - } + } + .grouped { threadId, _, _ in (threadId ?? Message.nonThreadMessageId) } + .forEach { threadId, threadMessages in + messageCount += threadMessages.count + processedMessages += threadMessages.map { $0.messageInfo.message } + + let jobToRun: Job? = Job( + variant: .messageReceive, + behaviour: .runOnce, + threadId: threadId, + details: MessageReceiveJob.Details( + messages: threadMessages.map { $0.messageInfo }, + calledFromBackgroundPoller: calledFromBackgroundPoller + ) + ) + jobsToRun = jobsToRun.appending(jobToRun) + + // If we are force-polling then add to the JobRunner so they are + // persistent and will retry on the next app run if they fail but + // don't let them auto-start + JobRunner.add(db, job: jobToRun, canStartJob: !calledFromBackgroundPoller) + } // Clean up message hashes and add some logs about the poll results - if allMessagesCount == 0 && !hadValidHashUpdate { + if allMessages.isEmpty && !hadValidHashUpdate { if !calledFromBackgroundPoller { - SNLog("Received \(allMessagesCount) new message\(allMessagesCount == 1 ? "" : "s"), all duplicates - marking the hash we polled with as invalid") + SNLog("Received \(allMessages.count) new message\(allMessages.count == 1 ? "" : "s"), all duplicates - marking the hash we polled with as invalid") } // Update the cached validity of the messages try SnodeReceivedMessageInfo.handlePotentialDeletedOrInvalidHash( db, potentiallyInvalidHashes: lastHashes, - otherKnownValidHashes: namespacedResults - .compactMap { $0.value.data?.messages.map { $0.info.hash } } - .reduce([], +) + otherKnownValidHashes: otherKnownHashes ) } else if !calledFromBackgroundPoller { - SNLog("Received \(messageCount) new message\(messageCount == 1 ? "" : "s") in \(pollerName) (duplicates: \(allMessagesCount - messageCount))") + SNLog("Received \(messageCount) new message\(messageCount == 1 ? "" : "s") in \(pollerName) (duplicates: \(allMessages.count - messageCount))") } } // If we aren't runing in a background poller then just finish immediately guard calledFromBackgroundPoller else { - return Just(()) + return Just(processedMessages) .setFailureType(to: Error.self) .eraseToAnyPublisher() } @@ -345,7 +351,7 @@ public class Poller { } ) .collect() - .map { _ in () } + .map { _ in processedMessages } .eraseToAnyPublisher() } .eraseToAnyPublisher() diff --git a/SessionMessagingKit/Utilities/ProfileManager.swift b/SessionMessagingKit/Utilities/ProfileManager.swift index def1a651a..d2b7b368e 100644 --- a/SessionMessagingKit/Utilities/ProfileManager.swift +++ b/SessionMessagingKit/Utilities/ProfileManager.swift @@ -533,6 +533,7 @@ public struct ProfileManager { // Profile picture & profile key var avatarNeedsDownload: Bool = false + var targetAvatarUrl: String? = nil let shouldUpdateAvatar: Bool = { guard isCurrentUser else { return true } @@ -568,6 +569,7 @@ public struct ProfileManager { profileChanges.append(Profile.Columns.profilePictureUrl.set(to: url)) profileChanges.append(Profile.Columns.profileEncryptionKey.set(to: key)) avatarNeedsDownload = true + targetAvatarUrl = url } // Profile filename (this isn't synchronized between devices) @@ -618,7 +620,9 @@ public struct ProfileManager { // Download the profile picture if needed guard avatarNeedsDownload else { return } - db.afterNextTransactionNested { db in + let dedupeIdentifier: String = "AvatarDownload-\(publicKey)-\(targetAvatarUrl ?? "remove")" + + db.afterNextTransactionNestedOnce(dedupeIdentifier: dedupeIdentifier) { db in // Need to refetch to ensure the db changes have occurred ProfileManager.downloadAvatar(for: Profile.fetchOrCreate(db, id: publicKey)) } diff --git a/SessionSnodeKit/Models/SnodeMessage.swift b/SessionSnodeKit/Models/SnodeMessage.swift index fea1d5bf7..69cff264e 100644 --- a/SessionSnodeKit/Models/SnodeMessage.swift +++ b/SessionSnodeKit/Models/SnodeMessage.swift @@ -53,10 +53,7 @@ extension SnodeMessage { public func encode(to encoder: Encoder) throws { var container: KeyedEncodingContainer = encoder.container(keyedBy: CodingKeys.self) - try container.encode( - (Features.useTestnet ? recipient.removingIdPrefixIfNeeded() : recipient), - forKey: .recipient - ) + try container.encode(recipient, forKey: .recipient) try container.encode(data, forKey: .data) try container.encode(ttl, forKey: .ttl) try container.encode(timestampMs, forKey: .timestampMs) diff --git a/SessionSnodeKit/Models/SnodeReceivedMessage.swift b/SessionSnodeKit/Models/SnodeReceivedMessage.swift index a4659cb78..6e20921d1 100644 --- a/SessionSnodeKit/Models/SnodeReceivedMessage.swift +++ b/SessionSnodeKit/Models/SnodeReceivedMessage.swift @@ -9,6 +9,7 @@ public struct SnodeReceivedMessage: CustomDebugStringConvertible { public static let defaultExpirationSeconds: Int64 = ((15 * 24 * 60 * 60) * 1000) public let info: SnodeReceivedMessageInfo + public let namespace: SnodeAPI.Namespace public let data: Data init?( @@ -29,6 +30,7 @@ public struct SnodeReceivedMessage: CustomDebugStringConvertible { hash: rawMessage.hash, expirationDateMs: (rawMessage.expiration ?? SnodeReceivedMessage.defaultExpirationSeconds) ) + self.namespace = namespace self.data = data } diff --git a/SessionSnodeKit/Networking/SnodeAPI.swift b/SessionSnodeKit/Networking/SnodeAPI.swift index 7489e4011..2f5e1d289 100644 --- a/SessionSnodeKit/Networking/SnodeAPI.swift +++ b/SessionSnodeKit/Networking/SnodeAPI.swift @@ -264,17 +264,13 @@ public final class SnodeAPI { } SNLog("Getting swarm for: \((publicKey == getUserHexEncodedPublicKey()) ? "self" : publicKey).") - let targetPublicKey: String = (Features.useTestnet ? - publicKey.removingIdPrefixIfNeeded() : - publicKey - ) return getRandomSnode() .flatMap { snode in SnodeAPI.send( request: SnodeRequest( endpoint: .getSwarm, - body: GetSwarmRequest(pubkey: targetPublicKey) + body: GetSwarmRequest(pubkey: publicKey) ), to: snode, associatedWith: publicKey, @@ -305,16 +301,14 @@ public final class SnodeAPI { } let userX25519PublicKey: String = getUserHexEncodedPublicKey() - let targetPublicKey: String = (Features.useTestnet ? - publicKey.removingIdPrefixIfNeeded() : - publicKey - ) return Just(()) .setFailureType(to: Error.self) .map { _ -> [SnodeAPI.Namespace: String] in namespaces .reduce(into: [:]) { result, namespace in + guard namespace.shouldDedupeMessages else { return } + // Prune expired message hashes for this namespace on this service node SnodeReceivedMessageInfo.pruneExpiredMessageHashInfo( for: snode, @@ -375,7 +369,7 @@ public final class SnodeAPI { request: SnodeRequest( endpoint: .getMessages, body: LegacyGetMessagesRequest( - pubkey: targetPublicKey, + pubkey: publicKey, lastHash: (namespaceLastHash[namespace] ?? ""), namespace: namespace, maxCount: nil, @@ -393,7 +387,7 @@ public final class SnodeAPI { body: GetMessagesRequest( lastHash: (namespaceLastHash[namespace] ?? ""), namespace: namespace, - pubkey: targetPublicKey, + pubkey: publicKey, subkey: nil, // TODO: Need to get this timestampMs: UInt64(SnodeAPI.currentOffsetTimestampMs()), ed25519PublicKey: userED25519KeyPair.publicKey, @@ -462,11 +456,6 @@ public final class SnodeAPI { associatedWith publicKey: String, using dependencies: SSKDependencies = SSKDependencies() ) -> AnyPublisher<(info: ResponseInfoType, data: (messages: [SnodeReceivedMessage], lastHash: String?)?), Error> { - let targetPublicKey: String = (Features.useTestnet ? - publicKey.removingIdPrefixIfNeeded() : - publicKey - ) - return Deferred { Future { resolver in // Prune expired message hashes for this namespace on this service node @@ -495,7 +484,7 @@ public final class SnodeAPI { request: SnodeRequest( endpoint: .getMessages, body: LegacyGetMessagesRequest( - pubkey: targetPublicKey, + pubkey: publicKey, lastHash: (lastHash ?? ""), namespace: namespace, maxCount: nil, @@ -522,7 +511,7 @@ public final class SnodeAPI { body: GetMessagesRequest( lastHash: (lastHash ?? ""), namespace: namespace, - pubkey: targetPublicKey, + pubkey: publicKey, subkey: nil, timestampMs: UInt64(SnodeAPI.currentOffsetTimestampMs()), ed25519PublicKey: userED25519KeyPair.publicKey, @@ -566,10 +555,7 @@ public final class SnodeAPI { in namespace: Namespace, using dependencies: SSKDependencies = SSKDependencies() ) -> AnyPublisher<(ResponseInfoType, SendMessagesResponse), Error> { - let publicKey: String = (Features.useTestnet ? - message.recipient.removingIdPrefixIfNeeded() : - message.recipient - ) + let publicKey: String = message.recipient let userX25519PublicKey: String = getUserHexEncodedPublicKey() let sendTimestamp: UInt64 = UInt64(SnodeAPI.currentOffsetTimestampMs()) @@ -657,10 +643,7 @@ public final class SnodeAPI { } let userX25519PublicKey: String = getUserHexEncodedPublicKey() - let publicKey: String = (Features.useTestnet ? - recipient.removingIdPrefixIfNeeded() : - recipient - ) + let publicKey: String = recipient var requests: [SnodeAPI.BatchRequest.Info] = targetedMessages .map { message, namespace in // Check if this namespace requires authentication @@ -749,11 +732,6 @@ public final class SnodeAPI { .eraseToAnyPublisher() } - let publicKey: String = (Features.useTestnet ? - publicKey.removingIdPrefixIfNeeded() : - publicKey - ) - return getSwarm(for: publicKey) .subscribe(on: Threading.workQueue) .tryFlatMap { swarm -> AnyPublisher<[String: (hashes: [String], expiry: UInt64)], Error> in @@ -801,11 +779,6 @@ public final class SnodeAPI { .eraseToAnyPublisher() } - let publicKey: String = (Features.useTestnet ? - publicKey.removingIdPrefixIfNeeded() : - publicKey - ) - return getSwarm(for: publicKey) .subscribe(on: Threading.workQueue) .tryFlatMap { swarm -> AnyPublisher in @@ -855,10 +828,6 @@ public final class SnodeAPI { .eraseToAnyPublisher() } - let publicKey: String = (Features.useTestnet ? - publicKey.removingIdPrefixIfNeeded() : - publicKey - ) let userX25519PublicKey: String = getUserHexEncodedPublicKey() return getSwarm(for: publicKey) diff --git a/SessionSnodeKit/Types/SnodeAPINamespace.swift b/SessionSnodeKit/Types/SnodeAPINamespace.swift index 84ee98a3e..4d75897f7 100644 --- a/SessionSnodeKit/Types/SnodeAPINamespace.swift +++ b/SessionSnodeKit/Types/SnodeAPINamespace.swift @@ -31,6 +31,24 @@ public extension SnodeAPI { } } + /// This flag indicates whether we should dedupe messages from the specified namespace, when `true` we will + /// store a `SnodeReceivedMessageInfo` record for the message and check for a matching record whenever + /// we receive a message from this namespace + /// + /// **Note:** An additional side-effect of this flag is that when we poll for messages from the specified namespace + /// we will always retrieve **all** messages from the namespace (instead of just new messages since the last one + /// we have seen) + public var shouldDedupeMessages: Bool { + switch self { + case .`default`, .legacyClosedGroup: return true + + case .configUserProfile, .configContacts, + .configConvoInfoVolatile, .configUserGroups, + .configClosedGroupInfo: + return false + } + } + var verificationString: String { switch self { case .`default`: return "" diff --git a/SessionUtilitiesKit/JobRunner/JobRunner.swift b/SessionUtilitiesKit/JobRunner/JobRunner.swift index ed058a229..c6928b245 100644 --- a/SessionUtilitiesKit/JobRunner/JobRunner.swift +++ b/SessionUtilitiesKit/JobRunner/JobRunner.swift @@ -143,7 +143,7 @@ public final class JobRunner { guard canStartJob else { return } // Start the job runner if needed - db.afterNextTransactionNested { _ in + db.afterNextTransactionNestedOnce(dedupeIdentifier: "JobRunner-Start: \(updatedJob.variant)") { _ in queues.wrappedValue[updatedJob.variant]?.start() } } @@ -166,7 +166,7 @@ public final class JobRunner { guard canStartJob else { return } // Start the job runner if needed - db.afterNextTransactionNested { _ in + db.afterNextTransactionNestedOnce(dedupeIdentifier: "JobRunner-Start: \(job.variant)") { _ in queues.wrappedValue[job.variant]?.start() } }