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: repositoriesShouldNotAccessFeature in MLSConversationRepository [WPB-6326] #2736

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 @@ -16,8 +16,6 @@
* along with this program. If not, see http://www.gnu.org/licenses/.
*/

@file:Suppress("konsist.repositoriesShouldNotAccessFeaturePackageClasses")

package com.wire.kalium.logic.data.conversation

import com.wire.kalium.cryptography.CommitBundle
Expand Down Expand Up @@ -53,7 +51,7 @@ import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeysMapper
import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeysRepository
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.di.MapperProvider
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.functional.flatMap
import com.wire.kalium.logic.functional.flatMapLeft
Expand Down Expand Up @@ -218,7 +216,7 @@ internal class MLSConversationDataSource(
private val epochsFlow: MutableSharedFlow<GroupID>,
private val proposalTimersFlow: MutableSharedFlow<ProposalTimer>,
private val keyPackageLimitsProvider: KeyPackageLimitsProvider,
private val checkRevocationList: CheckRevocationListUseCase,
private val revocationListChecker: RevocationListChecker,
private val certificateRevocationListRepository: CertificateRevocationListRepository,
private val serverConfigLinks: ServerConfig.Links,
private val idMapper: IdMapper = MapperProvider.idMapper(),
Expand Down Expand Up @@ -868,7 +866,7 @@ internal class MLSConversationDataSource(

private suspend fun checkRevocationList(crlNewDistributionPoints: List<String>) {
crlNewDistributionPoints.forEach { url ->
checkRevocationList(url).map { newExpiration ->
revocationListChecker.check(url).map { newExpiration ->
newExpiration?.let {
certificateRevocationListRepository.addOrUpdateCRL(url, it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,39 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.wire.kalium.logic.feature.e2ei.usecase
package com.wire.kalium.logic.data.e2ei

import com.wire.kalium.logic.CoreFailure
import com.wire.kalium.logic.E2EIFailure
import com.wire.kalium.logic.configuration.UserConfigRepository
import com.wire.kalium.logic.data.client.MLSClientProvider
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.data.id.CurrentClientIdProvider
import com.wire.kalium.logic.feature.user.IsE2EIEnabledUseCase
import com.wire.kalium.logic.featureFlags.FeatureSupport
import com.wire.kalium.logic.functional.Either
import com.wire.kalium.logic.functional.flatMap
import com.wire.kalium.logic.functional.getOrElse
import com.wire.kalium.logic.functional.map
import com.wire.kalium.logic.kaliumLogger

/**
* Use case to check if the CRL is expired and if so, register CRL and update conversation statuses if there is a change.
*/
interface CheckRevocationListUseCase {
suspend operator fun invoke(url: String): Either<CoreFailure, ULong?>
interface RevocationListChecker {
suspend fun check(url: String): Either<CoreFailure, ULong?>
}

internal class CheckRevocationListUseCaseImpl(
internal class RevocationListCheckerImpl(
private val certificateRevocationListRepository: CertificateRevocationListRepository,
private val currentClientIdProvider: CurrentClientIdProvider,
private val mlsClientProvider: MLSClientProvider,
private val isE2EIEnabledUseCase: IsE2EIEnabledUseCase
) : CheckRevocationListUseCase {
private val featureSupport: FeatureSupport,
private val userConfigRepository: UserConfigRepository,
) : RevocationListChecker {
private val logger = kaliumLogger.withTextTag("CheckRevocationListUseCase")
override suspend fun invoke(url: String): Either<CoreFailure, ULong?> {
return if (isE2EIEnabledUseCase()) {
override suspend fun check(url: String): Either<CoreFailure, ULong?> {
val isE2EIEnabled = getIsE2EIEnabled()

return if (isE2EIEnabled) {
logger.i("checking crl url: $url")
certificateRevocationListRepository.getClientDomainCRL(url).flatMap {
currentClientIdProvider().flatMap { clientId ->
Expand All @@ -57,4 +61,11 @@ internal class CheckRevocationListUseCaseImpl(
}
} else Either.Left(E2EIFailure.Disabled)
}

private fun getIsE2EIEnabled() = userConfigRepository.getE2EISettings().flatMap { settings ->
userConfigRepository.isMLSEnabled()
.map {
it && settings.isRequired && featureSupport.isMLSSupported
}
}.getOrElse(false)
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ import com.wire.kalium.logic.data.conversation.UpdateKeyingMaterialThresholdProv
import com.wire.kalium.logic.data.conversation.UpdateKeyingMaterialThresholdProviderImpl
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepositoryDataSource
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.data.e2ei.RevocationListCheckerImpl
import com.wire.kalium.logic.data.e2ei.E2EIRepository
import com.wire.kalium.logic.data.e2ei.E2EIRepositoryImpl
import com.wire.kalium.logic.feature.e2ei.usecase.ObserveE2EIConversationsVerificationStatusesUseCase
Expand Down Expand Up @@ -212,8 +214,6 @@ import com.wire.kalium.logic.feature.debug.DebugScope
import com.wire.kalium.logic.feature.e2ei.ACMECertificatesSyncWorker
import com.wire.kalium.logic.feature.e2ei.ACMECertificatesSyncWorkerImpl
import com.wire.kalium.logic.feature.e2ei.CheckCrlRevocationListUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCaseImpl
import com.wire.kalium.logic.feature.e2ei.usecase.FetchConversationMLSVerificationStatusUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.FetchConversationMLSVerificationStatusUseCaseImpl
import com.wire.kalium.logic.feature.e2ei.usecase.FetchMLSVerificationStatusUseCase
Expand Down Expand Up @@ -639,12 +639,13 @@ class UserSessionScope internal constructor(
memberJoinHandler, memberLeaveHandler
)

private val checkRevocationList: CheckRevocationListUseCase
get() = CheckRevocationListUseCaseImpl(
private val checkRevocationList: RevocationListChecker
get() = RevocationListCheckerImpl(
certificateRevocationListRepository = certificateRevocationListRepository,
currentClientIdProvider = clientIdProvider,
mlsClientProvider = mlsClientProvider,
isE2EIEnabledUseCase = isE2EIEnabled
featureSupport = featureSupport,
userConfigRepository = userConfigRepository
)

private val mlsConversationRepository: MLSConversationRepository
Expand Down Expand Up @@ -1377,7 +1378,7 @@ class UserSessionScope internal constructor(
conversationRepository = conversationRepository,
oneOnOneResolver = oneOnOneResolver,
refillKeyPackages = client.refillKeyPackages,
checkRevocationList = checkRevocationList,
revocationListChecker = checkRevocationList,
certificateRevocationListRepository = certificateRevocationListRepository
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ package com.wire.kalium.logic.feature.e2ei

import com.wire.kalium.logger.KaliumLogger
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.data.sync.IncrementalSyncRepository
import com.wire.kalium.logic.data.sync.IncrementalSyncStatus
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.functional.map
import kotlinx.coroutines.flow.filter
import kotlinx.datetime.Clock
Expand All @@ -38,13 +38,13 @@ interface CertificateRevocationListCheckWorker {
* Base implementation of [CertificateRevocationListCheckWorker].
* @param certificateRevocationListRepository The CRL repository.
* @param incrementalSyncRepository The incremental sync repository.
* @param checkRevocationList The check revocation list use case.
* @param revocationListChecker The check revocation list use case.
*
*/
internal class CertificateRevocationListCheckWorkerImpl(
private val certificateRevocationListRepository: CertificateRevocationListRepository,
private val incrementalSyncRepository: IncrementalSyncRepository,
private val checkRevocationList: CheckRevocationListUseCase,
private val revocationListChecker: RevocationListChecker,
kaliumLogger: KaliumLogger
) : CertificateRevocationListCheckWorker {

Expand All @@ -58,7 +58,7 @@ internal class CertificateRevocationListCheckWorkerImpl(
logger.i("Checking certificate revocation list (CRL)..")
certificateRevocationListRepository.getCRLs()?.cRLWithExpirationList?.forEach { crl ->
if (crl.expiration < Clock.System.now().epochSeconds.toULong()) {
checkRevocationList(crl.url).map { newExpirationTime ->
revocationListChecker.check(crl.url).map { newExpirationTime ->
newExpirationTime?.let {
certificateRevocationListRepository.addOrUpdateCRL(crl.url, it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ package com.wire.kalium.logic.feature.e2ei

import com.wire.kalium.logger.KaliumLogger
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.functional.map
import kotlinx.datetime.Clock

Expand All @@ -29,7 +29,7 @@ import kotlinx.datetime.Clock
*/
class CheckCrlRevocationListUseCase internal constructor(
private val certificateRevocationListRepository: CertificateRevocationListRepository,
private val checkRevocationList: CheckRevocationListUseCase,
private val revocationListChecker: RevocationListChecker,
kaliumLogger: KaliumLogger
) {

Expand All @@ -39,7 +39,7 @@ class CheckCrlRevocationListUseCase internal constructor(
logger.i("Checking certificate revocation list (CRL). Force update: $forceUpdate")
certificateRevocationListRepository.getCRLs()?.cRLWithExpirationList?.forEach { crl ->
if (forceUpdate || (crl.expiration < Clock.System.now().epochSeconds.toULong())) {
checkRevocationList(crl.url).map { newExpirationTime ->
revocationListChecker.check(crl.url).map { newExpirationTime ->
newExpirationTime?.let {
certificateRevocationListRepository.addOrUpdateCRL(crl.url, it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import com.wire.kalium.logic.data.client.ClientRepository
import com.wire.kalium.logic.data.conversation.JoinExistingMLSConversationsUseCase
import com.wire.kalium.logic.data.conversation.MLSConversationRepository
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.data.e2ei.E2EIRepository
import com.wire.kalium.logic.data.id.CurrentClientIdProvider
import com.wire.kalium.logic.data.properties.UserPropertyRepository
Expand All @@ -51,7 +52,6 @@ import com.wire.kalium.logic.feature.conversation.GetAllContactsNotInConversatio
import com.wire.kalium.logic.feature.e2ei.CertificateRevocationListCheckWorker
import com.wire.kalium.logic.feature.e2ei.CertificateRevocationListCheckWorkerImpl
import com.wire.kalium.logic.feature.e2ei.CertificateStatusMapperImpl
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.EnrollE2EIUseCase
import com.wire.kalium.logic.feature.e2ei.usecase.EnrollE2EIUseCaseImpl
import com.wire.kalium.logic.feature.e2ei.usecase.GetE2eiCertificateUseCase
Expand Down Expand Up @@ -109,7 +109,7 @@ class UserScope internal constructor(
private val isE2EIEnabledUseCase: IsE2EIEnabledUseCase,
private val certificateRevocationListRepository: CertificateRevocationListRepository,
private val incrementalSyncRepository: IncrementalSyncRepository,
private val checkRevocationList: CheckRevocationListUseCase,
private val checkRevocationList: RevocationListChecker,
private val syncFeatureConfigs: SyncFeatureConfigsUseCase,
private val userScopedLogger: KaliumLogger
) {
Expand Down Expand Up @@ -215,7 +215,7 @@ class UserScope internal constructor(
CertificateRevocationListCheckWorkerImpl(
certificateRevocationListRepository = certificateRevocationListRepository,
incrementalSyncRepository = incrementalSyncRepository,
checkRevocationList = checkRevocationList,
revocationListChecker = checkRevocationList,
kaliumLogger = userScopedLogger,
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ import com.wire.kalium.logic.data.conversation.Conversation
import com.wire.kalium.logic.data.conversation.ConversationDetails
import com.wire.kalium.logic.data.conversation.ConversationRepository
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.data.event.Event
import com.wire.kalium.logic.data.event.EventLoggingStatus
import com.wire.kalium.logic.data.event.logEventProcessing
import com.wire.kalium.logic.data.id.ConversationId
import com.wire.kalium.logic.data.id.GroupID
import com.wire.kalium.logic.feature.conversation.mls.OneOnOneResolver
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.feature.keypackage.RefillKeyPackagesResult
import com.wire.kalium.logic.feature.keypackage.RefillKeyPackagesUseCase
import com.wire.kalium.logic.functional.Either
Expand All @@ -52,7 +52,7 @@ internal class MLSWelcomeEventHandlerImpl(
val conversationRepository: ConversationRepository,
val oneOnOneResolver: OneOnOneResolver,
val refillKeyPackages: RefillKeyPackagesUseCase,
val checkRevocationList: CheckRevocationListUseCase,
val revocationListChecker: RevocationListChecker,
private val certificateRevocationListRepository: CertificateRevocationListRepository
) : MLSWelcomeEventHandler {
override suspend fun handle(event: Event.Conversation.MLSWelcome): Either<CoreFailure, Unit> =
Expand Down Expand Up @@ -105,7 +105,7 @@ internal class MLSWelcomeEventHandlerImpl(

private suspend fun checkRevocationList(crlNewDistributionPoints: List<String>) {
crlNewDistributionPoints.forEach { url ->
checkRevocationList(url).map { newExpiration ->
revocationListChecker.check(url).map { newExpiration ->
newExpiration?.let {
certificateRevocationListRepository.addOrUpdateCRL(url, it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arr
import com.wire.kalium.logic.data.conversation.MLSConversationRepositoryTest.Arrangement.Companion.WIRE_IDENTITY
import com.wire.kalium.logic.data.conversation.mls.KeyPackageClaimResult
import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepository
import com.wire.kalium.logic.data.e2ei.RevocationListChecker
import com.wire.kalium.logic.data.event.Event
import com.wire.kalium.logic.data.id.GroupID
import com.wire.kalium.logic.data.id.QualifiedClientID
Expand All @@ -56,7 +57,6 @@ import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKey
import com.wire.kalium.logic.data.mlspublickeys.MLSPublicKeysRepository
import com.wire.kalium.logic.data.user.UserId
import com.wire.kalium.logic.di.MapperProvider
import com.wire.kalium.logic.feature.e2ei.usecase.CheckRevocationListUseCase
import com.wire.kalium.logic.framework.TestClient
import com.wire.kalium.logic.framework.TestConversation
import com.wire.kalium.logic.framework.TestUser
Expand Down Expand Up @@ -148,7 +148,7 @@ class MLSConversationRepositoryTest {
mlsConversationRepository.decryptMessage(Arrangement.COMMIT, Arrangement.GROUP_ID)

coVerify {
arrangement.checkRevocationList.invoke(any())
arrangement.checkRevocationList.check(any())
}.wasInvoked(once)

coVerify {
Expand Down Expand Up @@ -307,7 +307,7 @@ class MLSConversationRepositoryTest {
mlsConversationRepository.addMemberToMLSGroup(Arrangement.GROUP_ID, listOf(TestConversation.USER_ID1))

coVerify {
arrangement.checkRevocationList.invoke(any())
arrangement.checkRevocationList.check(any())
}.wasInvoked(exactly = once)

coVerify {
Expand Down Expand Up @@ -619,7 +619,7 @@ class MLSConversationRepositoryTest {
}.wasInvoked(once)

coVerify {
arrangement.checkRevocationList.invoke(any())
arrangement.checkRevocationList.check(any())
}.wasNotInvoked()
}

Expand All @@ -639,7 +639,7 @@ class MLSConversationRepositoryTest {
mlsConversationRepository.joinGroupByExternalCommit(Arrangement.GROUP_ID, Arrangement.PUBLIC_GROUP_STATE)

coVerify {
arrangement.checkRevocationList.invoke(any())
arrangement.checkRevocationList.check(any())
}.wasInvoked(exactly = once)

coVerify {
Expand Down Expand Up @@ -1178,7 +1178,7 @@ class MLSConversationRepositoryTest {
}.wasInvoked(once)

coVerify {
arrangement.checkRevocationList.invoke(any())
arrangement.checkRevocationList.check(any())
}.wasNotInvoked()
}

Expand All @@ -1199,7 +1199,7 @@ class MLSConversationRepositoryTest {
)

coVerify {
arrangement.checkRevocationList.invoke(any())
arrangement.checkRevocationList.check(any())
}.wasInvoked(exactly = once)

coVerify {
Expand Down Expand Up @@ -1538,7 +1538,7 @@ class MLSConversationRepositoryTest {
val keyPackageLimitsProvider = mock(KeyPackageLimitsProvider::class)

@Mock
val checkRevocationList = mock(CheckRevocationListUseCase::class)
val checkRevocationList = mock(RevocationListChecker::class)

@Mock
val certificateRevocationListRepository = mock(CertificateRevocationListRepository::class)
Expand Down Expand Up @@ -1710,7 +1710,7 @@ class MLSConversationRepositoryTest {

suspend fun withCheckRevocationListResult() = apply {
coEvery {
checkRevocationList.invoke(any())
checkRevocationList.check(any())
}.returns(Either.Right(1uL))
}

Expand Down
Loading
Loading