From c4fad3664983d81b6c5ac2496aca689f87bf75b0 Mon Sep 17 00:00:00 2001 From: Mojtaba Chenani Date: Wed, 18 Sep 2024 12:22:48 +0200 Subject: [PATCH 1/8] Commit with unresolved merge conflicts --- .../ConversationGroupRepository.kt | 4 +- .../data/conversation/ConversationMapper.kt | 19 ++++ .../conversation/MLSConversationRepository.kt | 17 ++-- .../mlspublickeys/MLSPublicKeysRepository.kt | 18 ++-- .../ConversationGroupRepositoryTest.kt | 14 +++ .../MLSConversationRepositoryTest.kt | 95 ++++++++++++++++++- .../conversation/ConversationResponse.kt | 23 ++++- .../network/api/model/ApiModelMapper.kt | 30 ++++++ .../api/v6/authenticated/ConversationApiV6.kt | 23 ++++- 9 files changed, 221 insertions(+), 22 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepository.kt index d82f0d73b01..4d6e92b4413 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepository.kt @@ -154,6 +154,7 @@ internal class ConversationGroupRepositoryImpl( val conversationEntity = conversationMapper.fromApiModelToDaoModel( conversationResponse, mlsGroupState = ConversationEntity.GroupState.PENDING_CREATION, selfTeamId ) + val mlsPublicKeys = conversationMapper.fromApiModel(conversationResponse.publicKeys) val protocol = protocolInfoMapper.fromEntity(conversationEntity.protocolInfo) return wrapStorageRequest { @@ -166,7 +167,8 @@ internal class ConversationGroupRepositoryImpl( is Conversation.ProtocolInfo.MLSCapable -> mlsConversationRepository.establishMLSGroup( groupID = protocol.groupId, members = usersList + selfUserId, - allowSkippingUsersWithoutKeyPackages = true + publicKeys = mlsPublicKeys, + allowSkippingUsersWithoutKeyPackages = true, ).map { it.notAddedUsers } } }.flatMap { protocolSpecificAdditionFailures -> diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt index 1fc0dce8fb1..9f479974aa9 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt @@ -28,6 +28,7 @@ import com.wire.kalium.logic.data.id.toApi import com.wire.kalium.logic.data.id.toDao import com.wire.kalium.logic.data.id.toModel import com.wire.kalium.logic.data.message.MessagePreview +import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys import com.wire.kalium.logic.data.user.AvailabilityStatusMapper import com.wire.kalium.logic.data.user.BotService import com.wire.kalium.logic.data.user.Connection @@ -36,6 +37,7 @@ import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.data.user.toModel import com.wire.kalium.logic.data.user.type.DomainUserTypeMapper import com.wire.kalium.logic.di.MapperProvider +<<<<<<< HEAD import com.wire.kalium.network.api.authenticated.conversation.ConvProtocol import com.wire.kalium.network.api.authenticated.conversation.ConvTeamInfo import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse @@ -43,6 +45,16 @@ import com.wire.kalium.network.api.authenticated.conversation.CreateConversation import com.wire.kalium.network.api.authenticated.conversation.ReceiptMode import com.wire.kalium.network.api.model.ConversationAccessDTO import com.wire.kalium.network.api.model.ConversationAccessRoleDTO +======= +import com.wire.kalium.network.api.base.authenticated.conversation.ConvProtocol +import com.wire.kalium.network.api.base.authenticated.conversation.ConvTeamInfo +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse +import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequest +import com.wire.kalium.network.api.base.authenticated.conversation.ReceiptMode +import com.wire.kalium.network.api.base.authenticated.serverpublickey.MLSPublicKeysDTO +import com.wire.kalium.network.api.base.model.ConversationAccessDTO +import com.wire.kalium.network.api.base.model.ConversationAccessRoleDTO +>>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)) import com.wire.kalium.persistence.dao.conversation.ConversationEntity import com.wire.kalium.persistence.dao.conversation.ConversationEntity.GroupState import com.wire.kalium.persistence.dao.conversation.ConversationEntity.Protocol @@ -59,6 +71,7 @@ import kotlin.time.toDuration interface ConversationMapper { fun fromApiModelToDaoModel(apiModel: ConversationResponse, mlsGroupState: GroupState?, selfUserTeamId: TeamId?): ConversationEntity + fun fromApiModel(mlsPublicKeysDTO: MLSPublicKeysDTO?): MLSPublicKeys? fun fromDaoModel(daoModel: ConversationViewEntity): Conversation fun fromDaoModel(daoModel: ConversationEntity): Conversation fun fromDaoModelToDetails( @@ -136,6 +149,12 @@ internal class ConversationMapperImpl( legalHoldStatus = ConversationEntity.LegalHoldStatus.DISABLED ) + override fun fromApiModel(mlsPublicKeysDTO: MLSPublicKeysDTO?) = mlsPublicKeysDTO?.let { + MLSPublicKeys( + removal = mlsPublicKeysDTO.removal + ) + } + override fun fromDaoModel(daoModel: ConversationViewEntity): Conversation = with(daoModel) { val lastReadDateEntity = if (type == ConversationEntity.Type.CONNECTION_PENDING) Instant.UNIX_FIRST_DATE else lastReadDate 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 058a4736ce7..d3e2e458fbc 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 @@ -45,7 +45,9 @@ import com.wire.kalium.logic.data.id.toModel import com.wire.kalium.logic.data.keypackage.KeyPackageLimitsProvider import com.wire.kalium.logic.data.keypackage.KeyPackageRepository import com.wire.kalium.logic.data.mls.CipherSuite +import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeys import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeysRepository +import com.wire.kalium.logic.data.mlspublickeys.getRemovalKey import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.di.MapperProvider import com.wire.kalium.logic.data.e2ei.RevocationListChecker @@ -123,6 +125,7 @@ interface MLSConversationRepository { suspend fun establishMLSGroup( groupID: GroupID, members: List, + publicKeys: MLSPublicKeys? = null, allowSkippingUsersWithoutKeyPackages: Boolean = false ): Either @@ -554,16 +557,18 @@ internal class MLSConversationDataSource( override suspend fun establishMLSGroup( groupID: GroupID, members: List, - allowSkippingUsersWithoutKeyPackages: Boolean, + publicKeys: MLSPublicKeys?, + allowSkippingUsersWithoutKeyPackages: Boolean ): Either = withContext(serialDispatcher) { - mlsClientProvider.getMLSClient().flatMap { - mlsPublicKeysRepository.getKeyForCipherSuite( - CipherSuite.fromTag(it.getDefaultCipherSuite()) - ).flatMap { key -> + mlsClientProvider.getMLSClient().flatMap { mlsClient -> + val cipherSuite = CipherSuite.fromTag(mlsClient.getDefaultCipherSuite()) + val keys = publicKeys?.getRemovalKey(cipherSuite) ?: mlsPublicKeysRepository.getKeyForCipherSuite(cipherSuite) + + keys.flatMap { externalSenders -> establishMLSGroup( groupID = groupID, members = members, - externalSenders = key, + externalSenders = externalSenders, allowPartialMemberList = allowSkippingUsersWithoutKeyPackages ) } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt index 48709255f9b..180c506a838 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/mlspublickeys/MLSPublicKeysRepository.kt @@ -34,6 +34,15 @@ data class MLSPublicKeys( val removal: Map? ) +fun MLSPublicKeys.getRemovalKey(cipherSuite: CipherSuite): Either { + val mlsPublicKeysMapper: MLSPublicKeysMapper = MapperProvider.mlsPublicKeyMapper() + val keySignature = mlsPublicKeysMapper.fromCipherSuite(cipherSuite) + val key = this.removal?.let { removalKeys -> + removalKeys[keySignature.value] + } ?: return Either.Left(MLSFailure.Generic(IllegalStateException("No key found for cipher suite $cipherSuite"))) + return key.decodeBase64Bytes().right() +} + interface MLSPublicKeysRepository { suspend fun fetchKeys(): Either suspend fun getKeys(): Either @@ -42,7 +51,6 @@ interface MLSPublicKeysRepository { class MLSPublicKeysRepositoryImpl( private val mlsPublicKeyApi: MLSPublicKeyApi, - private val mlsPublicKeysMapper: MLSPublicKeysMapper = MapperProvider.mlsPublicKeyMapper() ) : MLSPublicKeysRepository { // TODO: make it thread safe @@ -60,14 +68,8 @@ class MLSPublicKeysRepositoryImpl( } override suspend fun getKeyForCipherSuite(cipherSuite: CipherSuite): Either { - return getKeys().flatMap { serverPublicKeys -> - val keySignature = mlsPublicKeysMapper.fromCipherSuite(cipherSuite) - val key = serverPublicKeys.removal?.let { removalKeys -> - removalKeys[keySignature.value] - } ?: return Either.Left(MLSFailure.Generic(IllegalStateException("No key found for cipher suite $cipherSuite"))) - key.decodeBase64Bytes().right() + serverPublicKeys.getRemovalKey(cipherSuite) } } - } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt index 3b71181fef7..ec8517003be 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt @@ -421,9 +421,16 @@ class ConversationGroupRepositoryTest { conversationDAO.insertConversation(any()) }.wasInvoked(once) +<<<<<<< HEAD coVerify { mlsConversationRepository.establishMLSGroup(any(), any(), eq(true)) }.wasInvoked(once) +======= + verify(mlsConversationRepository) + .suspendFunction(mlsConversationRepository::establishMLSGroup) + .with(anything(), anything(), anything(), eq(true)) + .wasInvoked(once) +>>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)) coVerify { newConversationMembersRepository.persistMembersAdditionToTheConversation(any(), any()) @@ -464,9 +471,16 @@ class ConversationGroupRepositoryTest { conversationDAO.insertConversation(any()) }.wasInvoked(once) +<<<<<<< HEAD coVerify { mlsConversationRepository.establishMLSGroup(any(), any(), eq(true)) }.wasInvoked(once) +======= + verify(mlsConversationRepository) + .suspendFunction(mlsConversationRepository::establishMLSGroup) + .with(anything(), anything(), anything(), eq(true)) + .wasInvoked(once) +>>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)) coVerify { newConversationMembersRepository.persistMembersAdditionToTheConversation(any(), any()) 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 37e358d4d5a..c549d150075 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 @@ -40,6 +40,7 @@ import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arr import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.CRYPTO_CLIENT_ID import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.E2EI_CONVERSATION_CLIENT_INFO_ENTITY import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.KEY_PACKAGE +import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.MLS_PUBLIC_KEY import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.ROTATE_BUNDLE import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.TEST_FAILURE import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.WIRE_IDENTITY @@ -168,7 +169,7 @@ class MLSConversationRepositoryTest { .withSendCommitBundleSuccessful() .arrange() - val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1)) + val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = null) result.shouldSucceed() coVerify { @@ -280,6 +281,90 @@ class MLSConversationRepositoryTest { }.wasNotInvoked() } + @Test + fun givenPublicKeysIsNotNull_whenCallingEstablishMLSGroup_ThenGetPublicKeysRepositoryNotCalled() = runTest { + val (arrangement, mlsConversationRepository) = Arrangement() + .withGetDefaultCipherSuite(CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519) + .withCommitPendingProposalsReturningNothing() + .withClaimKeyPackagesSuccessful() + .withGetMLSClientSuccessful() + .withKeyForCipherSuite() + .withAddMLSMemberSuccessful() + .withSendCommitBundleSuccessful() + .arrange() + + val result = + mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = MLS_PUBLIC_KEY) + result.shouldSucceed() + + verify(arrangement.mlsClient) + .suspendFunction(arrangement.mlsClient::createConversation) + .with(eq(Arrangement.RAW_GROUP_ID), anything()) + .wasInvoked(once) + + verify(arrangement.mlsClient) + .suspendFunction(arrangement.mlsClient::addMember) + .with(eq(Arrangement.RAW_GROUP_ID), anything()) + .wasInvoked(once) + + verify(arrangement.mlsMessageApi) + .suspendFunction(arrangement.mlsMessageApi::sendCommitBundle) + .with(anyInstanceOf(MLSMessageApi.CommitBundle::class)) + .wasInvoked(once) + + verify(arrangement.mlsClient) + .function(arrangement.mlsClient::commitAccepted) + .with(eq(Arrangement.RAW_GROUP_ID)) + .wasInvoked(once) + + verify(arrangement.mlsPublicKeysRepository) + .function(arrangement.mlsPublicKeysRepository::getKeyForCipherSuite) + .with(anything()) + .wasNotInvoked() + } + + @Test + fun givenPublicKeysIsNull_whenCallingEstablishMLSGroup_ThenGetPublicKeysRepositoryIsCalled() = runTest { + val (arrangement, mlsConversationRepository) = Arrangement() + .withGetDefaultCipherSuite(CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519) + .withCommitPendingProposalsReturningNothing() + .withClaimKeyPackagesSuccessful() + .withGetMLSClientSuccessful() + .withKeyForCipherSuite() + .withAddMLSMemberSuccessful() + .withSendCommitBundleSuccessful() + .arrange() + + val result = + mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = null) + result.shouldSucceed() + + verify(arrangement.mlsClient) + .suspendFunction(arrangement.mlsClient::createConversation) + .with(eq(Arrangement.RAW_GROUP_ID), anything()) + .wasInvoked(once) + + verify(arrangement.mlsClient) + .suspendFunction(arrangement.mlsClient::addMember) + .with(eq(Arrangement.RAW_GROUP_ID), anything()) + .wasInvoked(once) + + verify(arrangement.mlsMessageApi) + .suspendFunction(arrangement.mlsMessageApi::sendCommitBundle) + .with(anyInstanceOf(MLSMessageApi.CommitBundle::class)) + .wasInvoked(once) + + verify(arrangement.mlsClient) + .function(arrangement.mlsClient::commitAccepted) + .with(eq(Arrangement.RAW_GROUP_ID)) + .wasInvoked(once) + + verify(arrangement.mlsPublicKeysRepository) + .function(arrangement.mlsPublicKeysRepository::getKeyForCipherSuite) + .with(anything()) + .wasInvoked(once) + } + @Test fun givenNewCrlDistributionPoints_whenEstablishingMLSGroup_thenCheckRevocationList() = runTest { val (arrangement, mlsConversationRepository) = Arrangement(testKaliumDispatcher) @@ -329,7 +414,7 @@ class MLSConversationRepositoryTest { .withWaitUntilLiveSuccessful() .arrange() - val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1)) + val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = null) result.shouldSucceed() coVerify { @@ -357,7 +442,7 @@ class MLSConversationRepositoryTest { .withSendCommitBundleFailing(Arrangement.MLS_STALE_MESSAGE_ERROR) .arrange() - val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1)) + val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = null) result.shouldFail() coVerify { @@ -385,7 +470,7 @@ class MLSConversationRepositoryTest { .withSendCommitBundleSuccessful() .arrange() - val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1)) + val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = null) result.shouldSucceed() coVerify { @@ -410,7 +495,7 @@ class MLSConversationRepositoryTest { .withSendCommitBundleSuccessful() .arrange() - val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, emptyList()) + val result = mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, emptyList(), publicKeys = null) result.shouldSucceed() coVerify { diff --git a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt index f296b9614c4..9f81642dde0 100644 --- a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt +++ b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt @@ -18,12 +18,22 @@ package com.wire.kalium.network.api.authenticated.conversation +<<<<<<< HEAD:network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt import com.wire.kalium.network.api.model.ConversationAccessDTO import com.wire.kalium.network.api.model.ConversationAccessRoleDTO import com.wire.kalium.network.api.model.ConversationId import com.wire.kalium.network.api.model.SubconversationId import com.wire.kalium.network.api.model.TeamId import com.wire.kalium.network.api.model.UserId +======= +import com.wire.kalium.network.api.base.authenticated.serverpublickey.MLSPublicKeysDTO +import com.wire.kalium.network.api.base.model.ConversationAccessDTO +import com.wire.kalium.network.api.base.model.ConversationAccessRoleDTO +import com.wire.kalium.network.api.base.model.ConversationId +import com.wire.kalium.network.api.base.model.SubconversationId +import com.wire.kalium.network.api.base.model.TeamId +import com.wire.kalium.network.api.base.model.UserId +>>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)):network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/conversation/ConversationResponse.kt import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName @@ -86,7 +96,10 @@ data class ConversationResponse( val accessRole: Set?, @SerialName("receipt_mode") - val receiptMode: ReceiptMode + val receiptMode: ReceiptMode, + + @SerialName("public_keys") + val publicKeys: MLSPublicKeysDTO? = null ) { @Suppress("MagicNumber") @@ -155,6 +168,14 @@ data class ConversationResponseV3( val receiptMode: ReceiptMode, ) +@Serializable +data class ConversationResponseV6( + @SerialName("conversation") + val conversation: ConversationResponseV3, + @SerialName("public_keys") + val publicKeys: MLSPublicKeysDTO +) + @Serializable data class ConversationMembersResponse( @SerialName("self") diff --git a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt index 330f113e34d..70e5ed65ff5 100644 --- a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt +++ b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt @@ -18,12 +18,22 @@ package com.wire.kalium.network.api.model +<<<<<<< HEAD:network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse import com.wire.kalium.network.api.authenticated.conversation.ConversationResponseV3 import com.wire.kalium.network.api.authenticated.conversation.CreateConversationRequest import com.wire.kalium.network.api.authenticated.conversation.CreateConversationRequestV3 import com.wire.kalium.network.api.authenticated.conversation.UpdateConversationAccessRequest import com.wire.kalium.network.api.authenticated.conversation.UpdateConversationAccessRequestV3 +======= +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV3 +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV6 +import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequest +import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequestV3 +import com.wire.kalium.network.api.base.authenticated.conversation.UpdateConversationAccessRequest +import com.wire.kalium.network.api.base.authenticated.conversation.UpdateConversationAccessRequestV3 +>>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)):network/src/commonMain/kotlin/com/wire/kalium/network/api/base/model/ApiModelMapper.kt /** * Mapping between the base API model and the versioned API models. @@ -33,6 +43,7 @@ interface ApiModelMapper { fun toApiV3(request: CreateConversationRequest): CreateConversationRequestV3 fun toApiV3(request: UpdateConversationAccessRequest): UpdateConversationAccessRequestV3 fun fromApiV3(response: ConversationResponseV3): ConversationResponse + fun fromApiV6(response: ConversationResponseV6): ConversationResponse } class ApiModelMapperImpl : ApiModelMapper { @@ -76,4 +87,23 @@ class ApiModelMapperImpl : ApiModelMapper { response.receiptMode ) + override fun fromApiV6(response: ConversationResponseV6): ConversationResponse = + ConversationResponse( + creator = response.conversation.creator, + members = response.conversation.members, + name = response.conversation.name, + id = response.conversation.id, + groupId = response.conversation.groupId, + epoch = response.conversation.epoch, + type = response.conversation.type, + messageTimer = response.conversation.messageTimer, + teamId = response.conversation.teamId, + protocol = response.conversation.protocol, + lastEventTime = response.conversation.lastEventTime, + mlsCipherSuiteTag = response.conversation.mlsCipherSuiteTag, + access = response.conversation.access, + accessRole = response.conversation.accessRole, + receiptMode = response.conversation.receiptMode, + publicKeys = response.publicKeys + ) } diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt index bcdaa50c0a4..69969799443 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt @@ -19,8 +19,29 @@ package com.wire.kalium.network.api.v6.authenticated import com.wire.kalium.network.AuthenticatedNetworkClient +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse +import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV6 +import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequest +import com.wire.kalium.network.api.base.model.ApiModelMapper +import com.wire.kalium.network.api.base.model.ApiModelMapperImpl import com.wire.kalium.network.api.v5.authenticated.ConversationApiV5 +import com.wire.kalium.network.utils.NetworkResponse +import com.wire.kalium.network.utils.mapSuccess +import com.wire.kalium.network.utils.wrapKaliumResponse +import io.ktor.client.request.post +import io.ktor.client.request.setBody internal open class ConversationApiV6 internal constructor( authenticatedNetworkClient: AuthenticatedNetworkClient, -) : ConversationApiV5(authenticatedNetworkClient) + private val apiModelMapper: ApiModelMapper = ApiModelMapperImpl() +) : ConversationApiV5(authenticatedNetworkClient) { + override suspend fun createOne2OneConversation( + createConversationRequest: CreateConversationRequest + ): NetworkResponse = wrapKaliumResponse { + httpClient.post("$PATH_CONVERSATIONS/$PATH_ONE_2_ONE") { + setBody(apiModelMapper.toApiV3(createConversationRequest)) + } + }.mapSuccess { + apiModelMapper.fromApiV6(it) + } +} From c81a62d293411e53d8c5d5b4d6ec13a6eff51f80 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Wed, 25 Sep 2024 14:35:30 +0200 Subject: [PATCH 2/8] fix merge conflicts --- .../data/conversation/ConversationMapper.kt | 12 +----------- .../ConversationGroupRepositoryTest.kt | 18 ++---------------- .../conversation/ConversationResponse.kt | 11 +---------- .../kalium/network/api/model/ApiModelMapper.kt | 11 +---------- 4 files changed, 5 insertions(+), 47 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt index 9f479974aa9..2786c8704a7 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/conversation/ConversationMapper.kt @@ -37,24 +37,14 @@ import com.wire.kalium.logic.data.user.UserId import com.wire.kalium.logic.data.user.toModel import com.wire.kalium.logic.data.user.type.DomainUserTypeMapper import com.wire.kalium.logic.di.MapperProvider -<<<<<<< HEAD import com.wire.kalium.network.api.authenticated.conversation.ConvProtocol import com.wire.kalium.network.api.authenticated.conversation.ConvTeamInfo import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse import com.wire.kalium.network.api.authenticated.conversation.CreateConversationRequest import com.wire.kalium.network.api.authenticated.conversation.ReceiptMode +import com.wire.kalium.network.api.authenticated.serverpublickey.MLSPublicKeysDTO import com.wire.kalium.network.api.model.ConversationAccessDTO import com.wire.kalium.network.api.model.ConversationAccessRoleDTO -======= -import com.wire.kalium.network.api.base.authenticated.conversation.ConvProtocol -import com.wire.kalium.network.api.base.authenticated.conversation.ConvTeamInfo -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse -import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequest -import com.wire.kalium.network.api.base.authenticated.conversation.ReceiptMode -import com.wire.kalium.network.api.base.authenticated.serverpublickey.MLSPublicKeysDTO -import com.wire.kalium.network.api.base.model.ConversationAccessDTO -import com.wire.kalium.network.api.base.model.ConversationAccessRoleDTO ->>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)) import com.wire.kalium.persistence.dao.conversation.ConversationEntity import com.wire.kalium.persistence.dao.conversation.ConversationEntity.GroupState import com.wire.kalium.persistence.dao.conversation.ConversationEntity.Protocol diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt index ec8517003be..4b00b011bd9 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt @@ -421,16 +421,9 @@ class ConversationGroupRepositoryTest { conversationDAO.insertConversation(any()) }.wasInvoked(once) -<<<<<<< HEAD coVerify { - mlsConversationRepository.establishMLSGroup(any(), any(), eq(true)) + mlsConversationRepository.establishMLSGroup(any(), any(), any(), eq(true)) }.wasInvoked(once) -======= - verify(mlsConversationRepository) - .suspendFunction(mlsConversationRepository::establishMLSGroup) - .with(anything(), anything(), anything(), eq(true)) - .wasInvoked(once) ->>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)) coVerify { newConversationMembersRepository.persistMembersAdditionToTheConversation(any(), any()) @@ -471,16 +464,9 @@ class ConversationGroupRepositoryTest { conversationDAO.insertConversation(any()) }.wasInvoked(once) -<<<<<<< HEAD coVerify { - mlsConversationRepository.establishMLSGroup(any(), any(), eq(true)) + mlsConversationRepository.establishMLSGroup(any(), any(), any(), eq(true)) }.wasInvoked(once) -======= - verify(mlsConversationRepository) - .suspendFunction(mlsConversationRepository::establishMLSGroup) - .with(anything(), anything(), anything(), eq(true)) - .wasInvoked(once) ->>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)) coVerify { newConversationMembersRepository.persistMembersAdditionToTheConversation(any(), any()) diff --git a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt index 9f81642dde0..bebec817438 100644 --- a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt +++ b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt @@ -18,22 +18,13 @@ package com.wire.kalium.network.api.authenticated.conversation -<<<<<<< HEAD:network-model/src/commonMain/kotlin/com/wire/kalium/network/api/authenticated/conversation/ConversationResponse.kt +import com.wire.kalium.network.api.authenticated.serverpublickey.MLSPublicKeysDTO import com.wire.kalium.network.api.model.ConversationAccessDTO import com.wire.kalium.network.api.model.ConversationAccessRoleDTO import com.wire.kalium.network.api.model.ConversationId import com.wire.kalium.network.api.model.SubconversationId import com.wire.kalium.network.api.model.TeamId import com.wire.kalium.network.api.model.UserId -======= -import com.wire.kalium.network.api.base.authenticated.serverpublickey.MLSPublicKeysDTO -import com.wire.kalium.network.api.base.model.ConversationAccessDTO -import com.wire.kalium.network.api.base.model.ConversationAccessRoleDTO -import com.wire.kalium.network.api.base.model.ConversationId -import com.wire.kalium.network.api.base.model.SubconversationId -import com.wire.kalium.network.api.base.model.TeamId -import com.wire.kalium.network.api.base.model.UserId ->>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)):network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/conversation/ConversationResponse.kt import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.KSerializer import kotlinx.serialization.SerialName diff --git a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt index 70e5ed65ff5..46e7790bf67 100644 --- a/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt +++ b/network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt @@ -18,22 +18,13 @@ package com.wire.kalium.network.api.model -<<<<<<< HEAD:network-model/src/commonMain/kotlin/com/wire/kalium/network/api/model/ApiModelMapper.kt import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse import com.wire.kalium.network.api.authenticated.conversation.ConversationResponseV3 +import com.wire.kalium.network.api.authenticated.conversation.ConversationResponseV6 import com.wire.kalium.network.api.authenticated.conversation.CreateConversationRequest import com.wire.kalium.network.api.authenticated.conversation.CreateConversationRequestV3 import com.wire.kalium.network.api.authenticated.conversation.UpdateConversationAccessRequest import com.wire.kalium.network.api.authenticated.conversation.UpdateConversationAccessRequestV3 -======= -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV3 -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV6 -import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequest -import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequestV3 -import com.wire.kalium.network.api.base.authenticated.conversation.UpdateConversationAccessRequest -import com.wire.kalium.network.api.base.authenticated.conversation.UpdateConversationAccessRequestV3 ->>>>>>> 1b851495a0 (fix(mls): set removal-keys for 1on1 calls from conversation-response (#3009)):network/src/commonMain/kotlin/com/wire/kalium/network/api/base/model/ApiModelMapper.kt /** * Mapping between the base API model and the versioned API models. From 938ae5cb32fa2c045646afd46834b967fe426232 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 09:34:39 +0200 Subject: [PATCH 3/8] fix merge conflicts --- .../network/api/v6/authenticated/ConversationApiV6.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt index 69969799443..6a1cd4e8871 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/v6/authenticated/ConversationApiV6.kt @@ -19,11 +19,11 @@ package com.wire.kalium.network.api.v6.authenticated import com.wire.kalium.network.AuthenticatedNetworkClient -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponse -import com.wire.kalium.network.api.base.authenticated.conversation.ConversationResponseV6 -import com.wire.kalium.network.api.base.authenticated.conversation.CreateConversationRequest -import com.wire.kalium.network.api.base.model.ApiModelMapper -import com.wire.kalium.network.api.base.model.ApiModelMapperImpl +import com.wire.kalium.network.api.authenticated.conversation.ConversationResponse +import com.wire.kalium.network.api.authenticated.conversation.ConversationResponseV6 +import com.wire.kalium.network.api.authenticated.conversation.CreateConversationRequest +import com.wire.kalium.network.api.model.ApiModelMapper +import com.wire.kalium.network.api.model.ApiModelMapperImpl import com.wire.kalium.network.api.v5.authenticated.ConversationApiV5 import com.wire.kalium.network.utils.NetworkResponse import com.wire.kalium.network.utils.mapSuccess From 4e0ddfaeab3fd57e232ffc121c44b73401199545 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 10:03:28 +0200 Subject: [PATCH 4/8] fix merge conflicts --- .../MLSConversationRepositoryTest.kt | 91 +++++++++---------- 1 file changed, 43 insertions(+), 48 deletions(-) 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 c549d150075..d1f70b727b6 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 @@ -99,6 +99,7 @@ import io.mockative.matches import io.mockative.mock import io.mockative.once import io.mockative.twice +import io.mockative.verify import kotlinx.coroutines.async import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.first @@ -297,30 +298,29 @@ class MLSConversationRepositoryTest { mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = MLS_PUBLIC_KEY) result.shouldSucceed() - verify(arrangement.mlsClient) - .suspendFunction(arrangement.mlsClient::createConversation) - .with(eq(Arrangement.RAW_GROUP_ID), anything()) - .wasInvoked(once) - - verify(arrangement.mlsClient) - .suspendFunction(arrangement.mlsClient::addMember) - .with(eq(Arrangement.RAW_GROUP_ID), anything()) - .wasInvoked(once) - - verify(arrangement.mlsMessageApi) - .suspendFunction(arrangement.mlsMessageApi::sendCommitBundle) - .with(anyInstanceOf(MLSMessageApi.CommitBundle::class)) - .wasInvoked(once) - - verify(arrangement.mlsClient) - .function(arrangement.mlsClient::commitAccepted) - .with(eq(Arrangement.RAW_GROUP_ID)) - .wasInvoked(once) - - verify(arrangement.mlsPublicKeysRepository) - .function(arrangement.mlsPublicKeysRepository::getKeyForCipherSuite) - .with(anything()) - .wasNotInvoked() + coVerify { + arrangement.mlsClient.createConversation( + groupId = eq(Arrangement.RAW_GROUP_ID), + externalSenders = any()) + }.wasInvoked(once) + + coVerify { + arrangement.mlsClient.addMember( + groupId = eq(Arrangement.RAW_GROUP_ID), + membersKeyPackages = any()) + }.wasInvoked(once) + + coVerify { + arrangement.mlsMessageApi.sendCommitBundle(any()) + }.wasInvoked(once) + + coVerify { + arrangement.mlsClient.commitAccepted(eq(Arrangement.RAW_GROUP_ID)) + }.wasInvoked(once) + + coVerify { + arrangement.mlsPublicKeysRepository.getKeyForCipherSuite(any()) + }.wasNotInvoked() } @Test @@ -339,30 +339,25 @@ class MLSConversationRepositoryTest { mlsConversationRepository.establishMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_1), publicKeys = null) result.shouldSucceed() - verify(arrangement.mlsClient) - .suspendFunction(arrangement.mlsClient::createConversation) - .with(eq(Arrangement.RAW_GROUP_ID), anything()) - .wasInvoked(once) - - verify(arrangement.mlsClient) - .suspendFunction(arrangement.mlsClient::addMember) - .with(eq(Arrangement.RAW_GROUP_ID), anything()) - .wasInvoked(once) - - verify(arrangement.mlsMessageApi) - .suspendFunction(arrangement.mlsMessageApi::sendCommitBundle) - .with(anyInstanceOf(MLSMessageApi.CommitBundle::class)) - .wasInvoked(once) - - verify(arrangement.mlsClient) - .function(arrangement.mlsClient::commitAccepted) - .with(eq(Arrangement.RAW_GROUP_ID)) - .wasInvoked(once) - - verify(arrangement.mlsPublicKeysRepository) - .function(arrangement.mlsPublicKeysRepository::getKeyForCipherSuite) - .with(anything()) - .wasInvoked(once) + coVerify { + arrangement.mlsClient.createConversation(eq(Arrangement.RAW_GROUP_ID), any()) + }.wasInvoked(once) + + coVerify { + arrangement.mlsClient.addMember(eq(Arrangement.RAW_GROUP_ID), any()) + }.wasInvoked(once) + + coVerify { + arrangement.mlsMessageApi.sendCommitBundle(any()) + }.wasInvoked(once) + + coVerify { + arrangement.mlsClient.commitAccepted(eq(Arrangement.RAW_GROUP_ID)) + }.wasInvoked(once) + + coVerify { + arrangement.mlsPublicKeysRepository.getKeyForCipherSuite(any()) + }.wasInvoked(once) } @Test From b4d3c62e2dd7b4910617f94502f957d896545732 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 11:30:23 +0200 Subject: [PATCH 5/8] fix merge conflicts --- .../data/conversation/ConversationGroupRepositoryTest.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt index 4b00b011bd9..47b9c3ed866 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/conversation/ConversationGroupRepositoryTest.kt @@ -1723,11 +1723,10 @@ class ConversationGroupRepositoryTest { legalHoldHandler ) - suspend fun withMlsConversationEstablished(additionResult: MLSAdditionResult): Arrangement { + suspend fun withMlsConversationEstablished(additionResult: MLSAdditionResult): Arrangement = apply { coEvery { - mlsConversationRepository.establishMLSGroup(any(), any(), any()) + mlsConversationRepository.establishMLSGroup(any(), any(), any(), any()) }.returns(Either.Right(additionResult)) - return this } /** From aa4005438c6fb203e48318a1e0f3df4abba04243 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 12:28:20 +0200 Subject: [PATCH 6/8] fix stalling test --- .../conversation/MLSConversationRepositoryTest.kt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 d1f70b727b6..52ab07b042b 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 @@ -106,20 +106,23 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import kotlinx.coroutines.yield import kotlinx.datetime.Instant +import kotlin.test.BeforeTest import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertIs class MLSConversationRepositoryTest { + @BeforeTest + @Test - fun givenCommitMessage_whenDecryptingMessage_thenEmitEpochChange() = runTest(TestKaliumDispatcher.default) { + fun givenCommitMessage_whenDecryptingMessage_thenEmitEpochChange() = runTest { val (arrangement, mlsConversationRepository) = Arrangement(testKaliumDispatcher) .withGetMLSClientSuccessful() .withDecryptMLSMessageSuccessful(Arrangement.DECRYPTED_MESSAGE_BUNDLE) .arrange() - val epochChange = async(TestKaliumDispatcher.default) { + val epochChange = async() { arrangement.epochsFlow.first() } yield() @@ -284,7 +287,7 @@ class MLSConversationRepositoryTest { @Test fun givenPublicKeysIsNotNull_whenCallingEstablishMLSGroup_ThenGetPublicKeysRepositoryNotCalled() = runTest { - val (arrangement, mlsConversationRepository) = Arrangement() + val (arrangement, mlsConversationRepository) = Arrangement(kaliumDispatcher = testKaliumDispatcher) .withGetDefaultCipherSuite(CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519) .withCommitPendingProposalsReturningNothing() .withClaimKeyPackagesSuccessful() @@ -325,7 +328,7 @@ class MLSConversationRepositoryTest { @Test fun givenPublicKeysIsNull_whenCallingEstablishMLSGroup_ThenGetPublicKeysRepositoryIsCalled() = runTest { - val (arrangement, mlsConversationRepository) = Arrangement() + val (arrangement, mlsConversationRepository) = Arrangement(testKaliumDispatcher) .withGetDefaultCipherSuite(CipherSuite.MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519) .withCommitPendingProposalsReturningNothing() .withClaimKeyPackagesSuccessful() From ea96ec64bed4b8bc1b82e56d32f9cdeb5a0e9ab6 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 13:11:54 +0200 Subject: [PATCH 7/8] fix tests --- .../JoinExistingMLSConversationUseCaseTest.kt | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationUseCaseTest.kt index bdf9859a750..c9721549433 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/conversation/JoinExistingMLSConversationUseCaseTest.kt @@ -131,7 +131,12 @@ class JoinExistingMLSConversationUseCaseTest { joinExistingMLSConversationsUseCase(Arrangement.MLS_UNESTABLISHED_GROUP_CONVERSATION.id).shouldSucceed() coVerify { - arrangement.mlsConversationRepository.establishMLSGroup(eq(Arrangement.GROUP_ID3), eq(emptyList()), any()) + arrangement.mlsConversationRepository.establishMLSGroup( + groupID = Arrangement.GROUP_ID3, + members = emptyList(), + publicKeys = null, + allowSkippingUsersWithoutKeyPackages = false + ) }.wasNotInvoked() } @@ -148,7 +153,12 @@ class JoinExistingMLSConversationUseCaseTest { joinExistingMLSConversationsUseCase(Arrangement.MLS_UNESTABLISHED_SELF_CONVERSATION.id).shouldSucceed() coVerify { - arrangement.mlsConversationRepository.establishMLSGroup(eq(Arrangement.GROUP_ID_SELF), eq(emptyList()), any()) + arrangement.mlsConversationRepository.establishMLSGroup( + groupID = Arrangement.GROUP_ID_SELF, + members = emptyList(), + publicKeys = null, + allowSkippingUsersWithoutKeyPackages = false + ) }.wasInvoked(once) } @@ -167,7 +177,12 @@ class JoinExistingMLSConversationUseCaseTest { joinExistingMLSConversationsUseCase(Arrangement.MLS_UNESTABLISHED_ONE_ONE_ONE_CONVERSATION.id).shouldSucceed() coVerify { - arrangement.mlsConversationRepository.establishMLSGroup(eq(Arrangement.GROUP_ID_ONE_ON_ONE), eq(members), any()) + arrangement.mlsConversationRepository.establishMLSGroup( + groupID = Arrangement.GROUP_ID_ONE_ON_ONE, + members = members, + publicKeys = null, + allowSkippingUsersWithoutKeyPackages = false + ) }.wasInvoked(once) } @@ -256,7 +271,7 @@ class JoinExistingMLSConversationUseCaseTest { suspend fun withEstablishMLSGroupSuccessful(additionResult: MLSAdditionResult) = apply { coEvery { - mlsConversationRepository.establishMLSGroup(any(), any(), any()) + mlsConversationRepository.establishMLSGroup(any(), any(), any(), any()) }.returns(Either.Right(additionResult)) } From 26555fc0d0f5ed44639149be9cd000a0bd016c92 Mon Sep 17 00:00:00 2001 From: Mohamad Jaara Date: Thu, 26 Sep 2024 14:06:06 +0200 Subject: [PATCH 8/8] fix tests --- .../feature/mlsmigration/MLSMigratorTest.kt | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/mlsmigration/MLSMigratorTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/mlsmigration/MLSMigratorTest.kt index a60f24f0ced..216d4f8008c 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/mlsmigration/MLSMigratorTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/mlsmigration/MLSMigratorTest.kt @@ -27,6 +27,7 @@ import com.wire.kalium.logic.data.conversation.MLSConversationRepository import com.wire.kalium.logic.data.conversation.mls.MLSAdditionResult import com.wire.kalium.logic.data.id.ConversationId import com.wire.kalium.logic.data.id.SelfTeamIdProvider +import com.wire.kalium.logic.data.id.TeamId import com.wire.kalium.logic.data.message.SystemMessageInserter import com.wire.kalium.logic.data.mls.CipherSuite import com.wire.kalium.logic.data.user.UserId @@ -78,18 +79,23 @@ class MLSMigratorTest { migrator.migrateProteusConversations() coVerify { - arrangement.conversationRepository.updateProtocolRemotely(eq(conversation.id), eq(Conversation.Protocol.MIXED)) + arrangement.conversationRepository.updateProtocolRemotely(conversation.id, Conversation.Protocol.MIXED) }.wasInvoked(once) coVerify { - arrangement.mlsConversationRepository.establishMLSGroup(eq(Arrangement.MIXED_PROTOCOL_INFO.groupId), eq(emptyList()), any()) + arrangement.mlsConversationRepository.establishMLSGroup( + groupID = Arrangement.MIXED_PROTOCOL_INFO.groupId, + members = emptyList(), + publicKeys = null, + false + ) } coVerify { arrangement.mlsConversationRepository.addMemberToMLSGroup( - eq(Arrangement.MIXED_PROTOCOL_INFO.groupId), - eq(Arrangement.MEMBERS), - eq(CIPHER_SUITE) + Arrangement.MIXED_PROTOCOL_INFO.groupId, + Arrangement.MEMBERS, + CIPHER_SUITE ) } } @@ -119,7 +125,12 @@ class MLSMigratorTest { }.wasInvoked(once) coVerify { - arrangement.mlsConversationRepository.establishMLSGroup(eq(Arrangement.MIXED_PROTOCOL_INFO.groupId), eq(emptyList()), any()) + arrangement.mlsConversationRepository.establishMLSGroup( + groupID = Arrangement.MIXED_PROTOCOL_INFO.groupId, + members = emptyList(), + publicKeys = null, + allowSkippingUsersWithoutKeyPackages = false + ) } coVerify { @@ -232,7 +243,11 @@ class MLSMigratorTest { suspend fun withGetProteusTeamConversationsReturning(conversationsIds: List) = apply { coEvery { - conversationRepository.getConversationIds(eq(Conversation.Type.GROUP), eq(Conversation.Protocol.PROTEUS), any()) + conversationRepository.getConversationIds( + Conversation.Type.GROUP, + Conversation.Protocol.PROTEUS, + TeamId(value = "Some-team") + ) }.returns(Either.Right(conversationsIds)) } @@ -268,13 +283,13 @@ class MLSMigratorTest { suspend fun withEstablishGroupSucceeds(additionResult: MLSAdditionResult) = apply { coEvery { - mlsConversationRepository.establishMLSGroup(any(), any(), any()) + mlsConversationRepository.establishMLSGroup(any(), any(), any(), any()) }.returns(Either.Right(additionResult)) } suspend fun withEstablishGroupFails() = apply { coEvery { - mlsConversationRepository.establishMLSGroup(any(), any(), any()) + mlsConversationRepository.establishMLSGroup(any(), any(), any(), any()) }.returns(Either.Left(NetworkFailure.ServerMiscommunication(MLS_STALE_MESSAGE_ERROR))) }