pull/333/head
Niels Andriesse 4 years ago
parent 6b7b158000
commit 6ab8570b11

@ -388,6 +388,7 @@ extension MessageReceiver {
let _ = PushNotificationAPI.performOperation(.unsubscribe, for: groupPublicKey, publicKey: userPublicKey) let _ = PushNotificationAPI.performOperation(.unsubscribe, for: groupPublicKey, publicKey: userPublicKey)
} }
// Generate and distribute a new encryption key pair if needed // Generate and distribute a new encryption key pair if needed
// NOTE: If we're the admin we can be sure at this point that we weren't removed
let isCurrentUserAdmin = group.groupAdminIds.contains(getUserHexEncodedPublicKey()) let isCurrentUserAdmin = group.groupAdminIds.contains(getUserHexEncodedPublicKey())
if isCurrentUserAdmin { if isCurrentUserAdmin {
do { do {

@ -150,6 +150,7 @@ extension MessageSender {
public static func removeMembers(_ membersToRemove: Set<String>, to groupPublicKey: String, using transaction: YapDatabaseReadWriteTransaction) throws { public static func removeMembers(_ membersToRemove: Set<String>, to groupPublicKey: String, using transaction: YapDatabaseReadWriteTransaction) throws {
// Get the group, check preconditions & prepare // Get the group, check preconditions & prepare
let userPublicKey = getUserHexEncodedPublicKey()
let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey) let groupID = LKGroupUtilities.getEncodedClosedGroupIDAsData(groupPublicKey)
let threadID = TSGroupThread.threadId(fromGroupId: groupID) let threadID = TSGroupThread.threadId(fromGroupId: groupID)
guard let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) else { guard let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) else {
@ -160,9 +161,13 @@ extension MessageSender {
SNLog("Invalid closed group update.") SNLog("Invalid closed group update.")
throw Error.invalidClosedGroupUpdate throw Error.invalidClosedGroupUpdate
} }
guard !membersToRemove.contains(userPublicKey) else {
SNLog("Invalid closed group update.")
throw Error.invalidClosedGroupUpdate
}
let group = thread.groupModel let group = thread.groupModel
let members = Set(group.groupMemberIds).subtracting(membersToRemove) let members = Set(group.groupMemberIds).subtracting(membersToRemove)
let isCurrentUserAdmin = group.groupAdminIds.contains(getUserHexEncodedPublicKey()) let isCurrentUserAdmin = group.groupAdminIds.contains(userPublicKey)
// Send the update to the group and generate + distribute a new encryption key pair if needed // 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) })) let closedGroupControlMessage = ClosedGroupControlMessage(kind: .membersRemoved(members: membersToRemove.map { Data(hex: $0) }))
if isCurrentUserAdmin { if isCurrentUserAdmin {

Loading…
Cancel
Save