From b4926b72d9af62e89eb1d54c7e4ec4810da5bc19 Mon Sep 17 00:00:00 2001 From: Patrick Honkonen <1883101+SaintPatrck@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:37:14 -0400 Subject: [PATCH] Update `registerExport` to return `RegisterExportResponse` (#5903) --- .../providerevents/ProviderEventsManager.kt | 58 +++++++++++++++++-- .../transfer/RegisterExportResponse.kt | 6 ++ .../registry/CredentialExchangeRegistry.kt | 5 +- .../CredentialExchangeRegistryImpl.kt | 5 +- 4 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 cxf/src/main/kotlin/androidx/credentials/providerevents/transfer/RegisterExportResponse.kt diff --git a/cxf/src/main/kotlin/androidx/credentials/providerevents/ProviderEventsManager.kt b/cxf/src/main/kotlin/androidx/credentials/providerevents/ProviderEventsManager.kt index be60c985cc..81b091fd8e 100644 --- a/cxf/src/main/kotlin/androidx/credentials/providerevents/ProviderEventsManager.kt +++ b/cxf/src/main/kotlin/androidx/credentials/providerevents/ProviderEventsManager.kt @@ -2,11 +2,13 @@ package androidx.credentials.providerevents import android.annotation.SuppressLint import android.content.Context +import android.content.pm.SigningInfo import androidx.credentials.provider.CallingAppInfo import androidx.credentials.providerevents.transfer.ImportCredentialsRequest import androidx.credentials.providerevents.transfer.ImportCredentialsResponse import androidx.credentials.providerevents.transfer.ProviderImportCredentialsResponse import androidx.credentials.providerevents.transfer.RegisterExportRequest +import androidx.credentials.providerevents.transfer.RegisterExportResponse import com.bitwarden.annotation.OmitFromCoverage /** @@ -17,7 +19,7 @@ interface ProviderEventsManager { /** * Register as a credential export source. */ - fun registerExport(request: RegisterExportRequest): Boolean + fun registerExport(request: RegisterExportRequest): RegisterExportResponse /** * Begin the process of importing credentials. @@ -42,8 +44,8 @@ interface ProviderEventsManager { */ @OmitFromCoverage internal class StubProviderEventsManager : ProviderEventsManager { - override fun registerExport(request: RegisterExportRequest): Boolean { - return true + override fun registerExport(request: RegisterExportRequest): RegisterExportResponse { + return RegisterExportResponse() } override fun importCredentials( @@ -53,13 +55,57 @@ internal class StubProviderEventsManager : ProviderEventsManager { @SuppressLint("VisibleForTests") return ProviderImportCredentialsResponse( response = ImportCredentialsResponse( - responseJson = "", + responseJson = CANNED_RESPONSE, ), callingAppInfo = CallingAppInfo( - packageName = "", - signatures = emptyList(), + packageName = context.packageName, + signingInfo = SigningInfo(), origin = null, ), ) } } + +private val CANNED_RESPONSE = """ + { + "id": "3zGV3pmoSs6mT7IEAPXfOw", + "username": "", + "email": "user@email.com", + "fullName": "Test User", + "collections": [], + "items": [ + { + "id": "8cCs0RV_ViySk7KCACA", + "creationAt": 1739325421, + "modifiedAt": 1739325421, + "title": "test import credentials", + "favorite": false, + "scope": { + "urls": [ + "https://www.sample-url.io/" + ], + "androidApps": [] + }, + "credentials": [ + { + "type": "basic-auth", + "username": { + "fieldType": "string", + "value": "MyUsername" + } + }, + { + "type": "passkey", + "credentialId": "xMA-5emp0WsQASnuNmuzQA", + "rpId": "www.sample-url.io", + "username": "user@email.com", + "userDisplayName": "user@email.com", + "userHandle": "lEn2KqNnS7SsUdVbrdoFiw", + "key": "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgQx8Smx_KdvQ7nJXt2_62Xrn-im9ibCOtsphj_xZo_uWhRANCAARUDaIFJIUaRyUehAy_d1_a-DK63Ws_d-zkYj-uqHdrGZI0dnhazQGva4tJZQFN35iLoLzFFj_CSjqeYAEOX7Ck" + } + ] + } + ] + } +""" + .trimIndent() diff --git a/cxf/src/main/kotlin/androidx/credentials/providerevents/transfer/RegisterExportResponse.kt b/cxf/src/main/kotlin/androidx/credentials/providerevents/transfer/RegisterExportResponse.kt new file mode 100644 index 0000000000..27660a6e4b --- /dev/null +++ b/cxf/src/main/kotlin/androidx/credentials/providerevents/transfer/RegisterExportResponse.kt @@ -0,0 +1,6 @@ +package androidx.credentials.providerevents.transfer + +/** + * Placeholder class representing a response to registering as a credential export source. + */ +class RegisterExportResponse diff --git a/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistry.kt b/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistry.kt index 4aa53b32ee..5cfea0d369 100644 --- a/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistry.kt +++ b/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistry.kt @@ -1,5 +1,6 @@ package com.bitwarden.cxf.registry +import androidx.credentials.providerevents.transfer.RegisterExportResponse import com.bitwarden.cxf.registry.model.RegistrationRequest /** @@ -18,7 +19,7 @@ interface CredentialExchangeRegistry { * does not indicate if the application was added to the registry. Use the result value to check * if the application was added or not. [Result.isFailure] only indicates if an error occurred. */ - suspend fun register(registrationRequest: RegistrationRequest): Result + suspend fun register(registrationRequest: RegistrationRequest): Result /** * Unregister as a credential export source. @@ -28,5 +29,5 @@ interface CredentialExchangeRegistry { * * @return True if the unregistration was successful, false otherwise. */ - suspend fun unregister(): Boolean + suspend fun unregister(): RegisterExportResponse } diff --git a/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistryImpl.kt b/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistryImpl.kt index e328707fbd..14c323823e 100644 --- a/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistryImpl.kt +++ b/cxf/src/main/kotlin/com/bitwarden/cxf/registry/CredentialExchangeRegistryImpl.kt @@ -6,6 +6,7 @@ import androidx.core.graphics.drawable.toBitmapOrNull import androidx.credentials.providerevents.ProviderEventsManager import androidx.credentials.providerevents.transfer.ExportEntry import androidx.credentials.providerevents.transfer.RegisterExportRequest +import androidx.credentials.providerevents.transfer.RegisterExportResponse import com.bitwarden.annotation.OmitFromCoverage import com.bitwarden.core.data.util.asFailure import com.bitwarden.core.data.util.asSuccess @@ -24,7 +25,7 @@ internal class CredentialExchangeRegistryImpl( override suspend fun register( registrationRequest: RegistrationRequest, - ): Result { + ): Result { val icon = ContextCompat .getDrawable( application, @@ -50,7 +51,7 @@ internal class CredentialExchangeRegistryImpl( .asSuccess() } - override suspend fun unregister(): Boolean = + override suspend fun unregister(): RegisterExportResponse = providerEventsManager.registerExport( // This is a workaround for unregistering an account since an explicit "unregister" API // is not currently available.