From 0be05b41eb83e8fd979c3626c445a3a00a8f5af7 Mon Sep 17 00:00:00 2001 From: Nora Trapp Date: Mon, 8 Jun 2020 18:32:16 -0700 Subject: [PATCH] Keep track of who added us to a group --- .../ViewModels/ThreadViewModel.swift | 2 +- .../src/groups/GroupManager.swift | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/SignalMessaging/ViewModels/ThreadViewModel.swift b/SignalMessaging/ViewModels/ThreadViewModel.swift index 33a9d4c240..805fa9186e 100644 --- a/SignalMessaging/ViewModels/ThreadViewModel.swift +++ b/SignalMessaging/ViewModels/ThreadViewModel.swift @@ -56,7 +56,7 @@ public class ThreadViewModel: NSObject { self.hasPendingMessageRequest = thread.hasPendingMessageRequest(transaction: transaction.unwrapGrdbRead) if let groupThread = thread as? TSGroupThread, let addedByAddress = groupThread.groupModel.addedByAddress { - self.addedToGroupByName = Environment.shared.contactsManager.displayName(for: addedByAddress, transaction: transaction) + self.addedToGroupByName = Environment.shared.contactsManager.shortDisplayName(for: addedByAddress, transaction: transaction) } else { self.addedToGroupByName = nil } diff --git a/SignalServiceKit/src/groups/GroupManager.swift b/SignalServiceKit/src/groups/GroupManager.swift index b3bc2280c8..23e2287505 100644 --- a/SignalServiceKit/src/groups/GroupManager.swift +++ b/SignalServiceKit/src/groups/GroupManager.swift @@ -339,6 +339,9 @@ public class GroupManager: NSObject { return createdGroupModel } }.then(on: .global()) { (groupModel: TSGroupModel) -> Promise in + // We're creating this thread, we added ourselves + groupModel.addedByAddress = self.tsAccountManager.localAddress + let thread = databaseStorage.write { (transaction: SDSAnyWriteTransaction) -> TSGroupThread in return self.insertGroupThreadInDatabaseAndCreateInfoMessage(groupModel: groupModel, disappearingMessageToken: disappearingMessageToken, @@ -1083,6 +1086,9 @@ public class GroupManager: NSObject { builder.groupMembership = newGroupMembership let newGroupModel = try builder.build(transaction: transaction) + // We're leaving, so clear out who added us. If we're re-added it may change. + newGroupModel.addedByAddress = nil + let groupUpdateSourceAddress = localAddress let result = try self.updateExistingGroupThreadInDatabaseAndCreateInfoMessage(newGroupModel: newGroupModel, newDisappearingMessageToken: nil, @@ -1550,6 +1556,13 @@ public class GroupManager: NSObject { guard canInsert else { throw OWSAssertionError("Missing groupThread.") } + + // This thread didn't previously exist, so if we're a member we + // have to assume we were just added. + if let localAddress = tsAccountManager.localAddress, newGroupModel.groupMembers.contains(localAddress) { + newGroupModel.addedByAddress = groupUpdateSourceAddress + } + let thread = insertGroupThreadInDatabaseAndCreateInfoMessage(groupModel: newGroupModel, disappearingMessageToken: newDisappearingMessageToken, groupUpdateSourceAddress: groupUpdateSourceAddress, @@ -1630,6 +1643,14 @@ public class GroupManager: NSObject { let hasUserFacingChange = !oldGroupModel.isEqual(to: newGroupModel, ignoreRevision: true) + // If we weren't previously a member and are now a member, assume whoever + // triggered this update added us to the group. + if let localAddress = tsAccountManager.localAddress, + !oldGroupModel.groupMembers.contains(localAddress), + newGroupModel.groupMembers.contains(localAddress) { + newGroupModel.addedByAddress = groupUpdateSourceAddress + } + groupThread.update(with: newGroupModel, transaction: transaction) let action: UpsertGroupResult.Action = (hasUserFacingChange