From 40e523ecd21b553d481a82a3864a9a4866bd701b Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Fri, 13 Dec 2024 15:48:13 +0200 Subject: [PATCH] fix: Sending of message in empty MLS group --- .../conversation/MLSConversationRepository.kt | 69 +++++++++---------- .../MLSConversationRepositoryTest.kt | 2 +- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt index c6e8c608c27..c5363221deb 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepository.kt @@ -481,7 +481,7 @@ internal class MLSConversationDataSource( val keyPackages = result.successfullyFetchedKeyPackages val clientKeyPackageList = keyPackages.map { it.keyPackage.decodeBase64Bytes() } wrapMLSRequest { - if (userIdList.isEmpty()) { + if (clientKeyPackageList.isEmpty()) { // We are creating a group with only our self client which technically // doesn't need be added with a commit, but our backend API requires one, // so we create a commit by updating our key material. @@ -566,6 +566,7 @@ internal class MLSConversationDataSource( keys.flatMap { externalSenders -> establishMLSGroup( + mlsClient = mlsClient, groupID = groupID, members = members, externalSenders = externalSenders, @@ -583,6 +584,7 @@ internal class MLSConversationDataSource( conversationDAO.getMLSGroupIdByConversationId(parentId.toDao())?.let { parentGroupId -> val externalSenderKey = mlsClient.getExternalSenders(GroupID(parentGroupId).toCrypto()) establishMLSGroup( + mlsClient = mlsClient, groupID = groupID, members = emptyList(), externalSenders = externalSenderKey.value, @@ -593,45 +595,44 @@ internal class MLSConversationDataSource( } private suspend fun establishMLSGroup( + mlsClient: MLSClient, groupID: GroupID, members: List, externalSenders: ByteArray, allowPartialMemberList: Boolean = false, ): Either = withContext(serialDispatcher) { kaliumLogger.d("establish MLS group: $groupID") - mlsClientProvider.getMLSClient().flatMap { mlsClient -> - wrapMLSRequest { - mlsClient.createConversation( - idMapper.toCryptoModel(groupID), - externalSenders - ) - }.flatMapLeft { - if (it is MLSFailure.ConversationAlreadyExists) { - Either.Right(Unit) - } else { - Either.Left(it) - } - }.flatMap { - internalAddMemberToMLSGroup( - groupID = groupID, - userIdList = members, - retryOnStaleMessage = false, - allowPartialMemberList = allowPartialMemberList, - cipherSuite = CipherSuite.fromTag(mlsClient.getDefaultCipherSuite()) - ).onFailure { - wrapMLSRequest { - mlsClient.wipeConversation(groupID.toCrypto()) - } + wrapMLSRequest { + mlsClient.createConversation( + idMapper.toCryptoModel(groupID), + externalSenders + ) + }.flatMapLeft { + if (it is MLSFailure.ConversationAlreadyExists) { + Either.Right(Unit) + } else { + Either.Left(it) + } + }.flatMap { + internalAddMemberToMLSGroup( + groupID = groupID, + userIdList = members, + retryOnStaleMessage = false, + allowPartialMemberList = allowPartialMemberList, + cipherSuite = CipherSuite.fromTag(mlsClient.getDefaultCipherSuite()) + ).onFailure { + wrapMLSRequest { + mlsClient.wipeConversation(groupID.toCrypto()) } - }.flatMap { additionResult -> - wrapStorageRequest { - conversationDAO.updateMlsGroupStateAndCipherSuite( - ConversationEntity.GroupState.ESTABLISHED, - ConversationEntity.CipherSuite.fromTag(mlsClient.getDefaultCipherSuite().toInt()), - idMapper.toGroupIDEntity(groupID) - ) - }.map { additionResult } } + }.flatMap { additionResult -> + wrapStorageRequest { + conversationDAO.updateMlsGroupStateAndCipherSuite( + ConversationEntity.GroupState.ESTABLISHED, + ConversationEntity.CipherSuite.fromTag(mlsClient.getDefaultCipherSuite().toInt()), + idMapper.toGroupIDEntity(groupID) + ) + }.map { additionResult } } } @@ -655,9 +656,7 @@ internal class MLSConversationDataSource( kaliumLogger.w("enrollment for existing client: upload new keypackages and drop old ones") keyPackageRepository .replaceKeyPackages(clientId, rotateBundle.newKeyPackages, CipherSuite.fromTag(mlsClient.getDefaultCipherSuite())) - .flatMapLeft { - return E2EIFailure.RotationAndMigration(it).left() - } + .flatMapLeft { E2EIFailure.RotationAndMigration(it).left() } } kaliumLogger.w("send migration commits after key rotations") kaliumLogger.w("rotate bundles: ${rotateBundle.commits.size}") diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt index dac38b1d1cf..d4e7eca113f 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/MLSConversationRepositoryTest.kt @@ -1512,7 +1512,7 @@ class MLSConversationRepositoryTest { val (arrangement, mlsConversationRepository) = Arrangement(testKaliumDispatcher) .withCommitPendingProposalsReturningNothing() - .withClaimKeyPackagesSuccessful() + .withClaimKeyPackagesSuccessful(emptyList()) // empty cause members is empty in case of establishMLSSubConversationGroup .withGetMLSClientSuccessful() .withGetMLSGroupIdByConversationIdReturns(Arrangement.GROUP_ID.value) .withGetExternalSenderKeySuccessful()