From 71ddbbe3d2332ef17dcd3ea652c2177620169f96 Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Sun, 26 Oct 2025 20:51:52 +0100 Subject: [PATCH] Streamline passkey display name creation (#520) --- .../popup/pages/passkeys/PasskeyCreate.tsx | 11 +++++++---- .../app/credentialprovider/PasskeyFormFragment.kt | 2 +- .../credentialprovider/PasskeyRegistrationActivity.kt | 1 + .../models/PasskeyRegistrationViewModel.kt | 3 +++ 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/apps/browser-extension/src/entrypoints/popup/pages/passkeys/PasskeyCreate.tsx b/apps/browser-extension/src/entrypoints/popup/pages/passkeys/PasskeyCreate.tsx index 7277dd3fe..640e13262 100644 --- a/apps/browser-extension/src/entrypoints/popup/pages/passkeys/PasskeyCreate.tsx +++ b/apps/browser-extension/src/entrypoints/popup/pages/passkeys/PasskeyCreate.tsx @@ -34,7 +34,7 @@ const PasskeyCreate: React.FC = () => { const webApi = useWebApi(); const { executeVaultMutation, isLoading: isMutating, syncStatus } = useVaultMutate(); const [request, setRequest] = useState(null); - const [displayName, setDisplayName] = useState('My Passkey'); + const [displayName, setDisplayName] = useState(''); const [error, setError] = useState(null); const { isLocked } = useVaultLockRedirect(); const [existingPasskeys, setExistingPasskeys] = useState>([]); @@ -71,9 +71,12 @@ const PasskeyCreate: React.FC = () => { if (data && data.type === 'create') { setRequest(data); - if (data.publicKey?.user?.displayName) { - setDisplayName(data.publicKey.user.displayName); - } + /** + * Set default displayName: use rp.name if available, otherwise use rpId + * This aligns with iOS/Android behavior + */ + const defaultName = data.publicKey?.rp?.name || data.publicKey?.rp?.id || 'Passkey'; + setDisplayName(defaultName); // Check for existing passkeys for this RP ID and user if (dbContext.sqliteClient && data.publicKey?.rp?.id) { diff --git a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyFormFragment.kt b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyFormFragment.kt index 0ea60c377..ea6f090d0 100644 --- a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyFormFragment.kt +++ b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyFormFragment.kt @@ -130,7 +130,7 @@ class PasskeyFormFragment : Fragment() { headerTitle.text = getString(R.string.create_passkey_title) headerSubtitle.visibility = View.GONE infoExplanationText.text = getString(R.string.passkey_create_explanation) - displayNameInput.setText(viewModel.rpId) + displayNameInput.setText(viewModel.rpName ?: viewModel.rpId) saveButton.text = getString(R.string.passkey_create_button) } diff --git a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyRegistrationActivity.kt b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyRegistrationActivity.kt index abc4e45bd..bcb612e1e 100644 --- a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyRegistrationActivity.kt +++ b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/PasskeyRegistrationActivity.kt @@ -75,6 +75,7 @@ class PasskeyRegistrationActivity : FragmentActivity() { // Extract RP info val rpObj = requestObj.optJSONObject("rp") viewModel.rpId = rpObj?.optString("id") ?: "" + viewModel.rpName = rpObj?.optString("name")?.takeIf { it.isNotEmpty() } // Extract user info val userObj = requestObj.optJSONObject("user") diff --git a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/models/PasskeyRegistrationViewModel.kt b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/models/PasskeyRegistrationViewModel.kt index c9cae6c42..4710b7061 100644 --- a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/models/PasskeyRegistrationViewModel.kt +++ b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/credentialprovider/models/PasskeyRegistrationViewModel.kt @@ -20,6 +20,9 @@ class PasskeyRegistrationViewModel : ViewModel() { /** The relying party identifier. */ var rpId: String = "" + /** The relying party name (optional, from rp.name in the request). */ + var rpName: String? = null + /** The username for the passkey. */ var userName: String? = null