Compare commits
3 Commits
ce239499f8
...
94901085a1
Author | SHA1 | Date |
---|---|---|
Federico Maccaroni | 94901085a1 | |
github-actions[bot] | e16074a73e | |
Federico Maccaroni | 2cdb5a9c74 |
|
@ -1,26 +1,31 @@
|
|||
using Android.App;
|
||||
using System.Diagnostics;
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.Content.PM;
|
||||
using Android.OS;
|
||||
using Android.Runtime;
|
||||
using AndroidX.Activity.Result;
|
||||
using AndroidX.Activity.Result.Contract;
|
||||
using AndroidX.Credentials;
|
||||
using AndroidX.Credentials.Exceptions;
|
||||
using AndroidX.Credentials.Provider;
|
||||
using AndroidX.Credentials.WebAuthn;
|
||||
using Bit.App.Droid.Utilities;
|
||||
using Bit.App.Abstractions;
|
||||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Utilities;
|
||||
using Bit.Core.Resources.Localization;
|
||||
using Bit.Core.Utilities.Fido2;
|
||||
using Bit.Core.Services;
|
||||
using Bit.App.Droid.Utilities;
|
||||
using Bit.App.Platforms.Android.Autofill;
|
||||
using AndroidX.Credentials.Exceptions;
|
||||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Resources.Localization;
|
||||
using Bit.Core.Services;
|
||||
using Bit.Core.Utilities;
|
||||
using Bit.Core.Utilities.Fido2;
|
||||
using Org.Json;
|
||||
|
||||
namespace Bit.Droid.Autofill
|
||||
{
|
||||
[Activity(
|
||||
NoHistory = true,
|
||||
LaunchMode = LaunchMode.SingleTop)]
|
||||
NoHistory = false,
|
||||
LaunchMode = LaunchMode.SingleInstance)]
|
||||
[Register("com.x8bit.bitwarden.CredentialProviderSelectionActivity")]
|
||||
public class CredentialProviderSelectionActivity : MauiAppCompatActivity
|
||||
{
|
||||
private LazyResolve<IFido2MediatorService> _fido2MediatorService = new LazyResolve<IFido2MediatorService>();
|
||||
|
@ -31,6 +36,8 @@ namespace Bit.Droid.Autofill
|
|||
private LazyResolve<IUserVerificationMediatorService> _userVerificationMediatorService = new LazyResolve<IUserVerificationMediatorService>();
|
||||
private LazyResolve<IDeviceActionService> _deviceActionService = new LazyResolve<IDeviceActionService>();
|
||||
|
||||
private ActivityResultLauncher _activityResultLauncher;
|
||||
|
||||
protected override void OnCreate(Bundle bundle)
|
||||
{
|
||||
Intent?.Validate();
|
||||
|
@ -100,8 +107,14 @@ namespace Bit.Droid.Autofill
|
|||
cipherId,
|
||||
false,
|
||||
() => hasVaultBeenUnlockedInThisTransaction,
|
||||
RpId
|
||||
);
|
||||
RpId
|
||||
);
|
||||
|
||||
_activityResultLauncher = RegisterForActivityResult(new ActivityResultContracts.StartActivityForResult(),
|
||||
new ActivityResultCallback(result =>
|
||||
{
|
||||
_fido2GetAssertionUserInterface.Value.ConfirmVaultUnlocked(result.ResultCode == (int)Result.Ok);
|
||||
}));
|
||||
|
||||
var clientAssertParams = new Fido2ClientAssertCredentialParams
|
||||
{
|
||||
|
@ -171,6 +184,19 @@ namespace Bit.Droid.Autofill
|
|||
}
|
||||
}
|
||||
|
||||
public void LaunchToUnlock()
|
||||
{
|
||||
if (_activityResultLauncher is null)
|
||||
{
|
||||
throw new InvalidOperationException("There is no activity result launcher available");
|
||||
}
|
||||
|
||||
var intent = new Intent(this, typeof(MainActivity));
|
||||
intent.PutExtra(CredentialProviderConstants.Fido2CredentialAction, CredentialProviderConstants.Fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout);
|
||||
|
||||
_activityResultLauncher.Launch(intent);
|
||||
}
|
||||
|
||||
private void FailAndFinish()
|
||||
{
|
||||
var result = new Intent();
|
||||
|
@ -180,4 +206,12 @@ namespace Bit.Droid.Autofill
|
|||
Finish();
|
||||
}
|
||||
}
|
||||
|
||||
public class ActivityResultCallback : Java.Lang.Object, IActivityResultCallback
|
||||
{
|
||||
readonly Action<ActivityResult> _callback;
|
||||
public ActivityResultCallback(Action<ActivityResult> callback) => _callback = callback;
|
||||
public ActivityResultCallback(TaskCompletionSource<ActivityResult> tcs) => _callback = tcs.SetResult;
|
||||
public void OnActivityResult(Java.Lang.Object p0) => _callback((ActivityResult)p0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Services;
|
||||
using Bit.Core.Utilities.Fido2;
|
||||
using Bit.Droid.Autofill;
|
||||
|
||||
namespace Bit.App.Platforms.Android.Autofill
|
||||
{
|
||||
|
@ -10,6 +11,11 @@ namespace Bit.App.Platforms.Android.Autofill
|
|||
bool userVerified,
|
||||
Func<bool> hasVaultBeenUnlockedInThisTransaction,
|
||||
string rpId);
|
||||
|
||||
/// <summary>
|
||||
/// Call this after the vault was unlocked so that Fido2 credential autofill can proceed.
|
||||
/// </summary>
|
||||
void ConfirmVaultUnlocked(bool unlocked);
|
||||
}
|
||||
|
||||
public class Fido2GetAssertionUserInterface : Core.Utilities.Fido2.Fido2GetAssertionUserInterface, IFido2AndroidGetAssertionUserInterface
|
||||
|
@ -19,6 +25,8 @@ namespace Bit.App.Platforms.Android.Autofill
|
|||
private readonly ICipherService _cipherService;
|
||||
private readonly IUserVerificationMediatorService _userVerificationMediatorService;
|
||||
|
||||
private TaskCompletionSource<bool> _unlockVaultTcs;
|
||||
|
||||
public Fido2GetAssertionUserInterface(IStateService stateService,
|
||||
IVaultTimeoutService vaultTimeoutService,
|
||||
ICipherService cipherService,
|
||||
|
@ -46,11 +54,38 @@ namespace Bit.App.Platforms.Android.Autofill
|
|||
{
|
||||
if (!await _stateService.IsAuthenticatedAsync() || await _vaultTimeoutService.IsLockedAsync())
|
||||
{
|
||||
// this should never happen but just in case.
|
||||
throw new InvalidOperationException("Not authed or vault locked");
|
||||
if (await _stateService.GetVaultTimeoutAsync() != 0)
|
||||
{
|
||||
// this should never happen but just in case.
|
||||
throw new InvalidOperationException("Not authed or vault locked");
|
||||
}
|
||||
|
||||
// if vault timeout is immediate, then we need to unlock the vault
|
||||
if (!await NavigateAndWaitForUnlockAsync())
|
||||
{
|
||||
throw new InvalidOperationException("Couldn't unlock with immediate timeout");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ConfirmVaultUnlocked(bool unlocked) => _unlockVaultTcs?.TrySetResult(unlocked);
|
||||
|
||||
private async Task<bool> NavigateAndWaitForUnlockAsync()
|
||||
{
|
||||
var credentialProviderSelectionActivity = Platform.CurrentActivity as CredentialProviderSelectionActivity;
|
||||
if (credentialProviderSelectionActivity == null)
|
||||
{
|
||||
throw new InvalidOperationException("Can't get current activity");
|
||||
}
|
||||
|
||||
_unlockVaultTcs?.TrySetCanceled();
|
||||
_unlockVaultTcs = new TaskCompletionSource<bool>();
|
||||
|
||||
credentialProviderSelectionActivity.LaunchToUnlock();
|
||||
|
||||
return await _unlockVaultTcs.Task;
|
||||
}
|
||||
|
||||
private async Task<bool> VerifyUserAsync(string selectedCipherId, Fido2UserVerificationPreference userVerificationPreference, string rpId, bool vaultUnlockedDuringThisTransaction)
|
||||
{
|
||||
try
|
||||
|
|
|
@ -23,11 +23,14 @@ using Resource = Bit.Core.Resource;
|
|||
using Application = Android.App.Application;
|
||||
using Bit.Core.Services;
|
||||
using Bit.Core.Utilities.Fido2;
|
||||
using Bit.Core.Utilities;
|
||||
|
||||
namespace Bit.Droid.Services
|
||||
{
|
||||
public class DeviceActionService : IDeviceActionService
|
||||
{
|
||||
public const int DELAY_LOCK_LOGOUT_FOR_FIDO2_AUTOFILL_ON_IMMEDIATE_TIMEOUT_MS = 15000;
|
||||
|
||||
private readonly IStateService _stateService;
|
||||
private readonly IMessagingService _messagingService;
|
||||
private AlertDialog _progressDialog;
|
||||
|
@ -578,6 +581,15 @@ namespace Bit.Droid.Services
|
|||
{
|
||||
await ExecuteFido2GetCredentialAsync(appOptions);
|
||||
}
|
||||
else if (appOptions.Fido2CredentialAction == CredentialProviderConstants.Fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout
|
||||
&&
|
||||
ServiceContainer.TryResolve<IVaultTimeoutService>(out var vaultTimeoutService))
|
||||
{
|
||||
vaultTimeoutService.DelayLockAndLogoutMs = DELAY_LOCK_LOGOUT_FOR_FIDO2_AUTOFILL_ON_IMMEDIATE_TIMEOUT_MS;
|
||||
|
||||
activity.SetResult(Result.Ok);
|
||||
activity.Finish();
|
||||
}
|
||||
else if (appOptions.Fido2CredentialAction == CredentialProviderConstants.Fido2CredentialCreate)
|
||||
{
|
||||
await ExecuteFido2CreateCredentialAsync();
|
||||
|
|
|
@ -502,7 +502,7 @@
|
|||
<value>Pro spuštění rozšíření klepněte na ikonu Bitwardenu v menu.</value>
|
||||
</data>
|
||||
<data name="ExtensionTurnOn" xml:space="preserve">
|
||||
<value>Pro zapnutí Bitwardenu v prohlížeči Safari a dalších aplikacích klepněte na ikonu "Další“ v dolní části menu.</value>
|
||||
<value>Pro zapnutí Bitwardenu v prohlížeči Safari a dalších aplikacích klepněte na ikonu "Další" v dolní části menu.</value>
|
||||
</data>
|
||||
<data name="Favorite" xml:space="preserve">
|
||||
<value>Oblíbené</value>
|
||||
|
|
|
@ -3001,6 +3001,6 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||
<value>Der Passkey-Vorgang ist fehlgeschlagen, da die App nicht in den Asset-Links gefunden wurde</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
|
||||
<value>Der Passwort-Vorgang ist fehlgeschlagen, da die App nicht verifiziert werden konnte</value>
|
||||
<value>Der Passkey-Vorgang ist fehlgeschlagen, da die App nicht verifiziert werden konnte</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
|
@ -422,7 +422,7 @@
|
|||
<value>Servicio de autocompletado</value>
|
||||
</data>
|
||||
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
|
||||
<value>Set Bitwarden as your passkey provider in device settings.</value>
|
||||
<value>Establece Bitwarden como tu proveedor de claves de acceso en los ajustes del dispositivo.</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>Evitar caracteres ambiguos</value>
|
||||
|
@ -1195,7 +1195,7 @@ El escaneo se realizará automáticamente.</value>
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services.</value>
|
||||
<value>No hemos podido abrir automáticamente el menú de ajustes del proveedor de credenciales de Android. Puedes navegar al menú de ajustes del proveedor de credenciales de Android manualmente desde Ajustes > Sistema > Contraseñas y cuentas > Contraseñas, claves de acceso y servicios de datos.</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>No hemos podido abrir automáticamente las opciones de autorellenado de Android. Puedes ir al menú de opciones de autorellenado manualmente desde Ajustes de Android > Sistema > Idiomas y entradas > Avanzado > Servicio autocompletar.</value>
|
||||
|
@ -1822,7 +1822,7 @@ El escaneo se realizará automáticamente.</value>
|
|||
<value>Bitwarden necesita atención - Activar "Sobrescribir" en "Servicios de Auto-llenado" desde la configuración de Bitwarden</value>
|
||||
</data>
|
||||
<data name="PasskeyManagement" xml:space="preserve">
|
||||
<value>Passkey management</value>
|
||||
<value>Gestión de claves de acceso</value>
|
||||
</data>
|
||||
<data name="AutofillServices" xml:space="preserve">
|
||||
<value>Servicios de Autollenado</value>
|
||||
|
@ -2810,7 +2810,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>{0} horas</value>
|
||||
</data>
|
||||
<data name="PasskeyManagementExplanationLong" xml:space="preserve">
|
||||
<value>Use Bitwarden to save new passkeys and log in with passkeys stored in your vault.</value>
|
||||
<value>Usa Bitwarden para guardar nuevas claves de acceso e iniciar sesión con las claves de acceso almacenadas en tu caja fuerte.</value>
|
||||
</data>
|
||||
<data name="AutofillServicesExplanationLong" xml:space="preserve">
|
||||
<value>El Framework de Autofill de Android se utiliza para ayudar a rellenar información de inicio de sesión en otras aplicaciones en tu dispositivo.</value>
|
||||
|
@ -2841,7 +2841,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>¿Continuar a la App Store?</value>
|
||||
</data>
|
||||
<data name="ContinueToDeviceSettings" xml:space="preserve">
|
||||
<value>Continue to device Settings?</value>
|
||||
<value>¿Continuar a los ajustes del dispositivo?</value>
|
||||
</data>
|
||||
<data name="TwoStepLoginDescriptionLong" xml:space="preserve">
|
||||
<value>Haz tu cuenta más segura al configurar el inicio de sesión en dos pasos en la aplicación web de Bitwarden.</value>
|
||||
|
@ -2894,25 +2894,25 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>Configura una opción de desbloqueo para cambiar tu acción de tiempo de espera de tu caja fuerte.</value>
|
||||
</data>
|
||||
<data name="ChooseALoginToSaveThisPasskeyTo" xml:space="preserve">
|
||||
<value>Choose a login to save this passkey to</value>
|
||||
<value>Escoge un inicio de sesión para guardar esta clave de acceso</value>
|
||||
</data>
|
||||
<data name="SavePasskeyAsNewLogin" xml:space="preserve">
|
||||
<value>Save passkey as new login</value>
|
||||
<value>Guardar clave de acceso como un nuevo inicio de sesión</value>
|
||||
</data>
|
||||
<data name="SavePasskey" xml:space="preserve">
|
||||
<value>Save passkey</value>
|
||||
<value>Guardar clave de acceso</value>
|
||||
</data>
|
||||
<data name="PasskeysForX" xml:space="preserve">
|
||||
<value>Passkeys for {0}</value>
|
||||
<value>Claves de acceso para {0}</value>
|
||||
</data>
|
||||
<data name="PasswordsForX" xml:space="preserve">
|
||||
<value>Passwords for {0}</value>
|
||||
<value>Contraseñas para {0}</value>
|
||||
</data>
|
||||
<data name="OverwritePasskey" xml:space="preserve">
|
||||
<value>Overwrite passkey?</value>
|
||||
<value>¿Sobreescribir clave de acceso?</value>
|
||||
</data>
|
||||
<data name="ThisItemAlreadyContainsAPasskeyAreYouSureYouWantToOverwriteTheCurrentPasskey" xml:space="preserve">
|
||||
<value>This item already contains a passkey. Are you sure you want to overwrite the current passkey?</value>
|
||||
<value>Este elemento ya contiene una clave de acceso. ¿Estás seguro de que quieres sobreescribir la clave de acceso actual?</value>
|
||||
</data>
|
||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
||||
<value>Se requiere el inicio de sesión en dos pasos Duo para su cuenta. </value>
|
||||
|
@ -2924,86 +2924,86 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>Iniciar Duo</value>
|
||||
</data>
|
||||
<data name="VerificationRequiredByX" xml:space="preserve">
|
||||
<value>Verification required by {0}</value>
|
||||
<value>Verificación requerida por {0}</value>
|
||||
</data>
|
||||
<data name="VerificationRequiredForThisActionSetUpAnUnlockMethodInBitwardenToContinue" xml:space="preserve">
|
||||
<value>Verification required for this action. Set up an unlock method in Bitwarden to continue.</value>
|
||||
<value>Verificación requerida para esta acción. Establece un método de desbloqueo en Bitwarden para continuar.</value>
|
||||
</data>
|
||||
<data name="ErrorCreatingPasskey" xml:space="preserve">
|
||||
<value>Error creating passkey</value>
|
||||
<value>Error creando clave de acceso</value>
|
||||
</data>
|
||||
<data name="ErrorReadingPasskey" xml:space="preserve">
|
||||
<value>Error reading passkey</value>
|
||||
<value>Error leyendo clave de acceso</value>
|
||||
</data>
|
||||
<data name="ThereWasAProblemCreatingAPasskeyForXTryAgainLater" xml:space="preserve">
|
||||
<value>There was a problem creating a passkey for {0}. Try again later.</value>
|
||||
<value>Hubo un problema creando la clave de acceso para {0}. Inténtalo de nuevo más tarde.</value>
|
||||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="ThereWasAProblemReadingAPasskeyForXTryAgainLater" xml:space="preserve">
|
||||
<value>There was a problem reading your passkey for {0}. Try again later.</value>
|
||||
<value>Hubo un problema leyendo la clave de acceso para {0}. Inténtalo de nuevo más tarde.</value>
|
||||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="VerifyingIdentityEllipsis" xml:space="preserve">
|
||||
<value>Verifying identity...</value>
|
||||
<value>Verificando identidad...</value>
|
||||
</data>
|
||||
<data name="Passwords" xml:space="preserve">
|
||||
<value>Passwords</value>
|
||||
<value>Contraseñas</value>
|
||||
</data>
|
||||
<data name="UnknownAccount" xml:space="preserve">
|
||||
<value>Unknown account</value>
|
||||
<value>Cuenta desconocida</value>
|
||||
</data>
|
||||
<data name="SetUpAutofill" xml:space="preserve">
|
||||
<value>Set up auto-fill</value>
|
||||
<value>Establecer autocompletar</value>
|
||||
</data>
|
||||
<data name="GetInstantAccessToYourPasswordsAndPasskeys" xml:space="preserve">
|
||||
<value>Get instant access to your passwords and passkeys!</value>
|
||||
<value>¡Consigue acceso instantáneo a tus contraseñas y claves de acceso!</value>
|
||||
</data>
|
||||
<data name="SetUpAutoFillDescriptionLong" xml:space="preserve">
|
||||
<value>To set up password auto-fill and passkey management, set Bitwarden as your preferred provider in the iOS Settings.</value>
|
||||
<value>Para configurar el autocompletado y la administración de claves de acceso, establezca Bitwarden como su proveedor preferido en los ajustes de iOS.</value>
|
||||
</data>
|
||||
<data name="FirstDotGoToYourDeviceSettingsPasswordsPasswordOptions" xml:space="preserve">
|
||||
<value>1. Go to your device's Settings > Passwords > Password Options</value>
|
||||
<value>1. Ve a los Ajustes de tu dispositivo > Contraseñas > Opciones de Contraseña</value>
|
||||
</data>
|
||||
<data name="SecondDotTurnOnAutoFill" xml:space="preserve">
|
||||
<value>2. Turn on AutoFill</value>
|
||||
<value>2. Habilita el autocompletado</value>
|
||||
</data>
|
||||
<data name="ThirdDotSelectBitwardenToUseForPasswordsAndPasskeys" xml:space="preserve">
|
||||
<value>3. Select "Bitwarden" to use for passwords and passkeys</value>
|
||||
<value>3. Selecciona "Bitwarden" para usar contraseñas y claves de acceso</value>
|
||||
</data>
|
||||
<data name="YourPasskeyWillBeSavedToYourBitwardenVault" xml:space="preserve">
|
||||
<value>Your passkey will be saved to your Bitwarden vault</value>
|
||||
<value>Tu clave de acceso se guardará en tu caja fuerte de Bitwarden</value>
|
||||
</data>
|
||||
<data name="YourPasskeyWillBeSavedToYourBitwardenVaultForX" xml:space="preserve">
|
||||
<value>Your passkey will be saved to your Bitwarden vault for {0}</value>
|
||||
<value>Tu clave de acceso se guardará en tu caja fuerte de Bitwarden para {0}</value>
|
||||
</data>
|
||||
<data name="OrganizationUnassignedItemsMessageUSEUDescriptionLong" xml:space="preserve">
|
||||
<value>Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
|
||||
<value>Los elementos de organización sin asignar ya no están visibles en la vista Todas las cajas fuertes y solo se puede acceder a ellos a través de la consola de administrador. Asigne estos elementos a una colección desde la Consola de Administrador para hacerlos visibles.</value>
|
||||
</data>
|
||||
<data name="OrganizationUnassignedItemsMessageSelfHost041624DescriptionLong" xml:space="preserve">
|
||||
<value>On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
|
||||
<value>El 16 de mayo de 2024, los elementos de organización no asignados ya no serán visibles en la vista Todas las cajas fuertes y solo serán accesibles a través de la Consola de Administrador. Asigna estos objetos a una colección desde la Consola de Administrador para hacerlos visibles.</value>
|
||||
</data>
|
||||
<data name="RemindMeLater" xml:space="preserve">
|
||||
<value>Remind me later</value>
|
||||
<value>Recuérdamelo más tarde</value>
|
||||
</data>
|
||||
<data name="Notice" xml:space="preserve">
|
||||
<value>Notice</value>
|
||||
<value>Aviso</value>
|
||||
</data>
|
||||
<data name="PasskeysNotSupportedForThisApp" xml:space="preserve">
|
||||
<value>Passkeys not supported for this app</value>
|
||||
<value>Claves de acceso no soportadas para esta aplicación</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserIsNotPrivileged" xml:space="preserve">
|
||||
<value>Passkey operation failed because browser is not privileged</value>
|
||||
<value>Falló la operación de la clave de acceso porque el navegador no tiene privilegios</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserSignatureDoesNotMatch" xml:space="preserve">
|
||||
<value>Passkey operation failed because browser signature does not match</value>
|
||||
<value>Falló la operación de la clave de acceso porque la firma del navegador no coincide</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseOfMissingAssetLinks" xml:space="preserve">
|
||||
<value>Passkey operation failed because of missing asset links</value>
|
||||
<value>Falló la operación de la clave de acceso porque faltan enlaces de recursos</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppNotFoundInAssetLinks" xml:space="preserve">
|
||||
<value>Passkey operation failed because app not found in asset links</value>
|
||||
<value>Falló la operación de la clave de acceso porque la aplicación no encontró los enlaces de recursos</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
|
||||
<value>Passkey operation failed because app could not be verified</value>
|
||||
<value>Falló la operación de la clave de acceso porque la aplicación no pudo ser verificada</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
|
@ -2397,7 +2397,7 @@ turvallisesti valitsemalla "Lisää TOTP"</value>
|
|||
<value>Catch-all-sähköposti</value>
|
||||
</data>
|
||||
<data name="ForwardedEmailAlias" xml:space="preserve">
|
||||
<value>Sähköpostialias välitykseen</value>
|
||||
<value>Sähköpostialias ohjaukseen</value>
|
||||
</data>
|
||||
<data name="RandomWord" xml:space="preserve">
|
||||
<value>Satunnainen sana</value>
|
||||
|
@ -2991,7 +2991,7 @@ Haluatko vaihtaa tähän tiliin?</value>
|
|||
<value>Suojausavaimia ei tueta tässä sovelluksessa</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserIsNotPrivileged" xml:space="preserve">
|
||||
<value>Suojausavaintoiminto epäonnistui, koska selainta ei ole korotettu</value>
|
||||
<value>Suojausavaintoiminto epäonnistui, koska selainta ei ole hyväksytty</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserSignatureDoesNotMatch" xml:space="preserve">
|
||||
<value>Suojausavaintoiminto epäonnistui, koska selaimen allekirjoitus ei täsmää</value>
|
||||
|
@ -3003,6 +3003,6 @@ Haluatko vaihtaa tähän tiliin?</value>
|
|||
<value>Suojausavaintoiminto epäonnistui, koska sovellusta ei löytynyt asset-liitoksista</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
|
||||
<value>Suojausavaintoiminto epäonnistui, koska sovellusta ei voitu vahvistaa</value>
|
||||
<value>Suojausavaintoiminto epäonnistui, koska sovellusta ei voitu varmentaa</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
|
@ -1195,7 +1195,7 @@ A leitura será feita automaticamente.</value>
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services.</value>
|
||||
<value>Não foi possível abrir automaticamente o menu de configurações do provedor de credenciais do Android para você. Você pode navegar para o menu de configurações do provedor de credenciais manualmente a partir de Configurações do Android > Sistema > Senhas e Contas > Senhas chaves e serviços de dados.</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>Não foi possível abrir automaticamente o menu de configurações de autopreenchimento do Android para você. Você pode navegar para o menu de configurações de autopreenchimento manualmente a partir de Configurações do Android > Sistema > Idiomas e Entrada > Avançado > Serviço de autopreenchimento.</value>
|
||||
|
|
|
@ -422,7 +422,7 @@
|
|||
<value>Hjälpmedelsservice för automatisk ifyllnad</value>
|
||||
</data>
|
||||
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
|
||||
<value>Set Bitwarden as your passkey provider in device settings.</value>
|
||||
<value>Ange Bitwarden som din lösenordsleverantör i enhetsinställningarna.</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>Undvik tvetydiga tecken</value>
|
||||
|
@ -1196,7 +1196,7 @@ Skanningen sker automatiskt.</value>
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services.</value>
|
||||
<value>Det gick inte att automatiskt öppna menyn för Android-autentiseringsleverantörsinställningar för dig. Du kan navigera till menyn autentiseringsleverantörsinställningar manuellt från Android Inställningar > System > Lösenord och konton > Lösenord, Nyckelord och datatjänster.</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>Det gick inte att automatiskt öppna inställningsmenyn för Android automatisk ifyllnad. Du kan navigera till menyn manuellt från Android inställningar > System > Språk och inmatning > Avancerat > Tjänsten autofyll.</value>
|
||||
|
@ -1824,7 +1824,7 @@ Skanningen sker automatiskt.</value>
|
|||
<value>Bitwarden behöver din uppmärksamhet - Aktivera "Överlappning" under "Tjänster för automatisk ifyllnad" i Bitwardens inställningar</value>
|
||||
</data>
|
||||
<data name="PasskeyManagement" xml:space="preserve">
|
||||
<value>Passkey management</value>
|
||||
<value>Passkey hantering</value>
|
||||
</data>
|
||||
<data name="AutofillServices" xml:space="preserve">
|
||||
<value>Tjänster för automatisk ifyllnad</value>
|
||||
|
|
|
@ -422,7 +422,7 @@
|
|||
<value>自动填充服务</value>
|
||||
</data>
|
||||
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
|
||||
<value>在设备设置中将 Bitwarden 设置为您的通行密钥提供程序。</value>
|
||||
<value>在设备的设置中将 Bitwarden 设置为您的通行密钥提供程序。</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>避免易混淆的字符</value>
|
||||
|
@ -1195,7 +1195,7 @@
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>我们无法为您自动打开 Android 凭据提供者设置菜单。您可以通过“Android 设置 > 系统 > 密码和账户 > 密码、通行密钥和数据服务”手动定位到凭据提供者设置菜单。</value>
|
||||
<value>我们无法为您自动打开 Android 凭据提供程序设置菜单。您可以通过 Android 设置 > 系统 > 密码和账户 > 密码、通行密钥和数据服务手动定位到凭据提供程序设置菜单。</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>我们无法为您自动打开 Android 自动填充设置菜单。您可以通过 Android 设置 > 系统 > 语言和输入 > 高级 > 自动填充服务,来手动导航到自动填充设置。</value>
|
||||
|
@ -2938,7 +2938,7 @@
|
|||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="ThereWasAProblemReadingAPasskeyForXTryAgainLater" xml:space="preserve">
|
||||
<value>读取 {0} 的通行密钥时。请稍后再试。</value>
|
||||
<value>读取 {0} 的通行密钥时出错。请稍后再试。</value>
|
||||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="VerifyingIdentityEllipsis" xml:space="preserve">
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
public const string Fido2CredentialCreate = "fido2CredentialCreate";
|
||||
public const string Fido2CredentialGet = "fido2CredentialGet";
|
||||
public const string Fido2CredentialAction = "fido2CredentialAction";
|
||||
public const string Fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout = "fido2CredentialNeedsUnlockingAgainBecauseImmediateTimeout";
|
||||
public const string CredentialProviderCipherId = "credentialProviderCipherId";
|
||||
public const string CredentialDataIntentExtra = "CREDENTIAL_DATA";
|
||||
public const string CredentialIdIntentExtra = "credId";
|
||||
|
|
Loading…
Reference in New Issue