diff --git a/Podfile.lock b/Podfile.lock index 78a63d0c5..2e3981798 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -219,4 +219,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: bb4f6cffd6e7c08814b945e1787d01d639036b1e -COCOAPODS: 1.10.0.rc.1 +COCOAPODS: 1.10.1 diff --git a/Session/Open Groups/JoinPublicChatVC.swift b/Session/Open Groups/JoinPublicChatVC.swift index 267a6618e..1e2b94fef 100644 --- a/Session/Open Groups/JoinPublicChatVC.swift +++ b/Session/Open Groups/JoinPublicChatVC.swift @@ -132,10 +132,12 @@ final class JoinPublicChatVC : BaseVC, UIPageViewControllerDataSource, UIPageVie } isJoining = true ModalActivityIndicatorViewController.present(fromViewController: navigationController!, canCancel: false) { [weak self] _ in - Storage.shared.write(with: { transaction in + Storage.shared.write { transaction in OpenGroupManager.shared.add(with: urlAsString, using: transaction) .done(on: DispatchQueue.main) { [weak self] _ in self?.presentingViewController!.dismiss(animated: true, completion: nil) + let appDelegate = UIApplication.shared.delegate as! AppDelegate + appDelegate.forceSyncConfigurationNowIfNeeded().retainUntilComplete() // FIXME: It's probably cleaner to do this inside addOpenGroup(...) } .catch(on: DispatchQueue.main) { [weak self] error in self?.dismiss(animated: true, completion: nil) // Dismiss the loader @@ -148,10 +150,7 @@ final class JoinPublicChatVC : BaseVC, UIPageViewControllerDataSource, UIPageVie self?.isJoining = false self?.showError(title: title, message: message) } - }, completion: { - let appDelegate = UIApplication.shared.delegate as! AppDelegate - appDelegate.forceSyncConfigurationNowIfNeeded().retainUntilComplete() // FIXME: It's probably cleaner to do this inside addOpenGroup(...) - }) + } } } diff --git a/SessionMessagingKit/Messages/Control Messages/ClosedGroupControlMessage.swift b/SessionMessagingKit/Messages/Control Messages/ClosedGroupControlMessage.swift index 05c259c77..1e2646adc 100644 --- a/SessionMessagingKit/Messages/Control Messages/ClosedGroupControlMessage.swift +++ b/SessionMessagingKit/Messages/Control Messages/ClosedGroupControlMessage.swift @@ -11,12 +11,7 @@ public final class ClosedGroupControlMessage : ControlMessage { } } - public override var isSelfSendValid: Bool { - switch kind { - case .new: return false - default: return true - } - } + public override var isSelfSendValid: Bool { true } // MARK: Kind public enum Kind : CustomStringConvertible { diff --git a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift index 166d1b2da..33f17e2ac 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageReceiver+Handling.swift @@ -144,7 +144,7 @@ extension MessageReceiver { } private static func handleConfigurationMessage(_ message: ConfigurationMessage, using transaction: Any) { - guard message.sender == getUserHexEncodedPublicKey() else { return } + guard message.sender == getUserHexEncodedPublicKey(), !UserDefaults.standard[.hasSyncedConfiguration] else { return } let storage = SNMessagingKitConfiguration.shared.storage let allClosedGroupPublicKeys = storage.getUserClosedGroupPublicKeys() for closedGroup in message.closedGroups { @@ -157,6 +157,7 @@ extension MessageReceiver { guard !allOpenGroups.contains(openGroupURL) else { continue } OpenGroupManager.shared.add(with: openGroupURL, using: transaction).retainUntilComplete() } + UserDefaults.standard[.hasSyncedConfiguration] = true } @discardableResult @@ -279,6 +280,9 @@ extension MessageReceiver { } else { thread = TSGroupThread.getOrCreateThread(with: group, transaction: transaction) thread.save(with: transaction) + // Notify the user + let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeGroupUpdate) + infoMessage.save(with: transaction) } // Add the group to the user's set of public keys to poll for Storage.shared.addClosedGroupPublicKey(groupPublicKey, using: transaction) @@ -288,9 +292,6 @@ extension MessageReceiver { Storage.shared.setClosedGroupFormationTimestamp(to: messageSentTimestamp, for: groupPublicKey, using: transaction) // Notify the PN server let _ = PushNotificationAPI.performOperation(.subscribe, for: groupPublicKey, publicKey: getUserHexEncodedPublicKey()) - // Notify the user - let infoMessage = TSInfoMessage(timestamp: NSDate.ows_millisecondTimeStamp(), in: thread, messageType: .typeGroupUpdate) - infoMessage.save(with: transaction) } private static func handleClosedGroupEncryptionKeyPair(_ message: ClosedGroupControlMessage, using transaction: Any) { @@ -423,10 +424,6 @@ extension MessageReceiver { let members: Set = didAdminLeave ? [] : Set(group.groupMemberIds).subtracting([ message.sender! ]) // If the admin leaves the group is disbanded let userPublicKey = getUserHexEncodedPublicKey() let isCurrentUserAdmin = group.groupAdminIds.contains(userPublicKey) - // Guard against self-sends - guard message.sender != getUserHexEncodedPublicKey() else { - return SNLog("Ignoring invalid closed group update.") - } // If a regular member left: // • Distribute a new encryption key pair if we're the admin of the group // If the admin left: diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift b/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift index 03f6b14fb..fb8cb0819 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift @@ -24,7 +24,6 @@ extension MessageSender { // Send a closed group update message to all members individually var promises: [Promise] = [] for member in members { - guard member != userPublicKey else { continue } let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction) thread.save(with: transaction) let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name, diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender.swift b/SessionMessagingKit/Sending & Receiving/MessageSender.swift index 73f8e476d..093885aab 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender.swift @@ -137,8 +137,12 @@ public final class MessageSender : NSObject { } // Validate the message guard message.isValid else { handleFailure(with: Error.invalidMessage, using: transaction); return promise } - // Stop here if this is a self-send (unless it's a configuration message or a sync message) - guard !isSelfSend || message is ConfigurationMessage || isSyncMessage else { + // Stop here if this is a self-send, unless it's: + // • a configuration message + // • a sync message + // • a closed group control message of type `new` + let isNewClosedGroupControlMessage = given(message as? ClosedGroupControlMessage) { if case .new = $0.kind { return true } else { return false } } ?? false + guard !isSelfSend || message is ConfigurationMessage || isSyncMessage || isNewClosedGroupControlMessage else { storage.write(with: { transaction in MessageSender.handleSuccessfulMessageSend(message, to: destination, using: transaction) seal.fulfill(()) @@ -364,6 +368,7 @@ public final class MessageSender : NSObject { OWSDisappearingMessagesJob.shared().startAnyExpiration(for: tsMessage, expirationStartedAt: NSDate.millisecondTimestamp(), transaction: transaction) // Sync the message if: // • it's a visible message + // • the destination was a contact // • we didn't sync it already let userPublicKey = getUserHexEncodedPublicKey() if case .contact(let publicKey) = destination, !isSyncMessage, let message = message as? VisibleMessage { diff --git a/SessionUtilitiesKit/General/SNUserDefaults.swift b/SessionUtilitiesKit/General/SNUserDefaults.swift index 0d67755b8..e2a51e84e 100644 --- a/SessionUtilitiesKit/General/SNUserDefaults.swift +++ b/SessionUtilitiesKit/General/SNUserDefaults.swift @@ -5,6 +5,7 @@ public enum SNUserDefaults { public enum Bool : Swift.String { case hasLaunchedOnce case hasSeenGIFMetadataWarning + case hasSyncedConfiguration case hasViewedSeed case isUsingFullAPNs case isMigratingToV2KeyPair