Refactor PublicKeyCredentialCreationOptions (#3584)

This commit is contained in:
Patrick Honkonen 2024-07-19 15:08:54 -04:00 committed by GitHub
parent 1fdfbac7b7
commit 8a381d8682
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 84 additions and 84 deletions

View file

@ -1,10 +1,10 @@
package com.x8bit.bitwarden.data.autofill.fido2.manager
import com.bitwarden.vault.CipherView
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2ValidateOriginResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions
/**
* Responsible for managing FIDO 2 credential registration and authentication.
@ -25,11 +25,11 @@ interface Fido2CredentialManager {
): Fido2ValidateOriginResult
/**
* Attempt to extract FIDO 2 passkey creation options from the system [requestJson], or null.
* Attempt to extract FIDO 2 passkey attestation options from the system [requestJson], or null.
*/
fun getPasskeyCreateOptionsOrNull(
fun getPasskeyAttestationOptionsOrNull(
requestJson: String,
): PublicKeyCredentialCreationOptions?
): PasskeyAttestationOptions?
/**
* Register a new FIDO 2 credential to a users vault.

View file

@ -5,11 +5,11 @@ import com.bitwarden.fido.ClientData
import com.bitwarden.sdk.Fido2CredentialStore
import com.bitwarden.vault.CipherView
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.DigitalAssetLinkResponseJson
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.service.DigitalAssetLinkService
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2ValidateOriginResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions
import com.x8bit.bitwarden.data.platform.manager.AssetManager
import com.x8bit.bitwarden.data.platform.util.asFailure
import com.x8bit.bitwarden.data.platform.util.asSuccess
@ -93,11 +93,11 @@ class Fido2CredentialManagerImpl(
}
}
override fun getPasskeyCreateOptionsOrNull(
override fun getPasskeyAttestationOptionsOrNull(
requestJson: String,
): PublicKeyCredentialCreationOptions? =
): PasskeyAttestationOptions? =
try {
json.decodeFromString<PublicKeyCredentialCreationOptions>(requestJson)
json.decodeFromString<PasskeyAttestationOptions>(requestJson)
} catch (e: SerializationException) {
null
} catch (e: IllegalArgumentException) {
@ -194,7 +194,7 @@ class Fido2CredentialManagerImpl(
private fun String.getRpId(json: Json): Result<String> {
return try {
json
.decodeFromString<PublicKeyCredentialCreationOptions>(this)
.decodeFromString<PasskeyAttestationOptions>(this)
.relyingParty
.id
.asSuccess()

View file

@ -1,4 +1,4 @@
package com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model
package com.x8bit.bitwarden.data.autofill.fido2.model
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@ -7,7 +7,7 @@ import kotlinx.serialization.Serializable
* Models a FIDO 2 credential creation request options received from a Relying Party (RP).
*/
@Serializable
data class PublicKeyCredentialCreationOptions(
data class PasskeyAttestationOptions(
@SerialName("authenticatorSelection")
val authenticatorSelection: AuthenticatorSelectionCriteria,
@SerialName("challenge")

View file

@ -8,10 +8,10 @@ import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult
import com.x8bit.bitwarden.data.auth.repository.model.UserState
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.fido2.manager.Fido2CredentialManager
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials
import com.x8bit.bitwarden.data.platform.manager.PolicyManager
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager
@ -116,10 +116,10 @@ class VaultAddEditViewModel @Inject constructor(
.specialCircumstance
?.toFido2RequestOrNull()
val fido2CreationOptions = fido2CreationRequest
val fido2AttestationOptions = fido2CreationRequest
?.let { request ->
fido2CredentialManager
.getPasskeyCreateOptionsOrNull(request.requestJson)
.getPasskeyAttestationOptionsOrNull(request.requestJson)
}
val dialogState =
@ -142,7 +142,7 @@ class VaultAddEditViewModel @Inject constructor(
?.toDefaultAddTypeContent(isIndividualVaultDisabled)
?: fido2CreationRequest
?.toDefaultAddTypeContent(
creationOptions = fido2CreationOptions,
attestationOptions = fido2AttestationOptions,
isIndividualVaultDisabled = isIndividualVaultDisabled,
)
?: VaultAddEditState.ViewState.Content(
@ -157,8 +157,8 @@ class VaultAddEditViewModel @Inject constructor(
},
dialog = dialogState,
// Set special conditions for autofill and fido2 save
shouldShowCloseButton = autofillSaveItem == null && fido2CreationOptions == null,
shouldExitOnSave = autofillSaveItem != null || fido2CreationOptions != null,
shouldShowCloseButton = autofillSaveItem == null && fido2AttestationOptions == null,
shouldExitOnSave = autofillSaveItem != null || fido2AttestationOptions != null,
)
},
) {
@ -423,7 +423,7 @@ class VaultAddEditViewModel @Inject constructor(
}
val createOptions = fido2CredentialManager
.getPasskeyCreateOptionsOrNull(request.requestJson)
.getPasskeyAttestationOptionsOrNull(request.requestJson)
?: run {
showFido2ErrorDialog()
return

View file

@ -1,7 +1,7 @@
package com.x8bit.bitwarden.ui.vault.feature.addedit.util
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions
import com.x8bit.bitwarden.data.platform.util.toUriOrNull
import com.x8bit.bitwarden.ui.platform.base.util.toAndroidAppUriString
import com.x8bit.bitwarden.ui.vault.feature.addedit.VaultAddEditState
@ -13,7 +13,7 @@ import java.util.UUID
* [VaultAddEditState.ViewState.Content] during FIDO 2 credential creation.
*/
fun Fido2CredentialRequest.toDefaultAddTypeContent(
creationOptions: PublicKeyCredentialCreationOptions?,
attestationOptions: PasskeyAttestationOptions?,
isIndividualVaultDisabled: Boolean,
): VaultAddEditState.ViewState.Content {
@ -23,12 +23,12 @@ fun Fido2CredentialRequest.toDefaultAddTypeContent(
?: packageName
.toAndroidAppUriString()
val rpName = creationOptions
val rpName = attestationOptions
?.relyingParty
?.name
.orEmpty()
val username = creationOptions
val username = attestationOptions
?.user
?.name
.orEmpty()

View file

@ -8,11 +8,11 @@ import com.bitwarden.vault.CipherView
import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.fido2.manager.Fido2CredentialManager
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2ValidateOriginResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManager
import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData
import com.x8bit.bitwarden.data.autofill.util.isActiveWithFido2Credentials
@ -447,13 +447,13 @@ class VaultItemListingViewModel @Inject constructor(
credentialRequest: Fido2CredentialRequest,
cipherView: CipherView,
) {
val createOptions = fido2CredentialManager
.getPasskeyCreateOptionsOrNull(credentialRequest.requestJson)
val attestationOptions = fido2CredentialManager
.getPasskeyAttestationOptionsOrNull(credentialRequest.requestJson)
?: run {
showFido2ErrorDialog()
return
}
when (createOptions.authenticatorSelection.userVerification) {
when (attestationOptions.authenticatorSelection.userVerification) {
UserVerificationRequirement.DISCOURAGED -> {
registerFido2CredentialToCipher(
request = credentialRequest,

View file

@ -7,12 +7,12 @@ import androidx.credentials.provider.CallingAppInfo
import com.bitwarden.fido.ClientData
import com.bitwarden.sdk.Fido2CredentialStore
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.DigitalAssetLinkResponseJson
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.service.DigitalAssetLinkService
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2AttestationResponse
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2ValidateOriginResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions
import com.x8bit.bitwarden.data.autofill.fido2.model.createMockFido2CredentialRequest
import com.x8bit.bitwarden.data.platform.manager.AssetManager
import com.x8bit.bitwarden.data.platform.util.asFailure
@ -21,7 +21,7 @@ import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.RegisterFido2CredentialRequest
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockCipherView
import com.x8bit.bitwarden.data.vault.datasource.sdk.model.createMockPublicKeyAttestationResponse
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPasskeyAttestationOptions
import io.mockk.coEvery
import io.mockk.coVerify
import io.mockk.every
@ -55,8 +55,8 @@ class Fido2CredentialManagerTest {
}
private val json = mockk<Json> {
every {
decodeFromString<PublicKeyCredentialCreationOptions>(any())
} returns createMockPublicKeyCredentialCreationOptions(number = 1)
decodeFromString<PasskeyAttestationOptions>(any())
} returns createMockPasskeyAttestationOptions(number = 1)
}
private val mockPrivilegedCallingAppInfo = mockk<CallingAppInfo> {
every { packageName } returns "com.x8bit.bitwarden"
@ -184,7 +184,7 @@ class Fido2CredentialManagerTest {
@Test
fun `validateOrigin should return error when request cannot be decoded`() = runTest {
every {
json.decodeFromString<PublicKeyCredentialCreationOptions>(any())
json.decodeFromString<PasskeyAttestationOptions>(any())
} throws SerializationException()
assertEquals(
@ -197,7 +197,7 @@ class Fido2CredentialManagerTest {
fun `validateOrigin should return error when request cannot be cast to object type`() =
runTest {
every {
json.decodeFromString<PublicKeyCredentialCreationOptions>(any())
json.decodeFromString<PasskeyAttestationOptions>(any())
} throws IllegalArgumentException()
assertEquals(
@ -266,11 +266,11 @@ class Fido2CredentialManagerTest {
}
@Test
fun `getPasskeyCreateOptionsOrNull should return passkey options when deserialized`() =
fun `getPasskeyAttestationOptionsOrNull should return passkey options when deserialized`() =
runTest {
assertEquals(
createMockPublicKeyCredentialCreationOptions(number = 1),
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
createMockPasskeyAttestationOptions(number = 1),
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = "",
),
)
@ -280,10 +280,10 @@ class Fido2CredentialManagerTest {
fun `getPasskeyCreateOptionsOrNull should return null when deserialization fails`() =
runTest {
every {
json.decodeFromString<PublicKeyCredentialCreationOptions>(any())
json.decodeFromString<PasskeyAttestationOptions>(any())
} throws SerializationException()
assertNull(
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = "",
),
)
@ -293,10 +293,10 @@ class Fido2CredentialManagerTest {
@Test
fun `getPasskeyCreateOptionsOrNull should return null when IllegalArgumentException is thrown`() {
every {
json.decodeFromString<PublicKeyCredentialCreationOptions>(any())
json.decodeFromString<PasskeyAttestationOptions>(any())
} throws IllegalArgumentException()
assertNull(fido2CredentialManager.getPasskeyCreateOptionsOrNull(requestJson = ""))
assertNull(fido2CredentialManager.getPasskeyAttestationOptionsOrNull(requestJson = ""))
}
@Suppress("MaxLineLength")

View file

@ -15,10 +15,10 @@ import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult
import com.x8bit.bitwarden.data.auth.repository.model.Organization
import com.x8bit.bitwarden.data.auth.repository.model.UserState
import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.fido2.manager.Fido2CredentialManager
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.fido2.model.createMockFido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.model.AutofillSaveItem
import com.x8bit.bitwarden.data.autofill.model.AutofillSelectionData
@ -54,7 +54,7 @@ import com.x8bit.bitwarden.ui.vault.feature.addedit.model.CustomFieldAction
import com.x8bit.bitwarden.ui.vault.feature.addedit.model.CustomFieldType
import com.x8bit.bitwarden.ui.vault.feature.addedit.model.UriItem
import com.x8bit.bitwarden.ui.vault.feature.addedit.model.toCustomField
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPasskeyAttestationOptions
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.toDefaultAddTypeContent
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.toViewState
import com.x8bit.bitwarden.ui.vault.model.VaultAddEditType
@ -326,7 +326,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
fido2CredentialRequest = fido2CredentialRequest,
)
val fido2ContentState = fido2CredentialRequest.toDefaultAddTypeContent(
creationOptions = createMockPublicKeyCredentialCreationOptions(number = 1),
attestationOptions = createMockPasskeyAttestationOptions(number = 1),
isIndividualVaultDisabled = false,
)
val vaultAddEditType = VaultAddEditType.AddItem(VaultItemCipherType.LOGIN)
@ -732,7 +732,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
val mockCreateResult = Fido2RegisterCredentialResult.Success(
registrationResponse = "mockRegistrationResponse",
)
val mockCreateOptions = createMockPublicKeyCredentialCreationOptions(
val mockAttestationOptions = createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)
@ -745,10 +745,10 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
)
} returns mockCreateResult
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = fido2CredentialRequest.requestJson,
)
} returns mockCreateOptions
} returns mockAttestationOptions
every { authRepository.activeUserId } returns "mockUserId"
turbineScope {
@ -811,7 +811,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
),
)
val mockCreateResult = Fido2RegisterCredentialResult.Success("mockResponse")
val mockCreateOptions = createMockPublicKeyCredentialCreationOptions(
val mockAttestationOptions = createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.DISCOURAGED,
)
@ -823,10 +823,10 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
)
} returns mockCreateResult
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = fido2CredentialRequest.requestJson,
)
} returns mockCreateOptions
} returns mockAttestationOptions
every { authRepository.activeUserId } returns mockUserId
turbineScope {
@ -904,7 +904,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
}
verify(exactly = 0) {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
}
}
@ -927,7 +927,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
.copy(shouldExitOnSave = true)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = fido2CredentialRequest.requestJson,
)
} returns null
@ -971,10 +971,10 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
.copy(shouldExitOnSave = true)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = fido2CredentialRequest.requestJson,
)
} returns createMockPublicKeyCredentialCreationOptions(
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.PREFERRED,
)
@ -1017,10 +1017,10 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
.copy(shouldExitOnSave = true)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = fido2CredentialRequest.requestJson,
)
} returns createMockPublicKeyCredentialCreationOptions(
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)
@ -1062,10 +1062,10 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
fido2CredentialRequest = fido2CredentialRequest,
)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(
requestJson = fido2CredentialRequest.requestJson,
)
} returns createMockPublicKeyCredentialCreationOptions(
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = null,
)
@ -1545,8 +1545,8 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
} returns stateWithName.viewState
every { fido2CredentialManager.isUserVerified } returns false
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
} returns createMockPublicKeyCredentialCreationOptions(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)
@ -1565,7 +1565,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
coVerify {
fido2CredentialManager.isUserVerified
fido2CredentialManager.getPasskeyCreateOptionsOrNull(mockFidoRequest.requestJson)
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(mockFidoRequest.requestJson)
}
}

View file

@ -55,7 +55,7 @@ class Fido2CredentialRequestExtensionsTest {
origin = null,
)
.toDefaultAddTypeContent(
creationOptions = createMockPublicKeyCredentialCreationOptions(1),
attestationOptions = createMockPasskeyAttestationOptions(1),
isIndividualVaultDisabled = false,
),
)
@ -91,7 +91,7 @@ class Fido2CredentialRequestExtensionsTest {
origin = "www.test.com",
)
.toDefaultAddTypeContent(
creationOptions = createMockPublicKeyCredentialCreationOptions(number = 1),
attestationOptions = createMockPasskeyAttestationOptions(number = 1),
isIndividualVaultDisabled = false,
),
)

View file

@ -1,37 +1,37 @@
package com.x8bit.bitwarden.ui.vault.feature.addedit.util
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions
/**
* Returns a mock FIDO 2 [PublicKeyCredentialCreationOptions] object to simulate a credential
* Returns a mock FIDO 2 [PasskeyAttestationOptions] object to simulate a credential
* creation request.
*/
@Suppress("MaxLineLength")
fun createMockPublicKeyCredentialCreationOptions(
fun createMockPasskeyAttestationOptions(
number: Int,
userVerificationRequirement: PublicKeyCredentialCreationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement? = null,
) = PublicKeyCredentialCreationOptions(
authenticatorSelection = PublicKeyCredentialCreationOptions
userVerificationRequirement: PasskeyAttestationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement? = null,
) = PasskeyAttestationOptions(
authenticatorSelection = PasskeyAttestationOptions
.AuthenticatorSelectionCriteria(userVerification = userVerificationRequirement),
challenge = "mockPublicKeyCredentialCreationOptionsChallenge-$number",
excludeCredentials = listOf(
PublicKeyCredentialCreationOptions.PublicKeyCredentialDescriptor(
PasskeyAttestationOptions.PublicKeyCredentialDescriptor(
type = "mockPublicKeyCredentialDescriptorType-$number",
id = "mockPublicKeyCredentialDescriptorId-$number",
transports = listOf("mockPublicKeyCredentialDescriptorTransports-$number"),
),
),
pubKeyCredParams = listOf(
PublicKeyCredentialCreationOptions.PublicKeyCredentialParameters(
PasskeyAttestationOptions.PublicKeyCredentialParameters(
type = "PublicKeyCredentialParametersType-$number",
alg = number.toLong(),
),
),
relyingParty = PublicKeyCredentialCreationOptions.PublicKeyCredentialRpEntity(
relyingParty = PasskeyAttestationOptions.PublicKeyCredentialRpEntity(
name = "mockPublicKeyCredentialRpEntityName-$number",
id = "mockPublicKeyCredentialRpEntity-$number",
),
user = PublicKeyCredentialCreationOptions.PublicKeyCredentialUserEntity(
user = PasskeyAttestationOptions.PublicKeyCredentialUserEntity(
name = "mockPublicKeyCredentialUserEntityName-$number",
id = "mockPublicKeyCredentialUserEntityId-$number",
displayName = "mockPublicKeyCredentialUserEntityDisplayName-$number",

View file

@ -10,11 +10,11 @@ import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.auth.repository.model.SwitchAccountResult
import com.x8bit.bitwarden.data.auth.repository.model.UserState
import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult
import com.x8bit.bitwarden.data.autofill.fido2.datasource.network.model.PublicKeyCredentialCreationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.fido2.manager.Fido2CredentialManager
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2ValidateOriginResult
import com.x8bit.bitwarden.data.autofill.fido2.model.PasskeyAttestationOptions.AuthenticatorSelectionCriteria.UserVerificationRequirement
import com.x8bit.bitwarden.data.autofill.fido2.model.createMockFido2CredentialRequest
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManager
import com.x8bit.bitwarden.data.autofill.manager.AutofillSelectionManagerImpl
@ -51,7 +51,7 @@ import com.x8bit.bitwarden.ui.platform.base.util.concat
import com.x8bit.bitwarden.ui.platform.components.model.AccountSummary
import com.x8bit.bitwarden.ui.platform.components.model.IconData
import com.x8bit.bitwarden.ui.platform.feature.search.model.SearchType
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPublicKeyCredentialCreationOptions
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPasskeyAttestationOptions
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.createMockDisplayItemForCipher
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
@ -380,7 +380,7 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
sendViewList = emptyList(),
),
)
every { fido2CredentialManager.getPasskeyCreateOptionsOrNull(any()) } returns null
every { fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any()) } returns null
val viewModel = createVaultItemListingViewModel()
viewModel.trySendAction(VaultItemListingsAction.ItemClick(cipherView.id.orEmpty()))
@ -416,8 +416,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
),
)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
} returns createMockPublicKeyCredentialCreationOptions(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)
@ -459,8 +459,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
),
)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
} returns createMockPublicKeyCredentialCreationOptions(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)
@ -513,8 +513,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
),
)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
} returns createMockPublicKeyCredentialCreationOptions(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.DISCOURAGED,
)
@ -556,8 +556,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
),
)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
} returns createMockPublicKeyCredentialCreationOptions(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)
@ -2371,8 +2371,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
),
)
every {
fido2CredentialManager.getPasskeyCreateOptionsOrNull(any())
} returns createMockPublicKeyCredentialCreationOptions(
fido2CredentialManager.getPasskeyAttestationOptionsOrNull(any())
} returns createMockPasskeyAttestationOptions(
number = 1,
userVerificationRequirement = UserVerificationRequirement.REQUIRED,
)