1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-05 23:53:33 +00:00

Compare commits

...

15 Commits

Author SHA1 Message Date
ifernandezdiaz
b0e7912b76 Merge branch 'master' into PM-4047/fixing-simulator-app-build 2023-09-25 18:00:19 -03:00
ifernandezdiaz
83bd49a298 Fixing zip action for app file 2023-09-25 17:59:30 -03:00
André Bispo
b25c8b0842 [PM-3893] Make PreLogin and Register endpoint use identity endpoints (#2772) 2023-09-25 16:28:58 +01:00
Federico Maccaroni
a4a0d31fc6 [PM-3811] Passkeys unification (#2774)
* PM-3811 Unified passkeys view and moved both inside Login as an array of FIdo2Key

* PM-3811 Passkeys unification => updated cipher details view an helpers

* PM-3811 Updated passkeys creation date time format
2023-09-22 14:55:35 +00:00
ifernandezdiaz
d4117ed7ec Fixing issue on zipped .app file 2023-09-22 11:41:30 -03:00
ifernandezdiaz
6ef6cf5d84 Adding missing IDs (#2786) 2023-09-22 11:24:30 -03:00
github-actions[bot]
597f629920 Autosync the updated translations (#2785)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-09-22 08:04:57 +00:00
github-actions[bot]
b8cef16711 Bumped version to 2023.9.1 (#2784)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-09-20 18:36:32 -04:00
Jake Fink
c4f6ae9077 [PM-3726] prevent legacy user login (#2769)
* [PM-3726] prevent legacy user login

* [PM-3726] prevent unlock or auto key migration if legacy user

* [PM-3726] add legacy checks to lock page and refactor

* [PM-3726] rethrow exception from pin

* formatting

* [PM-3726] add changes to LockViewController, consolidate logout calls

* formatting

* [PM-3726] pr feedback

* generate resx

* formatting
2023-09-20 15:56:51 -04:00
github-actions[bot]
8b9658d2c5 Bumped version to 2023.9.0 (#2783)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-09-20 12:34:30 -04:00
André Bispo
43bf0fbdb3 [PM-3086] Account switcher endpoint use domain string for Bitwarden production environments (#2773) 2023-09-19 10:35:37 +01:00
André Bispo
11922c6f49 [PM-3522] Keep variable value after logout. (#2761) 2023-09-19 10:33:01 +01:00
André Bispo
a6f05338c2 [PM-3393] Excessive Invalid Biometric unlock attempts should automatically log out TDE users (#2747)
* [PM-3393] Log user out on biometric exceed attempts

* [PM-3393] Move duplicated code to AppHelpers

* [PM-3393] Update copy on new pop up

* [PM-3393] Moved VaultTimeoutService to LazyResolve.

* [PM-3382] Change IVaultTimeoutService for messaging

* [PM-3393] Use default values.
2023-09-19 10:32:23 +01:00
Federico Maccaroni
b932824b5a Make dept-development-mobile default code owner (#2780) 2023-09-18 18:23:16 -03:00
github-actions[bot]
efd1671f48 Autosync the updated translations (#2771)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2023-09-14 14:14:00 +00:00
114 changed files with 1319 additions and 654 deletions

2
.github/CODEOWNERS vendored
View File

@@ -6,6 +6,8 @@
# Unless a later match takes precedence
# @bitwarden/tech-leads
@bitwarden/dept-development-mobile
## Auth team files ##
## Platform team files ##

View File

@@ -710,7 +710,7 @@ jobs:
ARCHIVE_PATH="./src/iOS/bin/iPhoneSimulator/Release/BitwardeniOS.app"
EXPORT_PATH="./bitwarden-export"
zip -r -q BitwardeniOS.app.zip $ARCHIVE_PATH
zip -r -q -j BitwardeniOS.app.zip $ARCHIVE_PATH
mv BitwardeniOS.app.zip $EXPORT_PATH
shell: bash

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.8.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2023.9.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="33" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />

View File

@@ -36,7 +36,7 @@ namespace Bit.App.Controls
public bool ShowHostname
{
get => !string.IsNullOrWhiteSpace(AccountView.Hostname) && AccountView.Hostname != "vault.bitwarden.com";
get => !string.IsNullOrWhiteSpace(AccountView.Hostname);
}
public bool IsActive

View File

@@ -7,6 +7,7 @@ using Bit.App.Utilities;
using Bit.Core;
using Bit.Core.Abstractions;
using Bit.Core.Enums;
using Bit.Core.Exceptions;
using Bit.Core.Models.Domain;
using Bit.Core.Models.Request;
using Bit.Core.Services;
@@ -72,11 +73,12 @@ namespace Bit.App.Pages
TogglePasswordCommand = new Command(TogglePassword);
SubmitCommand = new Command(async () => await SubmitAsync());
AccountSwitchingOverlayViewModel = new AccountSwitchingOverlayViewModel(_stateService, _messagingService, _logger)
{
AllowAddAccountRow = true,
AllowActiveAccountSelection = true
};
AccountSwitchingOverlayViewModel =
new AccountSwitchingOverlayViewModel(_stateService, _messagingService, _logger)
{
AllowAddAccountRow = true,
AllowActiveAccountSelection = true
};
}
public string MasterPassword
@@ -155,8 +157,12 @@ namespace Bit.App.Pages
public Command SubmitCommand { get; }
public Command TogglePasswordCommand { get; }
public string ShowPasswordIcon => ShowPassword ? BitwardenIcons.EyeSlash : BitwardenIcons.Eye;
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
public string PasswordVisibilityAccessibilityText => ShowPassword
? AppResources.PasswordIsVisibleTapToHide
: AppResources.PasswordIsNotVisibleTapToShow;
public Action UnlockedAction { get; set; }
public event Action<int?> FocusSecretEntry
{
@@ -178,8 +184,9 @@ namespace Bit.App.Pages
var ephemeralPinSet = await _stateService.GetPinKeyEncryptedUserKeyEphemeralAsync()
?? await _stateService.GetPinProtectedKeyAsync();
PinEnabled = (_pinStatus == PinLockType.Transient && ephemeralPinSet != null) ||
_pinStatus == PinLockType.Persistent;
BiometricEnabled = await _vaultTimeoutService.IsBiometricLockSetAsync() && await _biometricService.CanUseBiometricsUnlockAsync();
_pinStatus == PinLockType.Persistent;
BiometricEnabled = await IsBiometricsEnabledAsync();
// Users without MP and without biometric or pin has no MP to unlock with
_hasMasterPassword = await _userVerificationService.HasMasterPasswordAsync();
@@ -214,7 +221,9 @@ namespace Bit.App.Pages
else
{
PageTitle = _hasMasterPassword ? AppResources.VerifyMasterPassword : AppResources.UnlockVault;
LockedVerifyText = _hasMasterPassword ? AppResources.VaultLockedMasterPassword : AppResources.VaultLockedIdentity;
LockedVerifyText = _hasMasterPassword
? AppResources.VaultLockedMasterPassword
: AppResources.VaultLockedIdentity;
}
if (BiometricEnabled)
@@ -233,11 +242,32 @@ namespace Bit.App.Pages
BiometricButtonText = supportsFace ? AppResources.UseFaceIDToUnlock :
AppResources.UseFingerprintToUnlock;
}
}
}
public async Task SubmitAsync()
{
ShowPassword = false;
try
{
var kdfConfig = await _stateService.GetActiveUserCustomDataAsync(a => new KdfConfig(a?.Profile));
if (PinEnabled)
{
await UnlockWithPinAsync(kdfConfig);
}
else
{
await UnlockWithMasterPasswordAsync(kdfConfig);
}
}
catch (LegacyUserException)
{
await HandleLegacyUserAsync();
}
}
private async Task UnlockWithPinAsync(KdfConfig kdfConfig)
{
if (PinEnabled && string.IsNullOrWhiteSpace(Pin))
{
@@ -246,6 +276,84 @@ namespace Bit.App.Pages
AppResources.Ok);
return;
}
var failed = true;
try
{
EncString userKeyPin;
EncString oldPinProtected;
switch (_pinStatus)
{
case PinLockType.Persistent:
{
userKeyPin = await _stateService.GetPinKeyEncryptedUserKeyAsync();
var oldEncryptedKey = await _stateService.GetPinProtectedAsync();
oldPinProtected = oldEncryptedKey != null ? new EncString(oldEncryptedKey) : null;
break;
}
case PinLockType.Transient:
userKeyPin = await _stateService.GetPinKeyEncryptedUserKeyEphemeralAsync();
oldPinProtected = await _stateService.GetPinProtectedKeyAsync();
break;
case PinLockType.Disabled:
default:
throw new Exception("Pin is disabled");
}
UserKey userKey;
if (oldPinProtected != null)
{
userKey = await _cryptoService.DecryptAndMigrateOldPinKeyAsync(
_pinStatus == PinLockType.Transient,
Pin,
_email,
kdfConfig,
oldPinProtected
);
}
else
{
userKey = await _cryptoService.DecryptUserKeyWithPinAsync(
Pin,
_email,
kdfConfig,
userKeyPin
);
}
var protectedPin = await _stateService.GetProtectedPinAsync();
var decryptedPin = await _cryptoService.DecryptToUtf8Async(new EncString(protectedPin), userKey);
failed = decryptedPin != Pin;
if (!failed)
{
Pin = string.Empty;
await AppHelpers.ResetInvalidUnlockAttemptsAsync();
await SetUserKeyAndContinueAsync(userKey);
}
}
catch (LegacyUserException)
{
throw;
}
catch
{
failed = true;
}
if (failed)
{
var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync();
if (invalidUnlockAttempts >= 5)
{
_messagingService.Send("logout");
return;
}
await _platformUtilsService.ShowDialogAsync(AppResources.InvalidPIN,
AppResources.AnErrorHasOccurred);
}
}
private async Task UnlockWithMasterPasswordAsync(KdfConfig kdfConfig)
{
if (!PinEnabled && string.IsNullOrWhiteSpace(MasterPassword))
{
await Page.DisplayAlert(AppResources.AnErrorHasOccurred,
@@ -254,142 +362,78 @@ namespace Bit.App.Pages
return;
}
ShowPassword = false;
var kdfConfig = await _stateService.GetActiveUserCustomDataAsync(a => new KdfConfig(a?.Profile));
if (PinEnabled)
var masterKey = await _cryptoService.MakeMasterKeyAsync(MasterPassword, _email, kdfConfig);
if (await _cryptoService.IsLegacyUserAsync(masterKey))
{
var failed = true;
throw new LegacyUserException();
}
var storedKeyHash = await _cryptoService.GetMasterKeyHashAsync();
var passwordValid = false;
MasterPasswordPolicyOptions enforcedMasterPasswordOptions = null;
if (storedKeyHash != null)
{
// Offline unlock possible
passwordValid = await _cryptoService.CompareAndUpdateKeyHashAsync(MasterPassword, masterKey);
}
else
{
// Online unlock required
await _deviceActionService.ShowLoadingAsync(AppResources.Loading);
var keyHash = await _cryptoService.HashMasterKeyAsync(MasterPassword, masterKey,
HashPurpose.ServerAuthorization);
var request = new PasswordVerificationRequest();
request.MasterPasswordHash = keyHash;
try
{
EncString userKeyPin = null;
EncString oldPinProtected = null;
if (_pinStatus == PinLockType.Persistent)
{
userKeyPin = await _stateService.GetPinKeyEncryptedUserKeyAsync();
var oldEncryptedKey = await _stateService.GetPinProtectedAsync();
oldPinProtected = oldEncryptedKey != null ? new EncString(oldEncryptedKey) : null;
}
else if (_pinStatus == PinLockType.Transient)
{
userKeyPin = await _stateService.GetPinKeyEncryptedUserKeyEphemeralAsync();
oldPinProtected = await _stateService.GetPinProtectedKeyAsync();
}
UserKey userKey;
if (oldPinProtected != null)
{
userKey = await _cryptoService.DecryptAndMigrateOldPinKeyAsync(
_pinStatus == PinLockType.Transient,
Pin,
_email,
kdfConfig,
oldPinProtected
);
}
else
{
userKey = await _cryptoService.DecryptUserKeyWithPinAsync(
Pin,
_email,
kdfConfig,
userKeyPin
);
}
var protectedPin = await _stateService.GetProtectedPinAsync();
var decryptedPin = await _cryptoService.DecryptToUtf8Async(new EncString(protectedPin), userKey);
failed = decryptedPin != Pin;
if (!failed)
{
Pin = string.Empty;
await AppHelpers.ResetInvalidUnlockAttemptsAsync();
await SetUserKeyAndContinueAsync(userKey);
}
var response = await _apiService.PostAccountVerifyPasswordAsync(request);
enforcedMasterPasswordOptions = response.MasterPasswordPolicy;
passwordValid = true;
var localKeyHash = await _cryptoService.HashMasterKeyAsync(MasterPassword, masterKey,
HashPurpose.LocalAuthorization);
await _cryptoService.SetMasterKeyHashAsync(localKeyHash);
}
catch
catch (Exception e)
{
failed = true;
System.Diagnostics.Debug.WriteLine(">>> {0}: {1}", e.GetType(), e.StackTrace);
}
if (failed)
await _deviceActionService.HideLoadingAsync();
}
if (passwordValid)
{
if (await RequirePasswordChangeAsync(enforcedMasterPasswordOptions))
{
var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync();
if (invalidUnlockAttempts >= 5)
{
_messagingService.Send("logout");
return;
}
await _platformUtilsService.ShowDialogAsync(AppResources.InvalidPIN,
AppResources.AnErrorHasOccurred);
// Save the ForcePasswordResetReason to force a password reset after unlock
await _stateService.SetForcePasswordResetReasonAsync(
ForcePasswordResetReason.WeakMasterPasswordOnLogin);
}
MasterPassword = string.Empty;
await AppHelpers.ResetInvalidUnlockAttemptsAsync();
var userKey = await _cryptoService.DecryptUserKeyWithMasterKeyAsync(masterKey);
await _cryptoService.SetMasterKeyAsync(masterKey);
await SetUserKeyAndContinueAsync(userKey);
// Re-enable biometrics
if (BiometricEnabled & !BiometricIntegrityValid)
{
await _biometricService.SetupBiometricAsync();
}
}
else
{
var masterKey = await _cryptoService.MakeMasterKeyAsync(MasterPassword, _email, kdfConfig);
var storedKeyHash = await _cryptoService.GetMasterKeyHashAsync();
var passwordValid = false;
MasterPasswordPolicyOptions enforcedMasterPasswordOptions = null;
if (storedKeyHash != null)
var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync();
if (invalidUnlockAttempts >= 5)
{
// Offline unlock possible
passwordValid = await _cryptoService.CompareAndUpdateKeyHashAsync(MasterPassword, masterKey);
}
else
{
// Online unlock required
await _deviceActionService.ShowLoadingAsync(AppResources.Loading);
var keyHash = await _cryptoService.HashMasterKeyAsync(MasterPassword, masterKey, HashPurpose.ServerAuthorization);
var request = new PasswordVerificationRequest();
request.MasterPasswordHash = keyHash;
try
{
var response = await _apiService.PostAccountVerifyPasswordAsync(request);
enforcedMasterPasswordOptions = response.MasterPasswordPolicy;
passwordValid = true;
var localKeyHash = await _cryptoService.HashMasterKeyAsync(MasterPassword, masterKey, HashPurpose.LocalAuthorization);
await _cryptoService.SetMasterKeyHashAsync(localKeyHash);
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(">>> {0}: {1}", e.GetType(), e.StackTrace);
}
await _deviceActionService.HideLoadingAsync();
}
if (passwordValid)
{
if (await RequirePasswordChangeAsync(enforcedMasterPasswordOptions))
{
// Save the ForcePasswordResetReason to force a password reset after unlock
await _stateService.SetForcePasswordResetReasonAsync(
ForcePasswordResetReason.WeakMasterPasswordOnLogin);
}
MasterPassword = string.Empty;
await AppHelpers.ResetInvalidUnlockAttemptsAsync();
var userKey = await _cryptoService.DecryptUserKeyWithMasterKeyAsync(masterKey);
await _cryptoService.SetMasterKeyAsync(masterKey);
await SetUserKeyAndContinueAsync(userKey);
// Re-enable biometrics
if (BiometricEnabled & !BiometricIntegrityValid)
{
await _biometricService.SetupBiometricAsync();
}
}
else
{
var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync();
if (invalidUnlockAttempts >= 5)
{
_messagingService.Send("logout");
return;
}
await _platformUtilsService.ShowDialogAsync(AppResources.InvalidMasterPassword,
AppResources.AnErrorHasOccurred);
_messagingService.Send("logout");
return;
}
await _platformUtilsService.ShowDialogAsync(AppResources.InvalidMasterPassword,
AppResources.AnErrorHasOccurred);
}
}
@@ -452,25 +496,36 @@ namespace Bit.App.Pages
{
ShowPassword = !ShowPassword;
var secret = PinEnabled ? Pin : MasterPassword;
_secretEntryFocusWeakEventManager.RaiseEvent(string.IsNullOrEmpty(secret) ? 0 : secret.Length, nameof(FocusSecretEntry));
_secretEntryFocusWeakEventManager.RaiseEvent(string.IsNullOrEmpty(secret) ? 0 : secret.Length,
nameof(FocusSecretEntry));
}
public async Task PromptBiometricAsync()
{
BiometricIntegrityValid = await _platformUtilsService.IsBiometricIntegrityValidAsync();
BiometricButtonVisible = BiometricIntegrityValid;
if (!BiometricEnabled || !BiometricIntegrityValid)
try
{
return;
BiometricIntegrityValid = await _platformUtilsService.IsBiometricIntegrityValidAsync();
BiometricButtonVisible = BiometricIntegrityValid;
if (!BiometricEnabled || !BiometricIntegrityValid)
{
return;
}
var success = await _platformUtilsService.AuthenticateBiometricAsync(null,
PinEnabled ? AppResources.PIN : AppResources.MasterPassword,
() => _secretEntryFocusWeakEventManager.RaiseEvent((int?)null, nameof(FocusSecretEntry)),
!PinEnabled && !HasMasterPassword);
await _stateService.SetBiometricLockedAsync(!success);
if (success)
{
var userKey = await _cryptoService.GetBiometricUnlockKeyAsync();
await SetUserKeyAndContinueAsync(userKey);
}
}
var success = await _platformUtilsService.AuthenticateBiometricAsync(null,
PinEnabled ? AppResources.PIN : AppResources.MasterPassword,
() => _secretEntryFocusWeakEventManager.RaiseEvent((int?)null, nameof(FocusSecretEntry)));
await _stateService.SetBiometricLockedAsync(!success);
if (success)
catch (LegacyUserException)
{
var userKey = await _cryptoService.GetBiometricUnlockKeyAsync();
await SetUserKeyAndContinueAsync(userKey);
await HandleLegacyUserAsync();
}
}
@@ -493,5 +548,29 @@ namespace Bit.App.Pages
_messagingService.Send("unlocked");
UnlockedAction?.Invoke();
}
private async Task<bool> IsBiometricsEnabledAsync()
{
try
{
return await _vaultTimeoutService.IsBiometricLockSetAsync() &&
await _biometricService.CanUseBiometricsUnlockAsync();
}
catch (LegacyUserException)
{
await HandleLegacyUserAsync();
}
return false;
}
private async Task HandleLegacyUserAsync()
{
// Legacy users must migrate on web vault.
await _platformUtilsService.ShowDialogAsync(AppResources.EncryptionKeyMigrationRequiredDescriptionLong,
AppResources.AnErrorHasOccurred,
AppResources.Ok);
await _vaultTimeoutService.LogOutAsync();
}
}
}

View File

@@ -248,6 +248,14 @@ namespace Bit.App.Pages
await _deviceActionService.HideLoadingAsync();
if (response.RequiresEncryptionKeyMigration)
{
// Legacy users must migrate on web vault.
await _platformUtilsService.ShowDialogAsync(AppResources.EncryptionKeyMigrationRequiredDescriptionLong, AppResources.AnErrorHasOccurred,
AppResources.Ok);
return;
}
if (response.TwoFactor)
{
StartTwoFactorAction?.Invoke();

View File

@@ -38,7 +38,8 @@
<Label
Text="{u:I18n DisablePersonalVaultExportPolicyInEffect}"
StyleClass="text-muted, text-sm, text-bold"
HorizontalTextAlignment="Center" />
HorizontalTextAlignment="Center"
AutomationId="DisablePrivateVaultPolicyLabel" />
</Frame>
<Grid
RowSpacing="10"
@@ -55,7 +56,8 @@
SelectedIndex="{Binding FileFormatSelectedIndex}"
SelectedIndexChanged="FileFormat_Changed"
StyleClass="box-value"
IsEnabled="{Binding DisablePrivateVaultPolicyEnabled, Converter={StaticResource inverseBool}}" />
IsEnabled="{Binding DisablePrivateVaultPolicyEnabled, Converter={StaticResource inverseBool}}"
AutomationId="FileFormatPicker" />
</StackLayout>
<StackLayout
StyleClass="box-row"
@@ -72,7 +74,8 @@
HorizontalOptions="Fill"
VerticalOptions="End"
IsEnabled="{Binding DisablePrivateVaultPolicyEnabled, Converter={StaticResource inverseBool}}"
Margin="0,0,0,10"/>
Margin="0,0,0,10"
AutomationId="SendTOTPCodeButton" />
</StackLayout>
<Grid
StyleClass="box-row"
@@ -96,7 +99,8 @@
Grid.Row="1"
Grid.Column="0"
ReturnType="Go"
ReturnCommand="{Binding ExportVaultCommand}" />
ReturnCommand="{Binding ExportVaultCommand}"
AutomationId="MasterPasswordEntry" />
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding ShowPasswordIcon}"
@@ -106,7 +110,8 @@
AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n ToggleVisibility}"
AutomationProperties.HelpText="{Binding PasswordVisibilityAccessibilityText}"
IsVisible="{Binding UseOTPVerification, Converter={StaticResource inverseBool}}"/>
IsVisible="{Binding UseOTPVerification, Converter={StaticResource inverseBool}}"
AutomationId="TogglePasswordVisibilityButton" />
<Label
Text="{u:I18n ConfirmYourIdentity}"
StyleClass="box-footer-label"
@@ -128,7 +133,8 @@
Clicked="ExportVault_Clicked"
HorizontalOptions="Fill"
VerticalOptions="End"
IsEnabled="{Binding DisablePrivateVaultPolicyEnabled, Converter={StaticResource inverseBool}}"/>
IsEnabled="{Binding DisablePrivateVaultPolicyEnabled, Converter={StaticResource inverseBool}}"
AutomationId="ExportVaultButton" />
</StackLayout>
</StackLayout>
</ScrollView>

View File

@@ -37,7 +37,7 @@ namespace Bit.App.Pages
set => SetProperty(ref _cipher, value, additionalPropertyNames: AdditionalPropertiesToRaiseOnCipherChanged);
}
public string CreationDate => string.Format(AppResources.CreatedX, Cipher.CreationDate.ToShortDateString());
public string CreationDate => string.Format(AppResources.CreatedXY, Cipher.CreationDate.ToShortDateString(), Cipher.CreationDate.ToShortTimeString());
public AsyncCommand CheckPasswordCommand { get; }

View File

@@ -229,9 +229,9 @@
Margin="0,10,0,0"
IsVisible="{Binding ShowPasskeyInfo}"/>
<Entry
Text="{u:I18n AvailableForTwoStepLogin}"
Text="{Binding CreationDate}"
IsEnabled="False"
StyleClass="box-value,text-muted"
StyleClass="box-value,text-muted"
IsVisible="{Binding ShowPasskeyInfo}" />
<Grid StyleClass="box-row, box-row-input">
@@ -650,38 +650,6 @@
AutomationId="IdentityCountryEntry" />
</StackLayout>
</StackLayout>
<StackLayout IsVisible="{Binding IsFido2Key}" Spacing="0" Padding="0">
<Label
Text="{u:I18n Username}"
StyleClass="box-label"
Margin="0,10,0,0"/>
<Entry
x:Name="_fido2KeyUsernameEntry"
Text="{Binding Cipher.Fido2Key.UserName}"
StyleClass="box-value"
Grid.Row="1"/>
<Label
Text="{u:I18n Passkey}"
StyleClass="box-label"
Margin="0,10,0,0"/>
<Entry
Text="{Binding CreationDate}"
IsEnabled="False"
StyleClass="box-value,text-muted" />
<Label
Text="{u:I18n Application}"
StyleClass="box-label"
Margin="0,10,0,0"/>
<Entry
Text="{Binding Cipher.Fido2Key.LaunchUri}"
IsEnabled="False"
StyleClass="box-value,text-muted" />
<Label
Text="{u:I18n YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey}"
StyleClass="box-sub-label" />
</StackLayout>
</StackLayout>
<StackLayout StyleClass="box" IsVisible="{Binding IsLogin}">
<StackLayout StyleClass="box-row-header">

View File

@@ -296,7 +296,6 @@ namespace Bit.App.Pages
public bool IsIdentity => Cipher?.Type == CipherType.Identity;
public bool IsCard => Cipher?.Type == CipherType.Card;
public bool IsSecureNote => Cipher?.Type == CipherType.SecureNote;
public bool IsFido2Key => Cipher?.Type == CipherType.Fido2Key;
public bool ShowUris => IsLogin && Cipher.Login.HasUris;
public bool ShowAttachments => Cipher.HasAttachments;
public string ShowPasswordIcon => ShowPassword ? BitwardenIcons.EyeSlash : BitwardenIcons.Eye;
@@ -309,7 +308,7 @@ namespace Bit.App.Pages
public string PasswordVisibilityAccessibilityText => ShowPassword ? AppResources.PasswordIsVisibleTapToHide : AppResources.PasswordIsNotVisibleTapToShow;
public bool HasTotpValue => IsLogin && !string.IsNullOrEmpty(Cipher?.Login?.Totp);
public string SetupTotpText => $"{BitwardenIcons.Camera} {AppResources.SetupTotp}";
public bool ShowPasskeyInfo => Cipher?.Login?.Fido2Key != null && !CloneMode;
public bool ShowPasskeyInfo => Cipher?.HasFido2Key == true && !CloneMode;
public void Init()
{
@@ -371,7 +370,7 @@ namespace Bit.App.Pages
if (Cipher.Type == CipherType.Login)
{
// passkeys can't be cloned
Cipher.Login.Fido2Key = null;
Cipher.Login.Fido2Keys = null;
}
}
if (appOptions?.OtpData != null && Cipher.Type == CipherType.Login)

View File

@@ -199,12 +199,12 @@
Text="{u:I18n Passkey}"
StyleClass="box-label"
Margin="0,10,0,0"
IsVisible="{Binding Cipher.Login.Fido2Key, Converter={StaticResource notNull}}"/>
IsVisible="{Binding Cipher.Login.MainFido2Key, Converter={StaticResource notNull}}"/>
<Entry
Text="{u:I18n AvailableForTwoStepLogin}"
Text="{Binding CreationDate}"
IsEnabled="False"
StyleClass="box-value,text-muted"
IsVisible="{Binding Cipher.Login.Fido2Key, Converter={StaticResource notNull}}" />
IsVisible="{Binding Cipher.Login.MainFido2Key, Converter={StaticResource notNull}}" />
<Grid StyleClass="box-row"
IsVisible="{Binding ShowTotp}"
AutomationId="ItemRow">
@@ -579,64 +579,6 @@
</StackLayout>
<BoxView StyleClass="box-row-separator" IsVisible="{Binding ShowIdentityAddress}" />
</StackLayout>
<StackLayout
IsVisible="{Binding IsFido2Key}"
Spacing="0"
Padding="0"
Margin="0,10,0,0">
<Label
Text="{u:I18n Username}"
StyleClass="box-label" />
<Label
Text="{Binding Cipher.Fido2Key.UserName, Mode=OneWay}"
StyleClass="box-value" />
<BoxView StyleClass="box-row-separator" Margin="0,10,0,0" />
<Label
Text="{u:I18n Passkey}"
StyleClass="box-label"
Margin="0,10,0,0" />
<Label
Text="{Binding CreationDate, Mode=OneWay}"
StyleClass="box-value" />
<BoxView StyleClass="box-row-separator" Margin="0,10,0,0" />
<Grid
StyleClass="box-row"
RowDefinitions="Auto,*,Auto"
ColumnDefinitions="*,Auto,Auto">
<Label
Text="{u:I18n Application}"
StyleClass="box-label" />
<Label
Grid.Row="1"
Text="{Binding Cipher.Fido2Key.LaunchUri, Mode=OneWay}"
StyleClass="box-value" />
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.ShareSquare}}"
Command="{Binding LaunchUriCommand}"
CommandParameter="{Binding Cipher.Fido2Key}"
Grid.Column="1"
Grid.RowSpan="2"
VerticalOptions="End"
IsVisible="{Binding Cipher.Fido2Key.CanLaunch, Mode=OneWay}"
AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n Launch}" />
<controls:IconButton
StyleClass="box-row-button, box-row-button-platform"
Text="{Binding Source={x:Static core:BitwardenIcons.Clone}}"
Command="{Binding CopyCommand}"
CommandParameter="Fido2KeyApplication"
Grid.Column="2"
Grid.RowSpan="2"
AutomationProperties.IsInAccessibleTree="True"
AutomationProperties.Name="{u:I18n CopyApplication}" />
<BoxView
StyleClass="box-row-separator"
Margin="0,3,0,0"
Grid.Row="2"
Grid.ColumnSpan="3" />
</Grid>
</StackLayout>
</StackLayout>
<StackLayout StyleClass="box" IsVisible="{Binding ShowUris}">
<StackLayout StyleClass="box-row-header">

View File

@@ -148,7 +148,6 @@ namespace Bit.App.Pages
public bool IsIdentity => Cipher?.Type == Core.Enums.CipherType.Identity;
public bool IsCard => Cipher?.Type == Core.Enums.CipherType.Card;
public bool IsSecureNote => Cipher?.Type == Core.Enums.CipherType.SecureNote;
public bool IsFido2Key => Cipher?.Type == Core.Enums.CipherType.Fido2Key;
public FormattedString ColoredPassword => GeneratedValueFormatter.Format(Cipher.Login.Password);
public FormattedString UpdatedText
{
@@ -649,11 +648,6 @@ namespace Bit.App.Pages
text = Cipher.Card.Code;
name = AppResources.SecurityCode;
}
else if (id == "Fido2KeyApplication")
{
text = Cipher.Fido2Key?.LaunchUri;
name = AppResources.Application;
}
if (text != null)
{
@@ -708,18 +702,12 @@ namespace Bit.App.Pages
private async Task<bool> CanCloneAsync()
{
if (Cipher.Type == CipherType.Fido2Key)
if (!Cipher.HasFido2Key)
{
await _platformUtilsService.ShowDialogAsync(AppResources.PasskeyWillNotBeCopied);
return false;
return true;
}
if (Cipher.Type == CipherType.Login && Cipher.Login?.Fido2Key != null)
{
return await _platformUtilsService.ShowDialogAsync(AppResources.ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem, AppResources.PasskeyWillNotBeCopied, AppResources.Yes, AppResources.No);
}
return true;
return await _platformUtilsService.ShowDialogAsync(AppResources.ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem, AppResources.PasskeyWillNotBeCopied, AppResources.Yes, AppResources.No);
}
}
}

View File

@@ -60,9 +60,6 @@ namespace Bit.App.Pages
case CipherType.Identity:
_name = AppResources.TypeIdentity;
break;
case CipherType.Fido2Key:
_name = AppResources.Passkey;
break;
default:
break;
}
@@ -111,9 +108,6 @@ namespace Bit.App.Pages
case CipherType.Identity:
_icon = BitwardenIcons.IdCard;
break;
case CipherType.Fido2Key:
_icon = BitwardenIcons.Passkey;
break;
default:
_icon = BitwardenIcons.Globe;
break;

View File

@@ -569,7 +569,7 @@ namespace Bit.App.Pages
{
Filter = c => !c.IsDeleted
&&
Type.Value.IsEqualToOrCanSignIn(c.Type);
Type.Value == c.Type;
}
else if (FolderId != null)
{
@@ -636,9 +636,7 @@ namespace Bit.App.Pages
NoFolderCiphers.Add(c);
}
// Fido2Key ciphers should be counted as Login ciphers
var countType = c.Type == CipherType.Fido2Key ? CipherType.Login : c.Type;
_typeCounts[countType] = _typeCounts.TryGetValue(countType, out var currentTypeCount)
_typeCounts[c.Type] = _typeCounts.TryGetValue(c.Type, out var currentTypeCount)
? currentTypeCount + 1
: 1;
}

View File

@@ -256,6 +256,15 @@ namespace Bit.App.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Account logged out..
/// </summary>
public static string AccountLoggedOutBiometricExceeded {
get {
return ResourceManager.GetString("AccountLoggedOutBiometricExceeded", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Account logged out successfully.
/// </summary>
@@ -418,6 +427,15 @@ namespace Bit.App.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to addy.io.
/// </summary>
public static string AddyIo {
get {
return ResourceManager.GetString("AddyIo", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Admin approval requested.
/// </summary>
@@ -508,15 +526,6 @@ namespace Bit.App.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to addy.io.
/// </summary>
public static string AddyIo {
get {
return ResourceManager.GetString("AddyIo", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to A notification has been sent to your device..
/// </summary>
@@ -1741,6 +1750,15 @@ namespace Bit.App.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Created {0}, {1}.
/// </summary>
public static string CreatedXY {
get {
return ResourceManager.GetString("CreatedXY", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Creating account....
/// </summary>
@@ -2353,6 +2371,15 @@ namespace Bit.App.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Encryption key migration required. Please login through the web vault to update your encryption key..
/// </summary>
public static string EncryptionKeyMigrationRequiredDescriptionLong {
get {
return ResourceManager.GetString("EncryptionKeyMigrationRequiredDescriptionLong", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Enter your account email address to receive your master password hint..
/// </summary>
@@ -6498,6 +6525,15 @@ namespace Bit.App.Resources {
}
}
/// <summary>
/// Looks up a localized string similar to Too many attempts.
/// </summary>
public static string TooManyAttempts {
get {
return ResourceManager.GetString("TooManyAttempts", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to TOTP.
/// </summary>
@@ -6751,7 +6787,7 @@ namespace Bit.App.Resources {
}
/// <summary>
/// Looks up a localized string similar to Unlocking may fail due to insufficient memory. Decrease your KDF memory settings to resolve..
/// Looks up a localized string similar to Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve..
/// </summary>
public static string UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve {
get {

View File

@@ -954,6 +954,9 @@ Skandering gebeur outomaties.</value>
<data name="UpdateKey" xml:space="preserve">
<value>U kan nie hierdie funksie gebruik tot u u enkripsiesleutel bygewerk het nie.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Leer meer</value>
</data>
@@ -2761,4 +2764,10 @@ Wil u na die rekening omskakel?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>لا يمكنك استخدام هذه الميزة حتى تقوم بتحديث مفتاح التشفير الخاص بك.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>مطلوب ترحيل مفتاح التشفير. الرجاء تسجيل الدخول بواسطة مخزن الويب لتحديث مفتاح التشفير الخاص بك.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>اعرف المزيد</value>
</data>
@@ -2762,4 +2765,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>جارٍ تسجيل الدخول</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>لقد أجريت محاولات كثيرة</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>تم تسجيل الخروج من الحساب.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skan prosesi avtomatik baş tutacaq.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Şifrələmə açarınızı güncəlləyənə qədər bu özəlliyi istifadə edə bilməzsiniz.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Şifrələmə açarının daşınması tələb olunur. Şifrələmə açarınızı güncəlləmək üçün zəhmət olmasa veb anbar üzərindən giriş edin.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Daha ətraflı</value>
</data>
@@ -2645,38 +2648,38 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Bu cihazı xatırla</value>
</data>
<data name="Passkey" xml:space="preserve">
<value>Passkey</value>
<value>Keçid açarı</value>
</data>
<data name="Passkeys" xml:space="preserve">
<value>Passkeys</value>
<value>Keçid açarı</value>
</data>
<data name="CreatedX" xml:space="preserve">
<value>Created {0}</value>
<value>{0} yaradıldı</value>
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
</data>
<data name="Application" xml:space="preserve">
<value>Application</value>
<value>Tətbiq</value>
</data>
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
<value>You cannot edit passkey application because it would invalidate the passkey</value>
<value>Keçid açarı tətbiqinə düzəliş edə bilməzsiniz, çünki bu, keçid açarını yararsız edəcək</value>
</data>
<data name="PasskeyWillNotBeCopied" xml:space="preserve">
<value>Passkey will not be copied</value>
<value>Keçid açarı kopyalanmır</value>
</data>
<data name="ThePasskeyWillNotBeCopiedToTheClonedItemDoYouWantToContinueCloningThisItem" xml:space="preserve">
<value>The passkey will not be copied to the cloned item. Do you want to continue cloning this item?</value>
<value>Keçid açarı, klonlanmış elementə kopyalanmayacaq. Bu elementi klonlamağa davam etmək istəyirsiniz?</value>
</data>
<data name="CopyApplication" xml:space="preserve">
<value>Copy application</value>
<value>Tətbiqi kopyala</value>
</data>
<data name="AvailableForTwoStepLogin" xml:space="preserve">
<value>Available for two-step login</value>
<value>İki addımlı giriş üçün əlçatandır</value>
</data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>Ana parolu təkrar soruş köməyi</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
<value>Yetərsiz yaddaşa görə kilid açma uğursuz ola bilər. Həll etmək üçün KDF yaddaş tənzimləmələrinizi azaldın və ya biometrik kilid açmanı quraşdırın.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Yararsız API açarı</value>
@@ -2703,7 +2706,7 @@ Bu hesaba keçmək istəyirsiniz?</value>
<value>Anbar vaxt bitməsi əməliyyatııxış et" olaraq dəyişdirildi</value>
</data>
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
<value>Bu element təşkilatla paylaşıla bilmir, çünki eyni keçid açarına sahib bir element artıq mövcuddur.</value>
</data>
<data name="BlockAutoFill" xml:space="preserve">
<value>Avto-doldurmanı əngəllə</value>
@@ -2760,4 +2763,10 @@ Bu hesaba keçmək istəyirsiniz?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Giriş edilir</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Həddən artıq cəhd</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Hesabdan çıxış edildi.</value>
</data>
</root>

View File

@@ -953,6 +953,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Вы не зможаце выкарыстоўваць гэту функцыю, пакуль не абнавіце свой ключ шыфравання.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Даведацца больш</value>
</data>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Трябва да обновите шифриращия си ключ, за да използвате тази възможност.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Необходима е промяна на шифриращия ключ. Впишете се в трезора си по уеб, за да обновите своя шифриращ ключ.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Научете повече</value>
</data>
@@ -2761,4 +2764,10 @@ select Add TOTP to store the key safely</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Вписване в</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Твърде много опити</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Акаунтът е отписан.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>আপনি আপনার এনক্রিপশন কী হালনাগাদ না করা পর্যন্ত এই বৈশিষ্ট্যটি ব্যবহার করতে পারবেন না।</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>আরও জানুন</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skeniranje će biti izvršeno automatski.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Ovu funkciju ne možete koristiti dok ne ažurirate ključ za šifrovanje.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Saznajte više</value>
</data>
@@ -2760,4 +2763,10 @@ Skeniranje će biti izvršeno automatski.</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ L'escaneig es farà automàticament.</value>
<data name="UpdateKey" xml:space="preserve">
<value>No podeu utilitzar aquesta característica fins que no actualitzeu la vostra clau de xifratge.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Més informació</value>
</data>
@@ -2761,4 +2764,10 @@ Voleu canviar a aquest compte?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Inici de sessió en</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Načtení proběhne automaticky.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Dokud neaktualizujete svůj šifrovací klíč, nemůžete tuto funkci použít.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Vyžaduje se migrace šifrovacího klíče. Pro aktualizaci šifrovacího klíče se přihlaste přes webový trezor.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Dozvědět se více</value>
</data>
@@ -2760,4 +2763,10 @@ Chcete se přepnout na tento účet?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Přihlašování na</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Příliš mnoho pokusů</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Účet byl odhlášen.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Dysgu mwy</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skanning vil ske automatisk.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Du kan ikke bruge denne funktion, før du opdaterer din krypteringsnøgle.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Krypteringsnøglemigrering nødvendig. Log ind gennem web-boksen for at opdatere krypteringsnøglen.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Få mere at vide</value>
</data>
@@ -2761,4 +2764,10 @@ Vil du skifte til denne konto?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logger ind på</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>For mange forsøg</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Konto logget ud.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Das Scannen erfolgt automatisch.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Du kannst diese Funktion nicht nutzen, solange du deinen Verschlüsselungsschlüssel nicht aktualisiert hast.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Mehr erfahren</value>
</data>
@@ -2676,7 +2679,7 @@ Möchtest du zu diesem Konto wechseln?</value>
<value>Hilfe zum erneuten Abfragen des Master-Passworts</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
<value>Das Entsperren kann aufgrund unzureichenden Arbeitsspeichers fehlschlagen. Verringere deine KDF-Speichereinstellungen oder richte die biometrische Entsperrung, um dies zu lösen.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Ungültiger API-Schlüssel</value>
@@ -2700,7 +2703,7 @@ Möchtest du zu diesem Konto wechseln?</value>
<value>Anmelden als {0}</value>
</data>
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
<value>Vault timeout action changed to log out</value>
<value>Tresor-Timeoutaktion auf "Abmelden" geändert</value>
</data>
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
<value>Dieser Eintrag kann nicht mit der Organisation geteilt werden, da bereits einer mit dem gleichen Passkey existiert.</value>
@@ -2760,4 +2763,10 @@ Möchtest du zu diesem Konto wechseln?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Anmelden bei</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Zu viele Versuche</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Konto abgemeldet.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη δυνατότητα μέχρι να ενημερώσετε το κλειδί κρυπτογράφησης.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Μάθετε Περισσότερα</value>
</data>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2761,4 +2764,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2775,4 +2778,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ El escaneo se realizará automáticamente.</value>
<data name="UpdateKey" xml:space="preserve">
<value>No puedes usar esta característica hasta que actualices tu clave de cifrado.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Aprender más</value>
</data>
@@ -2762,4 +2765,10 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skaneerimine toimub automaatselt.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Seda funktsiooni ei saa enne krüpteerimise võtme uuendamist kasutada.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Rohkem teavet</value>
</data>
@@ -2761,4 +2764,10 @@ Soovid selle konto peale lülituda?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Sisselogimas kui</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -953,6 +953,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Ezin duzu ezaugarri hau erabili zifratze-gakoa eguneratu arte.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Gehiago ezagutu</value>
</data>
@@ -2760,4 +2763,10 @@ Kontu honetara aldatu nahi duzu?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>تا زمانی که کد رمزنگاری را به‌روز نکنید نمی‌توانید از این قابلیت استفاده کنید.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>بیشتر بدانید</value>
</data>
@@ -2629,22 +2632,22 @@
<value>کلمه عبور اصلی فعلی</value>
</data>
<data name="LoggedIn" xml:space="preserve">
<value>Logged in!</value>
<value>وارد شده!</value>
</data>
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
<value>Approve with my other device</value>
<value>تایید با دستگاه دیگرم</value>
</data>
<data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value>
<value>درخواست تایید مدیر</value>
</data>
<data name="ApproveWithMasterPassword" xml:space="preserve">
<value>Approve with master password</value>
<value>تایید با کلمه عبور اصلی</value>
</data>
<data name="TurnOffUsingPublicDevice" xml:space="preserve">
<value>Turn off using a public device</value>
<value>اگر از دستگاه عمومی استفاده میکنید خاموش کنید</value>
</data>
<data name="RememberThisDevice" xml:space="preserve">
<value>Remember this device</value>
<value>این دستگاه را به خاطر بسپار</value>
</data>
<data name="Passkey" xml:space="preserve">
<value>کلید عبور</value>
@@ -2678,7 +2681,7 @@
<value>راهنمای درخواست مجدد کلمه عبور اصلی</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
<value>بازگشایی ممکن است به دلیل حافظه ناکافی انجام نشود. برای انجام تنظیمات حافظه KDF خود را کاهش دهید یا از بازگشایی زیست‌سنجی استفاده کنید.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>کلید API نامعتبر</value>
@@ -2687,22 +2690,22 @@
<value>توکن API نامعتبر</value>
</data>
<data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value>
<value>تایید مدیر در خواست شد</value>
</data>
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
<value>Your request has been sent to your admin.</value>
<value>درخواست شما به مدیرتان فرستاده شد.</value>
</data>
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<value>You will be notified once approved. </value>
<value>به محض تایید مطلع خواهید شد. </value>
</data>
<data name="TroubleLoggingIn" xml:space="preserve">
<value>Trouble logging in?</value>
<value>در ورود مشکلی دارید؟</value>
</data>
<data name="LoggingInAsX" xml:space="preserve">
<value>Logging in as {0}</value>
<value>ورود به عنوان {0}</value>
</data>
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
<value>Vault timeout action changed to log out</value>
<value>اقدام پایان زمان گاوصندوق به خروج تغییر کرد</value>
</data>
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
<value>این مورد را نمی‌توان با سازمان به اشتراک گذاشت زیرا قبلاً موردی با کلید عبور یکسان وجود دارد.</value>
@@ -2751,15 +2754,21 @@
<value>نمی‌توان چندین نشانی اینترنتی را همزمان ویرایش کرد</value>
</data>
<data name="LoginApproved" xml:space="preserve">
<value>Login approved</value>
<value>ورود تایید شد</value>
</data>
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
<value>ورود با دستگاه باید در تنظیمات برنامه‌ی Bitwarden تنظیم شود. به گزینه دیگری نیاز دارید؟</value>
</data>
<data name="LogInWithDevice" xml:space="preserve">
<value>Log in with device</value>
<value>ورود با دستگاه</value>
</data>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
<value>ورود با</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Koodi luetaan automaattisesti.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Et voi käyttää tätä toimintoa ennen kuin päivität salausavaimesi.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Salausavaimen siirto vaaditaan. Päivitä salausavaimesi kirjautumalla verkkoholviin.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Lue lisää</value>
</data>
@@ -2762,4 +2765,10 @@ Haluatko vaihtaa tähän tiliin?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Kirjaudutaan sijaintiin</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Liian monta yritystä</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Tili kirjattiin ulos.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Awtomatikong itong magsa-scan.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Hindi mo magagamit ang feature na ito hanggang sa i-update mo ang encryption key mo.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Matuto pa</value>
</data>
@@ -2762,4 +2765,10 @@ Gusto mo bang pumunta sa account na ito?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ La numérisation se fera automatiquement.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Vous ne pouvez pas utiliser cette fonctionnalité tant que vous ne mettez pas à jour votre clé de chiffrement.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Migration de la clé de chiffrement nécessaire. Veuillez vous connecter sur le coffre web pour mettre à jour votre clé de chiffrement.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>En savoir plus</value>
</data>
@@ -2629,22 +2632,22 @@ Voulez-vous basculer vers ce compte ?</value>
<value>Mot de passe principal actuel</value>
</data>
<data name="LoggedIn" xml:space="preserve">
<value>Logged in!</value>
<value>Connecté !</value>
</data>
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
<value>Approve with my other device</value>
</data>
<data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value>
<value>Demander l'approbation de l'administrateur</value>
</data>
<data name="ApproveWithMasterPassword" xml:space="preserve">
<value>Approve with master password</value>
<value>Approuver avec le mot de passe principal</value>
</data>
<data name="TurnOffUsingPublicDevice" xml:space="preserve">
<value>Turn off using a public device</value>
</data>
<data name="RememberThisDevice" xml:space="preserve">
<value>Remember this device</value>
<value>Se souvenir de cet appareil</value>
</data>
<data name="Passkey" xml:space="preserve">
<value>Clé d'accès</value>
@@ -2678,7 +2681,7 @@ Voulez-vous basculer vers ce compte ?</value>
<value>Aide sur la ressaisie du mot de passe principal</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
<value>Le déverrouillage peut échouer en raison d'une mémoire insuffisante. Diminuez les paramètres de mémoire KDF ou configurer le déverrouillage biométique pour y remédier.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Clé API invalide</value>
@@ -2687,16 +2690,16 @@ Voulez-vous basculer vers ce compte ?</value>
<value>Jeton API invalide</value>
</data>
<data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value>
<value>Approbation de l'administrateur demandée</value>
</data>
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
<value>Your request has been sent to your admin.</value>
<value>Votre demande a été envoyée à votre administrateur.</value>
</data>
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<value>You will be notified once approved. </value>
<value>Vous serez notifié une fois approuvé. </value>
</data>
<data name="TroubleLoggingIn" xml:space="preserve">
<value>Trouble logging in?</value>
<value>Problème pour vous connecter ?</value>
</data>
<data name="LoggingInAsX" xml:space="preserve">
<value>Logging in as {0}</value>
@@ -2757,9 +2760,15 @@ Voulez-vous basculer vers ce compte ?</value>
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
</data>
<data name="LogInWithDevice" xml:space="preserve">
<value>Log in with device</value>
<value>Se connecter avec l'appareil</value>
</data>
<data name="LoggingInOn" xml:space="preserve">
<value>Connexion sur</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Trop de tentatives</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Compte déconnecté.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -955,6 +955,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>לא ניתן להשתמש ביכולת זו עד שתעדכן את מפתח ההצפנה שלך.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>למידע נוסף</value>
</data>
@@ -2764,4 +2767,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>अधिक जानें</value>
</data>
@@ -2415,7 +2418,7 @@ select Add TOTP to store the key safely</value>
<value>सेवा</value>
</data>
<data name="AddyIo" xml:space="preserve">
<value>एननऐडी</value>
<value>addy.io</value>
<comment>"addy.io" is the product name and should not be translated.</comment>
</data>
<data name="FirefoxRelay" xml:space="preserve">
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -953,6 +953,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Ne možeš koristiti ovu značajku dok ne ažuriraš svoj ključ za šifriranje.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Saznaj više</value>
</data>
@@ -1749,10 +1752,10 @@
<comment>Confirmation alert message when soft-deleting a cipher.</comment>
</data>
<data name="AccountBiometricInvalidated" xml:space="preserve">
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
<value>Biometrijsko otključavanje za ovaj račun je onemogućeno do potvrde glavne lozinke.</value>
</data>
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
<value>Biometrijsko otključavanje auto-ispune za ovaj račun je onemogućeno do potvrde glavne lozinke.</value>
</data>
<data name="EnableSyncOnRefresh" xml:space="preserve">
<value>Uključi sinkronizaciju pri osvježavanju</value>
@@ -2139,10 +2142,10 @@
<value>Pravilo tvoje organizacije utječe na istek trezora. Najveće dozvoljeno vrijeme isteka je {0}:{1} h.</value>
</data>
<data name="VaultTimeoutPolicyWithActionInEffect" xml:space="preserve">
<value>Your organization policies are affecting your vault timeout. Maximum allowed vault timeout is {0} hour(s) and {1} minute(s). Your vault timeout action is set to {2}.</value>
<value>Pravila tvoje organizacije utječu na vremenski istek trezora. Maksimalno dopušteno vrijeme isteka je {0}:{1} h. Vaša radnja nakon isteka trezora je {2}.</value>
</data>
<data name="VaultTimeoutActionPolicyInEffect" xml:space="preserve">
<value>Your organization policies have set your vault timeout action to {0}.</value>
<value>Pravilo tvoje organizacije podesilo je radnju nakon isteka trezora na: {0}.</value>
</data>
<data name="VaultTimeoutToLarge" xml:space="preserve">
<value>Vrijeme isteka premašuje ograničenje koje je postavila tvoja organizacija.</value>
@@ -2491,7 +2494,7 @@
<value>Slanje podsjetnika glavne lozinke</value>
</data>
<data name="LoggingInAsXOnY" xml:space="preserve">
<value>Logging in as {0} on {1}</value>
<value>Prijava kao {0} na {1}</value>
</data>
<data name="NotYou" xml:space="preserve">
<value>Nisi ti?</value>
@@ -2611,37 +2614,37 @@
<value>EU</value>
</data>
<data name="SelfHosted" xml:space="preserve">
<value>Self-hosted</value>
<value>Vlastiti poslužitelj</value>
</data>
<data name="DataRegion" xml:space="preserve">
<value>Data region</value>
<value>Područje podataka</value>
</data>
<data name="Region" xml:space="preserve">
<value>Region</value>
<value>Regija</value>
</data>
<data name="UpdateWeakMasterPasswordWarning" xml:space="preserve">
<value>Your master password does not meet one or more of your organization policies. In order to access the vault, you must update your master password now. Proceeding will log you out of your current session, requiring you to log back in. Active sessions on other devices may continue to remain active for up to one hour.</value>
<value>Tvoja glavna lozinka ne zadovoljava pravila ove organizacije. Za pristup trezoru moraš odmah ažurirati svoju glavnu lozinku. Ako nastaviš, odjaviti ćeš se iz trenutne sesije te ćeš se morati ponovno prijaviti. Aktivne sesije na drugim uređajima mogu ostati aktivne do jedan sat.</value>
</data>
<data name="CurrentMasterPassword" xml:space="preserve">
<value>Current master password</value>
<value>Trenutna glavna lozinka</value>
</data>
<data name="LoggedIn" xml:space="preserve">
<value>Logged in!</value>
<value>Prijava uspješna!</value>
</data>
<data name="ApproveWithMyOtherDevice" xml:space="preserve">
<value>Approve with my other device</value>
<value>Odobri drugim uređajem</value>
</data>
<data name="RequestAdminApproval" xml:space="preserve">
<value>Request admin approval</value>
<value>Zatraži odobrenje administratora</value>
</data>
<data name="ApproveWithMasterPassword" xml:space="preserve">
<value>Approve with master password</value>
<value>Odobri glavnom lozinkom</value>
</data>
<data name="TurnOffUsingPublicDevice" xml:space="preserve">
<value>Turn off using a public device</value>
<value>Isključi ako koristiš javni uređaj</value>
</data>
<data name="RememberThisDevice" xml:space="preserve">
<value>Remember this device</value>
<value>Zapamti ovaj uređaj</value>
</data>
<data name="Passkey" xml:space="preserve">
<value>Passkey</value>
@@ -2654,7 +2657,7 @@
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
</data>
<data name="Application" xml:space="preserve">
<value>Application</value>
<value>Aplikacija</value>
</data>
<data name="YouCannotEditPasskeyApplicationBecauseItWouldInvalidateThePasskey" xml:space="preserve">
<value>You cannot edit passkey application because it would invalidate the passkey</value>
@@ -2666,7 +2669,7 @@
<value>The passkey will not be copied to the cloned item. Do you want to continue cloning this item?</value>
</data>
<data name="CopyApplication" xml:space="preserve">
<value>Copy application</value>
<value>Kopiraj aplikaciju</value>
</data>
<data name="AvailableForTwoStepLogin" xml:space="preserve">
<value>Available for two-step login</value>
@@ -2678,85 +2681,91 @@
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Invalid API key</value>
<value>Nevažeći API ključ</value>
</data>
<data name="InvalidAPIToken" xml:space="preserve">
<value>Invalid API token</value>
<value>Nevažeći API token</value>
</data>
<data name="AdminApprovalRequested" xml:space="preserve">
<value>Admin approval requested</value>
<value>Zatraženo odobrenje administratora</value>
</data>
<data name="YourRequestHasBeenSentToYourAdmin" xml:space="preserve">
<value>Your request has been sent to your admin.</value>
<value>Tvoj zahtjev je poslan administratoru.</value>
</data>
<data name="YouWillBeNotifiedOnceApproved" xml:space="preserve">
<value>You will be notified once approved. </value>
<value>Dobiti ćeš obavijest kada bude odobreno. </value>
</data>
<data name="TroubleLoggingIn" xml:space="preserve">
<value>Trouble logging in?</value>
<value>Problem s prijavom?</value>
</data>
<data name="LoggingInAsX" xml:space="preserve">
<value>Logging in as {0}</value>
<value>Prijava kao {0}</value>
</data>
<data name="VaultTimeoutActionChangedToLogOut" xml:space="preserve">
<value>Vault timeout action changed to log out</value>
<value>Radnja isteka trezora promijenjena je u odjavu</value>
</data>
<data name="ThisItemCannotBeSharedWithTheOrganizationBecauseThereIsOneAlreadyWithTheSamePasskey" xml:space="preserve">
<value>This item cannot be shared with the organization because there is one already with the same passkey.</value>
</data>
<data name="BlockAutoFill" xml:space="preserve">
<value>Block auto-fill</value>
<value>Blokiraj auto-ispunu</value>
</data>
<data name="AutoFillWillNotBeOfferedForTheseURIs" xml:space="preserve">
<value>Auto-fill will not be offered for these URIs.</value>
<value>Auto-ispuna neće biti ponuđena za ove URI-je.</value>
</data>
<data name="NewBlockedURI" xml:space="preserve">
<value>New blocked URI</value>
<value>Novi blokirani URI</value>
</data>
<data name="URISaved" xml:space="preserve">
<value>URI saved</value>
<value>URI spremljen</value>
</data>
<data name="InvalidFormatUseHttpsHttpOrAndroidApp" xml:space="preserve">
<value>Invalid format. Use https://, http://, or androidapp://</value>
<value>Neispravan format. https://, http://, ili androidapp://</value>
<comment>https://, http://, androidapp:// should not be translated</comment>
</data>
<data name="EditURI" xml:space="preserve">
<value>Edit URI</value>
<value>Uredi URI</value>
</data>
<data name="EnterURI" xml:space="preserve">
<value>Enter URI</value>
<value>Unesi URI</value>
</data>
<data name="FormatXSeparateMultipleURIsWithAComma" xml:space="preserve">
<value>Format: {0}. Separate multiple URIs with a comma.</value>
<value>Format: {0}. Odvoji višestruke URI zarezom.</value>
</data>
<data name="FormatX" xml:space="preserve">
<value>Format: {0}</value>
</data>
<data name="InvalidURI" xml:space="preserve">
<value>Invalid URI</value>
<value>Neispravan URI</value>
</data>
<data name="URIRemoved" xml:space="preserve">
<value>URI removed</value>
<value>URI uklonjen</value>
</data>
<data name="ThereAreNoBlockedURIs" xml:space="preserve">
<value>There are no blocked URIs</value>
<value>Nema blokiranih URI-a</value>
</data>
<data name="TheURIXIsAlreadyBlocked" xml:space="preserve">
<value>The URI {0} is already blocked</value>
<value>URI {0} je već blokiran</value>
</data>
<data name="CannotEditMultipleURIsAtOnce" xml:space="preserve">
<value>Cannot edit multiple URIs at once</value>
<value>Nije moguće uređivati više od jednog URI odjednom</value>
</data>
<data name="LoginApproved" xml:space="preserve">
<value>Login approved</value>
<value>Prijava odobrena</value>
</data>
<data name="LogInWithDeviceMustBeSetUpInTheSettingsOfTheBitwardenAppNeedAnotherOption" xml:space="preserve">
<value>Log in with device must be set up in the settings of the Bitwarden app. Need another option?</value>
<value>Prijava uređajem mora biti namještena u postavka Bitwarden mobilne aplikacije. Trebaš drugu opciju?</value>
</data>
<data name="LogInWithDevice" xml:space="preserve">
<value>Log in with device</value>
<value>Prijava uređajem</value>
</data>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
<value>Prijava na</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -953,6 +953,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Ez a funkció nem használható, amíg nem frissíted a titkosítási kulcsodat.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Titkosítási kulcs migráció szükséges. Jelentkezzünk be a webes széfen keresztül a titkosítási kulcs frissítéséhez.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>További információ</value>
</data>
@@ -2760,4 +2763,10 @@ Szeretnénk átváltani erre a fiókra?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Bejelentkezés:</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Túl sok próbálkozás történt</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>A fiók kijelentkezett.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Proses pindai akan terjadi secara otomatis.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Anda tidak dapat menggunakan fitur ini sampai Anda memperbarui kunci enkripsi Anda.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Pelajari Lebih Lanjut</value>
</data>
@@ -2761,4 +2764,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -953,6 +953,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Non puoi utilizzare questa funzione finché non aggiorni la tua chiave di criptografia.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Migrazione della chiave di criptografia obbligatoria. Accedi tramite la cassaforte web per aggiornare la tua chiave di criptografia.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Ulteriori informazioni</value>
</data>
@@ -2761,4 +2764,10 @@ Vuoi passare a questo account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Accedendo su</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Troppi tentativi</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account uscito.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>暗号キーを更新するまでこの機能は使用できません。</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>暗号化キーの移行が必要です。暗号化キーを更新するには、ウェブ保管庫からログインしてください。</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>詳細情報</value>
</data>
@@ -2677,7 +2680,7 @@
<value>マスターパスワードの再プロンプトヘルプ</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
<value>メモリ不足により、ロック解除に失敗する可能性があります。解決するには、KDF のメモリ設定を減らすか、生体認証によるロック解除を設定してください。</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>無効な API キー</value>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>ログイン先</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>試行回数が多すぎます</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>アカウントからログアウトしました。</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -955,6 +955,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>ನಿಮ್ಮ ಎನ್‌ಕ್ರಿಪ್ಶನ್ ಕೀಲಿಯನ್ನು ನವೀಕರಿಸುವವರೆಗೆ ನೀವು ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲಾಗುವುದಿಲ್ಲ.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>이 기능을 사용하려면 암호화 키를 업데이트해야 합니다.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>더 알아보기</value>
</data>
@@ -1753,7 +1756,7 @@
<value>Biometric unlock for this account is disabled pending verification of master password.</value>
</data>
<data name="AccountBiometricInvalidatedExtension" xml:space="preserve">
<value>Autofill biometric unlock for this account is disabled pending verification of master password.</value>
<value>마스터 비밀번호 인증을 하기 전에는 생체 인식을 사용한 자동 채우기가 비활성화됩니다.</value>
</data>
<data name="EnableSyncOnRefresh" xml:space="preserve">
<value>새로고침할 때 동기화 사용</value>
@@ -2761,4 +2764,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Nuskaitymas vyks automatiškai.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Negalite naudoti šios funkcijos, kol neatnaujinsite šifravimo raktą.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Sužinoti daugiau</value>
</data>
@@ -2762,4 +2765,10 @@ Ar norite pereiti prie šios paskyros?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -831,7 +831,7 @@
<comment>For 2FA whenever there are no available providers on this device.</comment>
</data>
<data name="NoTwoStepAvailable" xml:space="preserve">
<value>Šim kontam ir iestatīta divpakāpju pieteikšanās, bet šajā ierīcē netiek nodrošināts neviens no uzstādītajiem divpakāpju pārbaudes nodrošinātājiem. Lūgums izmantot atbalstītu ierīci un/vai pievienot papildus nodrošinātājus, kas tiek labāk atbalstīti dažādās ierīcēs (piemēram, autentificētāja lietotni).</value>
<value>Šim kontam ir iestatīta divpakāpju pieteikšanās, bet šajā ierīcē netiek nodrošināts neviens no uzstādītajiem divpakāpju pārbaudes nodrošinātājiem. Lūgums izmantot atbalstītu ierīci un/vai pievienot papildu nodrošinātājus, kas tiek labāk atbalstīti dažādās ierīcēs (piemēram, autentificētāja lietotni).</value>
</data>
<data name="RecoveryCodeTitle" xml:space="preserve">
<value>Atgūšanas kods</value>
@@ -954,6 +954,9 @@ Nolasīšana notiks automātiski.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Šo iespēju nevar izmantot, kamēr nav atjaunināta šifrēšanas atslēga.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Nepieciešama šifrēšanas atslēgas nomaiņa. Lūgums pieteikties tīmekļa glabātavā, lai atjauninātu savu šifrēšanas atslēgu.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Uzzināt vairāk</value>
</data>
@@ -1810,7 +1813,8 @@ Nolasīšana notiks automātiski.</value>
<value>Ielādē</value>
</data>
<data name="AcceptPolicies" xml:space="preserve">
<value>Ieslēdzot šo slēdzi, Tu piekrīti sekojošajam:</value>
<value>Ar šī slēdža ieslēgšanu tiek piekrists sekojošajam:
</value>
</data>
<data name="AcceptPoliciesError" xml:space="preserve">
<value>Nav apstiprināti izmantošanas noteikumi un privātuma nosacījumi.</value>
@@ -2176,7 +2180,7 @@ Nolasīšana notiks automātiski.</value>
<value>Konts tika veiksmīgi noņemts</value>
</data>
<data name="DeleteAccount" xml:space="preserve">
<value>Dzēst kontu</value>
<value>Izdzēst kontu</value>
</data>
<data name="DeletingYourAccountIsPermanent" xml:space="preserve">
<value>Konta dzēšana ir neatgriezeniska</value>
@@ -2677,7 +2681,7 @@ Vai pārslēgties uz šo kontu?</value>
<value>Galvenās paroles pārvaicāšanas palīdzība</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>Unlocking may fail due to insufficient memory. Decrease your KDF memory settings or set up biometric unlock to resolve.</value>
<value>Atslēgšana var neizdoties nepietiekamas atmiņas dēļ. Lai to novērstu, jāsamazina KDF atmiņas iestatījumi vai jāiestata biometriskā atslēgšana.</value>
</data>
<data name="InvalidAPIKey" xml:space="preserve">
<value>Nederīga API atslēga</value>
@@ -2761,4 +2765,10 @@ Vai pārslēgties uz šo kontu?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Piesakās</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Pārāk daudz mēģinājumu</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Konts tika izrakstīts.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>നിങ്ങളുടെ എൻ‌ക്രിപ്ഷൻ കീ അപ്‌ഡേറ്റ് ചെയ്യുന്നതുവരെ നിങ്ങൾക്ക് ഈ സവിശേഷത ഉപയോഗിക്കാൻ കഴിയില്ല.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>കൂടുതൽ അറിയാൻ</value>
</data>
@@ -2761,4 +2764,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skanning skjer automatisk.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Du kan ikke bruke denne funksjonen før du oppdaterer krypteringsnøkkelen din.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Lær mer</value>
</data>
@@ -2762,4 +2765,10 @@ Vil du bytte til denne kontoen?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logger inn på</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>For mange forsøk</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Konto logget ut.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Het scannen gebeurt automatisch.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Je kunt deze functie pas gebruiken als je je encryptiesleutel bijwerkt.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Meer informatie</value>
</data>
@@ -2761,4 +2764,10 @@ Wilt u naar dit account wisselen?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skanning skjer automatisk.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Du kan ikkje bruka denne funksjonen før du rettar enkrypteringsnykelen din.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Ler meir</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skanowanie nastąpi automatycznie.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Nie możesz używać tej funkcji, dopóki nie zaktualizujesz klucza szyfrowania.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Wymagana jest migracja klucza szyfrowania. Zaloguj się przez sejf internetowy, aby zaktualizować klucz szyfrowania.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Dowiedz się więcej</value>
</data>
@@ -2761,4 +2764,10 @@ Czy chcesz przełączyć się na to konto?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logowanie do</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Zbyt wiele prób</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Konto wylogowane.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ A leitura será feita automaticamente.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Você não pode usar esse recurso, até você atualizar sua chave de criptografia.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Saiba Mais</value>
</data>
@@ -2762,4 +2765,10 @@ Você deseja mudar para esta conta?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Entrando em</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ A leitura será efetuada automaticamente.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Não pode utilizar esta funcionalidade até atualizar a sua chave de encriptação.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>É necessária a migração da chave de encriptação. Inicie sessão através do cofre Web para atualizar a sua chave de encriptação.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Saber mais</value>
</data>
@@ -2760,4 +2763,10 @@ Deseja mudar para esta conta?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>A iniciar sessão em</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Demasiadas tentativas</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Conta com sessão terminada.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2654,7 +2657,7 @@ Do you want to switch to this account?</value>
</data>
<data name="CreatedX" xml:space="preserve">
<value>Created {0}</value>
<comment>To state the date in which the cipher was created: Created 03/21/2023</comment>
<comment>DEPRECATED To state the date in which the cipher was created: Created 03/21/2023</comment>
</data>
<data name="Application" xml:space="preserve">
<value>Application</value>
@@ -2762,4 +2765,14 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="CreatedXY" xml:space="preserve">
<value>Created {0}, {1}</value>
<comment>To state the date/time in which the cipher was created: Created 03/21/2023, 09:25 AM. First parameter is the date and the second parameter is the time.</comment>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanarea se va face automat.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Nu puteți utiliza această caracteristică înainte de a actualiza cheia de criptare.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Aflați mai multe</value>
</data>
@@ -2761,4 +2764,10 @@ Doriți să comutați la acest cont?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Вы не можете использовать эту функцию, пока не обновите свой ключ шифрования.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Требуется миграция ключа шифрования. Чтобы обновить ключ шифрования, войдите через веб-хранилище.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Узнать больше</value>
</data>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>Войти на</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Слишком много попыток</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Аккаунт не авторизован.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Skenovanie prebehne automaticky.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Túto funkciu nemožno použiť, kým neaktualizujete svoj šifrovací kľúč.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Vyžaduje sa migrácia šifrovacieho kľúča. Na aktualizáciu šifrovacieho kľúča sa prihláste cez webový trezor.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Zistiť viac</value>
</data>
@@ -2761,4 +2764,10 @@ Chcete prepnúť na toto konto?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Prihlásenie na</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Príliš veľa pokusov</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Účet bol odhlásený.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Te funkcije ne morete koristiti, dokler dokler ne posodobite vašega ključa za šifriranje.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Preberite več</value>
</data>
@@ -2761,4 +2764,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Не можете да користите ову способност док не промените Ваш кључ за шифровање.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Сазнај више</value>
</data>
@@ -2763,4 +2766,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -955,6 +955,9 @@ Skanningen sker automatiskt.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Du kan inte använda denna funktion förrän du uppdaterar din krypteringsnyckel.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Migrering av krypteringsnyckel krävs. Logga in på webbvalvet för att uppdatera din krypteringsnyckel.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Läs mer</value>
</data>
@@ -2763,4 +2766,10 @@ Vill du byta till detta konto?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logga in på</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>För många försök</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -955,6 +955,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>உங்கள் குறியாக்க விசையை புதுப்பிக்கும் வரை இந்த அம்சத்தைப் பயன்படுத்த முடியாது.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>மேலும் அறிக</value>
</data>
@@ -2762,4 +2765,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>இதில் உள்நுழைகிறது</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>You cannot use this feature until you update your encryption key.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Learn more</value>
</data>
@@ -2762,4 +2765,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -957,6 +957,9 @@ Scanning will happen automatically.</value>
<data name="UpdateKey" xml:space="preserve">
<value>คุณไม่สามารถใช้คุณลักษณะนี้ได้จนกว่าคุณปรับปรุงคีย์การเข้ารหัสลับของคุณ</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>เรียน​รู้​เพิ่ม​เติม</value>
</data>
@@ -2769,4 +2772,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Kod otomatik olarak taranacaktır.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Şifreleme anahtarınızı güncelleştirene kadar bu özelliği kullanamazsınız.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Şifreleme anahtarınızın güncellenmesi gerekiyor. Şifreleme anahtarınızı güncellemek için lütfen web kasasına giriş yapın.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Daha fazla bilgi al</value>
</data>
@@ -2760,4 +2763,10 @@ Bu hesaba geçmek ister misiniz?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Çok fazla deneme</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Hesabın oturumu kapatıldı.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>Ви не можете використовувати цю функцію доки не оновите свій ключ шифрування.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Потрібно перенести ключ шифрування. Увійдіть у вебсховище та оновіть свій ключ шифрування.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Докладніше</value>
</data>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>Увійти на</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Забагато спроб</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Ви вийшли з облікового запису.</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@ Quá trình quét sẽ diễn ra tự động.</value>
<data name="UpdateKey" xml:space="preserve">
<value>Bạn không thể sử dụng tính năng này cho đến khi bạn cập nhật khoá mã hóa.</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>Tìm Hiểu Thêm</value>
</data>
@@ -2761,4 +2764,10 @@ Do you want to switch to this account?</value>
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>Too many attempts</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>Account logged out.</value>
</data>
</root>

View File

@@ -559,7 +559,7 @@
<value>密码库超时动作</value>
</data>
<data name="VaultTimeoutLogOutConfirmation" xml:space="preserve">
<value>超时后退出账户将解除对密码库的所有访问权限,并需要进行在线身份验证。确定使用此设置吗?</value>
<value>超时后注销账户将解除对密码库的所有访问权限,并需要进行在线身份验证。确定使用此设置吗?</value>
</data>
<data name="LoggingIn" xml:space="preserve">
<value>正在登录...</value>
@@ -581,7 +581,7 @@
<value>主密码提示(可选)</value>
</data>
<data name="MasterPasswordHintDescription" xml:space="preserve">
<value>主密码提示可以在忘记密码时帮回忆起来。</value>
<value>主密码提示可以在忘记密码时帮回忆起来。</value>
</data>
<data name="MasterPasswordLengthValMessageX" xml:space="preserve">
<value>主密码必须至少 $VALUE$ 个字符长度。</value>
@@ -823,7 +823,7 @@
<comment>For 2FA</comment>
</data>
<data name="EnterVerificationCodeEmail" xml:space="preserve">
<value>请输入发送电子邮件 {0} 的 6 位验证码。</value>
<value>请输入发送电子邮件 {0} 的 6 位验证码。</value>
<comment>For 2FA</comment>
</data>
<data name="LoginUnavailable" xml:space="preserve">
@@ -852,7 +852,7 @@
<value>使用其他两步登录方式</value>
</data>
<data name="VerificationEmailNotSent" xml:space="preserve">
<value>无法发送验证电子邮件。请再试一次。</value>
<value>无法发送验证电子邮件。请重试。</value>
<comment>For 2FA</comment>
</data>
<data name="VerificationEmailSent" xml:space="preserve">
@@ -867,7 +867,7 @@
<comment>"YubiKey" is the product name and should not be translated.</comment>
</data>
<data name="AddNewAttachment" xml:space="preserve">
<value>添加新附件</value>
<value>添加新附件</value>
</data>
<data name="Attachments" xml:space="preserve">
<value>附件</value>
@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>在您更新加密密钥前,您不能使用此功能。</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>需要迁移加密密钥。请登录网页版密码库来更新您的加密密钥。</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>了解更多信息</value>
</data>
@@ -1489,7 +1492,7 @@
<value>30 分钟</value>
</data>
<data name="SetPINDescription" xml:space="preserve">
<value>设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您退出账户时被重置。</value>
<value>设定您用来解锁 Bitwarden 的 PIN 码。您的 PIN 设置将在您完全注销此应用程序时被重置。</value>
</data>
<data name="LoggedInAsOn" xml:space="preserve">
<value>已在 {1} 上以 {0} 身份登录。</value>
@@ -1861,7 +1864,7 @@
<value>如果开启,无障碍将显示一个弹出窗口以增强不支持 Android 自动填充框架的旧应用的自动填充服务。</value>
</data>
<data name="PersonalOwnershipSubmitError" xml:space="preserve">
<value>由于企业策略,您被限制为保存项目到您的个人密码库。将所有权选项更改为组织,然后从可用的集合中选择。</value>
<value>由于某个企业策略,您不能将项目保存到您的个人密码库。将所有权选项更改为组织,从可用的集合中选择。</value>
</data>
<data name="PersonalOwnershipPolicyInEffect" xml:space="preserve">
<value>某个组织策略正影响您的所有权选项。</value>
@@ -1984,7 +1987,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AddASend" xml:space="preserve">
<value>新增 Send</value>
<value>添加 Send</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="CopyLink" xml:space="preserve">
@@ -2048,7 +2051,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="SendDisabledWarning" xml:space="preserve">
<value>由于企业策略,您只能删除现有的 Send。</value>
<value>由于某个企业策略,您只能删除现有的 Send。</value>
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="AboutSend" xml:space="preserve">
@@ -2071,7 +2074,7 @@
<comment>'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated.</comment>
</data>
<data name="PasswordPrompt" xml:space="preserve">
<value>重新询问主密码</value>
<value>主密码重新提示</value>
</data>
<data name="PasswordConfirmation" xml:space="preserve">
<value>确认主密码</value>
@@ -2170,7 +2173,7 @@
<value>账户已锁定</value>
</data>
<data name="AccountLoggedOutSuccessfully" xml:space="preserve">
<value>成功退出账户</value>
<value>账户注销成功</value>
</data>
<data name="AccountRemovedSuccessfully" xml:space="preserve">
<value>账户移除成功</value>
@@ -2218,7 +2221,7 @@
<value>验证码已发送到您的电子邮箱</value>
</data>
<data name="AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain" xml:space="preserve">
<value>发送验证码到您的电子邮箱时发生错误。请再试一次</value>
<value>发送验证码到您的电子邮箱时发生错误。请重试</value>
</data>
<data name="EnterTheVerificationCodeThatWasSentToYourEmail" xml:space="preserve">
<value>输入发送到您电子邮箱的验证码</value>
@@ -2309,10 +2312,10 @@
<value>将锁定选项设置为「从不」可让任何能够访问您的设备的人都可以使用您的密码库。如果您使用此选项,则应确保您的设备得到妥善的保护。</value>
</data>
<data name="EnvironmentPageUrlsError" xml:space="preserve">
<value>输入的一个或多个 URL 无效。请修改后再次保存。</value>
<value>输入的一个或多个 URL 无效。请修改后再次尝试保存。</value>
</data>
<data name="GenericErrorMessage" xml:space="preserve">
<value>我们无法处理您的请求。请再试一次或联系我们。</value>
<value>我们无法处理您的请求。请重试或联系我们。</value>
</data>
<data name="AllowScreenCapture" xml:space="preserve">
<value>允许屏幕截图</value>
@@ -2499,7 +2502,7 @@
<value>不是你?</value>
</data>
<data name="LogInWithMasterPassword" xml:space="preserve">
<value>使用主密码登录</value>
<value>主密码登录</value>
</data>
<data name="LogInWithAnotherDevice" xml:space="preserve">
<value>设备登录</value>
@@ -2674,7 +2677,7 @@
<value>可用于两步登录</value>
</data>
<data name="MasterPasswordRePromptHelp" xml:space="preserve">
<value>主密码重新询问帮助</value>
<value>主密码重新提示帮助</value>
</data>
<data name="UnlockingMayFailDueToInsufficientMemoryDecreaseYourKDFMemorySettingsToResolve" xml:space="preserve">
<value>由于内存不足,解锁可能会失败。请减少您的 KDF 内存设置或设置生物识别解锁来解决此问题。</value>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>登录到</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>尝试次数过多</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>账户已注销。</value>
</data>
</root>

View File

@@ -954,6 +954,9 @@
<data name="UpdateKey" xml:space="preserve">
<value>更新加密金鑰前不能使用此功能。</value>
</data>
<data name="EncryptionKeyMigrationRequiredDescriptionLong" xml:space="preserve">
<value>Encryption key migration required. Please login through the web vault to update your encryption key.</value>
</data>
<data name="LearnMore" xml:space="preserve">
<value>深入了解</value>
</data>
@@ -1354,10 +1357,10 @@
<comment>A loading message when doing an exposed password check.</comment>
</data>
<data name="CheckPassword" xml:space="preserve">
<value>檢查密碼是否已外洩。</value>
<value>檢查密碼是否已暴露。</value>
</data>
<data name="PasswordExposed" xml:space="preserve">
<value>此密碼已外洩了 {0} 次,應立即變更密碼。</value>
<value>此密碼在資料外洩事件中被暴露了 {0} 次,應立即變更。</value>
</data>
<data name="PasswordSafe" xml:space="preserve">
<value>任何已知的外洩密碼資料庫中都沒有此密碼,它目前是安全的。</value>
@@ -2577,16 +2580,16 @@
<value>高強度</value>
</data>
<data name="CheckKnownDataBreachesForThisPassword" xml:space="preserve">
<value>在被攻擊的資料庫中搜尋是否有此密碼</value>
<value>檢查外洩密碼資料庫中是否有此密碼</value>
</data>
<data name="ExposedMasterPassword" xml:space="preserve">
<value>Exposed Master Password</value>
<value>已暴露的主密碼</value>
</data>
<data name="PasswordFoundInADataBreachAlertDescription" xml:space="preserve">
<value>在其他資料庫中找到您的密碼。我們建議您使用一個獨特的密碼來保護您的帳,您確定要用這個密碼嗎?</value>
<value>在資料外洩事件中找到密碼。我們建議您使用一個獨特的密碼來保護您的帳,您確定要使用已暴露的密碼嗎?</value>
</data>
<data name="WeakAndExposedMasterPassword" xml:space="preserve">
<value>主密碼強度不足</value>
<value>強度不足且已暴露的主密碼</value>
</data>
<data name="WeakPasswordIdentifiedAndFoundInADataBreachAlertDescription" xml:space="preserve">
<value>是密碼強度不足,且在其他資料庫中找到這個密碼。使用一個強度足夠和獨特的密碼來保護您的帳號。請問您確定要用這個密碼嗎?</value>
@@ -2761,4 +2764,10 @@
<data name="LoggingInOn" xml:space="preserve">
<value>Logging in on</value>
</data>
<data name="TooManyAttempts" xml:space="preserve">
<value>嘗試次數過多</value>
</data>
<data name="AccountLoggedOutBiometricExceeded" xml:space="preserve">
<value>帳號已登出。</value>
</data>
</root>

View File

@@ -32,7 +32,8 @@ namespace Bit.App.Services
IDeviceActionService deviceActionService,
IClipboardService clipboardService,
IMessagingService messagingService,
IBroadcasterService broadcasterService)
IBroadcasterService broadcasterService
)
{
_deviceActionService = deviceActionService;
_clipboardService = clipboardService;
@@ -242,7 +243,7 @@ namespace Bit.App.Services
}
public async Task<bool> AuthenticateBiometricAsync(string text = null, string fallbackText = null,
Action fallback = null)
Action fallback = null, bool logOutOnTooManyAttempts = false)
{
try
{
@@ -269,6 +270,12 @@ namespace Bit.App.Services
{
fallback?.Invoke();
}
if (result.Status == FingerprintAuthenticationResultStatus.TooManyAttempts
&& logOutOnTooManyAttempts)
{
await ShowDialogAsync(AppResources.AccountLoggedOutBiometricExceeded, AppResources.TooManyAttempts, AppResources.Ok);
_messagingService.Send(AccountsManagerMessageCommands.LOGOUT);
}
}
catch { }
return false;

View File

@@ -15,6 +15,7 @@ using Bit.Core.Enums;
using Bit.Core.Exceptions;
using Bit.Core.Models.Data;
using Bit.Core.Models.View;
using Bit.Core.Services;
using Bit.Core.Utilities;
using Newtonsoft.Json;
using Xamarin.Essentials;
@@ -78,17 +79,6 @@ namespace Bit.App.Utilities
options.Add(AppResources.CopyNotes);
}
}
if (cipher.Type == Core.Enums.CipherType.Fido2Key)
{
if (!string.IsNullOrWhiteSpace(cipher.Fido2Key.UserName))
{
options.Add(AppResources.CopyUsername);
}
if (cipher.Fido2Key.CanLaunch)
{
options.Add(AppResources.Launch);
}
}
var selection = await page.DisplayActionSheet(cipher.Name, AppResources.Cancel, null, options.ToArray());
if (await vaultTimeoutService.IsLockedAsync())
@@ -107,7 +97,7 @@ namespace Bit.App.Utilities
}
else if (selection == AppResources.CopyUsername)
{
await clipboardService.CopyTextAsync(cipher.Type == CipherType.Login ? cipher.Login.Username : cipher.Fido2Key.UserName);
await clipboardService.CopyTextAsync(cipher.Login.Username);
platformUtilsService.ShowToastForCopiedValue(AppResources.Username);
}
else if (selection == AppResources.CopyPassword

View File

@@ -18,8 +18,6 @@ namespace Bit.App.Utilities
return BitwardenIcons.CreditCard;
case CipherType.Identity:
return BitwardenIcons.IdCard;
case CipherType.Fido2Key:
return BitwardenIcons.Passkey;
}
return null;
}

View File

@@ -26,14 +26,12 @@ namespace Bit.App.Utilities
{
public static string GetIconImage(CipherView cipher)
{
switch (cipher.Type)
if (cipher.Type != CipherType.Login)
{
case CipherType.Login:
return IconImageHelper.GetLoginIconImage(cipher);
case CipherType.Fido2Key:
return IconImageHelper.GetFido2KeyIconImage(cipher);
return null;
}
return null;
return GetLoginIconImage(cipher);
}
public static string GetLoginIconImage(CipherView cipher)
@@ -65,26 +63,6 @@ namespace Bit.App.Utilities
return image;
}
public static string GetFido2KeyIconImage(CipherView cipher)
{
var hostnameUri = cipher.Fido2Key.LaunchUri;
if (!hostnameUri.Contains("."))
{
return null;
}
if (!hostnameUri.Contains("://"))
{
hostnameUri = string.Concat("https://", hostnameUri);
}
if (hostnameUri.StartsWith("http"))
{
return GetIconUrl(hostnameUri);
}
return null;
}
private static string GetIconUrl(string hostnameUri)
{
IEnvironmentService _environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService");

View File

@@ -49,7 +49,7 @@ namespace Bit.Core.Abstractions
Task RefreshIdentityTokenAsync();
Task<SsoPrevalidateResponse> PreValidateSsoAsync(string identifier);
Task<TResponse> SendAsync<TRequest, TResponse>(HttpMethod method, string path,
TRequest body, bool authed, bool hasResponse, Action<HttpRequestMessage> alterRequest, bool logoutOnUnauthorized = true);
TRequest body, bool authed, bool hasResponse, Action<HttpRequestMessage> alterRequest, bool logoutOnUnauthorized = true, bool sendToIdentity = false);
Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestMessage, CancellationToken cancellationToken = default);
void SetUrls(EnvironmentUrls urls);
[Obsolete("Mar 25 2021: This method has been deprecated in favor of direct uploads. This method still exists for backward compatibility with old server versions.")]

View File

@@ -13,6 +13,7 @@ namespace Bit.Core.Abstractions
Task RefreshKeysAsync();
Task SetUserKeyAsync(UserKey userKey, string userId = null);
Task<UserKey> GetUserKeyAsync(string userId = null);
Task<bool> IsLegacyUserAsync(MasterKey masterKey = null, string userId = null);
Task<UserKey> GetUserKeyWithLegacySupportAsync(string userId = null);
Task<bool> HasUserKeyAsync(string userId = null);
Task<bool> HasEncryptedUserKeyAsync(string userId = null);

View File

@@ -29,7 +29,7 @@ namespace Bit.Core.Abstractions
bool SupportsDuo();
Task<bool> SupportsBiometricAsync();
Task<bool> IsBiometricIntegrityValidAsync(string bioIntegritySrcKey = null);
Task<bool> AuthenticateBiometricAsync(string text = null, string fallbackText = null, Action fallback = null);
Task<bool> AuthenticateBiometricAsync(string text = null, string fallbackText = null, Action fallback = null, bool logOutOnTooManyAttempts = false);
long GetActiveTime();
}
}

View File

@@ -7,7 +7,6 @@
Login = 1,
SecureNote = 2,
Card = 3,
Identity = 4,
Fido2Key = 5
Identity = 4
}
}

View File

@@ -0,0 +1,11 @@
using System;
namespace Bit.Core.Exceptions
{
public class LegacyUserException : Exception
{
public LegacyUserException()
: base("Legacy users must migrate on web vault.")
{
}
}
}

View File

@@ -1,5 +1,4 @@
using Bit.Core.Models.Domain;
using Bit.Core.Models.Export;
namespace Bit.Core.Models.Api
{
@@ -11,7 +10,8 @@ namespace Bit.Core.Models.Api
public Fido2KeyApi(Fido2Key fido2Key)
{
NonDiscoverableId = fido2Key.NonDiscoverableId?.EncryptedString;
CredentialId = fido2Key.CredentialId?.EncryptedString;
Discoverable = fido2Key.Discoverable?.EncryptedString;
KeyType = fido2Key.KeyType?.EncryptedString;
KeyAlgorithm = fido2Key.KeyAlgorithm?.EncryptedString;
KeyCurve = fido2Key.KeyCurve?.EncryptedString;
@@ -23,7 +23,8 @@ namespace Bit.Core.Models.Api
Counter = fido2Key.Counter?.EncryptedString;
}
public string NonDiscoverableId { get; set; }
public string CredentialId { get; set; }
public string Discoverable { get; set; }
public string KeyType { get; set; } = Constants.DefaultFido2KeyType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2KeyAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2KeyCurve;

View File

@@ -10,6 +10,6 @@ namespace Bit.Core.Models.Api
public string Password { get; set; }
public DateTime? PasswordRevisionDate { get; set; }
public string Totp { get; set; }
public Fido2KeyApi Fido2Key { get; set; }
public List<Fido2KeyApi> Fido2Keys { get; set; }
}
}

View File

@@ -45,9 +45,6 @@ namespace Bit.Core.Models.Data
case Enums.CipherType.Identity:
Identity = new IdentityData(response.Identity);
break;
case Enums.CipherType.Fido2Key:
Fido2Key = new Fido2KeyData(response.Fido2Key);
break;
default:
break;
}
@@ -86,7 +83,6 @@ namespace Bit.Core.Models.Data
public SecureNoteData SecureNote { get; set; }
public CardData Card { get; set; }
public IdentityData Identity { get; set; }
public Fido2KeyData Fido2Key { get; set; }
public List<FieldData> Fields { get; set; }
public List<AttachmentData> Attachments { get; set; }
public List<PasswordHistoryData> PasswordHistory { get; set; }

View File

@@ -8,7 +8,8 @@ namespace Bit.Core.Models.Data
public Fido2KeyData(Fido2KeyApi apiData)
{
NonDiscoverableId = apiData.NonDiscoverableId;
CredentialId = apiData.CredentialId;
Discoverable = apiData.Discoverable;
KeyType = apiData.KeyType;
KeyAlgorithm = apiData.KeyAlgorithm;
KeyCurve = apiData.KeyCurve;
@@ -20,7 +21,8 @@ namespace Bit.Core.Models.Data
Counter = apiData.Counter;
}
public string NonDiscoverableId { get; set; }
public string CredentialId { get; set; }
public string Discoverable { get; set; }
public string KeyType { get; set; } = Constants.DefaultFido2KeyType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2KeyAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2KeyCurve;

View File

@@ -16,7 +16,7 @@ namespace Bit.Core.Models.Data
PasswordRevisionDate = data.PasswordRevisionDate;
Totp = data.Totp;
Uris = data.Uris?.Select(u => new LoginUriData(u)).ToList();
Fido2Key = data.Fido2Key != null ? new Fido2KeyData(data.Fido2Key) : null;
Fido2Keys = data.Fido2Keys?.Select(f => new Fido2KeyData(f)).ToList();
}
public List<LoginUriData> Uris { get; set; }
@@ -24,6 +24,6 @@ namespace Bit.Core.Models.Data
public string Password { get; set; }
public DateTime? PasswordRevisionDate { get; set; }
public string Totp { get; set; }
public Fido2KeyData Fido2Key { get; set; }
public List<Fido2KeyData> Fido2Keys { get; set; }
}
}

View File

@@ -13,6 +13,7 @@ namespace Bit.Core.Models.Domain
[Obsolete("Use AccountDecryptionOptions to determine if the user does not have a MP")]
public bool ResetMasterPassword { get; set; }
public bool ForcePasswordReset { get; set; }
public bool RequiresEncryptionKeyMigration { get; set; }
public Dictionary<TwoFactorProviderType, Dictionary<string, object>> TwoFactorProviders { get; set; }
}
}

View File

@@ -48,9 +48,6 @@ namespace Bit.Core.Models.Domain
case Enums.CipherType.Identity:
Identity = new Identity(obj.Identity, alreadyEncrypted);
break;
case CipherType.Fido2Key:
Fido2Key = new Fido2Key(obj.Fido2Key, alreadyEncrypted);
break;
default:
break;
}
@@ -66,7 +63,7 @@ namespace Bit.Core.Models.Domain
public string FolderId { get; set; }
public EncString Name { get; set; }
public EncString Notes { get; set; }
public Enums.CipherType Type { get; set; }
public CipherType Type { get; set; }
public bool Favorite { get; set; }
public bool OrganizationUseTotp { get; set; }
public bool Edit { get; set; }
@@ -79,7 +76,6 @@ namespace Bit.Core.Models.Domain
public Identity Identity { get; set; }
public Card Card { get; set; }
public SecureNote SecureNote { get; set; }
public Fido2Key Fido2Key { get; set; }
public List<Attachment> Attachments { get; set; }
public List<Field> Fields { get; set; }
public List<PasswordHistory> PasswordHistory { get; set; }
@@ -109,9 +105,6 @@ namespace Bit.Core.Models.Domain
case Enums.CipherType.Identity:
model.Identity = await Identity.DecryptAsync(OrganizationId);
break;
case Enums.CipherType.Fido2Key:
model.Fido2Key = await Fido2Key.DecryptAsync(OrganizationId);
break;
default:
break;
}
@@ -201,9 +194,6 @@ namespace Bit.Core.Models.Domain
case Enums.CipherType.Identity:
c.Identity = Identity.ToIdentityData();
break;
case Enums.CipherType.Fido2Key:
c.Fido2Key = Fido2Key.ToFido2KeyData();
break;
default:
break;
}

View File

@@ -9,7 +9,8 @@ namespace Bit.Core.Models.Domain
{
public static HashSet<string> EncryptableProperties => new HashSet<string>
{
nameof(NonDiscoverableId),
nameof(CredentialId),
nameof(Discoverable),
nameof(KeyType),
nameof(KeyAlgorithm),
nameof(KeyCurve),
@@ -28,7 +29,8 @@ namespace Bit.Core.Models.Domain
BuildDomainModel(this, data, EncryptableProperties, alreadyEncrypted);
}
public EncString NonDiscoverableId { get; set; }
public EncString CredentialId { get; set; }
public EncString Discoverable { get; set; }
public EncString KeyType { get; set; }
public EncString KeyAlgorithm { get; set; }
public EncString KeyCurve { get; set; }

View File

@@ -15,7 +15,7 @@ namespace Bit.Core.Models.Domain
{
PasswordRevisionDate = obj.PasswordRevisionDate;
Uris = obj.Uris?.Select(u => new LoginUri(u, alreadyEncrypted)).ToList();
Fido2Key = obj.Fido2Key != null ? new Fido2Key(obj.Fido2Key, alreadyEncrypted) : null;
Fido2Keys = obj.Fido2Keys?.Select(f => new Fido2Key(f, alreadyEncrypted)).ToList();
BuildDomainModel(this, obj, new HashSet<string>
{
"Username",
@@ -29,7 +29,7 @@ namespace Bit.Core.Models.Domain
public EncString Password { get; set; }
public DateTime? PasswordRevisionDate { get; set; }
public EncString Totp { get; set; }
public Fido2Key Fido2Key { get; set; }
public List<Fido2Key> Fido2Keys { get; set; }
public async Task<LoginView> DecryptAsync(string orgId)
{
@@ -47,9 +47,13 @@ namespace Bit.Core.Models.Domain
view.Uris.Add(await uri.DecryptAsync(orgId));
}
}
if (Fido2Key != null)
if (Fido2Keys != null)
{
view.Fido2Key = await Fido2Key.DecryptAsync(orgId);
view.Fido2Keys = new List<Fido2KeyView>();
foreach (var fido2Key in Fido2Keys)
{
view.Fido2Keys.Add(await fido2Key.DecryptAsync(orgId));
}
}
return view;
}
@@ -68,9 +72,9 @@ namespace Bit.Core.Models.Domain
{
l.Uris = Uris.Select(u => u.ToLoginUriData()).ToList();
}
if (Fido2Key != null)
if (Fido2Keys != null)
{
l.Fido2Key = Fido2Key.ToFido2KeyData();
l.Fido2Keys = Fido2Keys.Select(f => f.ToFido2KeyData()).ToList();
}
return l;
}

View File

@@ -31,7 +31,7 @@ namespace Bit.Core.Models.Request
Password = cipher.Login.Password?.EncryptedString,
PasswordRevisionDate = cipher.Login.PasswordRevisionDate,
Totp = cipher.Login.Totp?.EncryptedString,
Fido2Key = cipher.Login.Fido2Key != null ? new Fido2KeyApi(cipher.Login.Fido2Key) : null
Fido2Keys = cipher.Login.Fido2Keys?.Select(f => new Fido2KeyApi(f)).ToList()
};
break;
case CipherType.Card:
@@ -74,9 +74,6 @@ namespace Bit.Core.Models.Request
Type = cipher.SecureNote.Type
};
break;
case CipherType.Fido2Key:
Fido2Key = new Fido2KeyApi(cipher.Fido2Key);
break;
default:
break;
}
@@ -122,7 +119,6 @@ namespace Bit.Core.Models.Request
public SecureNoteApi SecureNote { get; set; }
public CardApi Card { get; set; }
public IdentityApi Identity { get; set; }
public Fido2KeyApi Fido2Key { get; set; }
public List<FieldApi> Fields { get; set; }
public List<PasswordHistoryRequest> PasswordHistory { get; set; }
public Dictionary<string, string> Attachments { get; set; }

View File

@@ -18,7 +18,6 @@ namespace Bit.Core.Models.Response
public CardApi Card { get; set; }
public IdentityApi Identity { get; set; }
public SecureNoteApi SecureNote { get; set; }
public Fido2KeyApi Fido2Key { get; set; }
public bool Favorite { get; set; }
public bool Edit { get; set; }
public bool ViewPassword { get; set; } = true; // Fallback for old server versions

View File

@@ -1,4 +1,5 @@
using Bit.Core.Enums;
using Bit.Core.Models.Data;
using Bit.Core.Models.Domain;
using Bit.Core.Utilities;
@@ -21,14 +22,21 @@ namespace Bit.Core.Models.View
Email = a.Profile?.Email;
Name = a.Profile?.Name;
AvatarColor = a.Profile?.AvatarColor;
if (!string.IsNullOrWhiteSpace(a.Settings?.EnvironmentUrls?.WebVault))
Hostname = ParseEndpoint(a.Settings?.EnvironmentUrls);
}
private string ParseEndpoint(EnvironmentUrlData urls)
{
var url = urls?.WebVault ?? urls?.Base;
if (!string.IsNullOrWhiteSpace(url))
{
Hostname = CoreHelpers.GetHostname(a.Settings?.EnvironmentUrls?.WebVault);
}
else if (!string.IsNullOrWhiteSpace(a.Settings?.EnvironmentUrls?.Base))
{
Hostname = CoreHelpers.GetHostname(a.Settings?.EnvironmentUrls?.Base);
if (url.Contains("bitwarden.com") || url.Contains("bitwarden.eu"))
{
return CoreHelpers.GetDomain(url);
}
return CoreHelpers.GetHostname(url);
}
return string.Empty;
}
public bool IsAccount { get; set; }

View File

@@ -43,7 +43,6 @@ namespace Bit.Core.Models.View
public IdentityView Identity { get; set; }
public CardView Card { get; set; }
public SecureNoteView SecureNote { get; set; }
public Fido2KeyView Fido2Key { get; set; }
public List<AttachmentView> Attachments { get; set; }
public List<FieldView> Fields { get; set; }
public List<PasswordHistoryView> PasswordHistory { get; set; }
@@ -67,8 +66,6 @@ namespace Bit.Core.Models.View
return Card;
case CipherType.Identity:
return Identity;
case CipherType.Fido2Key:
return Fido2Key;
default:
break;
}
@@ -115,12 +112,14 @@ namespace Bit.Core.Models.View
return LinkedFieldOptions.Find(lfo => lfo.Value == id).Key;
}
public string ComparableName => Name + Login?.Username + Fido2Key?.UserName;
public string ComparableName => Name + Login?.Username;
public bool CanLaunch => Login?.CanLaunch == true || Fido2Key?.CanLaunch == true;
public bool CanLaunch => Login?.CanLaunch == true;
public string LaunchUri => Login?.LaunchUri ?? Fido2Key?.LaunchUri;
public string LaunchUri => Login?.LaunchUri;
public bool IsClonable => OrganizationId is null && Type != CipherType.Fido2Key;
public bool IsClonable => OrganizationId is null;
public bool HasFido2Key => Type == CipherType.Login && Login?.HasFido2Keys == true;
}
}

View File

@@ -5,7 +5,8 @@ namespace Bit.Core.Models.View
{
public class Fido2KeyView : ItemView, ILaunchableView
{
public string NonDiscoverableId { get; set; }
public string CredentialId { get; set; }
public string Discoverable { get; set; }
public string KeyType { get; set; } = Constants.DefaultFido2KeyType;
public string KeyAlgorithm { get; set; } = Constants.DefaultFido2KeyAlgorithm;
public string KeyCurve { get; set; } = Constants.DefaultFido2KeyCurve;
@@ -18,6 +19,7 @@ namespace Bit.Core.Models.View
public override string SubTitle => UserName;
public override List<KeyValuePair<string, LinkedIdType>> LinkedFieldOptions => new List<KeyValuePair<string, LinkedIdType>>();
public bool IsDiscoverable => !string.IsNullOrWhiteSpace(Discoverable);
public bool CanLaunch => !string.IsNullOrEmpty(RpId);
public string LaunchUri => $"https://{RpId}";

Some files were not shown because too many files have changed in this diff Show More