From cbb1f18ab4f068a4a9dc4cd7ff35a5702ebdebfc Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Wed, 29 May 2024 16:23:34 +0300 Subject: [PATCH 1/4] feat: CRL Proxy --- .../logic/data/featureConfig/FeatureConfigMapper.kt | 8 ++++++-- .../kalium/logic/data/featureConfig/FeatureConfigModel.kt | 4 +++- .../feature/featureConfig/handler/E2EIConfigHandler.kt | 2 +- .../authenticated/featureConfigs/FeatureConfigResponse.kt | 4 ++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigMapper.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigMapper.kt index 7f3dcc0b7a2..40d0c4cf22e 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigMapper.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigMapper.kt @@ -139,14 +139,18 @@ class FeatureConfigMapperImpl : FeatureConfigMapper { E2EIModel( E2EIConfigModel( data.config.url, - data.config.verificationExpirationSeconds + data.config.verificationExpirationSeconds, + data.config.shouldUseProxy == true, + data.config.crlProxy ), fromDTO(data.status) ) } ?: E2EIModel( E2EIConfigModel( null, - 0 + 0, + false, + null ), Status.DISABLED ) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigModel.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigModel.kt index 6391b7d6378..17d630a2025 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigModel.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigModel.kt @@ -100,5 +100,7 @@ data class E2EIModel( data class E2EIConfigModel( val discoverUrl: String?, - val verificationExpirationSeconds: Long + val verificationExpirationSeconds: Long, + val shouldUseProxy: Boolean, + val crlProxy: String?, ) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt index 6c4d285bf2a..a39cd303693 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt @@ -48,7 +48,7 @@ class E2EIConfigHandler(private val userConfigRepository: UserConfigRepository) gracePeriodEnd = gracePeriodEnd ) - if (currentSettings?.isRequired == newSettings.isRequired && currentSettings?.discoverUrl == newSettings.discoverUrl) { + if (currentSettings?.isRequired == newSettings.isRequired && currentSettings.discoverUrl == newSettings.discoverUrl) { // that settings were already handled, // no need to re-write as it will reset gracePeriod return diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt index 61514bcb3eb..8dd6599c313 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt @@ -114,6 +114,10 @@ data class SelfDeletingMessagesConfigDTO( data class E2EIConfigDTO( @SerialName("acmeDiscoveryUrl") val url: String?, + @SerialName("crlProxy") + val crlProxy: String, + @SerialName("useProxyOnMobile") + val shouldUseProxy: Boolean?, @SerialName("verificationExpiration") val verificationExpirationSeconds: Long ) From 5b037f2760ec49c9d0ba214e3e122b7e6992cb60 Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Wed, 5 Jun 2024 16:12:55 +0300 Subject: [PATCH 2/4] feat: CRL Proxy: ready for review --- .../logic/configuration/E2EISettings.kt | 8 +- .../CertificateRevocationListRepository.kt | 52 +++++++----- .../kalium/logic/feature/UserSessionScope.kt | 3 +- .../handler/E2EIConfigHandler.kt | 4 +- ...CertificateRevocationListRepositoryTest.kt | 85 ++++++++++++++++++- .../logic/data/e2ei/E2EIRepositoryTest.kt | 8 +- .../data/event/FeatureConfigMapperTest.kt | 2 +- .../FeatureConfigRepositoryTest.kt | 4 +- .../data/featureConfig/FeatureConfigTest.kt | 2 +- .../client/ObserveE2EIRequiredUseCaseTest.kt | 2 +- .../client/RegisterMLSClientUseCaseTest.kt | 2 +- .../SyncFeatureConfigsUseCaseTest.kt | 2 +- .../featureConfigs/FeatureConfigResponse.kt | 2 +- .../network/api/base/unbound/acme/ACMEApi.kt | 10 +-- .../persistence/config/UserConfigStorage.kt | 2 + 15 files changed, 144 insertions(+), 44 deletions(-) diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/configuration/E2EISettings.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/configuration/E2EISettings.kt index 5ba108ee8a2..7455c685705 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/configuration/E2EISettings.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/configuration/E2EISettings.kt @@ -23,11 +23,13 @@ import kotlinx.datetime.Instant data class E2EISettings( val isRequired: Boolean, val discoverUrl: String?, - val gracePeriodEnd: Instant? + val gracePeriodEnd: Instant?, + val shouldUseProxy: Boolean, + val crlProxy: String?, ) { fun toEntity() = E2EISettingsEntity( - isRequired, discoverUrl, gracePeriodEnd?.toEpochMilliseconds() + isRequired, discoverUrl, gracePeriodEnd?.toEpochMilliseconds(), shouldUseProxy, crlProxy ) companion object { @@ -35,6 +37,8 @@ data class E2EISettings( entity.status, entity.discoverUrl, entity.gracePeriodEndMs?.let { Instant.fromEpochMilliseconds(it) }, + entity.shouldUseProxy == true, + entity.crlProxy ) } } diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepository.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepository.kt index c490499194b..e8cdddcce92 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepository.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepository.kt @@ -18,7 +18,10 @@ package com.wire.kalium.logic.data.e2ei import com.wire.kalium.logic.CoreFailure +import com.wire.kalium.logic.configuration.UserConfigRepository import com.wire.kalium.logic.functional.Either +import com.wire.kalium.logic.functional.getOrNull +import com.wire.kalium.logic.functional.map import com.wire.kalium.logic.wrapApiRequest import com.wire.kalium.network.api.base.unbound.acme.ACMEApi import com.wire.kalium.persistence.config.CRLUrlExpirationList @@ -39,36 +42,37 @@ internal interface CertificateRevocationListRepository { internal class CertificateRevocationListRepositoryDataSource( private val acmeApi: ACMEApi, - private val metadataDAO: MetadataDAO + private val metadataDAO: MetadataDAO, + private val userConfigRepository: UserConfigRepository ) : CertificateRevocationListRepository { override suspend fun getCRLs(): CRLUrlExpirationList? = metadataDAO.getSerializable(CRL_LIST_KEY, CRLUrlExpirationList.serializer()) override suspend fun addOrUpdateCRL(url: String, timestamp: ULong) { val newCRLUrls = metadataDAO.getSerializable(CRL_LIST_KEY, CRLUrlExpirationList.serializer()) - ?.let { crlExpirationList -> - val crlWithExpiration = crlExpirationList.cRLWithExpirationList.find { - it.url == url - } - crlWithExpiration?.let { item -> - crlExpirationList.cRLWithExpirationList.map { current -> - if (current.url == url) { - return@map item.copy(expiration = timestamp) - } else { - return@map current - } + ?.let { crlExpirationList -> + val crlWithExpiration = crlExpirationList.cRLWithExpirationList.find { + it.url == url + } + crlWithExpiration?.let { item -> + crlExpirationList.cRLWithExpirationList.map { current -> + if (current.url == url) { + return@map item.copy(expiration = timestamp) + } else { + return@map current } - } ?: run { - // add new CRL - crlExpirationList.cRLWithExpirationList.plus( - CRLWithExpiration(url, timestamp) - ) } - } ?: run { - // add new CRL - listOf(CRLWithExpiration(url, timestamp)) - } + // add new CRL + crlExpirationList.cRLWithExpirationList.plus( + CRLWithExpiration(url, timestamp) + ) + } + + } ?: run { + // add new CRL + listOf(CRLWithExpiration(url, timestamp)) + } metadataDAO.putSerializable( CRL_LIST_KEY, CRLUrlExpirationList(newCRLUrls), @@ -78,7 +82,11 @@ internal class CertificateRevocationListRepositoryDataSource( override suspend fun getClientDomainCRL(url: String): Either = wrapApiRequest { - acmeApi.getClientDomainCRL(url) + val proxyUrl = userConfigRepository.getE2EISettings() + .map { if (!it.shouldUseProxy || it.crlProxy.isNullOrBlank()) null else it.crlProxy } + .getOrNull() + + acmeApi.getClientDomainCRL(url, proxyUrl) } companion object { diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt index 0d57f6b73c6..6b1d5d020fe 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/UserSessionScope.kt @@ -1560,7 +1560,8 @@ class UserSessionScope internal constructor( private val certificateRevocationListRepository: CertificateRevocationListRepository get() = CertificateRevocationListRepositoryDataSource( acmeApi = globalScope.unboundNetworkContainer.acmeApi, - metadataDAO = userStorage.database.metadataDAO + metadataDAO = userStorage.database.metadataDAO, + userConfigRepository = userConfigRepository ) private val proteusPreKeyRefiller: ProteusPreKeyRefiller diff --git a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt index a39cd303693..f330d7de9a0 100644 --- a/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt +++ b/logic/src/commonMain/kotlin/com/wire/kalium/logic/feature/featureConfig/handler/E2EIConfigHandler.kt @@ -45,7 +45,9 @@ class E2EIConfigHandler(private val userConfigRepository: UserConfigRepository) val newSettings = E2EISettings( isRequired = e2eiConfig.status == Status.ENABLED, discoverUrl = e2eiConfig.config.discoverUrl, - gracePeriodEnd = gracePeriodEnd + gracePeriodEnd = gracePeriodEnd, + shouldUseProxy = e2eiConfig.config.shouldUseProxy, + crlProxy = e2eiConfig.config.crlProxy ) if (currentSettings?.isRequired == newSettings.isRequired && currentSettings.discoverUrl == newSettings.discoverUrl) { diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepositoryTest.kt index bf1933b7597..197b2835042 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/CertificateRevocationListRepositoryTest.kt @@ -17,13 +17,22 @@ */ package com.wire.kalium.logic.data.e2ei +import com.wire.kalium.logic.StorageFailure +import com.wire.kalium.logic.configuration.E2EISettings +import com.wire.kalium.logic.configuration.UserConfigRepository import com.wire.kalium.logic.data.e2ei.CertificateRevocationListRepositoryDataSource.Companion.CRL_LIST_KEY +import com.wire.kalium.logic.functional.Either +import com.wire.kalium.logic.functional.right import com.wire.kalium.network.api.base.unbound.acme.ACMEApi +import com.wire.kalium.network.utils.NetworkResponse import com.wire.kalium.persistence.config.CRLUrlExpirationList import com.wire.kalium.persistence.config.CRLWithExpiration import com.wire.kalium.persistence.dao.MetadataDAO +import io.ktor.utils.io.core.toByteArray import io.mockative.Mock +import io.mockative.any import io.mockative.classOf +import io.mockative.eq import io.mockative.given import io.mockative.mock import io.mockative.once @@ -106,6 +115,54 @@ class CertificateRevocationListRepositoryTest { }.wasInvoked(once) } + @Test + fun givenCRLUrlProxyRequired_whenClientDomainCRLRequested_thenProxyIsApplied() = runTest { + val (arrangement, crlRepository) = Arrangement() + .withClientDomainCRL() + .withE2EISettings(E2EI_SETTINGS.copy(shouldUseProxy = true, crlProxy = DUMMY_URL).right()) + .arrange() + + crlRepository.getClientDomainCRL(DUMMY_URL2) + + verify(arrangement.userConfigRepository).coroutine { getE2EISettings() }.wasInvoked(once) + + verify(arrangement.acmeApi).coroutine { + getClientDomainCRL(DUMMY_URL2, DUMMY_URL) + }.wasInvoked(once) + } + + @Test + fun givenCRLUrlProxyRequiredButEmpty_whenClientDomainCRLRequested_thenProxyIsNotApplied() = runTest { + val (arrangement, crlRepository) = Arrangement() + .withClientDomainCRL() + .withE2EISettings(E2EI_SETTINGS.copy(shouldUseProxy = true, crlProxy = "").right()) + .arrange() + + crlRepository.getClientDomainCRL(DUMMY_URL2) + + verify(arrangement.userConfigRepository).coroutine { getE2EISettings() }.wasInvoked(once) + + verify(arrangement.acmeApi).coroutine { + getClientDomainCRL(DUMMY_URL2, null) + }.wasInvoked(once) + } + + @Test + fun givenCRLUrlProxyNotRequired_whenClientDomainCRLRequested_thenProxyIsNotApplied() = runTest { + val (arrangement, crlRepository) = Arrangement() + .withClientDomainCRL() + .withE2EISettings(E2EI_SETTINGS.copy(shouldUseProxy = false, crlProxy = DUMMY_URL).right()) + .arrange() + + crlRepository.getClientDomainCRL(DUMMY_URL2) + + verify(arrangement.userConfigRepository).coroutine { getE2EISettings() }.wasInvoked(once) + + verify(arrangement.acmeApi).coroutine { + getClientDomainCRL(DUMMY_URL2, null) + }.wasInvoked(once) + } + private class Arrangement { @Mock @@ -114,7 +171,10 @@ class CertificateRevocationListRepositoryTest { @Mock val metadataDAO = mock(classOf()) - fun arrange() = this to CertificateRevocationListRepositoryDataSource(acmeApi, metadataDAO) + @Mock + val userConfigRepository = mock(classOf()) + + fun arrange() = this to CertificateRevocationListRepositoryDataSource(acmeApi, metadataDAO, userConfigRepository) suspend fun withEmptyList() = apply { given(metadataDAO).coroutine { @@ -142,6 +202,22 @@ class CertificateRevocationListRepositoryTest { ) }.thenReturn(CRLUrlExpirationList(listOf(CRLWithExpiration(DUMMY_URL, TIMESTAMP)))) } + + suspend fun withE2EISettings(result: Either = E2EI_SETTINGS.right()) = apply { + given(userConfigRepository).function(userConfigRepository::getE2EISettings) + .whenInvoked() + .thenReturn(result) + } + + suspend fun withClientDomainCRL() = apply { + given(acmeApi).suspendFunction(acmeApi::getClientDomainCRL) + .whenInvokedWith(any(), any()) + .thenReturn(NetworkResponse.Success("some_response".toByteArray(), mapOf(), 200)) + }.apply { + given(acmeApi).suspendFunction(acmeApi::getClientDomainCRL) + .whenInvokedWith(any(), eq(null)) + .thenReturn(NetworkResponse.Success("some_response".toByteArray(), mapOf(), 200)) + } } companion object { @@ -149,5 +225,12 @@ class CertificateRevocationListRepositoryTest { private const val DUMMY_URL2 = "https://dummy-2.url" private val TIMESTAMP = 1234567890.toULong() private val TIMESTAMP2 = 5453222.toULong() + private val E2EI_SETTINGS = E2EISettings( + isRequired = true, + discoverUrl = "discoverUrl", + gracePeriodEnd = null, + shouldUseProxy = false, + crlProxy = null + ) } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/E2EIRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/E2EIRepositoryTest.kt index cab1b39ab8d..26f90778c6c 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/E2EIRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/e2ei/E2EIRepositoryTest.kt @@ -1024,7 +1024,7 @@ class E2EIRepositoryTest { @Test fun givenE2EIIsDisabled_whenCallingDiscoveryUrl_thenItFailWithDisabled() { val (arrangement, e2eiRepository) = Arrangement() - .withGettingE2EISettingsReturns(Either.Right(E2EISettings(false, null, Instant.DISTANT_FUTURE))) + .withGettingE2EISettingsReturns(Either.Right(E2EISettings(false, null, Instant.DISTANT_FUTURE, false, null))) .arrange() e2eiRepository.discoveryUrl().shouldFail { @@ -1039,7 +1039,7 @@ class E2EIRepositoryTest { @Test fun givenE2EIIsEnabledAndDiscoveryUrlIsNull_whenCallingDiscoveryUrl_thenItFailWithMissingDiscoveryUrl() { val (arrangement, e2eiRepository) = Arrangement() - .withGettingE2EISettingsReturns(Either.Right(E2EISettings(true, null, Instant.DISTANT_FUTURE))) + .withGettingE2EISettingsReturns(Either.Right(E2EISettings(true, null, Instant.DISTANT_FUTURE, false, null))) .arrange() e2eiRepository.discoveryUrl().shouldFail { @@ -1054,7 +1054,7 @@ class E2EIRepositoryTest { @Test fun givenE2EIIsEnabledAndDiscoveryUrlIsNotNull_whenCallingDiscoveryUrl_thenItSucceed() { val (arrangement, e2eiRepository) = Arrangement() - .withGettingE2EISettingsReturns(Either.Right(E2EISettings(true, RANDOM_URL, Instant.DISTANT_FUTURE))) + .withGettingE2EISettingsReturns(Either.Right(E2EISettings(true, RANDOM_URL, Instant.DISTANT_FUTURE, false, null))) .arrange() e2eiRepository.discoveryUrl().shouldSucceed { @@ -1445,7 +1445,7 @@ class E2EIRepositoryTest { val HEADERS = mapOf(NONCE_HEADER_KEY to RANDOM_NONCE.value, LOCATION_HEADER_KEY to RANDOM_URL) val E2EI_TEAM_SETTINGS = E2EISettings( - true, RANDOM_URL, DateTimeUtil.currentInstant() + true, RANDOM_URL, DateTimeUtil.currentInstant(), false, null ) } } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/event/FeatureConfigMapperTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/event/FeatureConfigMapperTest.kt index cf0ec4b7582..1f326d2bb6b 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/event/FeatureConfigMapperTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/event/FeatureConfigMapperTest.kt @@ -162,7 +162,7 @@ class FeatureConfigMapperTest { ), FeatureFlagStatusDTO.ENABLED ), FeatureConfigData.E2EI( - E2EIConfigDTO("url", 1_000_000L), + E2EIConfigDTO("url", null, false, 1_000_000L), FeatureFlagStatusDTO.ENABLED ), FeatureConfigData.MLSMigration( diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigRepositoryTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigRepositoryTest.kt index bc917d12469..186bde600b6 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigRepositoryTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigRepositoryTest.kt @@ -81,7 +81,7 @@ class FeatureConfigRepositoryTest { supportedCipherSuite = null ), E2EIModel( - E2EIConfigModel("url", 1000000L), + E2EIConfigModel("url", 1000000L, false, null), Status.ENABLED ), MLSMigrationModel( @@ -165,7 +165,7 @@ class FeatureConfigRepositoryTest { ), FeatureFlagStatusDTO.ENABLED ), FeatureConfigData.E2EI( - E2EIConfigDTO("url", 1000000L), + E2EIConfigDTO("url", null, false, 1000000L), FeatureFlagStatusDTO.ENABLED ), FeatureConfigData.MLSMigration( diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigTest.kt index fd3facd35fa..e1aadb92060 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/data/featureConfig/FeatureConfigTest.kt @@ -49,7 +49,7 @@ object FeatureConfigTest { status = Status.ENABLED, supportedCipherSuite = null ), - e2EIModel: E2EIModel = E2EIModel(E2EIConfigModel("url", 10000L), Status.ENABLED), + e2EIModel: E2EIModel = E2EIModel(E2EIConfigModel("url", 10000L, false, null), Status.ENABLED), mlsMigrationModel: MLSMigrationModel? = MLSMigrationModel( Instant.DISTANT_FUTURE, Instant.DISTANT_FUTURE, diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/ObserveE2EIRequiredUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/ObserveE2EIRequiredUseCaseTest.kt index 585b4e71304..6f5b6946972 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/ObserveE2EIRequiredUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/ObserveE2EIRequiredUseCaseTest.kt @@ -370,7 +370,7 @@ class ObserveE2EIRequiredUseCaseTest { } companion object { - private val MLS_E2EI_SETTING = E2EISettings(true, "some_url", null) + private val MLS_E2EI_SETTING = E2EISettings(true, "some_url", null, false, null) private val VALID_CERTIFICATE = E2eiCertificate( userHandle = "userHandle", serialNumber = "serialNumber", diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/RegisterMLSClientUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/RegisterMLSClientUseCaseTest.kt index d06c1b8eab0..300a34f2920 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/RegisterMLSClientUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/client/RegisterMLSClientUseCaseTest.kt @@ -229,7 +229,7 @@ class RegisterMLSClientUseCaseTest { const val REFILL_AMOUNT = 100 val RANDOM_URL = "https://random.rn" val E2EI_TEAM_SETTINGS = E2EISettings( - true, RANDOM_URL, DateTimeUtil.currentInstant() + true, RANDOM_URL, DateTimeUtil.currentInstant(), false, null ) } diff --git a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/featureConfig/SyncFeatureConfigsUseCaseTest.kt b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/featureConfig/SyncFeatureConfigsUseCaseTest.kt index 657ae62849a..8a454cc0e1e 100644 --- a/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/featureConfig/SyncFeatureConfigsUseCaseTest.kt +++ b/logic/src/commonTest/kotlin/com/wire/kalium/logic/feature/featureConfig/SyncFeatureConfigsUseCaseTest.kt @@ -589,7 +589,7 @@ class SyncFeatureConfigsUseCaseTest { @Test fun givenE2EIIsDisabled_whenSyncing_thenItShouldBeStoredAsDisabled() = runTest { - val e2EIModel = E2EIModel(E2EIConfigModel("url", 10_000L), Status.DISABLED) + val e2EIModel = E2EIModel(E2EIConfigModel("url", 10_000L, false, null), Status.DISABLED) val expectedGracePeriodEnd = DateTimeUtil.currentInstant().plus(10_000.toDuration(DurationUnit.SECONDS)) val (arrangement, syncFeatureConfigsUseCase) = Arrangement() .withRemoteFeatureConfigsSucceeding( diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt index 8dd6599c313..d11c6feba54 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/authenticated/featureConfigs/FeatureConfigResponse.kt @@ -115,7 +115,7 @@ data class E2EIConfigDTO( @SerialName("acmeDiscoveryUrl") val url: String?, @SerialName("crlProxy") - val crlProxy: String, + val crlProxy: String?, @SerialName("useProxyOnMobile") val shouldUseProxy: Boolean?, @SerialName("verificationExpiration") diff --git a/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/unbound/acme/ACMEApi.kt b/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/unbound/acme/ACMEApi.kt index 6bddc72d47e..0173bb28a70 100644 --- a/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/unbound/acme/ACMEApi.kt +++ b/network/src/commonMain/kotlin/com/wire/kalium/network/api/base/unbound/acme/ACMEApi.kt @@ -59,7 +59,7 @@ interface ACMEApi { * @return A [NetworkResponse] object containing the certificate chain as a list of strings. */ suspend fun getACMEFederationCertificateChain(discoveryUrl: String): NetworkResponse> - suspend fun getClientDomainCRL(url: String): NetworkResponse + suspend fun getClientDomainCRL(url: String, proxyUrl: String?): NetworkResponse } class ACMEApiImpl internal constructor( @@ -252,7 +252,7 @@ class ACMEApiImpl internal constructor( }.mapSuccess { it.certificates } } - override suspend fun getClientDomainCRL(url: String): NetworkResponse { + override suspend fun getClientDomainCRL(url: String, proxyUrl: String?): NetworkResponse { if (url.isBlank()) { return NetworkResponse.Error( KaliumException.GenericError( @@ -262,9 +262,9 @@ class ACMEApiImpl internal constructor( } return wrapKaliumResponse { - val httpUrl = URLBuilder(url).apply { - this.protocol = URLProtocol.HTTP - }.build() + val httpUrl = if (proxyUrl.isNullOrEmpty()) URLBuilder(url).apply { this.protocol = URLProtocol.HTTP }.build() + else URLBuilder(proxyUrl).apply { this.pathSegments = this.pathSegments.plus(url) }.build() + clearTextTrafficHttpClient.get(httpUrl) } } diff --git a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/config/UserConfigStorage.kt b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/config/UserConfigStorage.kt index 88175fc20f0..57c8866264b 100644 --- a/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/config/UserConfigStorage.kt +++ b/persistence/src/commonMain/kotlin/com/wire/kalium/persistence/config/UserConfigStorage.kt @@ -207,6 +207,8 @@ data class E2EISettingsEntity( @SerialName("status") val status: Boolean, @SerialName("discoverUrl") val discoverUrl: String?, @SerialName("gracePeriodEndMs") val gracePeriodEndMs: Long?, + @SerialName("shouldUseProxy") val shouldUseProxy: Boolean?, + @SerialName("crlProxy") val crlProxy: String?, ) @Serializable From 4a2c6ea7fdeee11826ca4df8899b7a9471fcbf0c Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Wed, 5 Jun 2024 16:41:46 +0300 Subject: [PATCH 3/4] Fixed build --- .../kotlin/com/wire/kalium/model/FeatureConfigJson.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/network/src/commonTest/kotlin/com/wire/kalium/model/FeatureConfigJson.kt b/network/src/commonTest/kotlin/com/wire/kalium/model/FeatureConfigJson.kt index 031966ad99d..8791d27512d 100644 --- a/network/src/commonTest/kotlin/com/wire/kalium/model/FeatureConfigJson.kt +++ b/network/src/commonTest/kotlin/com/wire/kalium/model/FeatureConfigJson.kt @@ -132,7 +132,7 @@ object FeatureConfigJson { MLSConfigDTO(SupportedProtocolDTO.PROTEUS, listOf(SupportedProtocolDTO.PROTEUS), listOf(1), 1), FeatureFlagStatusDTO.ENABLED ), - FeatureConfigData.E2EI(E2EIConfigDTO("url", 0L), FeatureFlagStatusDTO.ENABLED), + FeatureConfigData.E2EI(E2EIConfigDTO("url", null, false, 0L), FeatureFlagStatusDTO.ENABLED), FeatureConfigData.MLSMigration( MLSMigrationConfigDTO(Instant.DISTANT_FUTURE, Instant.DISTANT_FUTURE), FeatureFlagStatusDTO.ENABLED From 5b0183445a86abbc2a52d55393075cdc206dade5 Mon Sep 17 00:00:00 2001 From: Boris Safonov Date: Wed, 5 Jun 2024 16:59:40 +0300 Subject: [PATCH 4/4] Trigger CI Signed-off-by: Boris Safonov