Skip to content

Commit

Permalink
fix: wipe conversation after member leave event [WPB-16204] 🍒 (#3302)
Browse files Browse the repository at this point in the history
* Commit with unresolved merge conflicts

* fix: resolve merge conflicts

* fix: imports

---------

Co-authored-by: Jakub Żerko <[email protected]>
  • Loading branch information
github-actions[bot] and Garzas authored Feb 21, 2025
1 parent 7c462ea commit 56a663f
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 41 deletions.
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

0 comments on commit 56a663f

Please sign in to comment.