From ecc75dfeedee031820f6e31a0cc5548bfedd7414 Mon Sep 17 00:00:00 2001 From: 0x330a <92654767+0x330a@users.noreply.github.com> Date: Thu, 30 Nov 2023 17:16:23 +1100 Subject: [PATCH] feat: starting member left admin handling functionality --- .../securesms/database/Storage.kt | 19 +++++++++++++++++++ .../libsession/database/StorageProtocol.kt | 1 + .../ReceivedMessageHandler.kt | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 9b96c8c32..6a007e1dc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -1616,6 +1616,25 @@ open class Storage( keys.free() } + override fun handleMemberLeft(message: GroupUpdated, closedGroupId: SessionId) { + val userGroups = configFactory.userGroups ?: return + val closedGroup = userGroups.getClosedGroup(closedGroupId.hexString()) ?: return + if (closedGroup.hasAdminKey()) { + // re-key and do a new config removing the previous member + val info = configFactory.getGroupInfoConfig(closedGroupId) ?: return + val members = configFactory.getGroupMemberConfig(closedGroupId) ?: return + val keys = configFactory.getGroupKeysConfig(closedGroupId, info, members, free = false) ?: return + members.erase(message.sender!!) + + keys.rekey(info, members) + + val + + } + + insertGroupInfoChange(message, closedGroupId) + } + override fun leaveGroup(groupSessionId: String) { val closedGroupId = SessionId.from(groupSessionId) val message = GroupUpdated( diff --git a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt index 7aa2869a1..190305279 100644 --- a/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt +++ b/libsession/src/main/java/org/session/libsession/database/StorageProtocol.kt @@ -172,6 +172,7 @@ interface StorageProtocol { fun promoteMember(groupSessionId: String, promotions: Array) fun removeMember(groupSessionId: String, removedMembers: Array, fromDelete: Boolean = false) fun handlePromoted(keyPair: KeyPair) + fun handleMemberLeft(message: GroupUpdated, closedGroupId: SessionId) fun leaveGroup(groupSessionId: String) // Groups 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 0e524bf0b..1a30845da 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 @@ -557,7 +557,7 @@ private fun handleMemberChange(message: GroupUpdated, closedGroup: SessionId) { private fun handleMemberLeft(message: GroupUpdated, closedGroup: SessionId) { val storage = MessagingModuleConfiguration.shared.storage - storage.insertGroupInfoChange(message, closedGroup) + storage.handleMemberLeft(message, closedGroup) } private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: SessionId) {