Allow self-sending of closed group control messages

pull/350/head
nielsandriesse 5 years ago
parent 4803b96eb1
commit ece564988e

@ -11,12 +11,7 @@ public final class ClosedGroupControlMessage : ControlMessage {
} }
} }
public override var isSelfSendValid: Bool { public override var isSelfSendValid: Bool { true }
switch kind {
case .new: return false
default: return true
}
}
// MARK: Kind // MARK: Kind
public enum Kind : CustomStringConvertible { public enum Kind : CustomStringConvertible {

@ -279,6 +279,9 @@ extension MessageReceiver {
} else { } else {
thread = TSGroupThread.getOrCreateThread(with: group, transaction: transaction) thread = TSGroupThread.getOrCreateThread(with: group, transaction: transaction)
thread.save(with: 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 // Add the group to the user's set of public keys to poll for
Storage.shared.addClosedGroupPublicKey(groupPublicKey, using: transaction) Storage.shared.addClosedGroupPublicKey(groupPublicKey, using: transaction)
@ -288,9 +291,6 @@ extension MessageReceiver {
Storage.shared.setClosedGroupFormationTimestamp(to: messageSentTimestamp, for: groupPublicKey, using: transaction) Storage.shared.setClosedGroupFormationTimestamp(to: messageSentTimestamp, for: groupPublicKey, using: transaction)
// Notify the PN server // Notify the PN server
let _ = PushNotificationAPI.performOperation(.subscribe, for: groupPublicKey, publicKey: getUserHexEncodedPublicKey()) 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) { private static func handleClosedGroupEncryptionKeyPair(_ message: ClosedGroupControlMessage, using transaction: Any) {
@ -418,10 +418,6 @@ extension MessageReceiver {
let members: Set<String> = didAdminLeave ? [] : Set(group.groupMemberIds).subtracting([ message.sender! ]) // If the admin leaves the group is disbanded let members: Set<String> = didAdminLeave ? [] : Set(group.groupMemberIds).subtracting([ message.sender! ]) // If the admin leaves the group is disbanded
let userPublicKey = getUserHexEncodedPublicKey() let userPublicKey = getUserHexEncodedPublicKey()
let isCurrentUserAdmin = group.groupAdminIds.contains(userPublicKey) 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: // If a regular member left:
// Distribute a new encryption key pair if we're the admin of the group // Distribute a new encryption key pair if we're the admin of the group
// If the admin left: // If the admin left:

@ -24,7 +24,6 @@ extension MessageSender {
// Send a closed group update message to all members individually // Send a closed group update message to all members individually
var promises: [Promise<Void>] = [] var promises: [Promise<Void>] = []
for member in members { for member in members {
guard member != userPublicKey else { continue }
let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction) let thread = TSContactThread.getOrCreateThread(withContactId: member, transaction: transaction)
thread.save(with: transaction) thread.save(with: transaction)
let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name, let closedGroupControlMessageKind = ClosedGroupControlMessage.Kind.new(publicKey: Data(hex: groupPublicKey), name: name,

@ -137,8 +137,12 @@ public final class MessageSender : NSObject {
} }
// Validate the message // Validate the message
guard message.isValid else { handleFailure(with: Error.invalidMessage, using: transaction); return promise } 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) // Stop here if this is a self-send, unless it's:
guard !isSelfSend || message is ConfigurationMessage || isSyncMessage else { // 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 storage.write(with: { transaction in
MessageSender.handleSuccessfulMessageSend(message, to: destination, using: transaction) MessageSender.handleSuccessfulMessageSend(message, to: destination, using: transaction)
seal.fulfill(()) seal.fulfill(())

Loading…
Cancel
Save