From 3722a45359b6a784d2adfc178f8b833ba9707795 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Thu, 17 Apr 2025 12:28:05 -0400 Subject: [PATCH] [PM-20305] Migrate BaseUrlInterceptor and BaseUrlInterceptors to `network` module (#5068) --- .../network/di/PlatformNetworkModule.kt | 10 ++- .../interceptor/BaseUrlInterceptors.kt | 44 ------------ .../datasource/network/retrofit/Retrofits.kt | 2 +- .../network/retrofit/RetrofitsImpl.kt | 4 +- .../platform/provider/BaseUrlsProviderImpl.kt | 34 +++++++++ .../provider/di/PlatformProvidersModule.kt | 25 +++++++ .../network/retrofit/RetrofitsTest.kt | 2 +- .../manager/provider/BaseUrlsProviderTest.kt | 69 +++++++++++++++++++ .../network/di/PlatformNetworkModule.kt | 10 ++- .../network/interceptor/BaseUrlInterceptor.kt | 58 ---------------- .../interceptor/BaseUrlInterceptors.kt | 33 --------- .../datasource/network/retrofit/Retrofits.kt | 2 +- .../network/retrofit/RetrofitsImpl.kt | 6 +- .../platform/provider/BaseUrlsProviderImpl.kt | 23 +++++++ .../provider/di/PlatformProviderModule.kt | 21 ++++++ .../interceptor/BaseUrlInterceptorTest.kt | 37 ---------- .../interceptor/BaseUrlInterceptorsTest.kt | 69 ------------------- .../network/retrofit/RetrofitsTest.kt | 2 +- .../network/interceptor/BaseUrlInterceptor.kt | 2 +- .../interceptor/BaseUrlInterceptors.kt | 35 ++++++++++ .../network/interceptor/BaseUrlsProvider.kt | 21 ++++++ .../interceptor/BaseUrlInterceptorTest.kt | 3 +- 22 files changed, 257 insertions(+), 255 deletions(-) delete mode 100644 app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt create mode 100644 app/src/main/java/com/x8bit/bitwarden/data/platform/provider/BaseUrlsProviderImpl.kt create mode 100644 app/src/main/java/com/x8bit/bitwarden/data/platform/provider/di/PlatformProvidersModule.kt create mode 100644 app/src/test/java/com/x8bit/bitwarden/data/platform/manager/provider/BaseUrlsProviderTest.kt delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt delete mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt create mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/BaseUrlsProviderImpl.kt create mode 100644 authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/di/PlatformProviderModule.kt delete mode 100644 authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt delete mode 100644 authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorsTest.kt rename {app/src/main/java/com/x8bit/bitwarden/data/platform/datasource => network/src/main/kotlin/com/bitwarden}/network/interceptor/BaseUrlInterceptor.kt (94%) create mode 100644 network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptors.kt create mode 100644 network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlsProvider.kt rename {app/src/test/java/com/x8bit/bitwarden/data/platform/datasource => network/src/test/kotlin/com/bitwarden}/network/interceptor/BaseUrlInterceptorTest.kt (90%) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/di/PlatformNetworkModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/di/PlatformNetworkModule.kt index 2e82f00fa8..a5bfd18d9e 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/di/PlatformNetworkModule.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/di/PlatformNetworkModule.kt @@ -1,6 +1,8 @@ package com.x8bit.bitwarden.data.platform.datasource.network.di import com.bitwarden.network.interceptor.AuthTokenInterceptor +import com.bitwarden.network.interceptor.BaseUrlInterceptors +import com.bitwarden.network.interceptor.BaseUrlsProvider import com.bitwarden.network.interceptor.HeadersInterceptor import com.bitwarden.network.service.ConfigService import com.bitwarden.network.service.ConfigServiceImpl @@ -11,7 +13,6 @@ import com.bitwarden.network.service.PushServiceImpl import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource import com.x8bit.bitwarden.data.auth.manager.AuthTokenManager import com.x8bit.bitwarden.data.platform.datasource.network.authenticator.RefreshAuthenticator -import com.x8bit.bitwarden.data.platform.datasource.network.interceptor.BaseUrlInterceptors import com.x8bit.bitwarden.data.platform.datasource.network.retrofit.Retrofits import com.x8bit.bitwarden.data.platform.datasource.network.retrofit.RetrofitsImpl import com.x8bit.bitwarden.data.platform.datasource.network.ssl.SslManager @@ -92,6 +93,13 @@ object PlatformNetworkModule { environmentRepository = environmentRepository, ) + @Provides + @Singleton + fun providesBaseUrlInterceptors( + baseUrlsProvider: BaseUrlsProvider, + ): BaseUrlInterceptors = + BaseUrlInterceptors(baseUrlsProvider = baseUrlsProvider) + @Provides @Singleton fun provideRetrofits( diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt deleted file mode 100644 index 8f111e5217..0000000000 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.x8bit.bitwarden.data.platform.datasource.network.interceptor - -import com.bitwarden.core.annotation.OmitFromCoverage -import com.bitwarden.data.repository.model.Environment -import com.bitwarden.data.repository.util.baseApiUrl -import com.bitwarden.data.repository.util.baseEventsUrl -import com.bitwarden.data.repository.util.baseIdentityUrl -import com.bitwarden.data.repository.util.toEnvironmentUrlsOrDefault -import com.x8bit.bitwarden.data.platform.datasource.disk.EnvironmentDiskSource -import javax.inject.Inject -import javax.inject.Singleton - -/** - * An overall container for various [BaseUrlInterceptor] implementations for different API groups. - */ -@OmitFromCoverage -@Singleton -class BaseUrlInterceptors @Inject constructor( - private val environmentDiskSource: EnvironmentDiskSource, -) { - private val environment: Environment - get() = environmentDiskSource.preAuthEnvironmentUrlData.toEnvironmentUrlsOrDefault() - - /** - * An interceptor for "/api" calls. - */ - val apiInterceptor: BaseUrlInterceptor = BaseUrlInterceptor { - environment.environmentUrlData.baseApiUrl - } - - /** - * An interceptor for "/identity" calls. - */ - val identityInterceptor: BaseUrlInterceptor = BaseUrlInterceptor { - environment.environmentUrlData.baseIdentityUrl - } - - /** - * An interceptor for "/events" calls. - */ - val eventsInterceptor: BaseUrlInterceptor = BaseUrlInterceptor { - environment.environmentUrlData.baseEventsUrl - } -} diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/Retrofits.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/Retrofits.kt index e5337ee271..f3671002ac 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/Retrofits.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/Retrofits.kt @@ -1,6 +1,6 @@ package com.x8bit.bitwarden.data.platform.datasource.network.retrofit -import com.x8bit.bitwarden.data.platform.datasource.network.interceptor.BaseUrlInterceptors +import com.bitwarden.network.interceptor.BaseUrlInterceptors import retrofit2.Retrofit import retrofit2.http.Url diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsImpl.kt index f17feb355f..911cf8d63d 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsImpl.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsImpl.kt @@ -2,11 +2,11 @@ package com.x8bit.bitwarden.data.platform.datasource.network.retrofit import com.bitwarden.network.core.NetworkResultCallAdapterFactory import com.bitwarden.network.interceptor.AuthTokenInterceptor +import com.bitwarden.network.interceptor.BaseUrlInterceptor +import com.bitwarden.network.interceptor.BaseUrlInterceptors import com.bitwarden.network.interceptor.HeadersInterceptor import com.bitwarden.network.util.HEADER_KEY_AUTHORIZATION import com.x8bit.bitwarden.data.platform.datasource.network.authenticator.RefreshAuthenticator -import com.x8bit.bitwarden.data.platform.datasource.network.interceptor.BaseUrlInterceptor -import com.x8bit.bitwarden.data.platform.datasource.network.interceptor.BaseUrlInterceptors import com.x8bit.bitwarden.data.platform.datasource.network.ssl.SslManager import com.x8bit.bitwarden.data.platform.util.isDevBuild import kotlinx.serialization.json.Json diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/provider/BaseUrlsProviderImpl.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/provider/BaseUrlsProviderImpl.kt new file mode 100644 index 0000000000..763279524b --- /dev/null +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/provider/BaseUrlsProviderImpl.kt @@ -0,0 +1,34 @@ +package com.x8bit.bitwarden.data.platform.provider + +import com.bitwarden.data.repository.util.baseApiUrl +import com.bitwarden.data.repository.util.baseEventsUrl +import com.bitwarden.data.repository.util.baseIdentityUrl +import com.bitwarden.data.repository.util.toEnvironmentUrlsOrDefault +import com.bitwarden.network.interceptor.BaseUrlsProvider +import com.x8bit.bitwarden.data.platform.datasource.disk.EnvironmentDiskSource + +/** + * The default implementation of [BaseUrlsProvider]. + */ +class BaseUrlsProviderImpl( + private val environmentDiskSource: EnvironmentDiskSource, +) : BaseUrlsProvider { + + override fun getBaseApiUrl(): String = environmentDiskSource + .preAuthEnvironmentUrlData + .toEnvironmentUrlsOrDefault() + .environmentUrlData + .baseApiUrl + + override fun getBaseIdentityUrl(): String = environmentDiskSource + .preAuthEnvironmentUrlData + .toEnvironmentUrlsOrDefault() + .environmentUrlData + .baseIdentityUrl + + override fun getBaseEventsUrl(): String = environmentDiskSource + .preAuthEnvironmentUrlData + .toEnvironmentUrlsOrDefault() + .environmentUrlData + .baseEventsUrl +} diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/provider/di/PlatformProvidersModule.kt b/app/src/main/java/com/x8bit/bitwarden/data/platform/provider/di/PlatformProvidersModule.kt new file mode 100644 index 0000000000..86d5f6bcae --- /dev/null +++ b/app/src/main/java/com/x8bit/bitwarden/data/platform/provider/di/PlatformProvidersModule.kt @@ -0,0 +1,25 @@ +package com.x8bit.bitwarden.data.platform.provider.di + +import com.bitwarden.network.interceptor.BaseUrlsProvider +import com.x8bit.bitwarden.data.platform.datasource.disk.EnvironmentDiskSource +import com.x8bit.bitwarden.data.platform.provider.BaseUrlsProviderImpl +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +/** + * This module initializes platform-specific "Provider" dependencies for the application. + */ +@Module +@InstallIn(SingletonComponent::class) +object PlatformProvidersModule { + + @Provides + @Singleton + fun provideBaseUrlsProvider( + environmentDiskSource: EnvironmentDiskSource, + ): BaseUrlsProvider = + BaseUrlsProviderImpl(environmentDiskSource = environmentDiskSource) +} diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsTest.kt index 6c3ad88ae4..5f15545516 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/retrofit/RetrofitsTest.kt @@ -1,10 +1,10 @@ package com.x8bit.bitwarden.data.platform.datasource.network.retrofit import com.bitwarden.network.interceptor.AuthTokenInterceptor +import com.bitwarden.network.interceptor.BaseUrlInterceptors import com.bitwarden.network.interceptor.HeadersInterceptor import com.bitwarden.network.model.NetworkResult import com.x8bit.bitwarden.data.platform.datasource.network.authenticator.RefreshAuthenticator -import com.x8bit.bitwarden.data.platform.datasource.network.interceptor.BaseUrlInterceptors import com.x8bit.bitwarden.data.platform.datasource.network.ssl.SslManager import com.x8bit.bitwarden.data.util.mockBuilder import io.mockk.every diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/provider/BaseUrlsProviderTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/provider/BaseUrlsProviderTest.kt new file mode 100644 index 0000000000..7d66600428 --- /dev/null +++ b/app/src/test/java/com/x8bit/bitwarden/data/platform/manager/provider/BaseUrlsProviderTest.kt @@ -0,0 +1,69 @@ +package com.x8bit.bitwarden.data.platform.manager.provider + +import com.bitwarden.data.repository.model.Environment +import com.x8bit.bitwarden.data.platform.datasource.disk.FakeEnvironmentDiskSource +import com.x8bit.bitwarden.data.platform.provider.BaseUrlsProviderImpl +import org.junit.jupiter.api.Assertions +import org.junit.jupiter.api.Test + +class BaseUrlsProviderTest { + + private val fakeEnvironmentDiskSource = FakeEnvironmentDiskSource() + private val baseUrlsManager = BaseUrlsProviderImpl( + environmentDiskSource = fakeEnvironmentDiskSource, + ) + + @Test + fun `getBaseApiUrl should return correct api URL when preAuthEnvironmentUrlData is set`() { + fakeEnvironmentDiskSource.preAuthEnvironmentUrlData = Environment.Eu.environmentUrlData + Assertions.assertEquals( + "https://vault.bitwarden.eu/api", + baseUrlsManager.getBaseApiUrl(), + ) + } + + @Test + fun `getBaseApiUrl should return default value when preAuthEnvironmentUrlData is null`() { + fakeEnvironmentDiskSource.preAuthEnvironmentUrlData = null + Assertions.assertEquals( + "https://vault.bitwarden.com/api", + baseUrlsManager.getBaseApiUrl(), + ) + } + + @Test + fun `getBaseIdentityUrl should return correct api URL when preAuthEnvironmentUrlData is set`() { + fakeEnvironmentDiskSource.preAuthEnvironmentUrlData = Environment.Eu.environmentUrlData + Assertions.assertEquals( + "https://vault.bitwarden.eu/identity", + baseUrlsManager.getBaseIdentityUrl(), + ) + } + + @Test + fun `getBaseIdentityUrl should return default value when preAuthEnvironmentUrlData is null`() { + fakeEnvironmentDiskSource.preAuthEnvironmentUrlData = null + Assertions.assertEquals( + "https://vault.bitwarden.com/identity", + baseUrlsManager.getBaseIdentityUrl(), + ) + } + + @Test + fun `getBaseEventsUrl should return correct api URL when preAuthEnvironmentUrlData is set`() { + fakeEnvironmentDiskSource.preAuthEnvironmentUrlData = Environment.Eu.environmentUrlData + Assertions.assertEquals( + "https://vault.bitwarden.eu/events", + baseUrlsManager.getBaseEventsUrl(), + ) + } + + @Test + fun `getBaseEventsUrl should return default value when preAuthEnvironmentUrlData is null`() { + fakeEnvironmentDiskSource.preAuthEnvironmentUrlData = null + Assertions.assertEquals( + "https://vault.bitwarden.com/events", + baseUrlsManager.getBaseEventsUrl(), + ) + } +} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/di/PlatformNetworkModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/di/PlatformNetworkModule.kt index a03b5e14a8..c8f8095e40 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/di/PlatformNetworkModule.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/di/PlatformNetworkModule.kt @@ -1,11 +1,12 @@ package com.bitwarden.authenticator.data.platform.datasource.network.di -import com.bitwarden.authenticator.data.platform.datasource.network.interceptor.BaseUrlInterceptors import com.bitwarden.authenticator.data.platform.datasource.network.retrofit.Retrofits import com.bitwarden.authenticator.data.platform.datasource.network.retrofit.RetrofitsImpl import com.bitwarden.authenticator.data.platform.datasource.network.util.HEADER_VALUE_CLIENT_NAME import com.bitwarden.authenticator.data.platform.datasource.network.util.HEADER_VALUE_CLIENT_VERSION import com.bitwarden.authenticator.data.platform.datasource.network.util.HEADER_VALUE_USER_AGENT +import com.bitwarden.network.interceptor.BaseUrlInterceptors +import com.bitwarden.network.interceptor.BaseUrlsProvider import com.bitwarden.network.interceptor.HeadersInterceptor import com.bitwarden.network.service.ConfigService import com.bitwarden.network.service.ConfigServiceImpl @@ -38,6 +39,13 @@ object PlatformNetworkModule { clientVersion = HEADER_VALUE_CLIENT_VERSION, ) + @Provides + @Singleton + fun providesBaseUrlInterceptors( + baseUrlsProvider: BaseUrlsProvider, + ): BaseUrlInterceptors = + BaseUrlInterceptors(baseUrlsProvider = baseUrlsProvider) + @Provides @Singleton fun provideRetrofits( diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt deleted file mode 100644 index 9b368ed793..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt +++ /dev/null @@ -1,58 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.network.interceptor - -import okhttp3.HttpUrl -import okhttp3.HttpUrl.Companion.toHttpUrlOrNull -import okhttp3.Interceptor -import okhttp3.Response - -/** - * A [Interceptor] that optionally takes the current base URL of a request and replaces it with - * the currently set [baseUrl] - */ -class BaseUrlInterceptor : Interceptor { - - /** - * The base URL to use as an override, or `null` if no override should be performed. - */ - var baseUrl: String? = null - set(value) { - field = value - baseHttpUrl = baseUrl?.let { requireNotNull(it.toHttpUrlOrNull()) } - } - - private var baseHttpUrl: HttpUrl? = null - - override fun intercept(chain: Interceptor.Chain): Response { - val request = chain.request() - - // If no base URL is set, we can simply skip - val base = baseHttpUrl ?: return chain.proceed(request) - - // Update the base URL used. - return chain.proceed( - request - .newBuilder() - .url( - request - .url - .replaceBaseUrlWith(base), - ) - .build(), - ) - } -} - -/** - * Given a [HttpUrl], replaces the existing base URL with the given [baseUrl]. - */ -private fun HttpUrl.replaceBaseUrlWith( - baseUrl: HttpUrl, -) = baseUrl - .newBuilder() - .addEncodedPathSegments( - this - .encodedPathSegments - .joinToString(separator = "/"), - ) - .encodedQuery(this.encodedQuery) - .build() diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt deleted file mode 100644 index ef00e02fe4..0000000000 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptors.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.network.interceptor - -import com.bitwarden.data.repository.model.Environment -import com.bitwarden.data.repository.util.baseApiUrl -import javax.inject.Inject -import javax.inject.Singleton - -/** - * An overall container for various [BaseUrlInterceptor] implementations for different API groups. - */ -@Singleton -class BaseUrlInterceptors @Inject constructor() { - var environment: Environment = Environment.Us - set(value) { - field = value - updateBaseUrls(environment = value) - } - - /** - * An interceptor for "/api" calls. - */ - val apiInterceptor: BaseUrlInterceptor = BaseUrlInterceptor() - - init { - // Ensure all interceptors begin with a default value - environment = Environment.Us - } - - private fun updateBaseUrls(environment: Environment) { - val environmentUrlData = environment.environmentUrlData - apiInterceptor.baseUrl = environmentUrlData.baseApiUrl - } -} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/Retrofits.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/Retrofits.kt index a9685ea885..c272a54703 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/Retrofits.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/Retrofits.kt @@ -1,6 +1,6 @@ package com.bitwarden.authenticator.data.platform.datasource.network.retrofit -import com.bitwarden.authenticator.data.platform.datasource.network.interceptor.BaseUrlInterceptors +import com.bitwarden.network.interceptor.BaseUrlInterceptors import retrofit2.Retrofit import retrofit2.http.Url diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsImpl.kt index 26d54589ef..fda261cb0e 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsImpl.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsImpl.kt @@ -1,9 +1,9 @@ package com.bitwarden.authenticator.data.platform.datasource.network.retrofit -import com.bitwarden.authenticator.data.platform.datasource.network.interceptor.BaseUrlInterceptor -import com.bitwarden.authenticator.data.platform.datasource.network.interceptor.BaseUrlInterceptors -import com.bitwarden.network.interceptor.HeadersInterceptor import com.bitwarden.network.core.NetworkResultCallAdapterFactory +import com.bitwarden.network.interceptor.BaseUrlInterceptor +import com.bitwarden.network.interceptor.BaseUrlInterceptors +import com.bitwarden.network.interceptor.HeadersInterceptor import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/BaseUrlsProviderImpl.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/BaseUrlsProviderImpl.kt new file mode 100644 index 0000000000..08091183ec --- /dev/null +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/BaseUrlsProviderImpl.kt @@ -0,0 +1,23 @@ +package com.bitwarden.authenticator.data.platform.provider + +import com.bitwarden.core.annotation.OmitFromCoverage +import com.bitwarden.data.repository.model.Environment +import com.bitwarden.data.repository.util.baseApiUrl +import com.bitwarden.data.repository.util.baseEventsUrl +import com.bitwarden.data.repository.util.baseIdentityUrl +import com.bitwarden.network.interceptor.BaseUrlsProvider + +/** + * Default implementation of [BaseUrlsProvider]. + */ +@OmitFromCoverage +object BaseUrlsProviderImpl : BaseUrlsProvider { + override fun getBaseApiUrl(): String = + Environment.Us.environmentUrlData.baseApiUrl + + override fun getBaseIdentityUrl(): String = + Environment.Us.environmentUrlData.baseIdentityUrl + + override fun getBaseEventsUrl(): String = + Environment.Us.environmentUrlData.baseEventsUrl +} diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/di/PlatformProviderModule.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/di/PlatformProviderModule.kt new file mode 100644 index 0000000000..893301ed26 --- /dev/null +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/data/platform/provider/di/PlatformProviderModule.kt @@ -0,0 +1,21 @@ +package com.bitwarden.authenticator.data.platform.provider.di + +import com.bitwarden.authenticator.data.platform.provider.BaseUrlsProviderImpl +import com.bitwarden.network.interceptor.BaseUrlsProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +/** + * Module responsible for providing platform provider dependencies. + */ +@Module +@InstallIn(SingletonComponent::class) +object PlatformProviderModule { + + @Provides + @Singleton + fun provideBaseUrlsProvider(): BaseUrlsProvider = BaseUrlsProviderImpl +} diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt deleted file mode 100644 index b972c3383a..0000000000 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.network.interceptor - -import com.bitwarden.network.interceptor.FakeInterceptorChain -import okhttp3.Request -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertNotEquals -import org.junit.jupiter.api.Test - -class BaseUrlInterceptorTest { - private val baseUrlInterceptor = BaseUrlInterceptor() - - @Test - fun `intercept with a null base URL should proceed with the original request`() { - val request = Request.Builder().url("http://www.fake.com/").build() - val chain = FakeInterceptorChain(request) - - val response = baseUrlInterceptor.intercept(chain) - - assertEquals(request, response.request) - assertEquals("http", response.request.url.scheme) - assertEquals("www.fake.com", response.request.url.host) - } - - @Test - fun `intercept with a non-null base URL should update the base URL used by the request`() { - baseUrlInterceptor.baseUrl = "https://api.bitwarden.com" - - val request = Request.Builder().url("http://www.fake.com/").build() - val chain = FakeInterceptorChain(request) - - val response = baseUrlInterceptor.intercept(chain) - - assertNotEquals(request, response.request) - assertEquals("https", response.request.url.scheme) - assertEquals("api.bitwarden.com", response.request.url.host) - } -} diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorsTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorsTest.kt deleted file mode 100644 index 220237a1a9..0000000000 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/interceptor/BaseUrlInterceptorsTest.kt +++ /dev/null @@ -1,69 +0,0 @@ -package com.bitwarden.authenticator.data.platform.datasource.network.interceptor - -import com.bitwarden.data.datasource.disk.model.EnvironmentUrlDataJson -import com.bitwarden.data.repository.model.Environment -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test - -class BaseUrlInterceptorsTest { - private val baseUrlInterceptors = BaseUrlInterceptors() - - @Test - fun `the default environment should be US and all interceptors should have the correct URLs`() { - assertEquals( - Environment.Us, - baseUrlInterceptors.environment, - ) - assertEquals( - "https://vault.bitwarden.com/api", - baseUrlInterceptors.apiInterceptor.baseUrl, - ) - } - - @Suppress("MaxLineLength") - @Test - fun `setting the environment should update all the interceptors correctly for a non-blank base URL`() { - baseUrlInterceptors.environment = Environment.Eu - - assertEquals( - "https://vault.bitwarden.eu/api", - baseUrlInterceptors.apiInterceptor.baseUrl, - ) - } - - @Suppress("MaxLineLength") - @Test - fun `setting the environment should update all the interceptors correctly for a blank base URL and all URLs filled`() { - baseUrlInterceptors.environment = Environment.SelfHosted( - environmentUrlData = EnvironmentUrlDataJson( - base = " ", - api = "https://api.com", - identity = "https://identity.com", - events = "https://events.com", - ), - ) - - assertEquals( - "https://api.com", - baseUrlInterceptors.apiInterceptor.baseUrl, - ) - } - - @Suppress("MaxLineLength") - @Test - fun `setting the environment should update all the interceptors correctly for a blank base URL and some or all URLs absent`() { - baseUrlInterceptors.environment = Environment.SelfHosted( - environmentUrlData = EnvironmentUrlDataJson( - base = " ", - api = "", - identity = "", - icon = " ", - ), - ) - - assertEquals( - "https://api.bitwarden.com", - baseUrlInterceptors.apiInterceptor.baseUrl, - ) - } -} diff --git a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsTest.kt b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsTest.kt index 46373cecca..c47ec6522b 100644 --- a/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsTest.kt +++ b/authenticator/src/test/java/com/bitwarden/authenticator/data/platform/datasource/network/retrofit/RetrofitsTest.kt @@ -1,6 +1,6 @@ package com.bitwarden.authenticator.data.platform.datasource.network.retrofit -import com.bitwarden.authenticator.data.platform.datasource.network.interceptor.BaseUrlInterceptors +import com.bitwarden.network.interceptor.BaseUrlInterceptors import com.bitwarden.network.interceptor.HeadersInterceptor import com.bitwarden.network.model.NetworkResult import io.mockk.every diff --git a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt b/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptor.kt similarity index 94% rename from app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt rename to network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptor.kt index 04e4e74523..34216683b7 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptor.kt +++ b/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptor.kt @@ -1,4 +1,4 @@ -package com.x8bit.bitwarden.data.platform.datasource.network.interceptor +package com.bitwarden.network.interceptor import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrlOrNull diff --git a/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptors.kt b/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptors.kt new file mode 100644 index 0000000000..2b7d8b0b41 --- /dev/null +++ b/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptors.kt @@ -0,0 +1,35 @@ +package com.bitwarden.network.interceptor + +import com.bitwarden.core.annotation.OmitFromCoverage +import javax.inject.Inject +import javax.inject.Singleton + +/** + * An overall container for various [BaseUrlInterceptor] implementations for different API groups. + */ +@OmitFromCoverage +@Singleton +class BaseUrlInterceptors @Inject constructor( + private val baseUrlsProvider: BaseUrlsProvider, +) { + /** + * An interceptor for "/api" calls. + */ + val apiInterceptor: BaseUrlInterceptor = BaseUrlInterceptor { + baseUrlsProvider.getBaseApiUrl() + } + + /** + * An interceptor for "/identity" calls. + */ + val identityInterceptor: BaseUrlInterceptor = BaseUrlInterceptor { + baseUrlsProvider.getBaseIdentityUrl() + } + + /** + * An interceptor for "/events" calls. + */ + val eventsInterceptor: BaseUrlInterceptor = BaseUrlInterceptor { + baseUrlsProvider.getBaseEventsUrl() + } +} diff --git a/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlsProvider.kt b/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlsProvider.kt new file mode 100644 index 0000000000..9cbca4d38d --- /dev/null +++ b/network/src/main/kotlin/com/bitwarden/network/interceptor/BaseUrlsProvider.kt @@ -0,0 +1,21 @@ +package com.bitwarden.network.interceptor + +/** + * Provides base URLs for different API groups. + */ +interface BaseUrlsProvider { + /** + * Gets the base URL for "/api" calls. + */ + fun getBaseApiUrl(): String + + /** + * Gets the base URL for "/identity" calls. + */ + fun getBaseIdentityUrl(): String + + /** + * Gets the base URL for "/events" calls. + */ + fun getBaseEventsUrl(): String +} diff --git a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt b/network/src/test/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptorTest.kt similarity index 90% rename from app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt rename to network/src/test/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptorTest.kt index 766467c244..c9b917b1f6 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/platform/datasource/network/interceptor/BaseUrlInterceptorTest.kt +++ b/network/src/test/kotlin/com/bitwarden/network/interceptor/BaseUrlInterceptorTest.kt @@ -1,6 +1,5 @@ -package com.x8bit.bitwarden.data.platform.datasource.network.interceptor +package com.bitwarden.network.interceptor -import com.bitwarden.network.interceptor.FakeInterceptorChain import okhttp3.Request import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertNotEquals