From 9eefc21eb92d9a1f85e0bbd8a821af509d273700 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Wed, 13 Jan 2021 14:08:41 +1100 Subject: [PATCH] Periodically send configuration messages --- Session.xcodeproj/project.pbxproj | 8 +++++ Session/Meta/AppDelegate.m | 2 ++ Session/Meta/AppDelegate.swift | 16 ++++++++++ .../ConfigurationMessage.swift | 2 +- .../General/SNUserDefaults.swift | 1 + .../ConfigurationMessage+Convenience.swift | 29 +++++++++++++++++++ 6 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 Session/Meta/AppDelegate.swift create mode 100644 SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index f9da3a03d..e9d291775 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -719,6 +719,8 @@ C3AABDDF2553ECF00042FF4C /* Array+Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D12553860800C340D1 /* Array+Description.swift */; }; C3AAFFC225AE916D0089E6DD /* OpenGroupManagerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3AAFFC125AE916D0089E6DD /* OpenGroupManagerProtocol.swift */; }; C3AAFFD525AE92860089E6DD /* OpenGroupManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3AAFFCB25AE92150089E6DD /* OpenGroupManager.swift */; }; + C3AAFFE825AE975D0089E6DD /* ConfigurationMessage+Convenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3AAFFDE25AE96FF0089E6DD /* ConfigurationMessage+Convenience.swift */; }; + C3AAFFF225AE99710089E6DD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3AAFFF125AE99710089E6DD /* AppDelegate.swift */; }; C3BBE0762554CDA60050F1E3 /* Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BBE0752554CDA60050F1E3 /* Configuration.swift */; }; C3BBE0802554CDD70050F1E3 /* Storage.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BBE07F2554CDD70050F1E3 /* Storage.swift */; }; C3BBE0A72554D4DE0050F1E3 /* Promise+Retrying.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C2A5D62553860B00C340D1 /* Promise+Retrying.swift */; }; @@ -1741,6 +1743,8 @@ C3AA6BB824CE8F1B002358B6 /* Migrating Translations from Android.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Migrating Translations from Android.md"; path = "Meta/Translations/Migrating Translations from Android.md"; sourceTree = ""; }; C3AAFFC125AE916D0089E6DD /* OpenGroupManagerProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupManagerProtocol.swift; sourceTree = ""; }; C3AAFFCB25AE92150089E6DD /* OpenGroupManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenGroupManager.swift; sourceTree = ""; }; + C3AAFFDE25AE96FF0089E6DD /* ConfigurationMessage+Convenience.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ConfigurationMessage+Convenience.swift"; sourceTree = ""; }; + C3AAFFF125AE99710089E6DD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; C3AECBEA24EF5244005743DE /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/Localizable.strings; sourceTree = ""; }; C3B7845C25649DA600ADB2E7 /* TSIncomingMessage+Conversion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TSIncomingMessage+Conversion.swift"; sourceTree = ""; }; C3BBE0752554CDA60050F1E3 /* Configuration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Configuration.swift; sourceTree = ""; }; @@ -3149,6 +3153,7 @@ C38EF2E3255B6DB9007E1867 /* OWSUnreadIndicator.m */, C33FDAE8255A580500E217F9 /* OWSMessageUtils.h */, C33FDBD7255A581900E217F9 /* OWSMessageUtils.m */, + C3AAFFDE25AE96FF0089E6DD /* ConfigurationMessage+Convenience.swift */, ); path = Messaging; sourceTree = ""; @@ -3515,6 +3520,7 @@ children = ( 76EB03C218170B33006006FC /* AppDelegate.h */, 76EB03C318170B33006006FC /* AppDelegate.m */, + C3AAFFF125AE99710089E6DD /* AppDelegate.swift */, 34D99CE3217509C1000AFB39 /* AppEnvironment.swift */, C35E8AA42485C83B00ACB629 /* CSV */, 34330A581E7875FB00DF2FB9 /* Fonts */, @@ -4753,6 +4759,7 @@ B8C2B332256376F000551B4D /* ThreadUtil.m in Sources */, C38EF40B255B6DF7007E1867 /* TappableStackView.swift in Sources */, C38EF31D255B6DBF007E1867 /* UIImage+OWS.swift in Sources */, + C3AAFFE825AE975D0089E6DD /* ConfigurationMessage+Convenience.swift in Sources */, C38EF359255B6DCC007E1867 /* SheetViewController.swift in Sources */, C38EF386255B6DD2007E1867 /* AttachmentApprovalInputAccessoryView.swift in Sources */, B8C2B2C82563685C00551B4D /* CircleView.swift in Sources */, @@ -5146,6 +5153,7 @@ 4CB5F26920F7D060004D1B42 /* MessageActions.swift in Sources */, 340FC8B5204DAC8D007AEB0F /* AboutTableViewController.m in Sources */, C33100082558FF6D00070591 /* NewConversationButtonSet.swift in Sources */, + C3AAFFF225AE99710089E6DD /* AppDelegate.swift in Sources */, B8BB82A5238F627000BA5194 /* HomeVC.swift in Sources */, C31A6C5A247F214E001123EF /* UIView+Glow.swift in Sources */, C31D1DE9252172D4005D4DA8 /* ContactUtilities.swift in Sources */, diff --git a/Session/Meta/AppDelegate.m b/Session/Meta/AppDelegate.m index 4f497391e..2c5c6dc3e 100644 --- a/Session/Meta/AppDelegate.m +++ b/Session/Meta/AppDelegate.m @@ -433,6 +433,8 @@ static NSTimeInterval launchStartedAt; if (CurrentAppContext().isMainApp) { [SNJobQueue.shared resumePendingJobs]; } + + [self syncConfigurationIfNeeded]; }); } } diff --git a/Session/Meta/AppDelegate.swift b/Session/Meta/AppDelegate.swift new file mode 100644 index 000000000..f501d4fbe --- /dev/null +++ b/Session/Meta/AppDelegate.swift @@ -0,0 +1,16 @@ + +extension AppDelegate { + + @objc func syncConfigurationIfNeeded() { + let userDefaults = UserDefaults.standard + guard userDefaults[.isUsingMultiDevice] else { return } + let lastSync = userDefaults[.lastConfigurationSync] ?? .distantPast + guard Date().timeIntervalSince(lastSync) > 2 * 24 * 60 * 60 else { return } // Sync every 2 days + let configurationMessage = ConfigurationMessage.getCurrent() + let destination = Message.Destination.contact(publicKey: getUserHexEncodedPublicKey()) + Storage.shared.write { transaction in + let job = MessageSendJob(message: configurationMessage, destination: destination) + JobQueue.shared.add(job, using: transaction) + } + } +} diff --git a/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage.swift b/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage.swift index 69406f318..1f505cec8 100644 --- a/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage.swift +++ b/SessionMessagingKit/Messages/Control Messages/ConfigurationMessage.swift @@ -8,7 +8,7 @@ public final class ConfigurationMessage : ControlMessage { // MARK: Initialization public override init() { super.init() } - internal init(closedGroups: Set, openGroups: Set) { + public init(closedGroups: Set, openGroups: Set) { super.init() self.closedGroups = closedGroups self.openGroups = openGroups diff --git a/SessionUtilitiesKit/General/SNUserDefaults.swift b/SessionUtilitiesKit/General/SNUserDefaults.swift index 6a6c0e70c..0d67755b8 100644 --- a/SessionUtilitiesKit/General/SNUserDefaults.swift +++ b/SessionUtilitiesKit/General/SNUserDefaults.swift @@ -14,6 +14,7 @@ public enum SNUserDefaults { public enum Date : Swift.String { case lastProfilePictureUpload case lastKeyPairMigrationNudge + case lastConfigurationSync } public enum Double : Swift.String { diff --git a/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift b/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift new file mode 100644 index 000000000..82702e72a --- /dev/null +++ b/SignalUtilitiesKit/Messaging/ConfigurationMessage+Convenience.swift @@ -0,0 +1,29 @@ + +extension ConfigurationMessage { + + public static func getCurrent() -> ConfigurationMessage { + var closedGroups: Set = [] + var openGroups: Set = [] + Storage.read { transaction in + TSGroupThread.enumerateCollectionObjects(with: transaction) { object, _ in + guard let thread = object as? TSGroupThread else { return } + switch thread.groupModel.groupType { + case .closedGroup: + guard thread.isCurrentUserMemberInGroup() else { return } + let groupID = thread.groupModel.groupId + let groupPublicKey = LKGroupUtilities.getDecodedGroupID(groupID) + guard Storage.shared.isClosedGroup(groupPublicKey), + let encryptionKeyPair = Storage.shared.getLatestClosedGroupEncryptionKeyPair(for: groupPublicKey) else { return } + let closedGroup = ClosedGroup(publicKey: groupPublicKey, name: thread.groupModel.groupName!, encryptionKeyPair: encryptionKeyPair, + members: Set(thread.groupModel.groupMemberIds), admins: Set(thread.groupModel.groupAdminIds)) + closedGroups.insert(closedGroup) + case .openGroup: + guard let openGroup = Storage.shared.getOpenGroup(for: thread.uniqueId!) else { return } + openGroups.insert(openGroup.server) + default: break + } + } + } + return ConfigurationMessage(closedGroups: closedGroups, openGroups: openGroups) + } +}