mirror of
https://github.com/oxen-io/session-android.git
synced 2025-08-11 17:27:42 +00:00
Handle message deletion
This commit is contained in:
@@ -177,8 +177,6 @@ interface StorageProtocol {
|
||||
fun insertGroupInfoLeaving(closedGroup: AccountId): Long?
|
||||
fun insertGroupInviteControlMessage(sentTimestamp: Long, senderPublicKey: String, closedGroup: AccountId, groupName: String): Long?
|
||||
fun updateGroupInfoChange(messageId: Long, newType: UpdateMessageData.Kind)
|
||||
fun handleMemberLeftNotification(message: GroupUpdated, closedGroupId: AccountId)
|
||||
fun sendGroupUpdateDeleteMessage(groupSessionId: String, messageHashes: List<String>): Promise<Unit, Exception>
|
||||
|
||||
// Groups
|
||||
fun getAllGroups(includeInactive: Boolean): List<GroupRecord>
|
||||
|
@@ -3,6 +3,8 @@ package org.session.libsession.messaging.groups
|
||||
import org.session.libsession.messaging.contacts.Contact
|
||||
import org.session.libsession.messaging.messages.control.GroupUpdated
|
||||
import org.session.libsession.utilities.recipients.Recipient
|
||||
import org.session.libsignal.protos.SignalServiceProtos
|
||||
import org.session.libsignal.protos.SignalServiceProtos.DataMessage.GroupUpdateDeleteMemberContentMessage
|
||||
import org.session.libsignal.utilities.AccountId
|
||||
|
||||
/**
|
||||
@@ -57,4 +59,13 @@ interface GroupManagerV2 {
|
||||
suspend fun handleKicked(groupId: AccountId)
|
||||
|
||||
suspend fun setName(groupId: AccountId, newName: String)
|
||||
|
||||
suspend fun requestMessageDeletion(groupId: AccountId, messageHashes: List<String>)
|
||||
|
||||
suspend fun handleDeleteMemberContent(
|
||||
groupId: AccountId,
|
||||
deleteMemberContent: GroupUpdateDeleteMemberContentMessage,
|
||||
sender: AccountId,
|
||||
senderIsVerifiedAdmin: Boolean,
|
||||
)
|
||||
}
|
@@ -6,6 +6,7 @@ import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import network.loki.messenger.libsession_util.util.ExpiryMode
|
||||
import network.loki.messenger.libsession_util.util.Sodium
|
||||
import network.loki.messenger.libsession_util.util.afterSend
|
||||
import org.session.libsession.avatars.AvatarHelper
|
||||
import org.session.libsession.database.userAuth
|
||||
import org.session.libsession.messaging.MessagingModuleConfiguration
|
||||
@@ -585,45 +586,31 @@ private fun MessageReceiver.handleGroupUpdated(message: GroupUpdated, closedGrou
|
||||
}
|
||||
|
||||
private fun handleDeleteMemberContent(message: GroupUpdated, closedGroup: AccountId) {
|
||||
val storage = MessagingModuleConfiguration.shared.storage
|
||||
val deleteMemberContent = message.inner.deleteMemberContent
|
||||
val adminSig = if (deleteMemberContent.hasAdminSignature()) deleteMemberContent.adminSignature.toByteArray()!! else byteArrayOf()
|
||||
|
||||
val memberIds = deleteMemberContent.memberSessionIdsList
|
||||
val hashes = deleteMemberContent.messageHashesList
|
||||
val threadId = storage.getThreadId(Address.fromSerialized(closedGroup.hexString))!!
|
||||
|
||||
val messageToValidate = buildDeleteMemberContentSignature(
|
||||
memberIds = memberIds.asSequence().map(::AccountId).asIterable(),
|
||||
messageHashes = hashes,
|
||||
timestamp = message.sentTimestamp!!
|
||||
)
|
||||
|
||||
if (hashes.isNotEmpty()) {
|
||||
// Delete all hashes conditionally
|
||||
if (storage.ensureMessageHashesAreSender(hashes.toSet(), message.sender!!, closedGroup.hexString)) {
|
||||
// ensure that all message hashes belong to user
|
||||
// storage delete
|
||||
storage.deleteMessagesByHash(threadId, hashes)
|
||||
} else {
|
||||
// otherwise assert a valid admin sig exists
|
||||
verifyAdminSignature(
|
||||
closedGroup,
|
||||
adminSig,
|
||||
messageToValidate
|
||||
)
|
||||
// storage delete
|
||||
storage.deleteMessagesByHash(threadId, hashes)
|
||||
}
|
||||
} else if (memberIds.isNotEmpty()) {
|
||||
// Delete all from member Ids, and require admin sig?
|
||||
val hasValidAdminSignature = adminSig.isNotEmpty() && runCatching {
|
||||
verifyAdminSignature(
|
||||
closedGroup,
|
||||
adminSig,
|
||||
messageToValidate
|
||||
buildDeleteMemberContentSignature(
|
||||
memberIds = deleteMemberContent.memberSessionIdsList.asSequence().map(::AccountId).asIterable(),
|
||||
messageHashes = deleteMemberContent.messageHashesList,
|
||||
timestamp = message.sentTimestamp!!,
|
||||
)
|
||||
)
|
||||
for (member in memberIds) {
|
||||
storage.deleteMessagesByUser(threadId, member)
|
||||
}.isSuccess
|
||||
|
||||
GlobalScope.launch {
|
||||
try {
|
||||
MessagingModuleConfiguration.shared.groupManagerV2.handleDeleteMemberContent(
|
||||
groupId = closedGroup,
|
||||
deleteMemberContent = deleteMemberContent,
|
||||
sender = AccountId(message.sender!!),
|
||||
senderIsVerifiedAdmin = hasValidAdminSignature
|
||||
)
|
||||
} catch (e: Exception) {
|
||||
Log.e("GroupUpdated", "Failed to handle delete member content", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -649,7 +636,7 @@ private fun handleMemberLeft(message: GroupUpdated, closedGroup: AccountId) {
|
||||
}
|
||||
|
||||
private fun handleMemberLeftNotification(message: GroupUpdated, closedGroup: AccountId) {
|
||||
MessagingModuleConfiguration.shared.storage.handleMemberLeftNotification(message, closedGroup)
|
||||
MessagingModuleConfiguration.shared.storage.insertGroupInfoChange(message, closedGroup)
|
||||
}
|
||||
|
||||
private fun handleGroupInfoChange(message: GroupUpdated, closedGroup: AccountId) {
|
||||
|
Reference in New Issue
Block a user