From 9399da6badf1e5467da529ed429d48535d5263ee Mon Sep 17 00:00:00 2001 From: Brice-W Date: Thu, 6 May 2021 14:49:28 +1000 Subject: [PATCH 1/6] handle the case when an added member is a zombie --- .../messaging/sending_receiving/ReceivedMessageHandler.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index 2a0b13ae3e..8b0588364f 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -395,6 +395,11 @@ private fun MessageReceiver.handleClosedGroupMembersAdded(message: ClosedGroupCo val newMembers = members + updateMembers storage.updateMembers(groupID, newMembers.map { Address.fromSerialized(it) }) + // update zombie members in case the added members are zombies + val zombies = storage.getZombieMember(groupID) + if (zombies.intersect(updateMembers).isNotEmpty()) + storage.updateZombieMembers(groupID, zombies.minus(updateMembers).map { Address.fromSerialized(it) }) + // Notify the user if (userPublicKey == senderPublicKey) { // sender is a linked device From 5eaef76b02b3cf87f8324d87a6a762bea07c06ac Mon Sep 17 00:00:00 2001 From: Brice-W Date: Tue, 25 May 2021 15:45:43 +1000 Subject: [PATCH 2/6] don't update zombie members if current user is removed --- .../sending_receiving/ReceivedMessageHandler.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index ff5dd6002c..73dab9759a 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -451,6 +451,7 @@ private fun MessageReceiver.handleClosedGroupMembersRemoved(message: ClosedGroup val members = group.members.map { it.serialize() } val admins = group.admins.map { it.toString() } val removedMembers = kind.members.map { it.toByteArray().toHexString() } + val zombies = storage.getZombieMember(groupID) // Check that the admin wasn't removed if (removedMembers.contains(admins.first())) { Log.d("Loki", "Ignoring invalid closed group update.") @@ -476,12 +477,12 @@ private fun MessageReceiver.handleClosedGroupMembersRemoved(message: ClosedGroup disableLocalGroupAndUnsubscribe(groupPublicKey, groupID, userPublicKey) } else { storage.updateMembers(groupID, newMembers.map { Address.fromSerialized(it) }) + // Update zombie members + storage.updateZombieMembers(groupID, zombies.minus(removedMembers).map { Address.fromSerialized(it) }) } - // Update zombie members - val zombies = storage.getZombieMember(groupID) - storage.updateZombieMembers(groupID, zombies.minus(removedMembers).map { Address.fromSerialized(it) }) - val type = if (senderLeft) SignalServiceGroup.Type.QUIT else SignalServiceGroup.Type.MEMBER_REMOVED + // Notify the user + val type = if (senderLeft) SignalServiceGroup.Type.QUIT else SignalServiceGroup.Type.MEMBER_REMOVED // We don't display zombie members in the notification as users have already been notified when those members left val notificationMembers = removedMembers.minus(zombies) if (notificationMembers.isNotEmpty()) { From 2c7730260dd5b5c54e3f428826d86cef722e3e86 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Thu, 3 Jun 2021 14:08:13 +1000 Subject: [PATCH 3/6] fix case where closed group was impossible to delete --- .../org/thoughtcrime/securesms/loki/activities/HomeActivity.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt index 9948aec40e..54cf2f8d7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/activities/HomeActivity.kt @@ -317,9 +317,6 @@ class HomeActivity : PassphraseRequiredActionBarActivity(), ConversationClickLis } if (isClosedGroup) { MessageSender.explicitLeave(groupPublicKey!!, false) - } else { - Toast.makeText(context, R.string.activity_home_leaving_group_failed_message, Toast.LENGTH_LONG).show() - return@launch } } // Delete the conversation From 807e1042caf9439001e6381414227ca0af6e45cf Mon Sep 17 00:00:00 2001 From: Brice-W Date: Thu, 3 Jun 2021 14:43:23 +1000 Subject: [PATCH 4/6] make update messages not selectable --- .../securesms/conversation/ConversationFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index f8162aae0a..2e4dee6a38 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -1029,6 +1029,7 @@ public class ConversationFragment extends Fragment @Override public void onItemClick(MessageRecord messageRecord) { + if (messageRecord.isUpdate()) return; if (actionMode != null) { ((ConversationAdapter) list.getAdapter()).toggleSelection(messageRecord); list.getAdapter().notifyDataSetChanged(); @@ -1044,6 +1045,7 @@ public class ConversationFragment extends Fragment @Override public void onItemLongClick(MessageRecord messageRecord) { + if (messageRecord.isUpdate()) return; if (actionMode == null) { ((ConversationAdapter) list.getAdapter()).toggleSelection(messageRecord); list.getAdapter().notifyDataSetChanged(); From 6fb461f7d8e3add085c61bbeda3a193c1f966f15 Mon Sep 17 00:00:00 2001 From: Brice-W Date: Fri, 4 Jun 2021 11:24:01 +1000 Subject: [PATCH 5/6] reset zombie members list if group already exists --- .../messaging/sending_receiving/ReceivedMessageHandler.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index 18fa8c5b08..bc4cbe358b 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -268,6 +268,7 @@ private fun handleNewClosedGroup(sender: String, sentTimestamp: Long, groupPubli // Update the group storage.updateTitle(groupID, name) storage.updateMembers(groupID, members.map { Address.fromSerialized(it) }) + storage.setZombieMembers(groupID, listOf().map { Address.fromSerialized(it) }) } else { storage.createGroup(groupID, name, LinkedList(members.map { Address.fromSerialized(it) }), null, null, LinkedList(admins.map { Address.fromSerialized(it) }), formationTimestamp) From 1d0b61cf89617598843c5ce868543c64b35e82aa Mon Sep 17 00:00:00 2001 From: Brice-W Date: Fri, 4 Jun 2021 12:20:21 +1000 Subject: [PATCH 6/6] fix to avoid zombies to be cleared when new group update received --- .../org/thoughtcrime/securesms/database/GroupDatabase.java | 1 - .../messaging/sending_receiving/ReceivedMessageHandler.kt | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index c3f25bf907..de34abb650 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -294,7 +294,6 @@ public class GroupDatabase extends Database implements LokiOpenGroupDatabaseProt ContentValues contents = new ContentValues(); contents.put(ZOMBIE_MEMBERS, Address.toSerializedList(members, ',')); - contents.put(ACTIVE, 1); databaseHelper.getWritableDatabase().update(TABLE_NAME, contents, GROUP_ID + " = ?", new String[] {groupId}); } diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt index bc4cbe358b..3c2c95f855 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/ReceivedMessageHandler.kt @@ -266,9 +266,11 @@ private fun handleNewClosedGroup(sender: String, sentTimestamp: Long, groupPubli val groupID = GroupUtil.doubleEncodeGroupID(groupPublicKey) if (storage.getGroup(groupID) != null) { // Update the group + // clearing zombie list if the group was not active before the update is received + if (!storage.isGroupActive(groupID)) + storage.setZombieMembers(groupID, listOf().map { Address.fromSerialized(it) }) storage.updateTitle(groupID, name) storage.updateMembers(groupID, members.map { Address.fromSerialized(it) }) - storage.setZombieMembers(groupID, listOf().map { Address.fromSerialized(it) }) } else { storage.createGroup(groupID, name, LinkedList(members.map { Address.fromSerialized(it) }), null, null, LinkedList(admins.map { Address.fromSerialized(it) }), formationTimestamp)