Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: wipe conversation after member leave event [WPB-16204] 🍒 #3302

Merged
merged 3 commits into from
Feb 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ import com.wire.kalium.common.error.wrapNullableFlowStorageRequest
import com.wire.kalium.common.error.wrapStorageRequest
import com.wire.kalium.network.api.authenticated.conversation.AddConversationMembersRequest
import com.wire.kalium.network.api.authenticated.conversation.AddServiceRequest
import com.wire.kalium.network.api.base.authenticated.conversation.ConversationApi
import com.wire.kalium.network.api.authenticated.conversation.ConversationMemberAddedResponse
import com.wire.kalium.network.api.authenticated.conversation.ConversationMemberRemovedResponse
import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse
import com.wire.kalium.network.api.authenticated.conversation.model.ConversationCodeInfo
import com.wire.kalium.network.api.authenticated.notification.EventContentDTO
import com.wire.kalium.network.api.base.authenticated.conversation.ConversationApi
import com.wire.kalium.network.api.model.ServiceAddedResponse
import com.wire.kalium.network.exceptions.KaliumException
import com.wire.kalium.network.exceptions.isConversationHasNoCode
Expand Down Expand Up @@ -493,13 +493,8 @@ internal class ConversationGroupRepositoryImpl(
is ConversationEntity.ProtocolInfo.Proteus ->
deleteMemberFromCloudAndStorage(userId, conversationId)

is ConversationEntity.ProtocolInfo.Mixed ->
deleteMemberFromCloudAndStorage(userId, conversationId)
.flatMap { deleteMemberFromMlsGroup(userId, conversationId, protocol) }

is ConversationEntity.ProtocolInfo.MLS -> {
is ConversationEntity.ProtocolInfo.MLSCapable ->
deleteMemberFromMlsGroup(userId, conversationId, protocol)
}
}
}

Expand Down Expand Up @@ -547,15 +542,24 @@ internal class ConversationGroupRepositoryImpl(
userId: UserId,
conversationId: ConversationId,
protocol: ConversationEntity.ProtocolInfo.MLSCapable
) =
if (userId == selfUserId) {
) = when (protocol) {
is ConversationEntity.ProtocolInfo.MLS -> {
if (userId == selfUserId) {
deleteMemberFromCloudAndStorage(userId, conversationId).flatMap {
mlsConversationRepository.leaveGroup(GroupID(protocol.groupId))
}
} else {
// when removing a member from an MLS group, don't need to call the api
mlsConversationRepository.removeMembersFromMLSGroup(GroupID(protocol.groupId), listOf(userId))
}
}

is ConversationEntity.ProtocolInfo.Mixed -> {
deleteMemberFromCloudAndStorage(userId, conversationId).flatMap {
mlsConversationRepository.leaveGroup(GroupID(protocol.groupId))
mlsConversationRepository.removeMembersFromMLSGroup(GroupID(protocol.groupId), listOf(userId))
}
} else {
// when removing a member from an MLS group, don't need to call the api
mlsConversationRepository.removeMembersFromMLSGroup(GroupID(protocol.groupId), listOf(userId))
}
}

private suspend fun deleteMemberFromCloudAndStorage(userId: UserId, conversationId: ConversationId) =
wrapApiRequest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,15 @@

package com.wire.kalium.logic.feature

import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.common.error.wrapStorageNullableRequest
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.isRight
import com.wire.kalium.common.functional.map
import com.wire.kalium.common.functional.onSuccess
import com.wire.kalium.common.logger.kaliumLogger
import com.wire.kalium.logger.KaliumLogger
import com.wire.kalium.logger.obfuscateId
import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.logic.GlobalKaliumScope
import com.wire.kalium.logic.cache.MLSSelfConversationIdProvider
import com.wire.kalium.logic.cache.MLSSelfConversationIdProviderImpl
Expand Down Expand Up @@ -354,11 +360,6 @@ import com.wire.kalium.logic.feature.user.webSocketStatus.PersistPersistentWebSo
import com.wire.kalium.logic.featureFlags.FeatureSupport
import com.wire.kalium.logic.featureFlags.FeatureSupportImpl
import com.wire.kalium.logic.featureFlags.KaliumConfigs
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.isRight
import com.wire.kalium.common.functional.map
import com.wire.kalium.common.functional.onSuccess
import com.wire.kalium.common.logger.kaliumLogger
import com.wire.kalium.logic.network.ApiMigrationManager
import com.wire.kalium.logic.network.ApiMigrationV3
import com.wire.kalium.logic.network.SessionManagerImpl
Expand Down Expand Up @@ -452,7 +453,6 @@ import com.wire.kalium.logic.sync.slow.SlowSyncWorkerImpl
import com.wire.kalium.logic.sync.slow.migration.SyncMigrationStepsProvider
import com.wire.kalium.logic.sync.slow.migration.SyncMigrationStepsProviderImpl
import com.wire.kalium.logic.util.MessageContentEncoder
import com.wire.kalium.common.error.wrapStorageNullableRequest
import com.wire.kalium.network.NetworkStateObserver
import com.wire.kalium.network.networkContainer.AuthenticatedNetworkContainer
import com.wire.kalium.network.session.SessionManager
Expand Down Expand Up @@ -1448,6 +1448,8 @@ class UserSessionScope internal constructor(
updateConversationClientsForCurrentCall = updateConversationClientsForCurrentCall,
legalHoldHandler = legalHoldHandler,
selfTeamIdProvider = selfTeamId,
mlsClientProvider = mlsClientProvider,
conversationDAO = userStorage.database.conversationDAO,
selfUserId = userId
)
private val memberChangeHandler: MemberChangeEventHandler
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,17 @@
package com.wire.kalium.logic.sync.receiver.conversation

import com.wire.kalium.common.error.CoreFailure
import com.wire.kalium.common.error.wrapMLSRequest
import com.wire.kalium.common.error.wrapStorageRequest
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.flatMap
import com.wire.kalium.common.functional.getOrElse
import com.wire.kalium.common.functional.getOrNull
import com.wire.kalium.common.functional.map
import com.wire.kalium.common.functional.onFailure
import com.wire.kalium.common.functional.onSuccess
import com.wire.kalium.common.logger.kaliumLogger
import com.wire.kalium.logic.data.client.MLSClientProvider
import com.wire.kalium.logic.data.conversation.ConversationRepository
import com.wire.kalium.logic.data.event.Event
import com.wire.kalium.logic.data.event.MemberLeaveReason
Expand All @@ -31,16 +42,10 @@ import com.wire.kalium.logic.data.message.PersistMessageUseCase
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.data.user.UserRepository
import com.wire.kalium.logic.feature.call.usecase.UpdateConversationClientsForCurrentCallUseCase
import com.wire.kalium.common.functional.Either
import com.wire.kalium.common.functional.flatMap
import com.wire.kalium.common.functional.getOrElse
import com.wire.kalium.common.functional.getOrNull
import com.wire.kalium.common.functional.onFailure
import com.wire.kalium.common.functional.onSuccess
import com.wire.kalium.common.logger.kaliumLogger
import com.wire.kalium.logic.sync.receiver.handler.legalhold.LegalHoldHandler
import com.wire.kalium.logic.util.createEventProcessingLogger
import com.wire.kalium.common.error.wrapStorageRequest
import com.wire.kalium.persistence.dao.conversation.ConversationDAO
import com.wire.kalium.persistence.dao.conversation.ConversationEntity
import com.wire.kalium.persistence.dao.member.MemberDAO

interface MemberLeaveEventHandler {
Expand All @@ -53,6 +58,8 @@ internal class MemberLeaveEventHandlerImpl(
private val userRepository: UserRepository,
private val conversationRepository: ConversationRepository,
private val persistMessage: PersistMessageUseCase,
private val mlsClientProvider: MLSClientProvider,
private val conversationDAO: ConversationDAO, // TODO: refactor to not have DAO here
private val updateConversationClientsForCurrentCall: Lazy<UpdateConversationClientsForCurrentCallUseCase>,
private val legalHoldHandler: LegalHoldHandler,
private val selfTeamIdProvider: SelfTeamIdProvider,
Expand Down Expand Up @@ -123,17 +130,6 @@ internal class MemberLeaveEventHandlerImpl(
}
}

private suspend fun deleteMembers(
userIDList: List<UserId>,
conversationID: ConversationId
): Either<CoreFailure, Long> =
wrapStorageRequest {
memberDAO.deleteMembersByQualifiedID(
userIDList.map { it.toDao() },
conversationID.toDao()
)
}

private suspend fun deleteConversationIfNeeded(event: Event.Conversation.MemberLeave) {
val isSelfUserLeftConversation = event.removedList == listOf(selfUserId) && event.reason == MemberLeaveReason.Left
if (!isSelfUserLeftConversation) return
Expand All @@ -145,4 +141,33 @@ internal class MemberLeaveEventHandlerImpl(
conversationRepository.deleteConversation(event.conversationId)
conversationRepository.removeConversationFromDeleteQueue(event.conversationId)
}

private suspend fun deleteMembers(
userIDList: List<UserId>,
conversationID: ConversationId
): Either<CoreFailure, Long> =
wrapStorageRequest { conversationDAO.getConversationProtocolInfo(conversationID.toDao()) }
.onSuccess { protocol ->
when (protocol) {
is ConversationEntity.ProtocolInfo.MLSCapable -> {
if (userIDList.contains(selfUserId)) {
mlsClientProvider.getMLSClient().map { mlsClient ->
wrapMLSRequest {
mlsClient.wipeConversation(protocol.groupId)
}
}
}
}

ConversationEntity.ProtocolInfo.Proteus -> {}
}
}
.flatMap {
wrapStorageRequest {
memberDAO.deleteMembersByQualifiedID(
userIDList.map { it.toDao() },
conversationID.toDao()
)
}
}
}
Loading
Loading