Skip to content

Commit 9d7df2b

Browse files
authored
[PM-19862] Migrate UnauthenticatedIdentityApi to the network module (#5017)
1 parent cb05787 commit 9d7df2b

File tree

49 files changed

+170
-164
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+170
-164
lines changed

app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/disk/model/AccountJson.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.x8bit.bitwarden.data.auth.datasource.disk.model
22

33
import com.bitwarden.network.model.KdfTypeJson
4-
import com.x8bit.bitwarden.data.auth.datasource.network.model.UserDecryptionOptionsJson
4+
import com.bitwarden.network.model.UserDecryptionOptionsJson
55
import kotlinx.serialization.Contextual
66
import kotlinx.serialization.ExperimentalSerializationApi
77
import kotlinx.serialization.SerialName

app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/IdentityService.kt

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package com.x8bit.bitwarden.data.auth.datasource.network.service
22

3+
import com.bitwarden.network.model.GetTokenResponseJson
4+
import com.bitwarden.network.model.PreLoginResponseJson
5+
import com.bitwarden.network.model.PrevalidateSsoResponseJson
6+
import com.bitwarden.network.model.RefreshTokenResponseJson
7+
import com.bitwarden.network.model.RegisterFinishRequestJson
38
import com.bitwarden.network.model.RegisterRequestJson
4-
import com.x8bit.bitwarden.data.auth.datasource.network.model.GetTokenResponseJson
9+
import com.bitwarden.network.model.RegisterResponseJson
10+
import com.bitwarden.network.model.SendVerificationEmailRequestJson
11+
import com.bitwarden.network.model.VerifyEmailTokenRequestJson
512
import com.x8bit.bitwarden.data.auth.datasource.network.model.IdentityTokenAuthModel
6-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PreLoginResponseJson
7-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PrevalidateSsoResponseJson
8-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RefreshTokenResponseJson
9-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RegisterFinishRequestJson
10-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RegisterResponseJson
11-
import com.x8bit.bitwarden.data.auth.datasource.network.model.SendVerificationEmailRequestJson
1213
import com.x8bit.bitwarden.data.auth.datasource.network.model.SendVerificationEmailResponseJson
1314
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorDataModel
14-
import com.x8bit.bitwarden.data.auth.datasource.network.model.VerifyEmailTokenRequestJson
1515
import com.x8bit.bitwarden.data.auth.datasource.network.model.VerifyEmailTokenResponseJson
1616

1717
/**

app/src/main/java/com/x8bit/bitwarden/data/auth/datasource/network/service/IdentityServiceImpl.kt

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,25 @@
11
package com.x8bit.bitwarden.data.auth.datasource.network.service
22

3+
import com.bitwarden.network.api.UnauthenticatedIdentityApi
4+
import com.bitwarden.network.model.GetTokenResponseJson
5+
import com.bitwarden.network.model.PreLoginRequestJson
6+
import com.bitwarden.network.model.PreLoginResponseJson
7+
import com.bitwarden.network.model.PrevalidateSsoResponseJson
8+
import com.bitwarden.network.model.RefreshTokenResponseJson
9+
import com.bitwarden.network.model.RegisterFinishRequestJson
310
import com.bitwarden.network.model.RegisterRequestJson
11+
import com.bitwarden.network.model.RegisterResponseJson
12+
import com.bitwarden.network.model.SendVerificationEmailRequestJson
13+
import com.bitwarden.network.model.VerifyEmailTokenRequestJson
414
import com.bitwarden.network.model.toBitwardenError
515
import com.bitwarden.network.util.NetworkErrorCode
616
import com.bitwarden.network.util.base64UrlEncode
717
import com.bitwarden.network.util.executeForNetworkResult
818
import com.bitwarden.network.util.parseErrorBodyOrNull
919
import com.bitwarden.network.util.toResult
10-
import com.x8bit.bitwarden.data.auth.datasource.network.api.UnauthenticatedIdentityApi
11-
import com.x8bit.bitwarden.data.auth.datasource.network.model.GetTokenResponseJson
1220
import com.x8bit.bitwarden.data.auth.datasource.network.model.IdentityTokenAuthModel
13-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PreLoginRequestJson
14-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PreLoginResponseJson
15-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PrevalidateSsoResponseJson
16-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RefreshTokenResponseJson
17-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RegisterFinishRequestJson
18-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RegisterResponseJson
19-
import com.x8bit.bitwarden.data.auth.datasource.network.model.SendVerificationEmailRequestJson
2021
import com.x8bit.bitwarden.data.auth.datasource.network.model.SendVerificationEmailResponseJson
2122
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorDataModel
22-
import com.x8bit.bitwarden.data.auth.datasource.network.model.VerifyEmailTokenRequestJson
2323
import com.x8bit.bitwarden.data.auth.datasource.network.model.VerifyEmailTokenResponseJson
2424
import com.x8bit.bitwarden.data.platform.util.DeviceModelProvider
2525
import kotlinx.serialization.json.Json

app/src/main/java/com/x8bit/bitwarden/data/auth/manager/util/TrustDeviceResponseExtensions.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.x8bit.bitwarden.data.auth.manager.util
22

33
import com.bitwarden.crypto.TrustDeviceResponse
4+
import com.bitwarden.network.model.TrustedDeviceUserDecryptionOptionsJson
5+
import com.bitwarden.network.model.UserDecryptionOptionsJson
46
import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson
5-
import com.x8bit.bitwarden.data.auth.datasource.network.model.TrustedDeviceUserDecryptionOptionsJson
6-
import com.x8bit.bitwarden.data.auth.datasource.network.model.UserDecryptionOptionsJson
77

88
/**
99
* Converts the given [TrustDeviceResponse] to an updated [UserStateJson], given the following

app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepository.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.x8bit.bitwarden.data.auth.repository
22

3+
import com.bitwarden.network.model.GetTokenResponseJson
34
import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason
45
import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus
5-
import com.x8bit.bitwarden.data.auth.datasource.network.model.GetTokenResponseJson
66
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorDataModel
77
import com.x8bit.bitwarden.data.auth.manager.AuthRequestManager
88
import com.x8bit.bitwarden.data.auth.repository.model.AuthState

app/src/main/java/com/x8bit/bitwarden/data/auth/repository/AuthRepositoryImpl.kt

+32-25
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,20 @@ import com.bitwarden.crypto.HashPurpose
1010
import com.bitwarden.crypto.Kdf
1111
import com.bitwarden.data.datasource.disk.ConfigDiskSource
1212
import com.bitwarden.data.manager.DispatcherManager
13+
import com.bitwarden.network.model.GetTokenResponseJson
14+
import com.bitwarden.network.model.PrevalidateSsoResponseJson
15+
import com.bitwarden.network.model.RefreshTokenResponseJson
16+
import com.bitwarden.network.model.RegisterFinishRequestJson
1317
import com.bitwarden.network.model.RegisterRequestJson
18+
import com.bitwarden.network.model.RegisterResponseJson
1419
import com.bitwarden.network.model.ResendEmailRequestJson
1520
import com.bitwarden.network.model.ResendNewDeviceOtpRequestJson
1621
import com.bitwarden.network.model.ResetPasswordRequestJson
22+
import com.bitwarden.network.model.SendVerificationEmailRequestJson
1723
import com.bitwarden.network.model.SetPasswordRequestJson
24+
import com.bitwarden.network.model.TrustedDeviceUserDecryptionOptionsJson
25+
import com.bitwarden.network.model.TwoFactorAuthMethod
26+
import com.bitwarden.network.model.VerifyEmailTokenRequestJson
1827
import com.bitwarden.network.util.isSslHandShakeError
1928
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
2029
import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson
@@ -24,19 +33,10 @@ import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus
2433
import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson
2534
import com.x8bit.bitwarden.data.auth.datasource.network.model.DeleteAccountResponseJson
2635
import com.x8bit.bitwarden.data.auth.datasource.network.model.DeviceDataModel
27-
import com.x8bit.bitwarden.data.auth.datasource.network.model.GetTokenResponseJson
2836
import com.x8bit.bitwarden.data.auth.datasource.network.model.IdentityTokenAuthModel
2937
import com.x8bit.bitwarden.data.auth.datasource.network.model.PasswordHintResponseJson
30-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PrevalidateSsoResponseJson
31-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RefreshTokenResponseJson
32-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RegisterFinishRequestJson
33-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RegisterResponseJson
34-
import com.x8bit.bitwarden.data.auth.datasource.network.model.SendVerificationEmailRequestJson
3538
import com.x8bit.bitwarden.data.auth.datasource.network.model.SendVerificationEmailResponseJson
36-
import com.x8bit.bitwarden.data.auth.datasource.network.model.TrustedDeviceUserDecryptionOptionsJson
37-
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorAuthMethod
3839
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorDataModel
39-
import com.x8bit.bitwarden.data.auth.datasource.network.model.VerifyEmailTokenRequestJson
4040
import com.x8bit.bitwarden.data.auth.datasource.network.model.VerifyEmailTokenResponseJson
4141
import com.x8bit.bitwarden.data.auth.datasource.network.service.AccountsService
4242
import com.x8bit.bitwarden.data.auth.datasource.network.service.DevicesService
@@ -1209,18 +1209,19 @@ class AuthRepositoryImpl(
12091209
organizationIdentifier = organizationIdentifier,
12101210
)
12111211
.fold(
1212-
onSuccess = {
1213-
when (it) {
1212+
onSuccess = { response ->
1213+
when (response) {
12141214
is PrevalidateSsoResponseJson.Error -> {
1215-
PrevalidateSsoResult.Failure(message = it.message, error = null)
1215+
PrevalidateSsoResult.Failure(message = response.message, error = null)
12161216
}
12171217

12181218
is PrevalidateSsoResponseJson.Success -> {
1219-
if (it.token.isNullOrBlank()) {
1220-
PrevalidateSsoResult.Failure(error = MissingPropertyException("Token"))
1221-
} else {
1222-
PrevalidateSsoResult.Success(token = it.token)
1223-
}
1219+
response.token
1220+
?.takeUnless { it.isBlank() }
1221+
?.let { PrevalidateSsoResult.Success(token = it) }
1222+
?: PrevalidateSsoResult.Failure(
1223+
error = MissingPropertyException("Token"),
1224+
)
12241225
}
12251226
}
12261227
},
@@ -1790,17 +1791,20 @@ class AuthRepositoryImpl(
17901791
/**
17911792
* Attempt to unlock the current user's vault with key connector data.
17921793
*/
1794+
@Suppress("LongMethod")
17931795
private suspend fun unlockVaultWithKeyConnectorOnLoginSuccess(
17941796
profile: AccountJson.Profile,
17951797
keyConnectorUrl: String,
17961798
orgIdentifier: String,
17971799
loginResponse: GetTokenResponseJson.Success,
1798-
): VaultUnlockResult? =
1799-
if (loginResponse.userDecryptionOptions?.hasMasterPassword != false) {
1800+
): VaultUnlockResult? {
1801+
val key = loginResponse.key
1802+
val privateKey = loginResponse.privateKey
1803+
return if (loginResponse.userDecryptionOptions?.hasMasterPassword != false) {
18001804
// This user has a master password, so we skip the key-connector logic as it is not
18011805
// setup yet. The user can still unlock the vault with their master password.
18021806
null
1803-
} else if (loginResponse.key != null && loginResponse.privateKey != null) {
1807+
} else if (key != null && privateKey != null) {
18041808
// This is a returning user who should already have the key connector setup
18051809
keyConnectorManager
18061810
.getMasterKeyFromKeyConnector(
@@ -1810,10 +1814,10 @@ class AuthRepositoryImpl(
18101814
.map {
18111815
unlockVault(
18121816
accountProfile = profile,
1813-
privateKey = loginResponse.privateKey,
1817+
privateKey = privateKey,
18141818
initUserCryptoMethod = InitUserCryptoMethod.KeyConnector(
18151819
masterKey = it.masterKey,
1816-
userKey = loginResponse.key,
1820+
userKey = key,
18171821
),
18181822
)
18191823
}
@@ -1863,6 +1867,7 @@ class AuthRepositoryImpl(
18631867
onSuccess = { it },
18641868
)
18651869
}
1870+
}
18661871

18671872
/**
18681873
* Attempt to unlock the current user's vault with password data.
@@ -1896,19 +1901,21 @@ class AuthRepositoryImpl(
18961901
): VaultUnlockResult? {
18971902
// Attempt to unlock the vault with auth request if possible.
18981903
// These values will only be null during the Just-in-Time provisioning flow.
1899-
if (loginResponse.privateKey != null && loginResponse.key != null) {
1904+
val privateKey = loginResponse.privateKey
1905+
val key = loginResponse.key
1906+
if (privateKey != null && key != null) {
19001907
deviceData?.let { model ->
19011908
return unlockVault(
19021909
accountProfile = profile,
1903-
privateKey = loginResponse.privateKey,
1910+
privateKey = privateKey,
19041911
initUserCryptoMethod = InitUserCryptoMethod.AuthRequest(
19051912
requestPrivateKey = model.privateKey,
19061913
method = model
19071914
.masterPasswordHash
19081915
?.let {
19091916
AuthRequestMethod.MasterKey(
19101917
protectedMasterKey = model.asymmetricalKey,
1911-
authRequestKey = loginResponse.key,
1918+
authRequestKey = key,
19121919
)
19131920
}
19141921
?: AuthRequestMethod.UserKey(protectedUserKey = model.asymmetricalKey),

app/src/main/java/com/x8bit/bitwarden/data/auth/repository/util/GetTokenResponseExtensions.kt

+12-9
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.x8bit.bitwarden.data.auth.repository.util
22

3+
import com.bitwarden.network.model.GetTokenResponseJson
34
import com.x8bit.bitwarden.data.auth.datasource.disk.model.AccountJson
45
import com.x8bit.bitwarden.data.auth.datasource.disk.model.EnvironmentUrlDataJson
56
import com.x8bit.bitwarden.data.auth.datasource.disk.model.ForcePasswordResetReason
67
import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson
7-
import com.x8bit.bitwarden.data.auth.datasource.network.model.GetTokenResponseJson
88

99
/**
1010
* Converts the given [GetTokenResponseJson.Success] to a [UserStateJson], given the following
@@ -67,13 +67,16 @@ fun GetTokenResponseJson.Success.toUserState(
6767
private fun GetTokenResponseJson.Success.toForcePasswordResetReason(): ForcePasswordResetReason? =
6868
this
6969
.userDecryptionOptions
70-
?.trustedDeviceUserDecryptionOptions
71-
?.let { options ->
72-
ForcePasswordResetReason.TDE_USER_WITHOUT_PASSWORD_HAS_PASSWORD_RESET_PERMISSION
73-
.takeIf {
74-
!this.userDecryptionOptions.hasMasterPassword &&
75-
options.hasManageResetPasswordPermission
70+
?.let { decryptionOptionsJson ->
71+
decryptionOptionsJson
72+
.trustedDeviceUserDecryptionOptions
73+
?.let { options ->
74+
ForcePasswordResetReason.TDE_USER_WITHOUT_PASSWORD_HAS_PASSWORD_RESET_PERMISSION
75+
.takeIf {
76+
!decryptionOptionsJson.hasMasterPassword &&
77+
options.hasManageResetPasswordPermission
78+
}
7679
}
80+
?: ForcePasswordResetReason.ADMIN_FORCE_PASSWORD_RESET
81+
.takeIf { this.shouldForcePasswordReset }
7782
}
78-
?: ForcePasswordResetReason.ADMIN_FORCE_PASSWORD_RESET
79-
.takeIf { this.shouldForcePasswordReset }

app/src/main/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.x8bit.bitwarden.data.auth.repository.util
22

3+
import com.bitwarden.network.model.UserDecryptionOptionsJson
34
import com.x8bit.bitwarden.data.auth.datasource.disk.model.OnboardingStatus
45
import com.x8bit.bitwarden.data.auth.datasource.disk.model.UserStateJson
5-
import com.x8bit.bitwarden.data.auth.datasource.network.model.UserDecryptionOptionsJson
66
import com.x8bit.bitwarden.data.auth.repository.model.UserAccountTokens
77
import com.x8bit.bitwarden.data.auth.repository.model.UserKeyConnectorState
88
import com.x8bit.bitwarden.data.auth.repository.model.UserOrganizations

app/src/main/java/com/x8bit/bitwarden/data/auth/util/KdfParamsExtensions.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.x8bit.bitwarden.data.auth.util
22

33
import com.bitwarden.crypto.Kdf
4-
import com.x8bit.bitwarden.data.auth.datasource.network.model.PreLoginResponseJson
4+
import com.bitwarden.network.model.PreLoginResponseJson
55

66
/**
77
* Convert [PreLoginResponseJson.KdfParams] to [Kdf] params for use with Bitwarden SDK.

app/src/main/java/com/x8bit/bitwarden/data/platform/datasource/network/authenticator/AuthenticatorProvider.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.x8bit.bitwarden.data.platform.datasource.network.authenticator
22

3-
import com.x8bit.bitwarden.data.auth.datasource.network.model.RefreshTokenResponseJson
3+
import com.bitwarden.network.model.RefreshTokenResponseJson
44
import com.x8bit.bitwarden.data.auth.repository.model.LogoutReason
55

66
/**

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginScreen.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ import androidx.compose.ui.unit.dp
3737
import androidx.hilt.navigation.compose.hiltViewModel
3838
import androidx.lifecycle.Lifecycle
3939
import androidx.lifecycle.compose.collectAsStateWithLifecycle
40+
import com.bitwarden.network.model.TwoFactorAuthMethod
41+
import com.bitwarden.ui.util.asText
4042
import com.x8bit.bitwarden.R
41-
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorAuthMethod
4243
import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.description
4344
import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.title
4445
import com.x8bit.bitwarden.ui.platform.base.util.EventsEffect
4546
import com.x8bit.bitwarden.ui.platform.base.util.LivecycleEventEffect
46-
import com.bitwarden.ui.util.asText
4747
import com.x8bit.bitwarden.ui.platform.base.util.standardHorizontalMargin
4848
import com.x8bit.bitwarden.ui.platform.components.appbar.BitwardenTopAppBar
4949
import com.x8bit.bitwarden.ui.platform.components.appbar.action.BitwardenOverflowActionItem

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/TwoFactorLoginViewModel.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import androidx.annotation.DrawableRes
66
import androidx.core.net.toUri
77
import androidx.lifecycle.SavedStateHandle
88
import androidx.lifecycle.viewModelScope
9+
import com.bitwarden.network.model.TwoFactorAuthMethod
10+
import com.bitwarden.network.util.availableAuthMethods
11+
import com.bitwarden.network.util.preferredAuthMethod
12+
import com.bitwarden.network.util.twoFactorDisplayEmail
13+
import com.bitwarden.network.util.twoFactorDuoAuthUrl
14+
import com.bitwarden.ui.util.Text
15+
import com.bitwarden.ui.util.asText
916
import com.x8bit.bitwarden.R
10-
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorAuthMethod
1117
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorDataModel
12-
import com.x8bit.bitwarden.data.auth.datasource.network.util.availableAuthMethods
13-
import com.x8bit.bitwarden.data.auth.datasource.network.util.preferredAuthMethod
14-
import com.x8bit.bitwarden.data.auth.datasource.network.util.twoFactorDisplayEmail
15-
import com.x8bit.bitwarden.data.auth.datasource.network.util.twoFactorDuoAuthUrl
1618
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
1719
import com.x8bit.bitwarden.data.auth.repository.model.LoginResult
1820
import com.x8bit.bitwarden.data.auth.repository.model.ResendEmailResult
@@ -30,8 +32,6 @@ import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.isContinueButtonE
3032
import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.shouldUseNfc
3133
import com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util.showPasswordInput
3234
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
33-
import com.bitwarden.ui.util.Text
34-
import com.bitwarden.ui.util.asText
3535
import com.x8bit.bitwarden.ui.platform.manager.resource.ResourceManager
3636
import dagger.hilt.android.lifecycle.HiltViewModel
3737
import kotlinx.coroutines.flow.launchIn

app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/twofactorlogin/util/TwoFactorAuthMethodExtensions.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.x8bit.bitwarden.ui.auth.feature.twofactorlogin.util
22

33
import androidx.annotation.DrawableRes
4-
import com.x8bit.bitwarden.R
5-
import com.x8bit.bitwarden.data.auth.datasource.network.model.TwoFactorAuthMethod
4+
import com.bitwarden.network.model.TwoFactorAuthMethod
65
import com.bitwarden.ui.util.Text
76
import com.bitwarden.ui.util.asText
87
import com.bitwarden.ui.util.concat
8+
import com.x8bit.bitwarden.R
99

1010
/**
1111
* Get the title for the given auth method.

0 commit comments

Comments
 (0)