diff --git a/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift b/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift index 93f449b90..fbf8b87e0 100644 --- a/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift +++ b/SessionMessagingKit/Sending & Receiving/MessageSender+ClosedGroups.swift @@ -161,12 +161,19 @@ extension MessageSender { throw Error.invalidClosedGroupUpdate } let group = thread.groupModel - // Send the update to the group + let members = Set(group.groupMemberIds).subtracting(membersToRemove) + let isCurrentUserAdmin = group.groupAdminIds.contains(getUserHexEncodedPublicKey()) + // Send the update to the group and generate + distribute a new encryption key pair if needed let closedGroupControlMessage = ClosedGroupControlMessage(kind: .membersRemoved(members: membersToRemove.map { Data(hex: $0) })) - MessageSender.send(closedGroupControlMessage, in: thread, using: transaction) + if isCurrentUserAdmin { + let _ = MessageSender.sendNonDurably(closedGroupControlMessage, in: thread, using: transaction).done { + try generateAndSendNewEncryptionKeyPair(for: groupPublicKey, to: members, using: transaction) + } + } else { + MessageSender.send(closedGroupControlMessage, in: thread, using: transaction) + } // Update the group - let members = [String](Set(group.groupMemberIds).subtracting(membersToRemove)) - let newGroupModel = TSGroupModel(title: group.groupName, memberIds: members, image: nil, groupId: groupID, groupType: .closedGroup, adminIds: group.groupAdminIds) + let newGroupModel = TSGroupModel(title: group.groupName, memberIds: [String](members), image: nil, groupId: groupID, groupType: .closedGroup, adminIds: group.groupAdminIds) thread.setGroupModel(newGroupModel, with: transaction) // Notify the user let updateInfo = group.getInfoStringAboutUpdate(to: newGroupModel)