Allow self-sending of closed group control messages

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

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

@ -279,6 +279,9 @@ extension MessageReceiver {
} else {
thread = TSGroupThread.getOrCreateThread(with: group, transaction: 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
Storage.shared.addClosedGroupPublicKey(groupPublicKey, using: transaction)
@ -288,9 +291,6 @@ extension MessageReceiver {
Storage.shared.setClosedGroupFormationTimestamp(to: messageSentTimestamp, for: groupPublicKey, using: transaction)
// Notify the PN server
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) {
@ -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 userPublicKey = getUserHexEncodedPublicKey()
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:
// Distribute a new encryption key pair if we're the admin of the group
// If the admin left:

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

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

Loading…
Cancel
Save