From 8c26e16ef0c0292b088e47274e23df8d221b8088 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Thu, 9 Apr 2020 11:42:23 +1000 Subject: [PATCH 1/5] Fix incorrect message being shown when user was removed from the group. Hide input bar correctly when we leave a group. --- .../ConversationViewController.m | 20 ++++++++++++++++++- .../src/Contacts/Threads/TSGroupThread.m | 5 +++++ .../Loki/Utilities/Notification+Loki.swift | 2 ++ .../src/Messages/OWSMessageManager.m | 14 ++++++++++++- SignalServiceKit/src/Messages/TSGroupModel.m | 8 ++++---- 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 58405b600..f19e212b9 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -424,6 +424,10 @@ typedef enum : NSUInteger { selector:@selector(handleThreadSessionRestoreDevicesChangedNotifiaction:) name:NSNotification.threadSessionRestoreDevicesChanged object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(handleGroupThreadLeftNotification:) + name:NSNotification.groupThreadLeft + object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleCalculatingPoWNotification:) name:NSNotification.calculatingPoW @@ -507,6 +511,20 @@ typedef enum : NSUInteger { [self ensureBannerState]; } +- (void)handleGroupThreadLeftNotification:(NSNotification *)notification +{ + OWSAssertIsOnMainThread(); + + // Check thread + NSString *threadID = (NSString *)notification.object; + if (![threadID isEqualToString:self.thread.uniqueId]) { return; } + // Ensure thread instance is up to date + [self.thread reload]; + // Update UI + [self hideInputIfNeeded]; + [self resetContentAndLayout]; +} + - (void)handleThreadFriendRequestStatusChangedNotification:(NSNotification *)notification { // Check thread @@ -687,7 +705,7 @@ typedef enum : NSUInteger { if (self.thread.isGroupThread) { TSGroupThread *thread = (TSGroupThread *)self.thread; - if (thread.isRSSFeed) { return; } + if (!thread.isPublicChat) { return; } __block LKPublicChat *publicChat; [OWSPrimaryStorage.sharedManager.dbReadConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { publicChat = [LKDatabaseUtilities getPublicChatForThreadID:thread.uniqueId transaction:transaction]; diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index 3995c0c35..b0d3b866c 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -249,6 +249,11 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific } self.groupModel.groupMemberIds = newGroupMemberIDs.allObjects; [self saveWithTransaction:transaction]; + + [transaction addCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.groupThreadLeft object:self.uniqueId]; + }]; } - (void)softDeleteGroupThreadWithTransaction:(YapDatabaseReadWriteTransaction *)transaction diff --git a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift index c2adfb2bf..edb0ad2cf 100644 --- a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift +++ b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift @@ -4,6 +4,7 @@ public extension Notification.Name { // State changes public static let contactOnlineStatusChanged = Notification.Name("contactOnlineStatusChanged") public static let threadFriendRequestStatusChanged = Notification.Name("threadFriendRequestStatusChanged") + public static let groupThreadLeft = Notification.Name("groupThreadLeft") public static let messageFriendRequestStatusChanged = Notification.Name("messageFriendRequestStatusChanged") public static let threadDeleted = Notification.Name("threadDeleted") public static let threadSessionRestoreDevicesChanged = Notification.Name("threadSessionRestoreDevicesChanged") @@ -26,6 +27,7 @@ public extension Notification.Name { // State changes @objc public static let contactOnlineStatusChanged = Notification.Name.contactOnlineStatusChanged.rawValue as NSString @objc public static let threadFriendRequestStatusChanged = Notification.Name.threadFriendRequestStatusChanged.rawValue as NSString + @objc public static let groupThreadLeft = Notification.Name.groupThreadLeft.rawValue as NSString @objc public static let messageFriendRequestStatusChanged = Notification.Name.messageFriendRequestStatusChanged.rawValue as NSString @objc public static let threadDeleted = Notification.Name.threadDeleted.rawValue as NSString @objc public static let threadSessionRestoreDevicesChanged = Notification.Name.threadSessionRestoreDevicesChanged.rawValue as NSString diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 9fef16f6f..1f5ab7681 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1455,6 +1455,8 @@ NS_ASSUME_NONNULL_BEGIN } NSString *hexEncodedPublicKey = ([LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:envelope.source in:transaction] ?: envelope.source); + NSString *localHexEncodedPublicKey = OWSIdentityManager.sharedManager.identityKeyPair.hexEncodedPublicKey; + NSString *ourHexEncodedPublicKey = ([LKDatabaseUtilities getMasterHexEncodedPublicKeyFor:localHexEncodedPublicKey in:transaction] ?: localHexEncodedPublicKey); // Group messages create the group if it doesn't already exist. // @@ -1464,7 +1466,6 @@ NS_ASSUME_NONNULL_BEGIN // Loki: Determine removed members removedMemberIds = [NSMutableSet setWithArray:oldGroupThread.groupModel.groupMemberIds]; [removedMemberIds minusSet:newMemberIds]; - [removedMemberIds removeObject:hexEncodedPublicKey]; } // Only set the display name here, the logic for updating profile pictures is handled when we're setting profile key @@ -1508,6 +1509,11 @@ NS_ASSUME_NONNULL_BEGIN customMessage:updateGroupInfo]; [infoMessage saveWithTransaction:transaction]; + // If we were the one that was removed then we need to leave the group + if ([removedMemberIds containsObject:ourHexEncodedPublicKey]) { + [newGroupThread leaveGroupWithTransaction:transaction]; + } + return nil; } case SSKProtoGroupContextTypeQuit: { @@ -1529,6 +1535,12 @@ NS_ASSUME_NONNULL_BEGIN inThread:oldGroupThread messageType:TSInfoMessageTypeGroupUpdate customMessage:updateGroupInfo] saveWithTransaction:transaction]; + + // If we were the one that quit then we need to leave the group + if ([newMemberIds containsObject:ourHexEncodedPublicKey]) { + [oldGroupThread leaveGroupWithTransaction:transaction]; + } + return nil; } case SSKProtoGroupContextTypeDeliver: { diff --git a/SignalServiceKit/src/Messages/TSGroupModel.m b/SignalServiceKit/src/Messages/TSGroupModel.m index 33a6f24b4..b02a1fad7 100644 --- a/SignalServiceKit/src/Messages/TSGroupModel.m +++ b/SignalServiceKit/src/Messages/TSGroupModel.m @@ -128,7 +128,7 @@ const int32_t kGroupIdLength = 16; NSMutableSet *membersWhoLeft = [NSMutableSet setWithSet:oldMembers]; [membersWhoLeft minusSet:newMembers]; - [membersWhoLeft minusSet:_removedMembers]; + [membersWhoLeft minusSet:newModel.removedMembers]; if ([membersWhoLeft count] > 0) { @@ -145,15 +145,15 @@ const int32_t kGroupIdLength = 16; updatedGroupInfoString = @"New members joined"; } - if (_removedMembers.count > 0) { + if (newModel.removedMembers.count > 0) { NSString *masterDeviceHexEncodedPublicKey = [NSUserDefaults.standardUserDefaults stringForKey:@"masterDeviceHexEncodedPublicKey"]; NSString *hexEncodedPublicKey = masterDeviceHexEncodedPublicKey != nil ? masterDeviceHexEncodedPublicKey : TSAccountManager.localNumber; - if ([_removedMembers containsObject:hexEncodedPublicKey]) { + if ([newModel.removedMembers containsObject:hexEncodedPublicKey]) { updatedGroupInfoString = [updatedGroupInfoString stringByAppendingString:NSLocalizedString(@"YOU_WERE_REMOVED", @"")]; } else { - NSArray *removedMembersNames = [[_removedMembers allObjects] map:^NSString*(NSString* item) { + NSArray *removedMembersNames = [[newModel.removedMembers allObjects] map:^NSString*(NSString* item) { return [contactsManager displayNameForPhoneIdentifier:item]; }]; if ([removedMembersNames count] > 1) { From 1e1459d6d242d2f228d6c5783643b76bc0c1bee5 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Thu, 9 Apr 2020 15:50:12 +1000 Subject: [PATCH 2/5] Ignore messages from users that are not in a group. --- SignalServiceKit/src/Messages/OWSMessageManager.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 1f5ab7681..4ed71cc18 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -589,6 +589,14 @@ NS_ASSUME_NONNULL_BEGIN [TSGroupThread threadWithGroupId:dataMessage.group.id transaction:transaction]; if (groupThread) { + BOOL isClosedGroup = groupThread.groupModel.groupType == closedGroup; + if (isClosedGroup && dataMessage.group.type == SSKProtoGroupContextTypeDeliver) { + // Only allow messages from members of the group + if (![groupThread isUserInGroup:envelope.source transaction:transaction]) { + return; + } + } + if (dataMessage.group.type != SSKProtoGroupContextTypeUpdate) { if (![groupThread isLocalUserInGroupWithTransaction:transaction]) { OWSLogInfo(@"Ignoring messages for left group."); From 7243dcb48d95e04ab7a6c9139b2159a3679b3f8a Mon Sep 17 00:00:00 2001 From: Mikunj Date: Tue, 14 Apr 2020 09:54:58 +1000 Subject: [PATCH 3/5] Fix iOS input being hidden after being removed then added to a group. --- .../ConversationView/ConversationViewController.m | 6 +++--- .../src/Contacts/Threads/TSGroupThread.h | 1 + .../src/Contacts/Threads/TSGroupThread.m | 13 ++++++++++++- .../src/Loki/Utilities/Notification+Loki.swift | 4 ++-- SignalServiceKit/src/Messages/OWSMessageManager.m | 15 +++++++++------ 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index f19e212b9..f4df8b1f1 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -425,8 +425,8 @@ typedef enum : NSUInteger { name:NSNotification.threadSessionRestoreDevicesChanged object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(handleGroupThreadLeftNotification:) - name:NSNotification.groupThreadLeft + selector:@selector(handleGroupThreadUpdated:) + name:NSNotification.groupThreadUpdated object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleCalculatingPoWNotification:) @@ -511,7 +511,7 @@ typedef enum : NSUInteger { [self ensureBannerState]; } -- (void)handleGroupThreadLeftNotification:(NSNotification *)notification +- (void)handleGroupThreadUpdated:(NSNotification *)notification { OWSAssertIsOnMainThread(); diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h index 3acc8a99b..89ce72249 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h @@ -45,6 +45,7 @@ extern NSString *const TSGroupThread_NotificationKey_UniqueId; + (NSArray *)groupThreadsWithRecipientId:(NSString *)recipientId transaction:(YapDatabaseReadWriteTransaction *)transaction; +- (void)updateGroupModel:(TSGroupModel *)newGroupModel withTransaction:(YapDatabaseReadWriteTransaction *)transaction; - (void)leaveGroupWithSneakyTransaction; - (void)leaveGroupWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index b0d3b866c..4d0ccde47 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -232,6 +232,17 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific return NSLocalizedString(@"NEW_GROUP_DEFAULT_TITLE", @""); } +- (void)updateGroupModel:(TSGroupModel *)newGroupModel withTransaction:(YapDatabaseReadWriteTransaction *)transaction +{ + self.groupModel = newGroupModel; + [self saveWithTransaction:transaction]; + + [transaction addCompletionQueue:dispatch_get_main_queue() + completionBlock:^{ + [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.groupThreadUpdated object:self.uniqueId]; + }]; +} + - (void)leaveGroupWithSneakyTransaction { [self.dbReadWriteConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { @@ -252,7 +263,7 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific [transaction addCompletionQueue:dispatch_get_main_queue() completionBlock:^{ - [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.groupThreadLeft object:self.uniqueId]; + [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.groupThreadUpdated object:self.uniqueId]; }]; } diff --git a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift index edb0ad2cf..0055ebb17 100644 --- a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift +++ b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift @@ -4,7 +4,7 @@ public extension Notification.Name { // State changes public static let contactOnlineStatusChanged = Notification.Name("contactOnlineStatusChanged") public static let threadFriendRequestStatusChanged = Notification.Name("threadFriendRequestStatusChanged") - public static let groupThreadLeft = Notification.Name("groupThreadLeft") + public static let groupThreadUpdated = Notification.Name("groupThreadLeft") public static let messageFriendRequestStatusChanged = Notification.Name("messageFriendRequestStatusChanged") public static let threadDeleted = Notification.Name("threadDeleted") public static let threadSessionRestoreDevicesChanged = Notification.Name("threadSessionRestoreDevicesChanged") @@ -27,7 +27,7 @@ public extension Notification.Name { // State changes @objc public static let contactOnlineStatusChanged = Notification.Name.contactOnlineStatusChanged.rawValue as NSString @objc public static let threadFriendRequestStatusChanged = Notification.Name.threadFriendRequestStatusChanged.rawValue as NSString - @objc public static let groupThreadLeft = Notification.Name.groupThreadLeft.rawValue as NSString + @objc public static let groupThreadUpdated = Notification.Name.groupThreadUpdated.rawValue as NSString @objc public static let messageFriendRequestStatusChanged = Notification.Name.messageFriendRequestStatusChanged.rawValue as NSString @objc public static let threadDeleted = Notification.Name.threadDeleted.rawValue as NSString @objc public static let threadSessionRestoreDevicesChanged = Notification.Name.threadSessionRestoreDevicesChanged.rawValue as NSString diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index 4ed71cc18..e12e9ac87 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -1498,11 +1498,14 @@ NS_ASSUME_NONNULL_BEGIN newGroupModel.removedMembers = removedMemberIds; NSString *updateGroupInfo = [newGroupThread.groupModel getInfoStringAboutUpdateTo:newGroupModel contactsManager:self.contactsManager]; - newGroupThread.groupModel = newGroupModel; - [newGroupThread saveWithTransaction:transaction]; - - // Loki: Try to establish sessions with all members when a group is created or updated - [self establishSessionsWithMembersIfNeeded: newMemberIds.allObjects forThread:newGroupThread transaction:transaction]; + + [newGroupThread updateGroupModel:newGroupModel withTransaction:transaction]; + + BOOL removedFromGroup = [removedMemberIds containsObject:ourHexEncodedPublicKey]; + if (!removedFromGroup) { + // Loki: Try to establish sessions with all members when a group is created or updated + [self establishSessionsWithMembersIfNeeded: newMemberIds.allObjects forThread:newGroupThread transaction:transaction]; + } [[OWSDisappearingMessagesJob sharedJob] becomeConsistentWithDisappearingDuration:dataMessage.expireTimer thread:newGroupThread @@ -1518,7 +1521,7 @@ NS_ASSUME_NONNULL_BEGIN [infoMessage saveWithTransaction:transaction]; // If we were the one that was removed then we need to leave the group - if ([removedMemberIds containsObject:ourHexEncodedPublicKey]) { + if (removedFromGroup) { [newGroupThread leaveGroupWithTransaction:transaction]; } From 0b29def940c7e377c60ca9e6580350ec6f0b2920 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Tue, 14 Apr 2020 10:07:53 +1000 Subject: [PATCH 4/5] Minor refactoring --- .../ConversationView/ConversationViewController.m | 4 ++-- SignalServiceKit/src/Contacts/Threads/TSGroupThread.m | 6 ++---- SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index f4df8b1f1..bee6ec9d0 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -425,7 +425,7 @@ typedef enum : NSUInteger { name:NSNotification.threadSessionRestoreDevicesChanged object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(handleGroupThreadUpdated:) + selector:@selector(handleGroupThreadUpdatedNotification:) name:NSNotification.groupThreadUpdated object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self @@ -511,7 +511,7 @@ typedef enum : NSUInteger { [self ensureBannerState]; } -- (void)handleGroupThreadUpdated:(NSNotification *)notification +- (void)handleGroupThreadUpdatedNotification:(NSNotification *)notification { OWSAssertIsOnMainThread(); diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index 4d0ccde47..4d65917f9 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -237,8 +237,7 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific self.groupModel = newGroupModel; [self saveWithTransaction:transaction]; - [transaction addCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ + [transaction addCompletionQueue:dispatch_get_main_queue() completionBlock:^{ [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.groupThreadUpdated object:self.uniqueId]; }]; } @@ -261,8 +260,7 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific self.groupModel.groupMemberIds = newGroupMemberIDs.allObjects; [self saveWithTransaction:transaction]; - [transaction addCompletionQueue:dispatch_get_main_queue() - completionBlock:^{ + [transaction addCompletionQueue:dispatch_get_main_queue() completionBlock:^{ [NSNotificationCenter.defaultCenter postNotificationName:NSNotification.groupThreadUpdated object:self.uniqueId]; }]; } diff --git a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift index 0055ebb17..33859f32a 100644 --- a/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift +++ b/SignalServiceKit/src/Loki/Utilities/Notification+Loki.swift @@ -4,7 +4,7 @@ public extension Notification.Name { // State changes public static let contactOnlineStatusChanged = Notification.Name("contactOnlineStatusChanged") public static let threadFriendRequestStatusChanged = Notification.Name("threadFriendRequestStatusChanged") - public static let groupThreadUpdated = Notification.Name("groupThreadLeft") + public static let groupThreadUpdated = Notification.Name("groupThreadUpdated") public static let messageFriendRequestStatusChanged = Notification.Name("messageFriendRequestStatusChanged") public static let threadDeleted = Notification.Name("threadDeleted") public static let threadSessionRestoreDevicesChanged = Notification.Name("threadSessionRestoreDevicesChanged") From d0b83a59e74450eebb7d240d981c385c73d00a27 Mon Sep 17 00:00:00 2001 From: nielsandriesse Date: Wed, 15 Apr 2020 14:20:02 +1000 Subject: [PATCH 5/5] Add comment & clean --- .../src/Contacts/Threads/TSGroupThread.h | 2 +- .../src/Contacts/Threads/TSGroupThread.m | 2 +- .../src/Messages/OWSMessageManager.m | 21 +++++++++---------- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h index 89ce72249..7c55b4370 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.h @@ -45,7 +45,7 @@ extern NSString *const TSGroupThread_NotificationKey_UniqueId; + (NSArray *)groupThreadsWithRecipientId:(NSString *)recipientId transaction:(YapDatabaseReadWriteTransaction *)transaction; -- (void)updateGroupModel:(TSGroupModel *)newGroupModel withTransaction:(YapDatabaseReadWriteTransaction *)transaction; +- (void)setGroupModel:(TSGroupModel *)newGroupModel withTransaction:(YapDatabaseReadWriteTransaction *)transaction; - (void)leaveGroupWithSneakyTransaction; - (void)leaveGroupWithTransaction:(YapDatabaseReadWriteTransaction *)transaction; diff --git a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m index 4d65917f9..db4bede17 100644 --- a/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m +++ b/SignalServiceKit/src/Contacts/Threads/TSGroupThread.m @@ -232,7 +232,7 @@ NSString *const TSGroupThread_NotificationKey_UniqueId = @"TSGroupThread_Notific return NSLocalizedString(@"NEW_GROUP_DEFAULT_TITLE", @""); } -- (void)updateGroupModel:(TSGroupModel *)newGroupModel withTransaction:(YapDatabaseReadWriteTransaction *)transaction +- (void)setGroupModel:(TSGroupModel *)newGroupModel withTransaction:(YapDatabaseReadWriteTransaction *)transaction { self.groupModel = newGroupModel; [self saveWithTransaction:transaction]; diff --git a/SignalServiceKit/src/Messages/OWSMessageManager.m b/SignalServiceKit/src/Messages/OWSMessageManager.m index e12e9ac87..7cc98d993 100644 --- a/SignalServiceKit/src/Messages/OWSMessageManager.m +++ b/SignalServiceKit/src/Messages/OWSMessageManager.m @@ -589,12 +589,10 @@ NS_ASSUME_NONNULL_BEGIN [TSGroupThread threadWithGroupId:dataMessage.group.id transaction:transaction]; if (groupThread) { - BOOL isClosedGroup = groupThread.groupModel.groupType == closedGroup; + BOOL isClosedGroup = (groupThread.groupModel.groupType == closedGroup); if (isClosedGroup && dataMessage.group.type == SSKProtoGroupContextTypeDeliver) { - // Only allow messages from members of the group - if (![groupThread isUserInGroup:envelope.source transaction:transaction]) { - return; - } + // Only allow messages from group members + if (![groupThread isUserInGroup:envelope.source transaction:transaction]) { return; } } if (dataMessage.group.type != SSKProtoGroupContextTypeUpdate) { @@ -1499,10 +1497,10 @@ NS_ASSUME_NONNULL_BEGIN NSString *updateGroupInfo = [newGroupThread.groupModel getInfoStringAboutUpdateTo:newGroupModel contactsManager:self.contactsManager]; - [newGroupThread updateGroupModel:newGroupModel withTransaction:transaction]; + [newGroupThread setGroupModel:newGroupModel withTransaction:transaction]; - BOOL removedFromGroup = [removedMemberIds containsObject:ourHexEncodedPublicKey]; - if (!removedFromGroup) { + BOOL wasCurrentUserRemovedFromGroup = [removedMemberIds containsObject:ourHexEncodedPublicKey]; + if (!wasCurrentUserRemovedFromGroup) { // Loki: Try to establish sessions with all members when a group is created or updated [self establishSessionsWithMembersIfNeeded: newMemberIds.allObjects forThread:newGroupThread transaction:transaction]; } @@ -1521,7 +1519,7 @@ NS_ASSUME_NONNULL_BEGIN [infoMessage saveWithTransaction:transaction]; // If we were the one that was removed then we need to leave the group - if (removedFromGroup) { + if (wasCurrentUserRemovedFromGroup) { [newGroupThread leaveGroupWithTransaction:transaction]; } @@ -1529,7 +1527,7 @@ NS_ASSUME_NONNULL_BEGIN } case SSKProtoGroupContextTypeQuit: { if (!oldGroupThread) { - OWSLogWarn(@"ignoring quit group message from unknown group."); + OWSLogWarn(@"Ignoring quit group message from unknown group."); return nil; } newMemberIds = [NSMutableSet setWithArray:oldGroupThread.groupModel.groupMemberIds]; @@ -1547,7 +1545,8 @@ NS_ASSUME_NONNULL_BEGIN messageType:TSInfoMessageTypeGroupUpdate customMessage:updateGroupInfo] saveWithTransaction:transaction]; - // If we were the one that quit then we need to leave the group + // If we were the one that quit then we need to leave the group (only relevant for slave + // devices in a multi device context) if ([newMemberIds containsObject:ourHexEncodedPublicKey]) { [oldGroupThread leaveGroupWithTransaction:transaction]; }