From 846d3a85a27d3e9d99d037173f58e76c16425819 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 7 Jul 2022 16:24:29 -0300 Subject: [PATCH 01/16] EC-308 Fix crash produced by creating avatar image on AccountSwitchingOverlayHelper and also added more logging to see when it happens. (#1983) --- .../AccountSwitchingOverlayHelper.cs | 24 +++++++++++++++---- .../Utilities/ImageSourceExtensions.cs | 12 ++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs b/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs index 8812285bb..4cde4b941 100644 --- a/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs +++ b/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Bit.App.Controls; using Bit.Core.Abstractions; using Bit.Core.Utilities; @@ -10,6 +11,8 @@ namespace Bit.iOS.Core.Utilities { public class AccountSwitchingOverlayHelper { + const string DEFAULT_SYSTEM_AVATAR_IMAGE = "person.2"; + IStateService _stateService; IMessagingService _messagingService; ILogger _logger; @@ -23,9 +26,22 @@ namespace Bit.iOS.Core.Utilities public async Task CreateAvatarImageAsync() { - var avatarImageSource = new AvatarImageSource(await _stateService.GetNameAsync(), await _stateService.GetEmailAsync()); - var avatarUIImage = await avatarImageSource.GetNativeImageAsync(); - return avatarUIImage.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal); + try + { + if (_stateService is null) + { + throw new NullReferenceException(nameof(_stateService)); + } + + var avatarImageSource = new AvatarImageSource(await _stateService.GetNameAsync(), await _stateService.GetEmailAsync()); + var avatarUIImage = await avatarImageSource.GetNativeImageAsync(); + return avatarUIImage?.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) ?? UIImage.GetSystemImage(DEFAULT_SYSTEM_AVATAR_IMAGE); + } + catch (Exception ex) + { + _logger.Exception(ex); + return UIImage.GetSystemImage(DEFAULT_SYSTEM_AVATAR_IMAGE); + } } public AccountSwitchingOverlayView CreateAccountSwitchingOverlayView(UIView containerView) diff --git a/src/iOS.Core/Utilities/ImageSourceExtensions.cs b/src/iOS.Core/Utilities/ImageSourceExtensions.cs index 25941a0bd..7fcf545cc 100644 --- a/src/iOS.Core/Utilities/ImageSourceExtensions.cs +++ b/src/iOS.Core/Utilities/ImageSourceExtensions.cs @@ -1,9 +1,9 @@ using System; using System.Threading; using System.Threading.Tasks; +using Bit.Core.Services; using UIKit; using Xamarin.Forms; -using Xamarin.Forms.Internals; using Xamarin.Forms.Platform.iOS; namespace Bit.iOS.Core.Utilities @@ -17,25 +17,29 @@ namespace Bit.iOS.Core.Utilities public static async Task GetNativeImageAsync(this ImageSource source, CancellationToken cancellationToken = default(CancellationToken)) { if (source == null || source.IsEmpty) + { return null; + } var handler = Xamarin.Forms.Internals.Registrar.Registered.GetHandlerForObject(source); if (handler == null) + { + LoggerHelper.LogEvenIfCantBeResolved(new InvalidOperationException("GetNativeImageAsync failed cause IImageSourceHandler couldn't be found")); return null; + } try { float scale = (float)UIScreen.MainScreen.Scale; - return await handler.LoadImageAsync(source, scale: scale, cancelationToken: cancellationToken); } catch (OperationCanceledException) { - Log.Warning("Image loading", "Image load cancelled"); + LoggerHelper.LogEvenIfCantBeResolved(new OperationCanceledException("GetNativeImageAsync was cancelled")); } catch (Exception ex) { - Log.Warning("Image loading", $"Image load failed: {ex}"); + LoggerHelper.LogEvenIfCantBeResolved(new InvalidOperationException("GetNativeImageAsync failed", ex)); } return null; From cceded2a0ff6519289791843ba1dbb2bc532ddc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui=20Tom=C3=A9?= <108268980+r-tome@users.noreply.github.com> Date: Fri, 8 Jul 2022 09:28:23 +0100 Subject: [PATCH 02/16] Updated the wording on the modal warning when deleting the account (#1982) --- src/App/Resources/AppResources.resx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 4417d5b09..8cd72b63f 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -2165,7 +2165,7 @@ Deleting your account is permanent - Your account and all associated data will be erased and unrecoverable. Are you sure you want to continue? + Your account and all vault data will be erased and unrecoverable. Are you sure you want to continue? Deleting your account From 67f49a05915fa2101b8ecd9a250b205c4ab3e4ac Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Mon, 11 Jul 2022 08:45:42 +0200 Subject: [PATCH 03/16] [PS-686] Mobile update negative copy in settings (#1961) * feat: update auto totp copy setting * feat: update show icons settings * feat: update auto add settings * feat: update settings and options to sentence case * feat: update translation keys With the latest changes the translation keys had diverged from their contents. This commit fixes that. * fix: revert AndroidManifest changes * chore: add todo comments to fix negative functions --- src/App/Pages/Settings/OptionsPage.xaml | 18 +++--- .../Pages/Settings/OptionsPageViewModel.cs | 49 ++++++++-------- src/App/Resources/AppResources.Designer.cs | 28 ++++----- src/App/Resources/AppResources.resx | 58 +++++++++---------- src/Core/Abstractions/ITotpService.cs | 1 - src/Core/Services/TotpService.cs | 9 --- src/Core/Utilities/ServiceContainer.cs | 2 +- 7 files changed, 79 insertions(+), 86 deletions(-) diff --git a/src/App/Pages/Settings/OptionsPage.xaml b/src/App/Pages/Settings/OptionsPage.xaml index 8d37074c6..8c4e3081b 100644 --- a/src/App/Pages/Settings/OptionsPage.xaml +++ b/src/App/Pages/Settings/OptionsPage.xaml @@ -83,31 +83,31 @@ @@ -117,16 +117,16 @@ - Help and Feedback + Help and feedback Hide @@ -269,7 +269,7 @@ Title for login page. (noun) - Log Out + Log out The log out button text (verb). @@ -412,7 +412,7 @@ Add an Item - App Extension + App extension Use the Bitwarden accessibility service to auto-fill your logins across apps and the web. @@ -516,7 +516,7 @@ Get your master password hint - Import Items + Import items You can bulk import items from the bitwarden.com web vault. Do you want to visit the website now? @@ -549,10 +549,10 @@ Immediately - Vault Timeout + Vault timeout - Vault Timeout Action + Vault timeout action Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting? @@ -647,7 +647,7 @@ Push notifications for apple products - Rate the App + Rate the app Please consider helping us out with a good review! @@ -701,7 +701,7 @@ What Apple calls their fingerprint reader. - Two-step Login + Two-step login Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now? @@ -710,7 +710,7 @@ Unlock with {0} - Unlock with PIN Code + Unlock with PIN code Validating @@ -907,11 +907,11 @@ Copy TOTP - - If your login has an authenticator key attached to it, the TOTP verification code is automatically copied to your clipboard whenever you auto-fill the login. + + If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login. - - Disable Automatic TOTP Copy + + Copy TOTP automatically A premium membership is required to use this feature. @@ -1128,11 +1128,11 @@ Expiration - - Disable Website Icons + + Show website icons - - Website Icons provide a recognizable image next to each login item in your vault. + + Show a recognizable image next to each login. Icons Server URL @@ -1311,7 +1311,7 @@ 5. Select "Bitwarden" - Password AutoFill + Password auto-fill The easiest way to add new logins to your vault is by using the Bitwarden Password AutoFill extension. Learn more about using the Bitwarden Password AutoFill extension by navigating to the "Settings" screen. @@ -1449,7 +1449,7 @@ There are no folders to list. - Fingerprint Phrase + Fingerprint phrase A 'fingerprint phrase' is a unique word phrase (similar to a passphrase) that a user can use to authenticate their public key with another user, for the purposes of sharing. @@ -1460,10 +1460,10 @@ Bitwarden allows you to share your vault items with others by using an organization account. Would you like to visit the bitwarden.com website to learn more? - Export Vault + Export vault - Lock Now + Lock now PIN @@ -1517,7 +1517,7 @@ 2 minutes - Clear Clipboard + Clear clipboard Clipboard is the operating system thing where you copy/paste data to on your device. @@ -1525,7 +1525,7 @@ Clipboard is the operating system thing where you copy/paste data to on your device. - Default URI Match Detection + Default URI match detection Default URI match detection for auto-fill. @@ -1573,14 +1573,14 @@ URIs that are blacklisted will not offer auto-fill. The list should be comma separated. Ex: "https://twitter.com, androidapp://com.twitter.android". - - Disable Save Prompt + + Ask to add login - - The "Save Prompt" automatically prompts you to save new items to your vault whenever you enter them for the first time. + + Ask to add an item if one isn't found in your vault. - On App Restart + On app restart Auto-fill makes it easy to securely access your Bitwarden vault from other websites and apps. It looks like you have not enabled an auto-fill service for Bitwarden. Enable auto-fill for Bitwarden from the "Settings" screen. @@ -2159,7 +2159,7 @@ Account removed successfully - Delete Account + Delete account Deleting your account is permanent diff --git a/src/Core/Abstractions/ITotpService.cs b/src/Core/Abstractions/ITotpService.cs index e0aff3c2f..717791b3a 100644 --- a/src/Core/Abstractions/ITotpService.cs +++ b/src/Core/Abstractions/ITotpService.cs @@ -6,6 +6,5 @@ namespace Bit.Core.Abstractions { Task GetCodeAsync(string key); int GetTimeInterval(string key); - Task IsAutoCopyEnabledAsync(); } } diff --git a/src/Core/Services/TotpService.cs b/src/Core/Services/TotpService.cs index df74920d7..358dfeb51 100644 --- a/src/Core/Services/TotpService.cs +++ b/src/Core/Services/TotpService.cs @@ -10,14 +10,11 @@ namespace Bit.Core.Services { private const string SteamChars = "23456789BCDFGHJKMNPQRTVWXY"; - private readonly IStateService _stateService; private readonly ICryptoFunctionService _cryptoFunctionService; public TotpService( - IStateService stateService, ICryptoFunctionService cryptoFunctionService) { - _stateService = stateService; _cryptoFunctionService = cryptoFunctionService; } @@ -132,11 +129,5 @@ namespace Bit.Core.Services } return period; } - - public async Task IsAutoCopyEnabledAsync() - { - var disabled = await _stateService.GetDisableAutoTotpCopyAsync(); - return !disabled.GetValueOrDefault(); - } } } diff --git a/src/Core/Utilities/ServiceContainer.cs b/src/Core/Utilities/ServiceContainer.cs index 84dda33bd..dedb7e551 100644 --- a/src/Core/Utilities/ServiceContainer.cs +++ b/src/Core/Utilities/ServiceContainer.cs @@ -74,7 +74,7 @@ namespace Bit.Core.Utilities }); var passwordGenerationService = new PasswordGenerationService(cryptoService, stateService, cryptoFunctionService, policyService); - var totpService = new TotpService(stateService, cryptoFunctionService); + var totpService = new TotpService(cryptoFunctionService); var authService = new AuthService(cryptoService, cryptoFunctionService, apiService, stateService, tokenService, appIdService, i18nService, platformUtilsService, messagingService, vaultTimeoutService, keyConnectorService); From 75e827678425497315cbf4eb5609fbc3f6941894 Mon Sep 17 00:00:00 2001 From: "Patrick H. Lauke" Date: Mon, 11 Jul 2022 14:48:19 +0100 Subject: [PATCH 04/16] Use correct icon for checked/unchecked boolean (#1986) Closes https://github.com/bitwarden/mobile/issues/1985 --- src/App/Pages/Vault/ViewPageViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App/Pages/Vault/ViewPageViewModel.cs b/src/App/Pages/Vault/ViewPageViewModel.cs index 17f8ef4f6..8934d39f0 100644 --- a/src/App/Pages/Vault/ViewPageViewModel.cs +++ b/src/App/Pages/Vault/ViewPageViewModel.cs @@ -750,7 +750,7 @@ namespace Bit.App.Pages { if (IsBooleanType) { - return _field.Value == "true" ? BitwardenIcons.Square : BitwardenIcons.CheckSquare; + return _field.Value == "true" ? BitwardenIcons.CheckSquare : BitwardenIcons.Square; } else if (IsLinkedType) { From d621a5d2f32454f206cc09937e484e823dab05f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Gon=C3=A7alves?= Date: Mon, 11 Jul 2022 18:02:11 +0100 Subject: [PATCH 05/16] [PS 920] Fix selfhosted url validations (#1967) * PS-920 - Added feedback to user when saving bad formed URLs * Added feedback to user when trying to perform login with bad formed URL * PS-920 - Refactor to use AsyncCommand *(missing file from previous commit) * PS-920 - Fixed whitespace formatting * PS-920 - Removed unused method * PS-920 - Fixed validation * Added comment for hard coded string * PS-920 - Removed unused properties * Fixed url validations * Refactored method to local function * PS-920 - Added exception handling and logging * Added generic error message string to AppResources --- src/App/Pages/Accounts/EnvironmentPage.xaml | 2 +- .../Pages/Accounts/EnvironmentPage.xaml.cs | 8 ----- .../Accounts/EnvironmentPageViewModel.cs | 34 +++++++++++++++++-- src/App/Resources/AppResources.Designer.cs | 14 +++++++- src/App/Resources/AppResources.resx | 8 ++++- src/Core/Services/ApiService.cs | 12 +++++++ 6 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/App/Pages/Accounts/EnvironmentPage.xaml b/src/App/Pages/Accounts/EnvironmentPage.xaml index 5a7abb783..cabf07ed7 100644 --- a/src/App/Pages/Accounts/EnvironmentPage.xaml +++ b/src/App/Pages/Accounts/EnvironmentPage.xaml @@ -14,7 +14,7 @@ - + diff --git a/src/App/Pages/Accounts/EnvironmentPage.xaml.cs b/src/App/Pages/Accounts/EnvironmentPage.xaml.cs index b57d2f440..baa2dd1c0 100644 --- a/src/App/Pages/Accounts/EnvironmentPage.xaml.cs +++ b/src/App/Pages/Accounts/EnvironmentPage.xaml.cs @@ -36,14 +36,6 @@ namespace Bit.App.Pages }; } - private async void Submit_Clicked(object sender, EventArgs e) - { - if (DoOnce()) - { - await _vm.SubmitAsync(); - } - } - private async Task SubmitSuccessAsync() { _platformUtilsService.ShowToast("success", null, AppResources.EnvironmentSaved); diff --git a/src/App/Pages/Accounts/EnvironmentPageViewModel.cs b/src/App/Pages/Accounts/EnvironmentPageViewModel.cs index b25113c41..07ce99a45 100644 --- a/src/App/Pages/Accounts/EnvironmentPageViewModel.cs +++ b/src/App/Pages/Accounts/EnvironmentPageViewModel.cs @@ -1,15 +1,17 @@ using System; using System.Threading.Tasks; +using System.Windows.Input; using Bit.App.Resources; using Bit.Core.Abstractions; using Bit.Core.Utilities; -using Xamarin.Forms; +using Xamarin.CommunityToolkit.ObjectModel; namespace Bit.App.Pages { public class EnvironmentPageViewModel : BaseViewModel { private readonly IEnvironmentService _environmentService; + readonly LazyResolve _logger = new LazyResolve("logger"); public EnvironmentPageViewModel() { @@ -22,10 +24,10 @@ namespace Bit.App.Pages IdentityUrl = _environmentService.IdentityUrl; IconsUrl = _environmentService.IconsUrl; NotificationsUrls = _environmentService.NotificationsUrl; - SubmitCommand = new Command(async () => await SubmitAsync()); + SubmitCommand = new AsyncCommand(SubmitAsync, onException: ex => OnSubmitException(ex), allowsMultipleExecutions: false); } - public Command SubmitCommand { get; } + public ICommand SubmitCommand { get; } public string BaseUrl { get; set; } public string ApiUrl { get; set; } public string IdentityUrl { get; set; } @@ -37,6 +39,12 @@ namespace Bit.App.Pages public async Task SubmitAsync() { + if (!ValidateUrls()) + { + await Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.EnvironmentPageUrlsError, AppResources.Ok); + return; + } + var resUrls = await _environmentService.SetUrlsAsync(new Core.Models.Data.EnvironmentUrlData { Base = BaseUrl, @@ -57,5 +65,25 @@ namespace Bit.App.Pages SubmitSuccessAction?.Invoke(); } + + public bool ValidateUrls() + { + bool IsUrlValid(string url) + { + return string.IsNullOrEmpty(url) || Uri.IsWellFormedUriString(url, UriKind.Absolute); + } + + return IsUrlValid(BaseUrl) + && IsUrlValid(ApiUrl) + && IsUrlValid(IdentityUrl) + && IsUrlValid(WebVaultUrl) + && IsUrlValid(IconsUrl); + } + + private void OnSubmitException(Exception ex) + { + _logger.Value.Exception(ex); + Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.GenericErrorMessage, AppResources.Ok); + } } } diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index e25fcdcdb..09f2c3f98 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 @@ -4044,5 +4044,17 @@ namespace Bit.App.Resources { return ResourceManager.GetString("NeverLockWarning", resourceCulture); } } + + public static string EnvironmentPageUrlsError { + get { + return ResourceManager.GetString("EnvironmentPageUrlsError", resourceCulture); + } + } + + public static string GenericErrorMessage { + get { + return ResourceManager.GetString("GenericErrorMessage", resourceCulture); + } + } } } diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index a04488167..58cc1f7c9 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App/Pages/Send/SendAddOnlyPage.xaml.cs b/src/App/Pages/Send/SendAddOnlyPage.xaml.cs new file mode 100644 index 000000000..821c9f817 --- /dev/null +++ b/src/App/Pages/Send/SendAddOnlyPage.xaml.cs @@ -0,0 +1,178 @@ +using System; +using System.Threading.Tasks; +using Bit.App.Models; +using Bit.App.Utilities; +using Bit.Core.Abstractions; +using Bit.Core.Enums; +using Bit.Core.Utilities; +using Xamarin.Forms; + +namespace Bit.App.Pages +{ + /// + /// This is a version of that is reduced for adding only and adapted + /// for performance for iOS Share extension. + /// + /// + /// This should NOT be used in Android. + /// + public partial class SendAddOnlyPage : BaseContentPage + { + private readonly IVaultTimeoutService _vaultTimeoutService; + private readonly LazyResolve _logger = new LazyResolve("logger"); + + private AppOptions _appOptions; + private SendAddEditPageViewModel _vm; + + public Action OnClose { get; set; } + public Action AfterSubmit { get; set; } + + public SendAddOnlyPage( + AppOptions appOptions = null, + string sendId = null, + SendType? type = null) + { + if (appOptions?.IosExtension != true) + { + throw new InvalidOperationException(nameof(SendAddOnlyPage) + " is only prepared to be used in iOS share extension"); + } + + _vaultTimeoutService = ServiceContainer.Resolve("vaultTimeoutService"); + _appOptions = appOptions; + InitializeComponent(); + _vm = BindingContext as SendAddEditPageViewModel; + _vm.Page = this; + _vm.SendId = sendId; + _vm.Type = appOptions?.CreateSend?.Item1 ?? type; + + if (_vm.IsText) + { + _nameEntry.ReturnType = ReturnType.Next; + _nameEntry.ReturnCommand = new Command(() => _textEditor.Focus()); + } + } + + protected override async void OnAppearing() + { + base.OnAppearing(); + + try + { + if (!await AppHelpers.IsVaultTimeoutImmediateAsync()) + { + await _vaultTimeoutService.CheckVaultTimeoutAsync(); + } + if (await _vaultTimeoutService.IsLockedAsync()) + { + return; + } + await _vm.InitAsync(); + + if (!await _vm.LoadAsync()) + { + await CloseAsync(); + return; + } + + _accountAvatar?.OnAppearing(); + await Device.InvokeOnMainThreadAsync(async () => _vm.AvatarImageSource = await GetAvatarImageSourceAsync()); + + await HandleCreateRequest(); + if (string.IsNullOrWhiteSpace(_vm.Send?.Name)) + { + RequestFocus(_nameEntry); + } + AdjustToolbar(); + } + catch (Exception ex) + { + _logger.Value.Exception(ex); + await CloseAsync(); + } + } + + protected override void OnDisappearing() + { + base.OnDisappearing(); + _accountAvatar?.OnDisappearing(); + } + + private async Task CloseAsync() + { + if (OnClose is null) + { + await Navigation.PopModalAsync(); + } + else + { + OnClose(); + } + } + + private async void Save_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + var submitted = await _vm.SubmitAsync(); + if (submitted) + { + AfterSubmit?.Invoke(); + } + } + } + + private async void Close_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + await CloseAsync(); + } + } + + private void AdjustToolbar() + { + _saveItem.IsEnabled = _vm.SendEnabled; + } + + private Task HandleCreateRequest() + { + if (_appOptions?.CreateSend == null) + { + return Task.CompletedTask; + } + + _vm.IsAddFromShare = true; + _vm.CopyInsteadOfShareAfterSaving = _appOptions.CopyInsteadOfShareAfterSaving; + + var name = _appOptions.CreateSend.Item2; + _vm.Send.Name = name; + + var type = _appOptions.CreateSend.Item1; + if (type == SendType.File) + { + _vm.FileData = _appOptions.CreateSend.Item3; + _vm.FileName = name; + } + else + { + var text = _appOptions.CreateSend.Item4; + _vm.Send.Text.Text = text; + _vm.TriggerSendTextPropertyChanged(); + } + _appOptions.CreateSend = null; + + return Task.CompletedTask; + } + + void OptionsHeader_Tapped(object sender, EventArgs e) + { + _vm.ToggleOptionsCommand.Execute(null); + + if (!_lazyOptionsView.IsLoaded) + { + _lazyOptionsView.MainScrollView = _scrollView; + _lazyOptionsView.LoadViewAsync(); + } + } + } +} diff --git a/src/App/Utilities/AccountManagement/AccountsManager.cs b/src/App/Utilities/AccountManagement/AccountsManager.cs index 1fac4b900..dd5b639f1 100644 --- a/src/App/Utilities/AccountManagement/AccountsManager.cs +++ b/src/App/Utilities/AccountManagement/AccountsManager.cs @@ -19,6 +19,7 @@ namespace Bit.App.Utilities.AccountManagement private readonly IStateService _stateService; private readonly IPlatformUtilsService _platformUtilsService; private readonly IAuthService _authService; + private readonly ILogger _logger; Func _getOptionsFunc; private IAccountsManagerHost _accountsManagerHost; @@ -28,7 +29,8 @@ namespace Bit.App.Utilities.AccountManagement IStorageService secureStorageService, IStateService stateService, IPlatformUtilsService platformUtilsService, - IAuthService authService) + IAuthService authService, + ILogger logger) { _broadcasterService = broadcasterService; _vaultTimeoutService = vaultTimeoutService; @@ -36,6 +38,7 @@ namespace Bit.App.Utilities.AccountManagement _stateService = stateService; _platformUtilsService = platformUtilsService; _authService = authService; + _logger = logger; } private AppOptions Options => _getOptionsFunc?.Invoke() ?? new AppOptions { IosExtension = true }; @@ -109,42 +112,45 @@ namespace Bit.App.Utilities.AccountManagement private async void OnMessage(Message message) { - switch (message.Command) + try { - case AccountsManagerMessageCommands.LOCKED: - Locked(message.Data as Tuple); - break; - case AccountsManagerMessageCommands.LOCK_VAULT: - await _vaultTimeoutService.LockAsync(true); - break; - case AccountsManagerMessageCommands.LOGOUT: - LogOut(message.Data as Tuple); - break; - case AccountsManagerMessageCommands.LOGGED_OUT: - // Clean up old migrated key if they ever log out. - await _secureStorageService.RemoveAsync("oldKey"); - break; - case AccountsManagerMessageCommands.ADD_ACCOUNT: - AddAccount(); - break; - case AccountsManagerMessageCommands.ACCOUNT_ADDED: - await _accountsManagerHost.UpdateThemeAsync(); - break; - case AccountsManagerMessageCommands.SWITCHED_ACCOUNT: - await SwitchedAccountAsync(); - break; + switch (message.Command) + { + case AccountsManagerMessageCommands.LOCKED: + await Device.InvokeOnMainThreadAsync(() => LockedAsync(message.Data as Tuple)); + break; + case AccountsManagerMessageCommands.LOCK_VAULT: + await _vaultTimeoutService.LockAsync(true); + break; + case AccountsManagerMessageCommands.LOGOUT: + await Device.InvokeOnMainThreadAsync(() => LogOutAsync(message.Data as Tuple)); + break; + case AccountsManagerMessageCommands.LOGGED_OUT: + // Clean up old migrated key if they ever log out. + await _secureStorageService.RemoveAsync("oldKey"); + break; + case AccountsManagerMessageCommands.ADD_ACCOUNT: + await AddAccountAsync(); + break; + case AccountsManagerMessageCommands.ACCOUNT_ADDED: + await _accountsManagerHost.UpdateThemeAsync(); + break; + case AccountsManagerMessageCommands.SWITCHED_ACCOUNT: + await SwitchedAccountAsync(); + break; + } + } + catch (Exception ex) + { + _logger.Exception(ex); } } - private void Locked(Tuple extras) + private async Task LockedAsync(Tuple extras) { var userId = extras?.Item1; var userInitiated = extras?.Item2 ?? false; - Device.BeginInvokeOnMainThread(async () => await LockedAsync(userId, userInitiated)); - } - private async Task LockedAsync(string userId, bool userInitiated) - { if (!await _stateService.IsActiveAccountAsync(userId)) { _platformUtilsService.ShowToast("info", null, AppResources.AccountLockedSuccessfully); @@ -163,28 +169,24 @@ namespace Bit.App.Utilities.AccountManagement await _accountsManagerHost.SetPreviousPageInfoAsync(); - Device.BeginInvokeOnMainThread(() => _accountsManagerHost.Navigate(NavigationTarget.Lock, new LockNavigationParams(autoPromptBiometric))); + await Device.InvokeOnMainThreadAsync(() => _accountsManagerHost.Navigate(NavigationTarget.Lock, new LockNavigationParams(autoPromptBiometric))); } - private void AddAccount() + private async Task AddAccountAsync() { - Device.BeginInvokeOnMainThread(() => + await Device.InvokeOnMainThreadAsync(() => { Options.HideAccountSwitcher = false; _accountsManagerHost.Navigate(NavigationTarget.HomeLogin); }); } - private void LogOut(Tuple extras) + private async Task LogOutAsync(Tuple extras) { var userId = extras?.Item1; var userInitiated = extras?.Item2 ?? true; var expired = extras?.Item3 ?? false; - Device.BeginInvokeOnMainThread(async () => await LogOutAsync(userId, userInitiated, expired)); - } - private async Task LogOutAsync(string userId, bool userInitiated, bool expired) - { await AppHelpers.LogOutAsync(userId, userInitiated); await NavigateOnAccountChangeAsync(); _authService.LogOut(() => diff --git a/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs b/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs index 2dc1744c1..e4ad3248a 100644 --- a/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs +++ b/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs @@ -1,20 +1,20 @@ using System; -using UIKit; -using Foundation; -using Bit.iOS.Core.Views; -using Bit.App.Resources; -using Bit.iOS.Core.Utilities; -using Bit.App.Abstractions; -using Bit.Core.Abstractions; -using Bit.Core.Utilities; using System.Threading.Tasks; -using Bit.App.Utilities; -using Bit.Core.Models.Domain; -using Bit.Core.Enums; -using Bit.App.Pages; +using Bit.App.Abstractions; using Bit.App.Models; -using Xamarin.Forms; +using Bit.App.Pages; +using Bit.App.Resources; +using Bit.App.Utilities; using Bit.Core; +using Bit.Core.Abstractions; +using Bit.Core.Enums; +using Bit.Core.Models.Domain; +using Bit.Core.Utilities; +using Bit.iOS.Core.Utilities; +using Bit.iOS.Core.Views; +using Foundation; +using UIKit; +using Xamarin.Forms; namespace Bit.iOS.Core.Controllers { @@ -39,6 +39,10 @@ namespace Bit.iOS.Core.Controllers protected bool autofillExtension = false; + public BaseLockPasswordViewController() + { + } + public BaseLockPasswordViewController(IntPtr handle) : base(handle) { } @@ -168,13 +172,12 @@ namespace Bit.iOS.Core.Controllers { TableView.BackgroundColor = ThemeHelpers.BackgroundColor; TableView.SeparatorColor = ThemeHelpers.SeparatorColor; + TableView.RowHeight = UITableView.AutomaticDimension; + TableView.EstimatedRowHeight = 70; + TableView.Source = new TableSource(this); + TableView.AllowsSelection = true; } - TableView.RowHeight = UITableView.AutomaticDimension; - TableView.EstimatedRowHeight = 70; - TableView.Source = new TableSource(this); - TableView.AllowsSelection = true; - base.ViewDidLoad(); if (_biometricLock) @@ -191,7 +194,7 @@ namespace Bit.iOS.Core.Controllers } } - public override async void ViewDidAppear(bool animated) + public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); @@ -402,28 +405,43 @@ namespace Bit.iOS.Core.Controllers }); } + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + MasterPasswordCell?.Dispose(); + MasterPasswordCell = null; + + TableView?.Dispose(); + } + public class TableSource : ExtendedUITableViewSource { - private readonly BaseLockPasswordViewController _controller; + private readonly WeakReference _controller; public TableSource(BaseLockPasswordViewController controller) { - _controller = controller; + _controller = new WeakReference(controller); } public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) { + if (!_controller.TryGetTarget(out var controller)) + { + return new ExtendedUITableViewCell(); + } + if (indexPath.Section == 0) { if (indexPath.Row == 0) { - if (_controller._biometricUnlockOnly) + if (controller._biometricUnlockOnly) { - return _controller.BiometricCell; + return controller.BiometricCell; } else { - return _controller.MasterPasswordCell; + return controller.MasterPasswordCell; } } } @@ -431,7 +449,7 @@ namespace Bit.iOS.Core.Controllers { if (indexPath.Row == 0) { - if (_controller._passwordReprompt) + if (controller._passwordReprompt) { var cell = new ExtendedUITableViewCell(); cell.TextLabel.TextColor = ThemeHelpers.DangerColor; @@ -441,9 +459,9 @@ namespace Bit.iOS.Core.Controllers cell.TextLabel.Text = AppResources.PasswordConfirmationDesc; return cell; } - else if (!_controller._biometricUnlockOnly) + else if (!controller._biometricUnlockOnly) { - return _controller.BiometricCell; + return controller.BiometricCell; } } } @@ -457,8 +475,13 @@ namespace Bit.iOS.Core.Controllers public override nint NumberOfSections(UITableView tableView) { - return (!_controller._biometricUnlockOnly && _controller._biometricLock) || - _controller._passwordReprompt + if (!_controller.TryGetTarget(out var controller)) + { + return 0; + } + + return (!controller._biometricUnlockOnly && controller._biometricLock) || + controller._passwordReprompt ? 2 : 1; } @@ -484,13 +507,18 @@ namespace Bit.iOS.Core.Controllers public override void RowSelected(UITableView tableView, NSIndexPath indexPath) { + if (!_controller.TryGetTarget(out var controller)) + { + return; + } + tableView.DeselectRow(indexPath, true); tableView.EndEditing(true); if (indexPath.Row == 0 && - ((_controller._biometricUnlockOnly && indexPath.Section == 0) || + ((controller._biometricUnlockOnly && indexPath.Section == 0) || indexPath.Section == 1)) { - var task = _controller.PromptBiometricAsync(); + var task = controller.PromptBiometricAsync(); return; } var cell = tableView.CellAt(indexPath); diff --git a/src/iOS.Core/Controllers/ExtendedUIViewController.cs b/src/iOS.Core/Controllers/ExtendedUIViewController.cs index 8d0db352b..b599ac4e2 100644 --- a/src/iOS.Core/Controllers/ExtendedUIViewController.cs +++ b/src/iOS.Core/Controllers/ExtendedUIViewController.cs @@ -7,7 +7,11 @@ namespace Bit.iOS.Core.Controllers public class ExtendedUIViewController : UIViewController { public Action DismissModalAction { get; set; } - + + public ExtendedUIViewController() + { + } + public ExtendedUIViewController(IntPtr handle) : base(handle) { @@ -28,16 +32,28 @@ namespace Bit.iOS.Core.Controllers { View.BackgroundColor = ThemeHelpers.BackgroundColor; } - if (NavigationController?.NavigationBar != null) + UpdateNavigationBarTheme(); + } + + protected virtual void UpdateNavigationBarTheme() + { + UpdateNavigationBarTheme(NavigationController?.NavigationBar); + } + + protected void UpdateNavigationBarTheme(UINavigationBar navBar) + { + if (navBar is null) { - NavigationController.NavigationBar.BarTintColor = ThemeHelpers.NavBarBackgroundColor; - NavigationController.NavigationBar.BackgroundColor = ThemeHelpers.NavBarBackgroundColor; - NavigationController.NavigationBar.TintColor = ThemeHelpers.NavBarTextColor; - NavigationController.NavigationBar.TitleTextAttributes = new UIStringAttributes - { - ForegroundColor = ThemeHelpers.NavBarTextColor - }; + return; } + + navBar.BarTintColor = ThemeHelpers.NavBarBackgroundColor; + navBar.BackgroundColor = ThemeHelpers.NavBarBackgroundColor; + navBar.TintColor = ThemeHelpers.NavBarTextColor; + navBar.TitleTextAttributes = new UIStringAttributes + { + ForegroundColor = ThemeHelpers.NavBarTextColor + }; } } } diff --git a/src/iOS.Core/Controllers/LockPasswordViewController.cs b/src/iOS.Core/Controllers/LockPasswordViewController.cs index fbce117ca..fb8d5e0f0 100644 --- a/src/iOS.Core/Controllers/LockPasswordViewController.cs +++ b/src/iOS.Core/Controllers/LockPasswordViewController.cs @@ -184,7 +184,7 @@ namespace Bit.iOS.Core.Controllers } } - public override async void ViewDidAppear(bool animated) + public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); diff --git a/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs b/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs index 4cde4b941..a732edaaf 100644 --- a/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs +++ b/src/iOS.Core/Utilities/AccountSwitchingOverlayHelper.cs @@ -12,10 +12,10 @@ namespace Bit.iOS.Core.Utilities public class AccountSwitchingOverlayHelper { const string DEFAULT_SYSTEM_AVATAR_IMAGE = "person.2"; - - IStateService _stateService; - IMessagingService _messagingService; - ILogger _logger; + + readonly IStateService _stateService; + readonly IMessagingService _messagingService; + readonly ILogger _logger; public AccountSwitchingOverlayHelper() { @@ -32,10 +32,12 @@ namespace Bit.iOS.Core.Utilities { throw new NullReferenceException(nameof(_stateService)); } - + var avatarImageSource = new AvatarImageSource(await _stateService.GetNameAsync(), await _stateService.GetEmailAsync()); - var avatarUIImage = await avatarImageSource.GetNativeImageAsync(); - return avatarUIImage?.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) ?? UIImage.GetSystemImage(DEFAULT_SYSTEM_AVATAR_IMAGE); + using (var avatarUIImage = await avatarImageSource.GetNativeImageAsync()) + { + return avatarUIImage?.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) ?? UIImage.GetSystemImage(DEFAULT_SYSTEM_AVATAR_IMAGE); + } } catch (Exception ex) { diff --git a/src/iOS.Core/Utilities/iOSCoreHelpers.cs b/src/iOS.Core/Utilities/iOSCoreHelpers.cs index 21321803e..a824d7235 100644 --- a/src/iOS.Core/Utilities/iOSCoreHelpers.cs +++ b/src/iOS.Core/Utilities/iOSCoreHelpers.cs @@ -2,6 +2,7 @@ using System.IO; using System.Threading.Tasks; using Bit.App.Abstractions; +using Bit.App.Controls; using Bit.App.Models; using Bit.App.Pages; using Bit.App.Resources; @@ -15,6 +16,7 @@ using Bit.iOS.Core.Services; using CoreNFC; using Foundation; using UIKit; +using Xamarin.Forms; namespace Bit.iOS.Core.Utilities { @@ -26,6 +28,42 @@ namespace Bit.iOS.Core.Utilities public static string AppGroupId = "group.com.8bit.bitwarden"; public static string AccessGroup = "LTZ2PFU5D6.com.8bit.bitwarden"; + public static void InitApp(T rootController, + string clearCipherCacheKey, + NFCNdefReaderSession nfcSession, + out NFCReaderDelegate nfcDelegate, + out IAccountsManager accountsManager) + where T : UIViewController, IAccountsManagerHost + { + Forms.Init(); + + if (ServiceContainer.RegisteredServices.Count > 0) + { + ServiceContainer.Reset(); + } + RegisterLocalServices(); + var deviceActionService = ServiceContainer.Resolve("deviceActionService"); + var messagingService = ServiceContainer.Resolve("messagingService"); + ServiceContainer.Init(deviceActionService.DeviceUserAgent, + clearCipherCacheKey, + Bit.Core.Constants.iOSAllClearCipherCacheKeys); + InitLogger(); + Bootstrap(); + + var appOptions = new AppOptions { IosExtension = true }; + var app = new App.App(appOptions); + ThemeManager.SetTheme(app.Resources); + + AppearanceAdjustments(); + + nfcDelegate = new Core.NFCReaderDelegate((success, message) => + messagingService.Send("gotYubiKeyOTP", message)); + SubscribeBroadcastReceiver(rootController, nfcSession, nfcDelegate); + + accountsManager = ServiceContainer.Resolve("accountsManager"); + accountsManager.Init(() => appOptions, rootController); + } + public static void InitLogger() { ServiceContainer.Resolve("logger").InitAsync(); @@ -89,6 +127,7 @@ namespace Bit.iOS.Core.Utilities ServiceContainer.Register("cryptoFunctionService", cryptoFunctionService); ServiceContainer.Register("cryptoService", cryptoService); ServiceContainer.Register("passwordRepromptService", passwordRepromptService); + ServiceContainer.Register("avatarImageSourcePool", new AvatarImageSourcePool()); } public static void Bootstrap(Func postBootstrapFunc = null) @@ -181,7 +220,8 @@ namespace Bit.iOS.Core.Utilities ServiceContainer.Resolve("secureStorageService"), ServiceContainer.Resolve("stateService"), ServiceContainer.Resolve("platformUtilsService"), - ServiceContainer.Resolve("authService")); + ServiceContainer.Resolve("authService"), + ServiceContainer.Resolve("logger")); ServiceContainer.Register("accountsManager", accountsManager); if (postBootstrapFunc != null) diff --git a/src/iOS.ShareExtension/ExtensionNavigationController.cs b/src/iOS.ShareExtension/ExtensionNavigationController.cs new file mode 100644 index 000000000..326ef2df0 --- /dev/null +++ b/src/iOS.ShareExtension/ExtensionNavigationController.cs @@ -0,0 +1,27 @@ +// This file has been autogenerated from a class added in the UI designer. + +using System; +using UIKit; + +namespace Bit.iOS.ShareExtension +{ + public partial class ExtensionNavigationController : UINavigationController + { + public ExtensionNavigationController (IntPtr handle) : base (handle) + { + } + + public override UIViewController PopViewController(bool animated) + { + TopViewController?.Dispose(); + return base.PopViewController(animated); + + } + + public override void DismissModalViewController(bool animated) + { + ModalViewController?.Dispose(); + base.DismissModalViewController(animated); + } + } +} diff --git a/src/iOS.ShareExtension/ExtensionNavigationController.designer.cs b/src/iOS.ShareExtension/ExtensionNavigationController.designer.cs new file mode 100644 index 000000000..aff73131b --- /dev/null +++ b/src/iOS.ShareExtension/ExtensionNavigationController.designer.cs @@ -0,0 +1,20 @@ +// WARNING +// +// This file has been generated automatically by Visual Studio to store outlets and +// actions made in the UI designer. If it is removed, they will be lost. +// Manual changes to this file may not be handled correctly. +// +using Foundation; +using System.CodeDom.Compiler; + +namespace Bit.iOS.ShareExtension +{ + [Register ("ExtensionNavigationController")] + partial class ExtensionNavigationController + { + + void ReleaseDesignerOutlets () + { + } + } +} diff --git a/src/iOS.ShareExtension/LoadingViewController.cs b/src/iOS.ShareExtension/LoadingViewController.cs index 6411ac175..8463c6795 100644 --- a/src/iOS.ShareExtension/LoadingViewController.cs +++ b/src/iOS.ShareExtension/LoadingViewController.cs @@ -7,11 +7,11 @@ using Bit.App.Abstractions; using Bit.App.Models; using Bit.App.Pages; using Bit.App.Utilities; +using Bit.App.Utilities.AccountManagement; using Bit.Core.Abstractions; using Bit.Core.Enums; using Bit.Core.Services; using Bit.Core.Utilities; -using Bit.iOS.Core; using Bit.iOS.Core.Controllers; using Bit.iOS.Core.Utilities; using Bit.iOS.Core.Views; @@ -24,16 +24,33 @@ using Xamarin.Forms; namespace Bit.iOS.ShareExtension { - public partial class LoadingViewController : ExtendedUIViewController + public partial class LoadingViewController : ExtendedUIViewController, IAccountsManagerHost { + const string STORYBOARD_NAME = "MainInterface"; + private Context _context = new Context(); private NFCNdefReaderSession _nfcSession = null; private Core.NFCReaderDelegate _nfcDelegate = null; + private IAccountsManager _accountsManager; readonly LazyResolve _stateService = new LazyResolve("stateService"); readonly LazyResolve _vaultTimeoutService = new LazyResolve("vaultTimeoutService"); - readonly LazyResolve _deviceActionService = new LazyResolve("deviceActionService"); - readonly LazyResolve _eventService = new LazyResolve("eventService"); + + Lazy _storyboard = new Lazy(() => UIStoryboard.FromName(STORYBOARD_NAME, null)); + + private App.App _app = null; + private UIViewController _currentModalController; + private bool _presentingOnNavigationPage; + + private ExtensionNavigationController ExtNavigationController + { + get + { + NavigationController.PresentationController.Delegate = + new CustomPresentationControllerDelegate(CompleteRequest); + return NavigationController as ExtensionNavigationController; + } + } public LoadingViewController(IntPtr handle) : base(handle) @@ -41,39 +58,38 @@ namespace Bit.iOS.ShareExtension public override void ViewDidLoad() { - InitApp(); + iOSCoreHelpers.InitApp(this, Bit.Core.Constants.iOSShareExtensionClearCiphersCacheKey, + _nfcSession, out _nfcDelegate, out _accountsManager); base.ViewDidLoad(); Logo.Image = new UIImage(ThemeHelpers.LightTheme ? "logo.png" : "logo_white.png"); View.BackgroundColor = ThemeHelpers.SplashBackgroundColor; _context.ExtensionContext = ExtensionContext; + _context.ProviderType = GetProviderTypeFromExtensionInputItems(); + } + /// + /// Gets the provider given the input items + /// + private string GetProviderTypeFromExtensionInputItems() + { foreach (var item in ExtensionContext.InputItems) { - var processed = false; foreach (var itemProvider in item.Attachments) { if (itemProvider.HasItemConformingTo(UTType.PlainText)) { - _context.ProviderType = UTType.PlainText; - - processed = true; - break; + return UTType.PlainText; } - else if (itemProvider.HasItemConformingTo(UTType.Data)) + + if (itemProvider.HasItemConformingTo(UTType.Data)) { - _context.ProviderType = UTType.Data; - - processed = true; - break; + return UTType.Data; } } - if (processed) - { - break; - } } + return null; } public override async void ViewDidAppear(bool animated) @@ -84,12 +100,12 @@ namespace Bit.iOS.ShareExtension { if (!await IsAuthed()) { - LaunchHomePage(); + await _accountsManager.NavigateOnAccountChangeAsync(false); return; } else if (await IsLocked()) { - PerformSegue("lockPasswordSegue", this); + NavigateToLockViewController(); } else { @@ -102,24 +118,52 @@ namespace Bit.iOS.ShareExtension } } - public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) + void NavigateToLockViewController() { - if (segue.DestinationViewController is UINavigationController navController - && - navController.TopViewController is LockPasswordViewController passwordViewController) + var viewController = _storyboard.Value.InstantiateViewController("lockVC") as LockPasswordViewController; + viewController.LoadingController = this; + viewController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + + if (_presentingOnNavigationPage) { - passwordViewController.LoadingController = this; - segue.DestinationViewController.PresentationController.Delegate = - new CustomPresentationControllerDelegate(passwordViewController.DismissModalAction); + _presentingOnNavigationPage = false; + DismissViewController(true, () => ExtNavigationController.PushViewController(viewController, true)); + } + else + { + ExtNavigationController.PushViewController(viewController, true); } } public void DismissLockAndContinue() { Debug.WriteLine("BW Log, Dismissing lock controller."); + + ClearBeforeNavigating(); + DismissViewController(false, () => ContinueOnAsync().FireAndForget()); } + private void DismissAndLaunch(Action pageToLaunch) + { + ClearBeforeNavigating(); + + DismissViewController(false, pageToLaunch); + } + + void ClearBeforeNavigating() + { + _currentModalController?.Dispose(); + _currentModalController = null; + + if (_storyboard.IsValueCreated) + { + _storyboard.Value.Dispose(); + _storyboard = null; + _storyboard = new Lazy(() => UIStoryboard.FromName(STORYBOARD_NAME, null)); + } + } + private async Task ContinueOnAsync() { Tuple createSend = null; @@ -140,20 +184,24 @@ namespace Bit.iOS.ShareExtension CreateSend = createSend, CopyInsteadOfShareAfterSaving = true }; - var sendAddEditPage = new SendAddEditPage(appOptions) + var sendPage = new SendAddOnlyPage(appOptions) { OnClose = () => CompleteRequest(), AfterSubmit = () => CompleteRequest() }; - var app = new App.App(appOptions); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(sendAddEditPage); + SetupAppAndApplyResources(sendPage); - var navigationPage = new NavigationPage(sendAddEditPage); - var sendAddEditController = navigationPage.CreateViewController(); - sendAddEditController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(sendAddEditController, true, null); + NavigateToPage(sendPage); + } + + private void NavigateToPage(ContentPage page) + { + var navigationPage = new NavigationPage(page); + _currentModalController = navigationPage.CreateViewController(); + _currentModalController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + _presentingOnNavigationPage = true; + PresentViewController(_currentModalController, true, null); } private async Task<(string, byte[])> LoadDataBytesAsync() @@ -202,31 +250,6 @@ namespace Bit.iOS.ShareExtension }); } - private void InitApp() - { - // Init Xamarin Forms - Forms.Init(); - - if (ServiceContainer.RegisteredServices.Count > 0) - { - ServiceContainer.Reset(); - } - iOSCoreHelpers.RegisterLocalServices(); - var messagingService = ServiceContainer.Resolve("messagingService"); - ServiceContainer.Init(_deviceActionService.Value.DeviceUserAgent, - Bit.Core.Constants.iOSShareExtensionClearCiphersCacheKey, Bit.Core.Constants.iOSAllClearCipherCacheKeys); - iOSCoreHelpers.InitLogger(); - iOSCoreHelpers.Bootstrap(); - - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - - iOSCoreHelpers.AppearanceAdjustments(); - _nfcDelegate = new NFCReaderDelegate((success, message) => - messagingService.Send("gotYubiKeyOTP", message)); - iOSCoreHelpers.SubscribeBroadcastReceiver(this, _nfcSession, _nfcDelegate); - } - private Task IsLocked() { return _vaultTimeoutService.Value.IsLockedAsync(); @@ -244,7 +267,7 @@ namespace Bit.iOS.ShareExtension if (await IsAuthed()) { await AppHelpers.LogOutAsync(await _stateService.Value.GetActiveUserIdAsync()); - if (_deviceActionService.Value.SystemMajorVersion() >= 12) + if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) { await ASCredentialIdentityStore.SharedStore?.RemoveAllCredentialIdentitiesAsync(); } @@ -252,83 +275,75 @@ namespace Bit.iOS.ShareExtension }); } + private App.App SetupAppAndApplyResources(ContentPage page) + { + if (_app is null) + { + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(app.Resources); + } + ThemeManager.ApplyResourcesToPage(page); + return _app; + } + private void LaunchHomePage() { var homePage = new HomePage(); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(homePage); + SetupAppAndApplyResources(homePage); if (homePage.BindingContext is HomeViewModel vm) { - vm.StartLoginAction = () => DismissViewController(false, () => LaunchLoginFlow()); - vm.StartRegisterAction = () => DismissViewController(false, () => LaunchRegisterFlow()); - vm.StartSsoLoginAction = () => DismissViewController(false, () => LaunchLoginSsoFlow()); - vm.StartEnvironmentAction = () => DismissViewController(false, () => LaunchEnvironmentFlow()); + vm.StartLoginAction = () => DismissAndLaunch(() => LaunchLoginFlow()); + vm.StartRegisterAction = () => DismissAndLaunch(() => LaunchRegisterFlow()); + vm.StartSsoLoginAction = () => DismissAndLaunch(() => LaunchLoginSsoFlow()); + vm.StartEnvironmentAction = () => DismissAndLaunch(() => LaunchEnvironmentFlow()); vm.CloseAction = () => CompleteRequest(); } - var navigationPage = new NavigationPage(homePage); - var loginController = navigationPage.CreateViewController(); - loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(loginController, true, null); - + NavigateToPage(homePage); LogoutIfAuthed(); } private void LaunchEnvironmentFlow() { var environmentPage = new EnvironmentPage(); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); + SetupAppAndApplyResources(environmentPage); ThemeManager.ApplyResourcesToPage(environmentPage); if (environmentPage.BindingContext is EnvironmentPageViewModel vm) { - vm.SubmitSuccessAction = () => DismissViewController(false, () => LaunchHomePage()); - vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.SubmitSuccessAction = () => DismissAndLaunch(() => LaunchHomePage()); + vm.CloseAction = () => DismissAndLaunch(() => LaunchHomePage()); } - var navigationPage = new NavigationPage(environmentPage); - var loginController = navigationPage.CreateViewController(); - loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(loginController, true, null); + NavigateToPage(environmentPage); } private void LaunchRegisterFlow() { var registerPage = new RegisterPage(null); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(registerPage); + SetupAppAndApplyResources(registerPage); if (registerPage.BindingContext is RegisterPageViewModel vm) { - vm.RegistrationSuccess = () => DismissViewController(false, () => LaunchLoginFlow(vm.Email)); - vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.RegistrationSuccess = () => DismissAndLaunch(() => LaunchLoginFlow(vm.Email)); + vm.CloseAction = () => DismissAndLaunch(() => LaunchHomePage()); } - - var navigationPage = new NavigationPage(registerPage); - var loginController = navigationPage.CreateViewController(); - loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(loginController, true, null); + NavigateToPage(registerPage); } private void LaunchLoginFlow(string email = null) { var loginPage = new LoginPage(email); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(loginPage); + SetupAppAndApplyResources(loginPage); if (loginPage.BindingContext is LoginPageViewModel vm) { - vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow(false)); - vm.UpdateTempPasswordAction = () => DismissViewController(false, () => LaunchUpdateTempPasswordFlow()); - vm.LogInSuccessAction = () => DismissLockAndContinue(); + vm.StartTwoFactorAction = () => DismissAndLaunch(() => LaunchTwoFactorFlow(false)); + vm.UpdateTempPasswordAction = () => DismissAndLaunch(() => LaunchUpdateTempPasswordFlow()); + vm.LogInSuccessAction = () => + { + DismissLockAndContinue(); + }; vm.CloseAction = () => CompleteRequest(); } - - var navigationPage = new NavigationPage(loginPage); - var loginController = navigationPage.CreateViewController(); - loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(loginController, true, null); + NavigateToPage(loginPage); LogoutIfAuthed(); } @@ -336,22 +351,16 @@ namespace Bit.iOS.ShareExtension private void LaunchLoginSsoFlow() { var loginPage = new LoginSsoPage(); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(loginPage); + SetupAppAndApplyResources(loginPage); if (loginPage.BindingContext is LoginSsoPageViewModel vm) { - vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow(true)); - vm.StartSetPasswordAction = () => DismissViewController(false, () => LaunchSetPasswordFlow()); - vm.UpdateTempPasswordAction = () => DismissViewController(false, () => LaunchUpdateTempPasswordFlow()); + vm.StartTwoFactorAction = () => DismissAndLaunch(() => LaunchTwoFactorFlow(true)); + vm.StartSetPasswordAction = () => DismissAndLaunch(() => LaunchSetPasswordFlow()); + vm.UpdateTempPasswordAction = () => DismissAndLaunch(() => LaunchUpdateTempPasswordFlow()); vm.SsoAuthSuccessAction = () => DismissLockAndContinue(); - vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.CloseAction = () => DismissAndLaunch(() => LaunchHomePage()); } - - var navigationPage = new NavigationPage(loginPage); - var loginController = navigationPage.CreateViewController(); - loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(loginController, true, null); + NavigateToPage(loginPage); LogoutIfAuthed(); } @@ -359,65 +368,97 @@ namespace Bit.iOS.ShareExtension private void LaunchTwoFactorFlow(bool authingWithSso) { var twoFactorPage = new TwoFactorPage(); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(twoFactorPage); + SetupAppAndApplyResources(twoFactorPage); if (twoFactorPage.BindingContext is TwoFactorPageViewModel vm) { vm.TwoFactorAuthSuccessAction = () => DismissLockAndContinue(); - vm.StartSetPasswordAction = () => DismissViewController(false, () => LaunchSetPasswordFlow()); + vm.StartSetPasswordAction = () => DismissAndLaunch(() => LaunchSetPasswordFlow()); if (authingWithSso) { - vm.CloseAction = () => DismissViewController(false, () => LaunchLoginSsoFlow()); + vm.CloseAction = () => DismissAndLaunch(() => LaunchLoginSsoFlow()); } else { - vm.CloseAction = () => DismissViewController(false, () => LaunchLoginFlow()); + vm.CloseAction = () => DismissAndLaunch(() => LaunchLoginFlow()); } - vm.UpdateTempPasswordAction = () => DismissViewController(false, () => LaunchUpdateTempPasswordFlow()); + vm.UpdateTempPasswordAction = () => DismissAndLaunch(() => LaunchUpdateTempPasswordFlow()); } - - var navigationPage = new NavigationPage(twoFactorPage); - var twoFactorController = navigationPage.CreateViewController(); - twoFactorController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(twoFactorController, true, null); + NavigateToPage(twoFactorPage); } private void LaunchSetPasswordFlow() { var setPasswordPage = new SetPasswordPage(); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(setPasswordPage); + SetupAppAndApplyResources(setPasswordPage); if (setPasswordPage.BindingContext is SetPasswordPageViewModel vm) { - vm.UpdateTempPasswordAction = () => DismissViewController(false, () => LaunchUpdateTempPasswordFlow()); + vm.UpdateTempPasswordAction = () => DismissAndLaunch(() => LaunchUpdateTempPasswordFlow()); vm.SetPasswordSuccessAction = () => DismissLockAndContinue(); - vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.CloseAction = () => DismissAndLaunch(() => LaunchHomePage()); } - - var navigationPage = new NavigationPage(setPasswordPage); - var setPasswordController = navigationPage.CreateViewController(); - setPasswordController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(setPasswordController, true, null); + NavigateToPage(setPasswordPage); } private void LaunchUpdateTempPasswordFlow() { var updateTempPasswordPage = new UpdateTempPasswordPage(); - var app = new App.App(new AppOptions { IosExtension = true }); - ThemeManager.SetTheme(app.Resources); - ThemeManager.ApplyResourcesToPage(updateTempPasswordPage); + SetupAppAndApplyResources(updateTempPasswordPage); if (updateTempPasswordPage.BindingContext is UpdateTempPasswordPageViewModel vm) { - vm.UpdateTempPasswordSuccessAction = () => DismissViewController(false, () => LaunchHomePage()); - vm.LogOutAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.UpdateTempPasswordSuccessAction = () => DismissAndLaunch(() => LaunchHomePage()); + vm.LogOutAction = () => DismissAndLaunch(() => LaunchHomePage()); + } + NavigateToPage(updateTempPasswordPage); + } + + public void Navigate(NavigationTarget navTarget, INavigationParams navParams = null) + { + if (ExtNavigationController?.ViewControllers?.Any() ?? false) + { + ExtNavigationController.PopViewController(false); + } + else if (ExtNavigationController?.ModalViewController != null) + { + ExtNavigationController.DismissModalViewController(false); } - var navigationPage = new NavigationPage(updateTempPasswordPage); - var updateTempPasswordController = navigationPage.CreateViewController(); - updateTempPasswordController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; - PresentViewController(updateTempPasswordController, true, null); + switch (navTarget) + { + case NavigationTarget.HomeLogin: + ExecuteLaunch(LaunchHomePage); + break; + case NavigationTarget.Login: + if (navParams is LoginNavigationParams loginParams) + { + ExecuteLaunch(() => LaunchLoginFlow(loginParams.Email)); + } + else + { + ExecuteLaunch(() => LaunchLoginFlow()); + } + break; + case NavigationTarget.Lock: + NavigateToLockViewController(); + break; + case NavigationTarget.Home: + DismissLockAndContinue(); + break; + } } + + private void ExecuteLaunch(Action launchAction) + { + if (_presentingOnNavigationPage) + { + DismissAndLaunch(launchAction); + } + else + { + launchAction(); + } + } + + public Task SetPreviousPageInfoAsync() => Task.CompletedTask; + public Task UpdateThemeAsync() => Task.CompletedTask; } } diff --git a/src/iOS.ShareExtension/LockPasswordViewController.cs b/src/iOS.ShareExtension/LockPasswordViewController.cs index 7a1b599f7..d8508981c 100644 --- a/src/iOS.ShareExtension/LockPasswordViewController.cs +++ b/src/iOS.ShareExtension/LockPasswordViewController.cs @@ -1,11 +1,22 @@ +using Bit.App.Controls; +using Bit.Core.Utilities; using Bit.iOS.Core.Utilities; using System; using UIKit; namespace Bit.iOS.ShareExtension { - public partial class LockPasswordViewController : Core.Controllers.LockPasswordViewController + public partial class LockPasswordViewController : Core.Controllers.BaseLockPasswordViewController { + AccountSwitchingOverlayView _accountSwitchingOverlayView; + AccountSwitchingOverlayHelper _accountSwitchingOverlayHelper; + + public LockPasswordViewController() + { + BiometricIntegrityKey = Bit.Core.Constants.iOSShareExtensionBiometricIntegrityKey; + DismissModalAction = Cancel; + } + public LockPasswordViewController(IntPtr handle) : base(handle) { @@ -17,24 +28,80 @@ namespace Bit.iOS.ShareExtension public override UINavigationItem BaseNavItem => _navItem; public override UIBarButtonItem BaseCancelButton => _cancelButton; public override UIBarButtonItem BaseSubmitButton => _submitButton; - public override Action Success => () => LoadingController.DismissLockAndContinue(); - public override Action Cancel => () => LoadingController.CompleteRequest(); + public override Action Success => () => + { + LoadingController?.Navigate(Bit.Core.Enums.NavigationTarget.Home); + LoadingController = null; + }; + public override Action Cancel => () => + { + LoadingController?.CompleteRequest(); + LoadingController = null; + }; - public override void ViewDidLoad() + public override UITableView TableView => _mainTableView; + + public override async void ViewDidLoad() { base.ViewDidLoad(); + _cancelButton.TintColor = ThemeHelpers.NavBarTextColor; _submitButton.TintColor = ThemeHelpers.NavBarTextColor; + + _accountSwitchingOverlayHelper = new AccountSwitchingOverlayHelper(); + _accountSwitchingButton.Image = await _accountSwitchingOverlayHelper.CreateAvatarImageAsync(); + + _accountSwitchingOverlayView = _accountSwitchingOverlayHelper.CreateAccountSwitchingOverlayView(_overlayView); + } + + protected override void UpdateNavigationBarTheme() + { + UpdateNavigationBarTheme(_navBar); + } + + partial void AccountSwitchingButton_Activated(UIBarButtonItem sender) + { + _accountSwitchingOverlayHelper.OnToolbarItemActivated(_accountSwitchingOverlayView, _overlayView); } partial void SubmitButton_Activated(UIBarButtonItem sender) { - var task = CheckPasswordAsync(); + CheckPasswordAsync().FireAndForget(); } partial void CancelButton_Activated(UIBarButtonItem sender) { Cancel(); } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (TableView != null) + { + TableView.Source?.Dispose(); + } + if (_accountSwitchingButton?.Image != null) + { + var img = _accountSwitchingButton.Image; + _accountSwitchingButton.Image = null; + img.Dispose(); + } + if (_accountSwitchingOverlayView != null && _overlayView?.Subviews != null) + { + foreach (var subView in _overlayView.Subviews) + { + subView.RemoveFromSuperview(); + subView.Dispose(); + } + _accountSwitchingOverlayView = null; + _overlayView.RemoveFromSuperview(); + } + _accountSwitchingOverlayHelper = null; + } + + base.Dispose(disposing); + } } } diff --git a/src/iOS.ShareExtension/LockPasswordViewController.designer.cs b/src/iOS.ShareExtension/LockPasswordViewController.designer.cs index b92a198b0..6be61f9dc 100644 --- a/src/iOS.ShareExtension/LockPasswordViewController.designer.cs +++ b/src/iOS.ShareExtension/LockPasswordViewController.designer.cs @@ -12,18 +12,30 @@ namespace Bit.iOS.ShareExtension [Register ("LockPasswordViewController")] partial class LockPasswordViewController { + [Outlet] + UIKit.UIBarButtonItem _accountSwitchingButton { get; set; } + [Outlet] UIKit.UIBarButtonItem _cancelButton { get; set; } [Outlet] UIKit.UITableView _mainTableView { get; set; } + [Outlet] + UIKit.UINavigationBar _navBar { get; set; } + [Outlet] UIKit.UINavigationItem _navItem { get; set; } + [Outlet] + UIKit.UIView _overlayView { get; set; } + [Outlet] UIKit.UIBarButtonItem _submitButton { get; set; } + [Action ("AccountSwitchingButton_Activated:")] + partial void AccountSwitchingButton_Activated (UIKit.UIBarButtonItem sender); + [Action ("CancelButton_Activated:")] partial void CancelButton_Activated (UIKit.UIBarButtonItem sender); @@ -32,6 +44,11 @@ namespace Bit.iOS.ShareExtension void ReleaseDesignerOutlets () { + if (_accountSwitchingButton != null) { + _accountSwitchingButton.Dispose (); + _accountSwitchingButton = null; + } + if (_cancelButton != null) { _cancelButton.Dispose (); _cancelButton = null; @@ -47,10 +64,20 @@ namespace Bit.iOS.ShareExtension _navItem = null; } + if (_overlayView != null) { + _overlayView.Dispose (); + _overlayView = null; + } + if (_submitButton != null) { _submitButton.Dispose (); _submitButton = null; } + + if (_navBar != null) { + _navBar.Dispose (); + _navBar = null; + } } } } diff --git a/src/iOS.ShareExtension/MainInterface.storyboard b/src/iOS.ShareExtension/MainInterface.storyboard index 98a8e1346..1bde113e1 100644 --- a/src/iOS.ShareExtension/MainInterface.storyboard +++ b/src/iOS.ShareExtension/MainInterface.storyboard @@ -1,9 +1,11 @@ - + - + + + @@ -11,10 +13,6 @@ - - - - @@ -23,25 +21,25 @@ + - + - - + - + - - + + - - - - - - - - - - - - - - - - - - - + + + - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + - - + + - + + + + + diff --git a/src/iOS.ShareExtension/iOS.ShareExtension.csproj b/src/iOS.ShareExtension/iOS.ShareExtension.csproj index 7d8bebc6d..5109c8886 100644 --- a/src/iOS.ShareExtension/iOS.ShareExtension.csproj +++ b/src/iOS.ShareExtension/iOS.ShareExtension.csproj @@ -26,7 +26,6 @@ None x86_64 NSUrlSessionHandler - false Entitlements.plist BitwardeniOSShareExtension @@ -193,6 +192,10 @@ LockPasswordViewController.cs + + + ExtensionNavigationController.cs + From f2ba86a62b848a2dde36e3733b783e9a58a4b1fd Mon Sep 17 00:00:00 2001 From: vincentvidal Date: Thu, 14 Jul 2022 22:24:02 +0200 Subject: [PATCH 07/16] =?UTF-8?q?Add=20support=20for=20iod=C3=A9=20Browser?= =?UTF-8?q?=20(#1886)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Android/Accessibility/AccessibilityHelpers.cs | 1 + src/Android/Autofill/AutofillHelpers.cs | 1 + src/Android/Resources/xml/autofillservice.xml | 3 +++ 3 files changed, 5 insertions(+) diff --git a/src/Android/Accessibility/AccessibilityHelpers.cs b/src/Android/Accessibility/AccessibilityHelpers.cs index 82bb3b4a5..464c7abad 100644 --- a/src/Android/Accessibility/AccessibilityHelpers.cs +++ b/src/Android/Accessibility/AccessibilityHelpers.cs @@ -54,6 +54,7 @@ namespace Bit.Droid.Accessibility new Browser("com.google.android.apps.chrome", "url_bar"), new Browser("com.google.android.apps.chrome_dev", "url_bar"), // Rem. for "com.google.android.captiveportallogin": URL displayed in ActionBar subtitle without viewId. + new Browser("com.iode.firefox", "mozac_browser_toolbar_url_view"), new Browser("com.jamal2367.styx", "search"), new Browser("com.kiwibrowser.browser", "url_bar"), new Browser("com.kiwibrowser.browser.dev", "url_bar"), diff --git a/src/Android/Autofill/AutofillHelpers.cs b/src/Android/Autofill/AutofillHelpers.cs index 4549e56b8..d9438ac64 100644 --- a/src/Android/Autofill/AutofillHelpers.cs +++ b/src/Android/Autofill/AutofillHelpers.cs @@ -73,6 +73,7 @@ namespace Bit.Droid.Autofill "com.google.android.apps.chrome", "com.google.android.apps.chrome_dev", "com.google.android.captiveportallogin", + "com.iode.firefox", "com.jamal2367.styx", "com.kiwibrowser.browser", "com.kiwibrowser.browser.dev", diff --git a/src/Android/Resources/xml/autofillservice.xml b/src/Android/Resources/xml/autofillservice.xml index c65812815..0cec265ba 100644 --- a/src/Android/Resources/xml/autofillservice.xml +++ b/src/Android/Resources/xml/autofillservice.xml @@ -77,6 +77,9 @@ + From 70cf7431f79a4178c1db94810817a7dddc28f157 Mon Sep 17 00:00:00 2001 From: Donkeykong307 Date: Thu, 14 Jul 2022 21:27:53 +0100 Subject: [PATCH 08/16] Opera GX Autofill Support (#1855) Added Opera GX Support for autofill --- src/Android/Accessibility/AccessibilityHelpers.cs | 1 + src/Android/Autofill/AutofillHelpers.cs | 1 + src/Android/Resources/xml/autofillservice.xml | 3 +++ 3 files changed, 5 insertions(+) diff --git a/src/Android/Accessibility/AccessibilityHelpers.cs b/src/Android/Accessibility/AccessibilityHelpers.cs index 464c7abad..81d7fa65f 100644 --- a/src/Android/Accessibility/AccessibilityHelpers.cs +++ b/src/Android/Accessibility/AccessibilityHelpers.cs @@ -68,6 +68,7 @@ namespace Bit.Droid.Accessibility new Browser("com.naver.whale", "url_bar"), new Browser("com.opera.browser", "url_field"), new Browser("com.opera.browser.beta", "url_field"), + new Browser("com.opera.gx", "addressbarEdit"), new Browser("com.opera.mini.native", "url_field"), new Browser("com.opera.mini.native.beta", "url_field"), new Browser("com.opera.touch", "addressbarEdit"), diff --git a/src/Android/Autofill/AutofillHelpers.cs b/src/Android/Autofill/AutofillHelpers.cs index d9438ac64..8ec3416bd 100644 --- a/src/Android/Autofill/AutofillHelpers.cs +++ b/src/Android/Autofill/AutofillHelpers.cs @@ -87,6 +87,7 @@ namespace Bit.Droid.Autofill "com.naver.whale", "com.opera.browser", "com.opera.browser.beta", + "com.opera.gx", "com.opera.mini.native", "com.opera.mini.native.beta", "com.opera.touch", diff --git a/src/Android/Resources/xml/autofillservice.xml b/src/Android/Resources/xml/autofillservice.xml index 0cec265ba..f47e35f8c 100644 --- a/src/Android/Resources/xml/autofillservice.xml +++ b/src/Android/Resources/xml/autofillservice.xml @@ -119,6 +119,9 @@ + From 8f3a4b98a585ad8f2834f2d932a4ef4754e28a36 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 14 Jul 2022 17:33:30 -0300 Subject: [PATCH 09/16] EC-323 sanitize data on get first letters for avatar image creation (#1990) --- src/App/Controls/AvatarImageSource.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/App/Controls/AvatarImageSource.cs b/src/App/Controls/AvatarImageSource.cs index 4b5902618..38f3df31c 100644 --- a/src/App/Controls/AvatarImageSource.cs +++ b/src/App/Controls/AvatarImageSource.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Text; using System.Threading; using System.Threading.Tasks; using SkiaSharp; @@ -131,21 +132,23 @@ namespace Bit.App.Controls private string GetFirstLetters(string data, int charCount) { - var parts = data.Split(); + var sanitizedData = data.Trim(); + var parts = sanitizedData.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length > 1 && charCount <= 2) { - var text = ""; - for (int i = 0; i < charCount; i++) + var text = string.Empty; + for (var i = 0; i < charCount; i++) { - text += parts[i].Substring(0, 1); + text += parts[i][0]; } return text; } - if (data.Length > 2) + if (sanitizedData.Length > 2) { - return data.Substring(0, 2); + return sanitizedData.Substring(0, 2); } - return data; + return sanitizedData; } private Color StringToColor(string str) From 1f2fb3f796617e542c540aca55f65d5abb34c529 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 14 Jul 2022 18:54:45 -0300 Subject: [PATCH 10/16] [EC-324] Added more logging for information on list crash (#1993) * EC-324 Added more logging for trying to get more information on list out of range crash on AppCenter * EC-324 Fix include on iOS.Core.csproj on iOS CollectionView files --- .../CollectionView/CollectionException.cs | 16 +++++++ .../ExtendedGroupableItemsViewController.cs | 19 +++++++- .../ExtendedGroupableItemsViewDelegator.cs | 43 +++++++++++++++++++ src/iOS.Core/iOS.Core.csproj | 2 + 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/iOS.Core/Renderers/CollectionView/CollectionException.cs create mode 100644 src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewDelegator.cs diff --git a/src/iOS.Core/Renderers/CollectionView/CollectionException.cs b/src/iOS.Core/Renderers/CollectionView/CollectionException.cs new file mode 100644 index 000000000..35204bf95 --- /dev/null +++ b/src/iOS.Core/Renderers/CollectionView/CollectionException.cs @@ -0,0 +1,16 @@ +using System; +namespace Bit.iOS.Core.Renderers.CollectionView +{ + public class CollectionException : Exception + { + public CollectionException(string message) + : base(message) + { + } + + public CollectionException(string message, Exception innerEx) + : base(message, innerEx) + { + } + } +} diff --git a/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewController.cs b/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewController.cs index 94c15e114..519fcbbb6 100644 --- a/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewController.cs +++ b/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewController.cs @@ -1,6 +1,8 @@ using System; using Bit.App.Controls; +using Bit.Core.Services; using Foundation; +using UIKit; using Xamarin.Forms.Platform.iOS; namespace Bit.iOS.Core.Renderers.CollectionView @@ -13,6 +15,11 @@ namespace Bit.iOS.Core.Renderers.CollectionView { } + protected override UICollectionViewDelegateFlowLayout CreateDelegator() + { + return new ExtendedGroupableItemsViewDelegator>(ItemsViewLayout, this); + } + protected override void UpdateTemplatedCell(TemplatedCell cell, NSIndexPath indexPath) { try @@ -21,7 +28,17 @@ namespace Bit.iOS.Core.Renderers.CollectionView } catch (Exception ex) when (ItemsView?.ExtraDataForLogging != null) { - throw new Exception("Error in ExtendedCollectionView, extra data: " + ItemsView.ExtraDataForLogging, ex); + var colEx = new CollectionException("Error in ExtendedCollectionView -> ExtendedGroupableItemsViewController, extra data: " + ItemsView.ExtraDataForLogging, ex); + try + { + LoggerHelper.LogEvenIfCantBeResolved(colEx); + } + catch + { + // Do nothing in here, this is temporary to get more info about the crash, if the logger fails, we want to get the info + // by crashing with the original exception and not the logger one + } + throw colEx; } } } diff --git a/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewDelegator.cs b/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewDelegator.cs new file mode 100644 index 000000000..d6ccb30fe --- /dev/null +++ b/src/iOS.Core/Renderers/CollectionView/ExtendedGroupableItemsViewDelegator.cs @@ -0,0 +1,43 @@ +using System; +using Bit.App.Controls; +using Bit.Core.Services; +using CoreGraphics; +using Foundation; +using UIKit; +using Xamarin.Forms.Platform.iOS; + +namespace Bit.iOS.Core.Renderers.CollectionView +{ + public class ExtendedGroupableItemsViewDelegator : GroupableItemsViewDelegator + where TItemsView : ExtendedCollectionView + where TViewController : GroupableItemsViewController + { + public ExtendedGroupableItemsViewDelegator(ItemsViewLayout itemsViewLayout, TViewController itemsViewController) + : base(itemsViewLayout, itemsViewController) + { + } + + public override CGSize GetSizeForItem(UICollectionView collectionView, UICollectionViewLayout layout, NSIndexPath indexPath) + { + // Added this to get extra information on a crash when getting the size for an item. + try + { + return base.GetSizeForItem(collectionView, layout, indexPath); + } + catch (Exception ex) when (ViewController?.ItemsView?.ExtraDataForLogging != null) + { + var colEx = new CollectionException("Error in ExtendedCollectionView -> ExtendedGroupableItemsViewDelegator, extra data: " + ViewController.ItemsView.ExtraDataForLogging, ex); + try + { + LoggerHelper.LogEvenIfCantBeResolved(colEx); + } + catch + { + // Do nothing in here, this is temporary to get more info about the crash, if the logger fails, we want to get the info + // by crashing with the original exception and not the logger one + } + throw colEx; + } + } + } +} diff --git a/src/iOS.Core/iOS.Core.csproj b/src/iOS.Core/iOS.Core.csproj index 4344ddb6d..9cb52e91a 100644 --- a/src/iOS.Core/iOS.Core.csproj +++ b/src/iOS.Core/iOS.Core.csproj @@ -201,6 +201,8 @@ + + From 2d2a883b963adb7506bdf5c1c548ad5ff46b2279 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 14 Jul 2022 19:04:13 -0300 Subject: [PATCH 11/16] EC-306 Fix crash happening on vietnamise when trying to go to Password Autofill on iOS given that the string was the same as Autofill Services and the comparison was misleading. Also refactored so that the action is on each item instead of having to compare to act (#1989) --- .../SettingsPage/SettingsPage.xaml.cs | 122 +--------------- .../SettingsPage/SettingsPageListItem.cs | 3 + .../SettingsPage/SettingsPageViewModel.cs | 136 ++++++++++++++---- 3 files changed, 118 insertions(+), 143 deletions(-) diff --git a/src/App/Pages/Settings/SettingsPage/SettingsPage.xaml.cs b/src/App/Pages/Settings/SettingsPage/SettingsPage.xaml.cs index ac0cfdf04..47a8a22c4 100644 --- a/src/App/Pages/Settings/SettingsPage/SettingsPage.xaml.cs +++ b/src/App/Pages/Settings/SettingsPage/SettingsPage.xaml.cs @@ -2,18 +2,13 @@ using System.ComponentModel; using System.Linq; using System.Threading.Tasks; -using Bit.App.Abstractions; using Bit.App.Controls; -using Bit.App.Pages.Accounts; -using Bit.App.Resources; -using Bit.Core.Utilities; using Xamarin.Forms; namespace Bit.App.Pages { public partial class SettingsPage : BaseContentPage { - private readonly IDeviceActionService _deviceActionService; private readonly TabsPage _tabsPage; private SettingsPageViewModel _vm; @@ -21,7 +16,6 @@ namespace Bit.App.Pages { _tabsPage = tabsPage; InitializeComponent(); - _deviceActionService = ServiceContainer.Resolve("deviceActionService"); _vm = BindingContext as SettingsPageViewModel; _vm.Page = this; } @@ -67,122 +61,12 @@ namespace Bit.App.Pages } } - private async void RowSelected(object sender, SelectionChangedEventArgs e) + private void RowSelected(object sender, SelectionChangedEventArgs e) { ((ExtendedCollectionView)sender).SelectedItem = null; - if (!DoOnce()) + if (e.CurrentSelection?.FirstOrDefault() is SettingsPageListItem item) { - return; - } - if (!(e.CurrentSelection?.FirstOrDefault() is SettingsPageListItem item)) - { - return; - } - - if (item.Name == AppResources.Sync) - { - await Navigation.PushModalAsync(new NavigationPage(new SyncPage())); - } - else if (item.Name == AppResources.AutofillServices) - { - await Navigation.PushModalAsync(new NavigationPage(new AutofillServicesPage(this))); - } - else if (item.Name == AppResources.PasswordAutofill) - { - await Navigation.PushModalAsync(new NavigationPage(new AutofillPage())); - } - else if (item.Name == AppResources.AppExtension) - { - await Navigation.PushModalAsync(new NavigationPage(new ExtensionPage())); - } - else if (item.Name == AppResources.Options) - { - await Navigation.PushModalAsync(new NavigationPage(new OptionsPage())); - } - else if (item.Name == AppResources.Folders) - { - await Navigation.PushModalAsync(new NavigationPage(new FoldersPage())); - } - else if (item.Name == AppResources.About) - { - await _vm.AboutAsync(); - } - else if (item.Name == AppResources.HelpAndFeedback) - { - _vm.Help(); - } - else if (item.Name == AppResources.FingerprintPhrase) - { - await _vm.FingerprintAsync(); - } - else if (item.Name == AppResources.RateTheApp) - { - _vm.Rate(); - } - else if (item.Name == AppResources.ImportItems) - { - _vm.Import(); - } - else if (item.Name == AppResources.ExportVault) - { - await Navigation.PushModalAsync(new NavigationPage(new ExportVaultPage())); - } - else if (item.Name == AppResources.LearnOrg) - { - await _vm.ShareAsync(); - } - else if (item.Name == AppResources.WebVault) - { - _vm.WebVault(); - } - else if (item.Name == AppResources.ChangeMasterPassword) - { - await _vm.ChangePasswordAsync(); - } - else if (item.Name == AppResources.TwoStepLogin) - { - await _vm.TwoStepAsync(); - } - else if (item.Name == AppResources.LogOut) - { - await _vm.LogOutAsync(); - } - else if (item.Name == AppResources.DeleteAccount) - { - await Navigation.PushModalAsync(new NavigationPage(new DeleteAccountPage())); - } - else if (item.Name == AppResources.LockNow) - { - await _vm.LockAsync(); - } - else if (item.Name == AppResources.VaultTimeout) - { - await _vm.VaultTimeoutAsync(); - } - else if (item.Name == AppResources.VaultTimeoutAction) - { - await _vm.VaultTimeoutActionAsync(); - } - else if (item.Name == AppResources.UnlockWithPIN) - { - await _vm.UpdatePinAsync(); - } - else if (item.Name == AppResources.SubmitCrashLogs) - { - await _vm.LoggerReportingAsync(); - } - else - { - var biometricName = AppResources.Biometrics; - if (Device.RuntimePlatform == Device.iOS) - { - var supportsFace = await _deviceActionService.SupportsFaceBiometricAsync(); - biometricName = supportsFace ? AppResources.FaceID : AppResources.TouchID; - } - if (item.Name == string.Format(AppResources.UnlockWith, biometricName)) - { - await _vm.UpdateBiometricAsync(); - } + _vm?.ExecuteSettingItemCommand.Execute(item); } } } diff --git a/src/App/Pages/Settings/SettingsPage/SettingsPageListItem.cs b/src/App/Pages/Settings/SettingsPage/SettingsPageListItem.cs index c1e8878f4..a4d3e926d 100644 --- a/src/App/Pages/Settings/SettingsPage/SettingsPageListItem.cs +++ b/src/App/Pages/Settings/SettingsPage/SettingsPageListItem.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Bit.App.Resources; using Bit.App.Utilities; using Xamarin.Forms; @@ -12,6 +13,8 @@ namespace Bit.App.Pages public string SubLabel { get; set; } public TimeSpan? Time { get; set; } public bool UseFrame { get; set; } + public Func ExecuteAsync { get; set; } + public bool SubLabelTextEnabled => SubLabel == AppResources.Enabled; public string LineBreakMode => SubLabel == null ? "TailTruncation" : ""; public bool ShowSubLabel => SubLabel.Length != 0; diff --git a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs index 831be4979..59d76f762 100644 --- a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs +++ b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Bit.App.Abstractions; +using Bit.App.Pages.Accounts; using Bit.App.Resources; using Bit.Core.Abstractions; using Bit.Core.Enums; @@ -84,10 +85,14 @@ namespace Bit.App.Pages GroupedItems = new ObservableRangeCollection(); PageTitle = AppResources.Settings; + + ExecuteSettingItemCommand = new AsyncCommand(item => item.ExecuteAsync(), onException: _loggerService.Exception, allowsMultipleExecutions: false); } public ObservableRangeCollection GroupedItems { get; set; } + public IAsyncCommand ExecuteSettingItemCommand { get; } + public async Task InitAsync() { _supportsBiometric = await _platformUtilsService.SupportsBiometricAsync(); @@ -434,6 +439,8 @@ namespace Bit.App.Pages public void BuildList() { + //TODO: Refactor this once navigation is abstracted so that it doesn't depend on Page, e.g. Page.Navigation.PushModalAsync... + var doUpper = Device.RuntimePlatform != Device.Android; var autofillItems = new List(); if (Device.RuntimePlatform == Device.Android) @@ -441,38 +448,69 @@ namespace Bit.App.Pages autofillItems.Add(new SettingsPageListItem { Name = AppResources.AutofillServices, - SubLabel = _deviceActionService.AutofillServicesEnabled() ? - AppResources.Enabled : AppResources.Disabled + SubLabel = _deviceActionService.AutofillServicesEnabled() ? AppResources.Enabled : AppResources.Disabled, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new AutofillServicesPage(Page as SettingsPage))) }); } else { if (_deviceActionService.SystemMajorVersion() >= 12) { - autofillItems.Add(new SettingsPageListItem { Name = AppResources.PasswordAutofill }); + autofillItems.Add(new SettingsPageListItem + { + Name = AppResources.PasswordAutofill, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new AutofillPage())) + }); } - autofillItems.Add(new SettingsPageListItem { Name = AppResources.AppExtension }); + autofillItems.Add(new SettingsPageListItem + { + Name = AppResources.AppExtension, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new ExtensionPage())) + }); } var manageItems = new List { - new SettingsPageListItem { Name = AppResources.Folders }, - new SettingsPageListItem { Name = AppResources.Sync, SubLabel = _lastSyncDate } + new SettingsPageListItem + { + Name = AppResources.Folders, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new FoldersPage())) + }, + new SettingsPageListItem + { + Name = AppResources.Sync, + SubLabel = _lastSyncDate, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new SyncPage())) + } }; var securityItems = new List { - new SettingsPageListItem { Name = AppResources.VaultTimeout, SubLabel = _vaultTimeoutDisplayValue }, + new SettingsPageListItem + { + Name = AppResources.VaultTimeout, + SubLabel = _vaultTimeoutDisplayValue, + ExecuteAsync = () => VaultTimeoutAsync() }, new SettingsPageListItem { Name = AppResources.VaultTimeoutAction, - SubLabel = _vaultTimeoutActionDisplayValue + SubLabel = _vaultTimeoutActionDisplayValue, + ExecuteAsync = () => VaultTimeoutActionAsync() }, new SettingsPageListItem { Name = AppResources.UnlockWithPIN, - SubLabel = _pin ? AppResources.Enabled : AppResources.Disabled + SubLabel = _pin ? AppResources.Enabled : AppResources.Disabled, + ExecuteAsync = () => UpdatePinAsync() }, - new SettingsPageListItem { Name = AppResources.LockNow }, - new SettingsPageListItem { Name = AppResources.TwoStepLogin } + new SettingsPageListItem + { + Name = AppResources.LockNow, + ExecuteAsync = () => LockAsync() + }, + new SettingsPageListItem + { + Name = AppResources.TwoStepLogin, + ExecuteAsync = () => TwoStepAsync() + } }; if (_supportsBiometric || _biometric) { @@ -485,7 +523,8 @@ namespace Bit.App.Pages var item = new SettingsPageListItem { Name = string.Format(AppResources.UnlockWith, biometricName), - SubLabel = _biometric ? AppResources.Enabled : AppResources.Disabled + SubLabel = _biometric ? AppResources.Enabled : AppResources.Disabled, + ExecuteAsync = () => UpdateBiometricAsync() }; securityItems.Insert(2, item); } @@ -510,38 +549,87 @@ namespace Bit.App.Pages } var accountItems = new List { - new SettingsPageListItem { Name = AppResources.FingerprintPhrase }, - new SettingsPageListItem { Name = AppResources.LogOut } + new SettingsPageListItem + { + Name = AppResources.FingerprintPhrase, + ExecuteAsync = () => FingerprintAsync() + }, + new SettingsPageListItem + { + Name = AppResources.LogOut, + ExecuteAsync = () => LogOutAsync() + } }; if (_showChangeMasterPassword) { - accountItems.Insert(0, new SettingsPageListItem { Name = AppResources.ChangeMasterPassword }); + accountItems.Insert(0, new SettingsPageListItem + { + Name = AppResources.ChangeMasterPassword, + ExecuteAsync = () => ChangePasswordAsync() + }); } var toolsItems = new List { - new SettingsPageListItem { Name = AppResources.ImportItems }, - new SettingsPageListItem { Name = AppResources.ExportVault } + new SettingsPageListItem + { + Name = AppResources.ImportItems, + ExecuteAsync = () => Device.InvokeOnMainThreadAsync(() => Import()) + }, + new SettingsPageListItem + { + Name = AppResources.ExportVault, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new ExportVaultPage())) + } }; if (IncludeLinksWithSubscriptionInfo()) { - toolsItems.Add(new SettingsPageListItem { Name = AppResources.LearnOrg }); - toolsItems.Add(new SettingsPageListItem { Name = AppResources.WebVault }); + toolsItems.Add(new SettingsPageListItem + { + Name = AppResources.LearnOrg, + ExecuteAsync = () => ShareAsync() + }); + toolsItems.Add(new SettingsPageListItem + { + Name = AppResources.WebVault, + ExecuteAsync = () => Device.InvokeOnMainThreadAsync(() => WebVault()) + }); } var otherItems = new List { - new SettingsPageListItem { Name = AppResources.Options }, - new SettingsPageListItem { Name = AppResources.About }, - new SettingsPageListItem { Name = AppResources.HelpAndFeedback }, + new SettingsPageListItem + { + Name = AppResources.Options, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new OptionsPage())) + }, + new SettingsPageListItem + { + Name = AppResources.About, + ExecuteAsync = () => AboutAsync() + }, + new SettingsPageListItem + { + Name = AppResources.HelpAndFeedback, + ExecuteAsync = () => Device.InvokeOnMainThreadAsync(() => Help()) + }, #if !FDROID new SettingsPageListItem { Name = AppResources.SubmitCrashLogs, SubLabel = _reportLoggingEnabled ? AppResources.Enabled : AppResources.Disabled, + ExecuteAsync = () => LoggerReportingAsync() }, #endif - new SettingsPageListItem { Name = AppResources.RateTheApp }, - new SettingsPageListItem { Name = AppResources.DeleteAccount } + new SettingsPageListItem + { + Name = AppResources.RateTheApp, + ExecuteAsync = () => Device.InvokeOnMainThreadAsync(() => Rate()) + }, + new SettingsPageListItem + { + Name = AppResources.DeleteAccount, + ExecuteAsync = () => Page.Navigation.PushModalAsync(new NavigationPage(new DeleteAccountPage())) + } }; // TODO: improve this. Leaving this as is to reduce error possibility on the hotfix. From d2fbf5bdeab5fcbad032dc9c813921f8337f48d7 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Thu, 14 Jul 2022 19:17:04 -0300 Subject: [PATCH 12/16] EC-312 Fix crash on entering invalid credentials five times on Autofill (#1988) --- src/App/Abstractions/IAccountsManager.cs | 1 + src/App/App.xaml.cs | 2 +- .../AccountManagement/AccountsManager.cs | 12 +- src/Core/Services/AuthService.cs | 3 +- .../CredentialProviderViewController.cs | 347 +++++++++++------- .../BaseLockPasswordViewController.cs | 41 +-- 6 files changed, 236 insertions(+), 170 deletions(-) diff --git a/src/App/Abstractions/IAccountsManager.cs b/src/App/Abstractions/IAccountsManager.cs index 684230d01..37acbc1db 100644 --- a/src/App/Abstractions/IAccountsManager.cs +++ b/src/App/Abstractions/IAccountsManager.cs @@ -8,5 +8,6 @@ namespace Bit.App.Abstractions { void Init(Func getOptionsFunc, IAccountsManagerHost accountsManagerHost); Task NavigateOnAccountChangeAsync(bool? isAuthed = null); + Task LogOutAsync(string userId, bool userInitiated, bool expired); } } diff --git a/src/App/App.xaml.cs b/src/App/App.xaml.cs index 3415fd7e9..8d2b74538 100644 --- a/src/App/App.xaml.cs +++ b/src/App/App.xaml.cs @@ -301,7 +301,7 @@ namespace Bit.App UpdateThemeAsync(); }; Current.MainPage = new NavigationPage(new HomePage(Options)); - var mainPageTask = _accountsManager.NavigateOnAccountChangeAsync(); + _accountsManager.NavigateOnAccountChangeAsync().FireAndForget(); ServiceContainer.Resolve("platformUtilsService").Init(); } diff --git a/src/App/Utilities/AccountManagement/AccountsManager.cs b/src/App/Utilities/AccountManagement/AccountsManager.cs index dd5b639f1..88701f2b7 100644 --- a/src/App/Utilities/AccountManagement/AccountsManager.cs +++ b/src/App/Utilities/AccountManagement/AccountsManager.cs @@ -123,7 +123,11 @@ namespace Bit.App.Utilities.AccountManagement await _vaultTimeoutService.LockAsync(true); break; case AccountsManagerMessageCommands.LOGOUT: - await Device.InvokeOnMainThreadAsync(() => LogOutAsync(message.Data as Tuple)); + var extras = message.Data as Tuple; + var userId = extras?.Item1; + var userInitiated = extras?.Item2 ?? true; + var expired = extras?.Item3 ?? false; + await Device.InvokeOnMainThreadAsync(() => LogOutAsync(userId, userInitiated, expired)); break; case AccountsManagerMessageCommands.LOGGED_OUT: // Clean up old migrated key if they ever log out. @@ -181,12 +185,8 @@ namespace Bit.App.Utilities.AccountManagement }); } - private async Task LogOutAsync(Tuple extras) + public async Task LogOutAsync(string userId, bool userInitiated, bool expired) { - var userId = extras?.Item1; - var userInitiated = extras?.Item2 ?? true; - var expired = extras?.Item3 ?? false; - await AppHelpers.LogOutAsync(userId, userInitiated); await NavigateOnAccountChangeAsync(); _authService.LogOut(() => diff --git a/src/Core/Services/AuthService.cs b/src/Core/Services/AuthService.cs index c1fb38fa8..7316a758e 100644 --- a/src/Core/Services/AuthService.cs +++ b/src/Core/Services/AuthService.cs @@ -6,6 +6,7 @@ using Bit.Core.Enums; using Bit.Core.Exceptions; using Bit.Core.Models.Domain; using Bit.Core.Models.Request; +using Bit.Core.Utilities; namespace Bit.Core.Services { @@ -173,7 +174,7 @@ namespace Bit.Core.Services public void LogOut(Action callback) { callback.Invoke(); - _messagingService.Send("loggedOut"); + _messagingService.Send(AccountsManagerMessageCommands.LOGGED_OUT); } public List GetSupportedTwoFactorProviders() diff --git a/src/iOS.Autofill/CredentialProviderViewController.cs b/src/iOS.Autofill/CredentialProviderViewController.cs index 298a6e1cb..9bd087f17 100644 --- a/src/iOS.Autofill/CredentialProviderViewController.cs +++ b/src/iOS.Autofill/CredentialProviderViewController.cs @@ -8,10 +8,12 @@ using Bit.App.Utilities; using Bit.App.Utilities.AccountManagement; using Bit.Core.Abstractions; using Bit.Core.Enums; +using Bit.Core.Services; using Bit.Core.Utilities; using Bit.iOS.Autofill.Models; using Bit.iOS.Core.Utilities; using Bit.iOS.Core.Views; +using CoreFoundation; using CoreNFC; using Foundation; using UIKit; @@ -36,88 +38,128 @@ namespace Bit.iOS.Autofill public override void ViewDidLoad() { - InitApp(); - base.ViewDidLoad(); - Logo.Image = new UIImage(ThemeHelpers.LightTheme ? "logo.png" : "logo_white.png"); - View.BackgroundColor = ThemeHelpers.SplashBackgroundColor; - _context = new Context + try { - ExtContext = ExtensionContext - }; + InitApp(); + base.ViewDidLoad(); + Logo.Image = new UIImage(ThemeHelpers.LightTheme ? "logo.png" : "logo_white.png"); + View.BackgroundColor = ThemeHelpers.SplashBackgroundColor; + _context = new Context + { + ExtContext = ExtensionContext + }; + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; + } } public override async void PrepareCredentialList(ASCredentialServiceIdentifier[] serviceIdentifiers) { - InitAppIfNeeded(); - _context.ServiceIdentifiers = serviceIdentifiers; - if (serviceIdentifiers.Length > 0) + try { - var uri = serviceIdentifiers[0].Identifier; - if (serviceIdentifiers[0].Type == ASCredentialServiceIdentifierType.Domain) + InitAppIfNeeded(); + _context.ServiceIdentifiers = serviceIdentifiers; + if (serviceIdentifiers.Length > 0) { - uri = string.Concat("https://", uri); + var uri = serviceIdentifiers[0].Identifier; + if (serviceIdentifiers[0].Type == ASCredentialServiceIdentifierType.Domain) + { + uri = string.Concat("https://", uri); + } + _context.UrlString = uri; } - _context.UrlString = uri; - } - if (!await IsAuthed()) - { - await _accountsManager.NavigateOnAccountChangeAsync(false); - } - else if (await IsLocked()) - { - PerformSegue("lockPasswordSegue", this); - } - else - { - if (_context.ServiceIdentifiers == null || _context.ServiceIdentifiers.Length == 0) + if (!await IsAuthed()) { - PerformSegue("loginSearchSegue", this); + await _accountsManager.NavigateOnAccountChangeAsync(false); + } + else if (await IsLocked()) + { + PerformSegue("lockPasswordSegue", this); } else { - PerformSegue("loginListSegue", this); + if (_context.ServiceIdentifiers == null || _context.ServiceIdentifiers.Length == 0) + { + PerformSegue("loginSearchSegue", this); + } + else + { + PerformSegue("loginListSegue", this); + } } } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; + } } public override async void ProvideCredentialWithoutUserInteraction(ASPasswordCredentialIdentity credentialIdentity) { - InitAppIfNeeded(); - await _stateService.Value.SetPasswordRepromptAutofillAsync(false); - await _stateService.Value.SetPasswordVerifiedAutofillAsync(false); - if (!await IsAuthed() || await IsLocked()) + try { - var err = new NSError(new NSString("ASExtensionErrorDomain"), - Convert.ToInt32(ASExtensionErrorCode.UserInteractionRequired), null); - ExtensionContext.CancelRequest(err); - return; + InitAppIfNeeded(); + await _stateService.Value.SetPasswordRepromptAutofillAsync(false); + await _stateService.Value.SetPasswordVerifiedAutofillAsync(false); + if (!await IsAuthed() || await IsLocked()) + { + var err = new NSError(new NSString("ASExtensionErrorDomain"), + Convert.ToInt32(ASExtensionErrorCode.UserInteractionRequired), null); + ExtensionContext.CancelRequest(err); + return; + } + _context.CredentialIdentity = credentialIdentity; + await ProvideCredentialAsync(false); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } - _context.CredentialIdentity = credentialIdentity; - await ProvideCredentialAsync(false); } public override async void PrepareInterfaceToProvideCredential(ASPasswordCredentialIdentity credentialIdentity) { - InitAppIfNeeded(); - if (!await IsAuthed()) + try { - await _accountsManager.NavigateOnAccountChangeAsync(false); - return; + InitAppIfNeeded(); + if (!await IsAuthed()) + { + await _accountsManager.NavigateOnAccountChangeAsync(false); + return; + } + _context.CredentialIdentity = credentialIdentity; + await CheckLockAsync(async () => await ProvideCredentialAsync()); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } - _context.CredentialIdentity = credentialIdentity; - CheckLock(async () => await ProvideCredentialAsync()); } public override async void PrepareInterfaceForExtensionConfiguration() { - InitAppIfNeeded(); - _context.Configuring = true; - if (!await IsAuthed()) + try { - await _accountsManager.NavigateOnAccountChangeAsync(false); - return; + InitAppIfNeeded(); + _context.Configuring = true; + if (!await IsAuthed()) + { + await _accountsManager.NavigateOnAccountChangeAsync(false); + return; + } + await CheckLockAsync(() => PerformSegue("setupSegue", this)); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } - CheckLock(() => PerformSegue("setupSegue", this)); } public void CompleteRequest(string id = null, string username = null, @@ -159,34 +201,43 @@ namespace Bit.iOS.Autofill public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender) { - if (segue.DestinationViewController is UINavigationController navController) + try { - if (navController.TopViewController is LoginListViewController listLoginController) + if (segue.DestinationViewController is UINavigationController navController) { - listLoginController.Context = _context; - listLoginController.CPViewController = this; - segue.DestinationViewController.PresentationController.Delegate = - new CustomPresentationControllerDelegate(listLoginController.DismissModalAction); - } - else if (navController.TopViewController is LoginSearchViewController listSearchController) - { - listSearchController.Context = _context; - listSearchController.CPViewController = this; - segue.DestinationViewController.PresentationController.Delegate = - new CustomPresentationControllerDelegate(listSearchController.DismissModalAction); - } - else if (navController.TopViewController is LockPasswordViewController passwordViewController) - { - passwordViewController.CPViewController = this; - segue.DestinationViewController.PresentationController.Delegate = - new CustomPresentationControllerDelegate(passwordViewController.DismissModalAction); - } - else if (navController.TopViewController is SetupViewController setupViewController) - { - setupViewController.CPViewController = this; - segue.DestinationViewController.PresentationController.Delegate = - new CustomPresentationControllerDelegate(setupViewController.DismissModalAction); + if (navController.TopViewController is LoginListViewController listLoginController) + { + listLoginController.Context = _context; + listLoginController.CPViewController = this; + segue.DestinationViewController.PresentationController.Delegate = + new CustomPresentationControllerDelegate(listLoginController.DismissModalAction); + } + else if (navController.TopViewController is LoginSearchViewController listSearchController) + { + listSearchController.Context = _context; + listSearchController.CPViewController = this; + segue.DestinationViewController.PresentationController.Delegate = + new CustomPresentationControllerDelegate(listSearchController.DismissModalAction); + } + else if (navController.TopViewController is LockPasswordViewController passwordViewController) + { + passwordViewController.CPViewController = this; + segue.DestinationViewController.PresentationController.Delegate = + new CustomPresentationControllerDelegate(passwordViewController.DismissModalAction); + } + else if (navController.TopViewController is SetupViewController setupViewController) + { + setupViewController.CPViewController = this; + segue.DestinationViewController.PresentationController.Delegate = + new CustomPresentationControllerDelegate(setupViewController.DismissModalAction); + } } + + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } } @@ -194,93 +245,109 @@ namespace Bit.iOS.Autofill { DismissViewController(false, async () => { - if (_context.CredentialIdentity != null) + try { - await ProvideCredentialAsync(); - return; + if (_context.CredentialIdentity != null) + { + await ProvideCredentialAsync(); + return; + } + if (_context.Configuring) + { + PerformSegue("setupSegue", this); + return; + } + if (_context.ServiceIdentifiers == null || _context.ServiceIdentifiers.Length == 0) + { + PerformSegue("loginSearchSegue", this); + } + else + { + PerformSegue("loginListSegue", this); + } } - if (_context.Configuring) + catch (Exception ex) { - PerformSegue("setupSegue", this); - return; - } - if (_context.ServiceIdentifiers == null || _context.ServiceIdentifiers.Length == 0) - { - PerformSegue("loginSearchSegue", this); - } - else - { - PerformSegue("loginListSegue", this); + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; } }); } private async Task ProvideCredentialAsync(bool userInteraction = true) { - var cipherService = ServiceContainer.Resolve("cipherService", true); - Bit.Core.Models.Domain.Cipher cipher = null; - var cancel = cipherService == null || _context.CredentialIdentity?.RecordIdentifier == null; - if (!cancel) + try { - cipher = await cipherService.GetAsync(_context.CredentialIdentity.RecordIdentifier); - cancel = cipher == null || cipher.Type != Bit.Core.Enums.CipherType.Login || cipher.Login == null; - } - if (cancel) - { - var err = new NSError(new NSString("ASExtensionErrorDomain"), - Convert.ToInt32(ASExtensionErrorCode.CredentialIdentityNotFound), null); - ExtensionContext?.CancelRequest(err); - return; - } - - var decCipher = await cipher.DecryptAsync(); - if (decCipher.Reprompt != Bit.Core.Enums.CipherRepromptType.None) - { - // Prompt for password using either the lock screen or dialog unless - // already verified the password. - if (!userInteraction) + var cipherService = ServiceContainer.Resolve("cipherService", true); + Bit.Core.Models.Domain.Cipher cipher = null; + var cancel = cipherService == null || _context.CredentialIdentity?.RecordIdentifier == null; + if (!cancel) + { + cipher = await cipherService.GetAsync(_context.CredentialIdentity.RecordIdentifier); + cancel = cipher == null || cipher.Type != Bit.Core.Enums.CipherType.Login || cipher.Login == null; + } + if (cancel) { - await _stateService.Value.SetPasswordRepromptAutofillAsync(true); var err = new NSError(new NSString("ASExtensionErrorDomain"), - Convert.ToInt32(ASExtensionErrorCode.UserInteractionRequired), null); + Convert.ToInt32(ASExtensionErrorCode.CredentialIdentityNotFound), null); ExtensionContext?.CancelRequest(err); return; } - else if (!await _stateService.Value.GetPasswordVerifiedAutofillAsync()) + + var decCipher = await cipher.DecryptAsync(); + if (decCipher.Reprompt != Bit.Core.Enums.CipherRepromptType.None) { - // Add a timeout to resolve keyboard not always showing up. - await Task.Delay(250); - var passwordRepromptService = ServiceContainer.Resolve("passwordRepromptService"); - if (!await passwordRepromptService.ShowPasswordPromptAsync()) + // Prompt for password using either the lock screen or dialog unless + // already verified the password. + if (!userInteraction) { + await _stateService.Value.SetPasswordRepromptAutofillAsync(true); var err = new NSError(new NSString("ASExtensionErrorDomain"), - Convert.ToInt32(ASExtensionErrorCode.UserCanceled), null); + Convert.ToInt32(ASExtensionErrorCode.UserInteractionRequired), null); ExtensionContext?.CancelRequest(err); return; } + else if (!await _stateService.Value.GetPasswordVerifiedAutofillAsync()) + { + // Add a timeout to resolve keyboard not always showing up. + await Task.Delay(250); + var passwordRepromptService = ServiceContainer.Resolve("passwordRepromptService"); + if (!await passwordRepromptService.ShowPasswordPromptAsync()) + { + var err = new NSError(new NSString("ASExtensionErrorDomain"), + Convert.ToInt32(ASExtensionErrorCode.UserCanceled), null); + ExtensionContext?.CancelRequest(err); + return; + } + } } - } - string totpCode = null; - var disableTotpCopy = await _stateService.Value.GetDisableAutoTotpCopyAsync(); - if (!disableTotpCopy.GetValueOrDefault(false)) - { - var canAccessPremiumAsync = await _stateService.Value.CanAccessPremiumAsync(); - if (!string.IsNullOrWhiteSpace(decCipher.Login.Totp) && - (canAccessPremiumAsync || cipher.OrganizationUseTotp)) + string totpCode = null; + var disableTotpCopy = await _stateService.Value.GetDisableAutoTotpCopyAsync(); + if (!disableTotpCopy.GetValueOrDefault(false)) { - var totpService = ServiceContainer.Resolve("totpService"); - totpCode = await totpService.GetCodeAsync(decCipher.Login.Totp); + var canAccessPremiumAsync = await _stateService.Value.CanAccessPremiumAsync(); + if (!string.IsNullOrWhiteSpace(decCipher.Login.Totp) && + (canAccessPremiumAsync || cipher.OrganizationUseTotp)) + { + var totpService = ServiceContainer.Resolve("totpService"); + totpCode = await totpService.GetCodeAsync(decCipher.Login.Totp); + } } - } - CompleteRequest(decCipher.Id, decCipher.Login.Username, decCipher.Login.Password, totpCode); + CompleteRequest(decCipher.Id, decCipher.Login.Username, decCipher.Login.Password, totpCode); + } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + throw; + } } - private async void CheckLock(Action notLockedAction) + private async Task CheckLockAsync(Action notLockedAction) { if (await IsLocked() || await _stateService.Value.GetPasswordRepromptAutofillAsync()) { - PerformSegue("lockPasswordSegue", this); + DispatchQueue.MainQueue.DispatchAsync(() => PerformSegue("lockPasswordSegue", this)); } else { @@ -303,15 +370,21 @@ namespace Bit.iOS.Autofill { NSRunLoop.Main.BeginInvokeOnMainThread(async () => { - if (await IsAuthed()) + try { - await AppHelpers.LogOutAsync(await _stateService.Value.GetActiveUserIdAsync()); - var deviceActionService = ServiceContainer.Resolve("deviceActionService"); - if (deviceActionService.SystemMajorVersion() >= 12) + if (await IsAuthed()) { - await ASCredentialIdentityStore.SharedStore?.RemoveAllCredentialIdentitiesAsync(); + await AppHelpers.LogOutAsync(await _stateService.Value.GetActiveUserIdAsync()); + if (UIDevice.CurrentDevice.CheckSystemVersion(12, 0)) + { + await ASCredentialIdentityStore.SharedStore?.RemoveAllCredentialIdentitiesAsync(); + } } } + catch (Exception ex) + { + LoggerHelper.LogEvenIfCantBeResolved(ex); + } }); } diff --git a/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs b/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs index e4ad3248a..a0f16b6a7 100644 --- a/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs +++ b/src/iOS.Core/Controllers/BaseLockPasswordViewController.cs @@ -28,6 +28,7 @@ namespace Bit.iOS.Core.Controllers private IPlatformUtilsService _platformUtilsService; private IBiometricService _biometricService; private IKeyConnectorService _keyConnectorService; + private IAccountsManager _accountManager; private bool _isPinProtected; private bool _isPinProtectedWithKey; private bool _pinLock; @@ -84,7 +85,7 @@ namespace Bit.iOS.Core.Controllers } public abstract UITableView TableView { get; } - + public override async void ViewDidLoad() { _vaultTimeoutService = ServiceContainer.Resolve("vaultTimeoutService"); @@ -95,6 +96,7 @@ namespace Bit.iOS.Core.Controllers _platformUtilsService = ServiceContainer.Resolve("platformUtilsService"); _biometricService = ServiceContainer.Resolve("biometricService"); _keyConnectorService = ServiceContainer.Resolve("keyConnectorService"); + _accountManager = ServiceContainer.Resolve("accountsManager"); // We re-use the lock screen for autofill extension to verify master password // when trying to access protected items. @@ -265,13 +267,7 @@ namespace Bit.iOS.Core.Controllers } if (failed) { - var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync(); - if (invalidUnlockAttempts >= 5) - { - await LogOutAsync(); - return; - } - InvalidValue(); + await HandleFailedCredentialsAsync(); } } else @@ -306,17 +302,22 @@ namespace Bit.iOS.Core.Controllers } else { - var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync(); - if (invalidUnlockAttempts >= 5) - { - await LogOutAsync(); - return; - } - InvalidValue(); + await HandleFailedCredentialsAsync(); } } } + private async Task HandleFailedCredentialsAsync() + { + var invalidUnlockAttempts = await AppHelpers.IncrementInvalidUnlockAttemptsAsync(); + if (invalidUnlockAttempts >= 5) + { + await _accountManager.LogOutAsync(await _stateService.GetActiveUserIdAsync(), false, false); + return; + } + InvalidValue(); + } + public async Task PromptBiometricAsync() { if (!_biometricLock || !_biometricIntegrityValid) @@ -395,16 +396,6 @@ namespace Bit.iOS.Core.Controllers PresentViewController(alert, true, null); } - private async Task LogOutAsync() - { - await AppHelpers.LogOutAsync(await _stateService.GetActiveUserIdAsync()); - var authService = ServiceContainer.Resolve("authService"); - authService.LogOut(() => - { - Cancel?.Invoke(); - }); - } - protected override void Dispose(bool disposing) { base.Dispose(disposing); From c07c305384eeed49cc2e949eb26b8100df7533b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Ch=C4=99ci=C5=84ski?= Date: Fri, 15 Jul 2022 11:08:38 +0200 Subject: [PATCH 13/16] Add version change check in the version bump workflow (#1992) --- .github/workflows/version-bump.yml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 0b5c86e46..b3c5a58ef 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -19,12 +19,6 @@ jobs: - name: Create Version Branch run: | git switch -c version_bump_${{ github.event.inputs.version_number }} - git push -u origin version_bump_${{ github.event.inputs.version_number }} - - - name: Checkout Version Branch - uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 - with: - ref: version_bump_${{ github.event.inputs.version_number }} - name: Bump Version - Android XML uses: bitwarden/gh-actions/version-bump@03ad9a873c39cdc95dd8d77dbbda67f84db43945 @@ -56,16 +50,32 @@ jobs: version: ${{ github.event.inputs.version_number }} file_path: "./src/iOS/Info.plist" - - name: Commit files + - name: Setup git run: | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" git config --local user.name "github-actions[bot]" + + - name: Check if version changed + id: version-changed + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "::set-output name=changes_to_commit::TRUE" + else + echo "::set-output name=changes_to_commit::FALSE" + echo "No changes to commit!"; + fi + + - name: Commit files + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} + run: | git commit -m "Bumped version to ${{ github.event.inputs.version_number }}" -a - name: Push changes + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} run: git push -u origin version_bump_${{ github.event.inputs.version_number }} - name: Create Version PR + if: ${{ steps.version-changed.outputs.changes_to_commit == 'TRUE' }} env: PR_BRANCH: "version_bump_${{ github.event.inputs.version_number }}" GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" From cb0c52fb26532d52da0df2254096b1023f10a18d Mon Sep 17 00:00:00 2001 From: Micaiah Martin <77340197+mimartin12@users.noreply.github.com> Date: Fri, 15 Jul 2022 13:30:14 +0000 Subject: [PATCH 14/16] Add publish options to release workflow (#1994) --- .github/workflows/release.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8e28ba9a8..6a90503b7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,6 +13,11 @@ on: - Initial Release - Redeploy - Dry Run + fdroid_publish: + description: 'Publish to f-droid store' + required: true + default: true + type: boolean jobs: release: @@ -78,6 +83,7 @@ jobs: name: F-Droid Release runs-on: ubuntu-20.04 needs: release + if: inputs.fdroid_publish steps: - name: Checkout repo uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0 From cf222bd0c3094f1dc5526afd5f73dddbc68520ac Mon Sep 17 00:00:00 2001 From: Pedro da Rocha Pires Date: Fri, 15 Jul 2022 16:13:10 +0100 Subject: [PATCH 15/16] [EC-325] Settings option to allow screen capture on Android (#1914) * settings option to allow screen capture on Android * Improved code on Screen Capture and added prompt to the user to allow screen capture * EC-325 Removed async on OnCreate of MainActivity given that's not necessary anymore Co-authored-by: Federico Maccaroni --- src/Android/MainActivity.cs | 5 +- src/Android/Services/DeviceActionService.cs | 16 + src/App/Abstractions/IDeviceActionService.cs | 1 + .../SettingsPage/SettingsPageViewModel.cs | 41 +- .../GroupingsPage/GroupingsPageViewModel.cs | 4 +- src/App/Resources/AppResources.Designer.cs | 9707 ++++++++++------- src/App/Resources/AppResources.resx | 6 + src/Core/Abstractions/IStateService.cs | 2 + src/Core/Models/Domain/Account.cs | 2 + src/Core/Services/StateMigrationService.cs | 2 +- src/Core/Services/StateService.cs | 23 + src/Core/Utilities/CoreHelpers.cs | 19 + src/iOS.Core/Services/DeviceActionService.cs | 6 + 13 files changed, 5991 insertions(+), 3843 deletions(-) diff --git a/src/Android/MainActivity.cs b/src/Android/MainActivity.cs index af98b744c..39fdfa6f1 100644 --- a/src/Android/MainActivity.cs +++ b/src/Android/MainActivity.cs @@ -64,10 +64,11 @@ namespace Bit.Droid Intent?.Validate(); base.OnCreate(savedInstanceState); - if (!CoreHelpers.InDebugMode()) + + _deviceActionService.SetScreenCaptureAllowedAsync().FireAndForget(_ => { Window.AddFlags(Android.Views.WindowManagerFlags.Secure); - } + }); ServiceContainer.Resolve("logger").InitAsync(); diff --git a/src/Android/Services/DeviceActionService.cs b/src/Android/Services/DeviceActionService.cs index df873f79c..c981844ca 100644 --- a/src/Android/Services/DeviceActionService.cs +++ b/src/Android/Services/DeviceActionService.cs @@ -948,5 +948,21 @@ namespace Bit.Droid.Services { // for any Android-specific cleanup required after switching accounts } + + public async Task SetScreenCaptureAllowedAsync() + { + if (CoreHelpers.ForceScreenCaptureEnabled()) + { + return; + } + + var activity = CrossCurrentActivity.Current?.Activity; + if (await _stateService.GetScreenCaptureAllowedAsync()) + { + activity.RunOnUiThread(() => activity.Window.ClearFlags(WindowManagerFlags.Secure)); + return; + } + activity.RunOnUiThread(() => activity.Window.AddFlags(WindowManagerFlags.Secure)); + } } } diff --git a/src/App/Abstractions/IDeviceActionService.cs b/src/App/Abstractions/IDeviceActionService.cs index 28eb7b712..1c7f75941 100644 --- a/src/App/Abstractions/IDeviceActionService.cs +++ b/src/App/Abstractions/IDeviceActionService.cs @@ -48,5 +48,6 @@ namespace Bit.App.Abstractions bool SupportsFido2(); float GetSystemFontSizeScale(); Task OnAccountSwitchCompleteAsync(); + Task SetScreenCaptureAllowedAsync(); } } diff --git a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs index 59d76f762..7b5efe8d2 100644 --- a/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs +++ b/src/App/Pages/Settings/SettingsPage/SettingsPageViewModel.cs @@ -8,7 +8,6 @@ using Bit.App.Resources; using Bit.Core.Abstractions; using Bit.Core.Enums; using Bit.Core.Models.Domain; -using Bit.Core.Services; using Bit.Core.Utilities; using Xamarin.CommunityToolkit.ObjectModel; using Xamarin.Forms; @@ -31,11 +30,13 @@ namespace Bit.App.Pages private readonly IKeyConnectorService _keyConnectorService; private readonly IClipboardService _clipboardService; private readonly ILogger _loggerService; + private const int CustomVaultTimeoutValue = -100; private bool _supportsBiometric; private bool _pin; private bool _biometric; + private bool _screenCaptureAllowed; private string _lastSyncDate; private string _vaultTimeoutDisplayValue; private string _vaultTimeoutActionDisplayValue; @@ -122,6 +123,7 @@ namespace Bit.App.Pages var pinSet = await _vaultTimeoutService.IsPinLockSetAsync(); _pin = pinSet.Item1 || pinSet.Item2; _biometric = await _vaultTimeoutService.IsBiometricLockSetAsync(); + _screenCaptureAllowed = await _stateService.GetScreenCaptureAllowedAsync(); if (_vaultTimeoutDisplayValue == null) { @@ -547,6 +549,15 @@ namespace Bit.App.Pages UseFrame = true, }); } + if (Device.RuntimePlatform == Device.Android) + { + securityItems.Add(new SettingsPageListItem + { + Name = AppResources.AllowScreenCapture, + SubLabel = _screenCaptureAllowed ? AppResources.Enabled : AppResources.Disabled, + ExecuteAsync = () => SetScreenCaptureAllowedAsync() + }); + } var accountItems = new List { new SettingsPageListItem @@ -709,5 +720,33 @@ namespace Bit.App.Pages private string CreateSelectableOption(string option, bool selected) => selected ? $"✓ {option}" : option; private bool CompareSelection(string selection, string compareTo) => selection == compareTo || selection == $"✓ {compareTo}"; + + public async Task SetScreenCaptureAllowedAsync() + { + if (CoreHelpers.ForceScreenCaptureEnabled()) + { + return; + } + + try + { + if (!_screenCaptureAllowed + && + !await Page.DisplayAlert(AppResources.AllowScreenCapture, AppResources.AreYouSureYouWantToEnableScreenCapture, AppResources.Yes, AppResources.No)) + { + return; + } + + await _stateService.SetScreenCaptureAllowedAsync(!_screenCaptureAllowed); + _screenCaptureAllowed = !_screenCaptureAllowed; + await _deviceActionService.SetScreenCaptureAllowedAsync(); + BuildList(); + } + catch (Exception ex) + { + _loggerService.Exception(ex); + await Page.DisplayAlert(AppResources.AnErrorHasOccurred, AppResources.GenericErrorMessage, AppResources.Ok); + } + } } } diff --git a/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs b/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs index 9b2855853..e0e9a7fe2 100644 --- a/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs +++ b/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs @@ -181,6 +181,8 @@ namespace Bit.App.Pages return; } + _deviceActionService.SetScreenCaptureAllowedAsync().FireAndForget(); + await InitVaultFilterAsync(MainPage); if (MainPage) { @@ -296,7 +298,7 @@ namespace Bit.App.Pages } }, AppResources.Trash, _deletedCount, uppercaseGroupNames, false)); } - + // TODO: refactor this if (Device.RuntimePlatform == Device.Android || diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index 09f2c3f98..71cec4b7c 100644 --- a/src/App/Resources/AppResources.Designer.cs +++ b/src/App/Resources/AppResources.Designer.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -10,35 +9,46 @@ namespace Bit.App.Resources { using System; - using System.Reflection; - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] - [System.Diagnostics.DebuggerNonUserCodeAttribute()] - [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// This class was generated by MSBuild using the GenerateResource task. + /// To add or remove a member, edit your .resx file then rerun MSBuild. + /// + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Build.Tasks.StronglyTypedResourceBuilder", "15.1.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AppResources { - private static System.Resources.ResourceManager resourceMan; + private static global::System.Resources.ResourceManager resourceMan; - private static System.Globalization.CultureInfo resourceCulture; + private static global::System.Globalization.CultureInfo resourceCulture; - [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AppResources() { } - [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] - public static System.Resources.ResourceManager ResourceManager { + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { get { - if (object.Equals(null, resourceMan)) { - System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Bit.App.Resources.AppResources", typeof(AppResources).Assembly); + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Bit.App.Resources.AppResources", typeof(AppResources).Assembly); resourceMan = temp; } return resourceMan; } } - [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] - public static System.Globalization.CultureInfo Culture { + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -47,4014 +57,6035 @@ namespace Bit.App.Resources { } } + /// + /// Looks up a localized string similar to About. + /// public static string About { get { return ResourceManager.GetString("About", resourceCulture); } } - public static string Add { - get { - return ResourceManager.GetString("Add", resourceCulture); - } - } - - public static string AddFolder { - get { - return ResourceManager.GetString("AddFolder", resourceCulture); - } - } - - public static string AddItem { - get { - return ResourceManager.GetString("AddItem", resourceCulture); - } - } - - public static string AnErrorHasOccurred { - get { - return ResourceManager.GetString("AnErrorHasOccurred", resourceCulture); - } - } - - public static string Back { - get { - return ResourceManager.GetString("Back", resourceCulture); - } - } - - public static string Bitwarden { - get { - return ResourceManager.GetString("Bitwarden", resourceCulture); - } - } - - public static string Cancel { - get { - return ResourceManager.GetString("Cancel", resourceCulture); - } - } - - public static string Copy { - get { - return ResourceManager.GetString("Copy", resourceCulture); - } - } - - public static string CopyPassword { - get { - return ResourceManager.GetString("CopyPassword", resourceCulture); - } - } - - public static string CopyUsername { - get { - return ResourceManager.GetString("CopyUsername", resourceCulture); - } - } - - public static string Credits { - get { - return ResourceManager.GetString("Credits", resourceCulture); - } - } - - public static string Delete { - get { - return ResourceManager.GetString("Delete", resourceCulture); - } - } - - public static string Deleting { - get { - return ResourceManager.GetString("Deleting", resourceCulture); - } - } - - public static string DoYouReallyWantToDelete { - get { - return ResourceManager.GetString("DoYouReallyWantToDelete", resourceCulture); - } - } - - public static string Edit { - get { - return ResourceManager.GetString("Edit", resourceCulture); - } - } - - public static string EditFolder { - get { - return ResourceManager.GetString("EditFolder", resourceCulture); - } - } - - public static string Email { - get { - return ResourceManager.GetString("Email", resourceCulture); - } - } - - public static string EmailAddress { - get { - return ResourceManager.GetString("EmailAddress", resourceCulture); - } - } - - public static string EmailUs { - get { - return ResourceManager.GetString("EmailUs", resourceCulture); - } - } - - public static string EmailUsDescription { - get { - return ResourceManager.GetString("EmailUsDescription", resourceCulture); - } - } - - public static string EnterPIN { - get { - return ResourceManager.GetString("EnterPIN", resourceCulture); - } - } - - public static string Favorites { - get { - return ResourceManager.GetString("Favorites", resourceCulture); - } - } - - public static string FileBugReport { - get { - return ResourceManager.GetString("FileBugReport", resourceCulture); - } - } - - public static string FileBugReportDescription { - get { - return ResourceManager.GetString("FileBugReportDescription", resourceCulture); - } - } - - public static string FingerprintDirection { - get { - return ResourceManager.GetString("FingerprintDirection", resourceCulture); - } - } - - public static string Folder { - get { - return ResourceManager.GetString("Folder", resourceCulture); - } - } - - public static string FolderCreated { - get { - return ResourceManager.GetString("FolderCreated", resourceCulture); - } - } - - public static string FolderDeleted { - get { - return ResourceManager.GetString("FolderDeleted", resourceCulture); - } - } - - public static string FolderNone { - get { - return ResourceManager.GetString("FolderNone", resourceCulture); - } - } - - public static string Folders { - get { - return ResourceManager.GetString("Folders", resourceCulture); - } - } - - public static string FolderUpdated { - get { - return ResourceManager.GetString("FolderUpdated", resourceCulture); - } - } - - public static string GoToWebsite { - get { - return ResourceManager.GetString("GoToWebsite", resourceCulture); - } - } - - public static string HelpAndFeedback { - get { - return ResourceManager.GetString("HelpAndFeedback", resourceCulture); - } - } - - public static string Hide { - get { - return ResourceManager.GetString("Hide", resourceCulture); - } - } - - public static string InternetConnectionRequiredMessage { - get { - return ResourceManager.GetString("InternetConnectionRequiredMessage", resourceCulture); - } - } - - public static string InternetConnectionRequiredTitle { - get { - return ResourceManager.GetString("InternetConnectionRequiredTitle", resourceCulture); - } - } - - public static string InvalidMasterPassword { - get { - return ResourceManager.GetString("InvalidMasterPassword", resourceCulture); - } - } - - public static string InvalidPIN { - get { - return ResourceManager.GetString("InvalidPIN", resourceCulture); - } - } - - public static string Launch { - get { - return ResourceManager.GetString("Launch", resourceCulture); - } - } - - public static string LogIn { - get { - return ResourceManager.GetString("LogIn", resourceCulture); - } - } - - public static string LogInNoun { - get { - return ResourceManager.GetString("LogInNoun", resourceCulture); - } - } - - public static string LogOut { - get { - return ResourceManager.GetString("LogOut", resourceCulture); - } - } - - public static string LogoutConfirmation { - get { - return ResourceManager.GetString("LogoutConfirmation", resourceCulture); - } - } - - public static string RemoveAccount { - get { - return ResourceManager.GetString("RemoveAccount", resourceCulture); - } - } - - public static string RemoveAccountConfirmation { - get { - return ResourceManager.GetString("RemoveAccountConfirmation", resourceCulture); - } - } - - public static string AccountAlreadyAdded { - get { - return ResourceManager.GetString("AccountAlreadyAdded", resourceCulture); - } - } - - public static string SwitchToAlreadyAddedAccountConfirmation { - get { - return ResourceManager.GetString("SwitchToAlreadyAddedAccountConfirmation", resourceCulture); - } - } - - public static string MasterPassword { - get { - return ResourceManager.GetString("MasterPassword", resourceCulture); - } - } - - public static string More { - get { - return ResourceManager.GetString("More", resourceCulture); - } - } - - public static string MyVault { - get { - return ResourceManager.GetString("MyVault", resourceCulture); - } - } - - public static string Name { - get { - return ResourceManager.GetString("Name", resourceCulture); - } - } - - public static string No { - get { - return ResourceManager.GetString("No", resourceCulture); - } - } - - public static string Notes { - get { - return ResourceManager.GetString("Notes", resourceCulture); - } - } - - public static string Ok { - get { - return ResourceManager.GetString("Ok", resourceCulture); - } - } - - public static string Password { - get { - return ResourceManager.GetString("Password", resourceCulture); - } - } - - public static string Save { - get { - return ResourceManager.GetString("Save", resourceCulture); - } - } - - public static string Move { - get { - return ResourceManager.GetString("Move", resourceCulture); - } - } - - public static string Saving { - get { - return ResourceManager.GetString("Saving", resourceCulture); - } - } - - public static string Settings { - get { - return ResourceManager.GetString("Settings", resourceCulture); - } - } - - public static string Show { - get { - return ResourceManager.GetString("Show", resourceCulture); - } - } - - public static string ItemDeleted { - get { - return ResourceManager.GetString("ItemDeleted", resourceCulture); - } - } - - public static string Submit { - get { - return ResourceManager.GetString("Submit", resourceCulture); - } - } - - public static string Sync { - get { - return ResourceManager.GetString("Sync", resourceCulture); - } - } - - public static string ThankYou { - get { - return ResourceManager.GetString("ThankYou", resourceCulture); - } - } - - public static string Tools { - get { - return ResourceManager.GetString("Tools", resourceCulture); - } - } - - public static string URI { - get { - return ResourceManager.GetString("URI", resourceCulture); - } - } - - public static string UseFingerprintToUnlock { - get { - return ResourceManager.GetString("UseFingerprintToUnlock", resourceCulture); - } - } - - public static string Username { - get { - return ResourceManager.GetString("Username", resourceCulture); - } - } - - public static string ValidationFieldRequired { - get { - return ResourceManager.GetString("ValidationFieldRequired", resourceCulture); - } - } - - public static string ValueHasBeenCopied { - get { - return ResourceManager.GetString("ValueHasBeenCopied", resourceCulture); - } - } - - public static string VerifyFingerprint { - get { - return ResourceManager.GetString("VerifyFingerprint", resourceCulture); - } - } - - public static string VerifyMasterPassword { - get { - return ResourceManager.GetString("VerifyMasterPassword", resourceCulture); - } - } - - public static string VerifyPIN { - get { - return ResourceManager.GetString("VerifyPIN", resourceCulture); - } - } - - public static string Version { - get { - return ResourceManager.GetString("Version", resourceCulture); - } - } - - public static string View { - get { - return ResourceManager.GetString("View", resourceCulture); - } - } - - public static string VisitOurWebsite { - get { - return ResourceManager.GetString("VisitOurWebsite", resourceCulture); - } - } - - public static string VisitOurWebsiteDescription { - get { - return ResourceManager.GetString("VisitOurWebsiteDescription", resourceCulture); - } - } - - public static string Website { - get { - return ResourceManager.GetString("Website", resourceCulture); - } - } - - public static string Yes { - get { - return ResourceManager.GetString("Yes", resourceCulture); - } - } - - public static string Account { - get { - return ResourceManager.GetString("Account", resourceCulture); - } - } - - public static string AccountCreated { - get { - return ResourceManager.GetString("AccountCreated", resourceCulture); - } - } - - public static string AddAnItem { - get { - return ResourceManager.GetString("AddAnItem", resourceCulture); - } - } - - public static string AppExtension { - get { - return ResourceManager.GetString("AppExtension", resourceCulture); - } - } - - public static string AutofillAccessibilityDescription { - get { - return ResourceManager.GetString("AutofillAccessibilityDescription", resourceCulture); - } - } - - public static string AutofillService { - get { - return ResourceManager.GetString("AutofillService", resourceCulture); - } - } - - public static string AvoidAmbiguousCharacters { - get { - return ResourceManager.GetString("AvoidAmbiguousCharacters", resourceCulture); - } - } - - public static string BitwardenAppExtension { - get { - return ResourceManager.GetString("BitwardenAppExtension", resourceCulture); - } - } - - public static string BitwardenAppExtensionAlert2 { - get { - return ResourceManager.GetString("BitwardenAppExtensionAlert2", resourceCulture); - } - } - - public static string BitwardenAppExtensionDescription { - get { - return ResourceManager.GetString("BitwardenAppExtensionDescription", resourceCulture); - } - } - - public static string BitwardenAutofillService { - get { - return ResourceManager.GetString("BitwardenAutofillService", resourceCulture); - } - } - - public static string BitwardenAutofillAccessibilityServiceDescription { - get { - return ResourceManager.GetString("BitwardenAutofillAccessibilityServiceDescription", resourceCulture); - } - } - - public static string ChangeEmail { - get { - return ResourceManager.GetString("ChangeEmail", resourceCulture); - } - } - - public static string ChangeEmailConfirmation { - get { - return ResourceManager.GetString("ChangeEmailConfirmation", resourceCulture); - } - } - - public static string ChangeMasterPassword { - get { - return ResourceManager.GetString("ChangeMasterPassword", resourceCulture); - } - } - - public static string ChangePasswordConfirmation { - get { - return ResourceManager.GetString("ChangePasswordConfirmation", resourceCulture); - } - } - - public static string Close { - get { - return ResourceManager.GetString("Close", resourceCulture); - } - } - - public static string Continue { - get { - return ResourceManager.GetString("Continue", resourceCulture); - } - } - - public static string CreateAccount { - get { - return ResourceManager.GetString("CreateAccount", resourceCulture); - } - } - - public static string CreatingAccount { - get { - return ResourceManager.GetString("CreatingAccount", resourceCulture); - } - } - - public static string EditItem { - get { - return ResourceManager.GetString("EditItem", resourceCulture); - } - } - - public static string EnableAutomaticSyncing { - get { - return ResourceManager.GetString("EnableAutomaticSyncing", resourceCulture); - } - } - - public static string EnterEmailForHint { - get { - return ResourceManager.GetString("EnterEmailForHint", resourceCulture); - } - } - - public static string ExntesionReenable { - get { - return ResourceManager.GetString("ExntesionReenable", resourceCulture); - } - } - - public static string ExtensionAlmostDone { - get { - return ResourceManager.GetString("ExtensionAlmostDone", resourceCulture); - } - } - - public static string ExtensionEnable { - get { - return ResourceManager.GetString("ExtensionEnable", resourceCulture); - } - } - - public static string ExtensionInSafari { - get { - return ResourceManager.GetString("ExtensionInSafari", resourceCulture); - } - } - - public static string ExtensionInstantAccess { - get { - return ResourceManager.GetString("ExtensionInstantAccess", resourceCulture); - } - } - - public static string ExtensionReady { - get { - return ResourceManager.GetString("ExtensionReady", resourceCulture); - } - } - - public static string ExtensionSetup { - get { - return ResourceManager.GetString("ExtensionSetup", resourceCulture); - } - } - - public static string ExtensionSetup2 { - get { - return ResourceManager.GetString("ExtensionSetup2", resourceCulture); - } - } - - public static string ExtensionTapIcon { - get { - return ResourceManager.GetString("ExtensionTapIcon", resourceCulture); - } - } - - public static string ExtensionTurnOn { - get { - return ResourceManager.GetString("ExtensionTurnOn", resourceCulture); - } - } - - public static string Favorite { - get { - return ResourceManager.GetString("Favorite", resourceCulture); - } - } - - public static string Fingerprint { - get { - return ResourceManager.GetString("Fingerprint", resourceCulture); - } - } - - public static string GeneratePassword { - get { - return ResourceManager.GetString("GeneratePassword", resourceCulture); - } - } - - public static string GetPasswordHint { - get { - return ResourceManager.GetString("GetPasswordHint", resourceCulture); - } - } - - public static string ImportItems { - get { - return ResourceManager.GetString("ImportItems", resourceCulture); - } - } - - public static string ImportItemsConfirmation { - get { - return ResourceManager.GetString("ImportItemsConfirmation", resourceCulture); - } - } - - public static string ImportItemsDescription { - get { - return ResourceManager.GetString("ImportItemsDescription", resourceCulture); - } - } - - public static string LastSync { - get { - return ResourceManager.GetString("LastSync", resourceCulture); - } - } - - public static string Length { - get { - return ResourceManager.GetString("Length", resourceCulture); - } - } - - public static string Lock { - get { - return ResourceManager.GetString("Lock", resourceCulture); - } - } - - public static string FifteenMinutes { - get { - return ResourceManager.GetString("FifteenMinutes", resourceCulture); - } - } - - public static string OneHour { - get { - return ResourceManager.GetString("OneHour", resourceCulture); - } - } - - public static string OneMinute { - get { - return ResourceManager.GetString("OneMinute", resourceCulture); - } - } - - public static string FourHours { - get { - return ResourceManager.GetString("FourHours", resourceCulture); - } - } - - public static string Immediately { - get { - return ResourceManager.GetString("Immediately", resourceCulture); - } - } - - public static string VaultTimeout { - get { - return ResourceManager.GetString("VaultTimeout", resourceCulture); - } - } - - public static string VaultTimeoutAction { - get { - return ResourceManager.GetString("VaultTimeoutAction", resourceCulture); - } - } - - public static string VaultTimeoutLogOutConfirmation { - get { - return ResourceManager.GetString("VaultTimeoutLogOutConfirmation", resourceCulture); - } - } - - public static string LoggingIn { - get { - return ResourceManager.GetString("LoggingIn", resourceCulture); - } - } - - public static string LoginOrCreateNewAccount { - get { - return ResourceManager.GetString("LoginOrCreateNewAccount", resourceCulture); - } - } - - public static string Manage { - get { - return ResourceManager.GetString("Manage", resourceCulture); - } - } - - public static string MasterPasswordConfirmationValMessage { - get { - return ResourceManager.GetString("MasterPasswordConfirmationValMessage", resourceCulture); - } - } - - public static string MasterPasswordDescription { - get { - return ResourceManager.GetString("MasterPasswordDescription", resourceCulture); - } - } - - public static string MasterPasswordHint { - get { - return ResourceManager.GetString("MasterPasswordHint", resourceCulture); - } - } - - public static string MasterPasswordHintDescription { - get { - return ResourceManager.GetString("MasterPasswordHintDescription", resourceCulture); - } - } - - public static string MasterPasswordLengthValMessage { - get { - return ResourceManager.GetString("MasterPasswordLengthValMessage", resourceCulture); - } - } - - public static string MinNumbers { - get { - return ResourceManager.GetString("MinNumbers", resourceCulture); - } - } - - public static string MinSpecial { - get { - return ResourceManager.GetString("MinSpecial", resourceCulture); - } - } - - public static string MoreSettings { - get { - return ResourceManager.GetString("MoreSettings", resourceCulture); - } - } - - public static string MustLogInMainApp { - get { - return ResourceManager.GetString("MustLogInMainApp", resourceCulture); - } - } - - public static string Never { - get { - return ResourceManager.GetString("Never", resourceCulture); - } - } - - public static string NewItemCreated { - get { - return ResourceManager.GetString("NewItemCreated", resourceCulture); - } - } - - public static string NoFavorites { - get { - return ResourceManager.GetString("NoFavorites", resourceCulture); - } - } - - public static string NoItems { - get { - return ResourceManager.GetString("NoItems", resourceCulture); - } - } - - public static string NoItemsTap { - get { - return ResourceManager.GetString("NoItemsTap", resourceCulture); - } - } - - public static string NoUsernamePasswordConfigured { - get { - return ResourceManager.GetString("NoUsernamePasswordConfigured", resourceCulture); - } - } - - public static string OkGotIt { - get { - return ResourceManager.GetString("OkGotIt", resourceCulture); - } - } - - public static string OptionDefaults { - get { - return ResourceManager.GetString("OptionDefaults", resourceCulture); - } - } - - public static string Options { - get { - return ResourceManager.GetString("Options", resourceCulture); - } - } - - public static string Other { - get { - return ResourceManager.GetString("Other", resourceCulture); - } - } - - public static string PasswordGenerated { - get { - return ResourceManager.GetString("PasswordGenerated", resourceCulture); - } - } - - public static string PasswordGenerator { - get { - return ResourceManager.GetString("PasswordGenerator", resourceCulture); - } - } - - public static string PasswordHint { - get { - return ResourceManager.GetString("PasswordHint", resourceCulture); - } - } - - public static string PasswordHintAlert { - get { - return ResourceManager.GetString("PasswordHintAlert", resourceCulture); - } - } - - public static string PasswordOverrideAlert { - get { - return ResourceManager.GetString("PasswordOverrideAlert", resourceCulture); - } - } - - public static string PushNotificationAlert { - get { - return ResourceManager.GetString("PushNotificationAlert", resourceCulture); - } - } - - public static string RateTheApp { - get { - return ResourceManager.GetString("RateTheApp", resourceCulture); - } - } - - public static string RateTheAppDescription { - get { - return ResourceManager.GetString("RateTheAppDescription", resourceCulture); - } - } - - public static string RegeneratePassword { - get { - return ResourceManager.GetString("RegeneratePassword", resourceCulture); - } - } - - public static string RetypeMasterPassword { - get { - return ResourceManager.GetString("RetypeMasterPassword", resourceCulture); - } - } - - public static string SearchVault { - get { - return ResourceManager.GetString("SearchVault", resourceCulture); - } - } - - public static string Security { - get { - return ResourceManager.GetString("Security", resourceCulture); - } - } - - public static string Select { - get { - return ResourceManager.GetString("Select", resourceCulture); - } - } - - public static string SetPIN { - get { - return ResourceManager.GetString("SetPIN", resourceCulture); - } - } - - public static string SetPINDirection { - get { - return ResourceManager.GetString("SetPINDirection", resourceCulture); - } - } - - public static string ItemInformation { - get { - return ResourceManager.GetString("ItemInformation", resourceCulture); - } - } - - public static string ItemUpdated { - get { - return ResourceManager.GetString("ItemUpdated", resourceCulture); - } - } - - public static string Submitting { - get { - return ResourceManager.GetString("Submitting", resourceCulture); - } - } - - public static string Syncing { - get { - return ResourceManager.GetString("Syncing", resourceCulture); - } - } - - public static string SyncingComplete { - get { - return ResourceManager.GetString("SyncingComplete", resourceCulture); - } - } - - public static string SyncingFailed { - get { - return ResourceManager.GetString("SyncingFailed", resourceCulture); - } - } - - public static string SyncVaultNow { - get { - return ResourceManager.GetString("SyncVaultNow", resourceCulture); - } - } - - public static string TouchID { - get { - return ResourceManager.GetString("TouchID", resourceCulture); - } - } - - public static string TwoStepLogin { - get { - return ResourceManager.GetString("TwoStepLogin", resourceCulture); - } - } - - public static string TwoStepLoginConfirmation { - get { - return ResourceManager.GetString("TwoStepLoginConfirmation", resourceCulture); - } - } - - public static string UnlockWith { - get { - return ResourceManager.GetString("UnlockWith", resourceCulture); - } - } - - public static string UnlockWithPIN { - get { - return ResourceManager.GetString("UnlockWithPIN", resourceCulture); - } - } - - public static string Validating { - get { - return ResourceManager.GetString("Validating", resourceCulture); - } - } - - public static string VerificationCode { - get { - return ResourceManager.GetString("VerificationCode", resourceCulture); - } - } - - public static string ViewItem { - get { - return ResourceManager.GetString("ViewItem", resourceCulture); - } - } - - public static string WebVault { - get { - return ResourceManager.GetString("WebVault", resourceCulture); - } - } - - public static string Lost2FAApp { - get { - return ResourceManager.GetString("Lost2FAApp", resourceCulture); - } - } - - public static string Items { - get { - return ResourceManager.GetString("Items", resourceCulture); - } - } - - public static string ExtensionActivated { - get { - return ResourceManager.GetString("ExtensionActivated", resourceCulture); - } - } - - public static string Icons { - get { - return ResourceManager.GetString("Icons", resourceCulture); - } - } - - public static string Translations { - get { - return ResourceManager.GetString("Translations", resourceCulture); - } - } - - public static string ItemsForUri { - get { - return ResourceManager.GetString("ItemsForUri", resourceCulture); - } - } - - public static string NoItemsForUri { - get { - return ResourceManager.GetString("NoItemsForUri", resourceCulture); - } - } - - public static string BitwardenAutofillServiceOverlay { - get { - return ResourceManager.GetString("BitwardenAutofillServiceOverlay", resourceCulture); - } - } - - public static string BitwardenAutofillServiceNotificationContent { - get { - return ResourceManager.GetString("BitwardenAutofillServiceNotificationContent", resourceCulture); - } - } - - public static string BitwardenAutofillServiceOpenAccessibilitySettings { - get { - return ResourceManager.GetString("BitwardenAutofillServiceOpenAccessibilitySettings", resourceCulture); - } - } - - public static string BitwardenAutofillServiceStep1 { - get { - return ResourceManager.GetString("BitwardenAutofillServiceStep1", resourceCulture); - } - } - - public static string BitwardenAutofillServiceStep2 { - get { - return ResourceManager.GetString("BitwardenAutofillServiceStep2", resourceCulture); - } - } - - public static string Disabled { - get { - return ResourceManager.GetString("Disabled", resourceCulture); - } - } - - public static string Enabled { - get { - return ResourceManager.GetString("Enabled", resourceCulture); - } - } - - public static string Status { - get { - return ResourceManager.GetString("Status", resourceCulture); - } - } - - public static string BitwardenAutofillServiceAlert2 { - get { - return ResourceManager.GetString("BitwardenAutofillServiceAlert2", resourceCulture); - } - } - - public static string Autofill { - get { - return ResourceManager.GetString("Autofill", resourceCulture); - } - } - - public static string AutofillOrView { - get { - return ResourceManager.GetString("AutofillOrView", resourceCulture); - } - } - - public static string BitwardenAutofillServiceMatchConfirm { - get { - return ResourceManager.GetString("BitwardenAutofillServiceMatchConfirm", resourceCulture); - } - } - - public static string MatchingItems { - get { - return ResourceManager.GetString("MatchingItems", resourceCulture); - } - } - - public static string PossibleMatchingItems { - get { - return ResourceManager.GetString("PossibleMatchingItems", resourceCulture); - } - } - - public static string Search { - get { - return ResourceManager.GetString("Search", resourceCulture); - } - } - - public static string BitwardenAutofillServiceSearch { - get { - return ResourceManager.GetString("BitwardenAutofillServiceSearch", resourceCulture); - } - } - - public static string LearnOrg { - get { - return ResourceManager.GetString("LearnOrg", resourceCulture); - } - } - - public static string CannotOpenApp { - get { - return ResourceManager.GetString("CannotOpenApp", resourceCulture); - } - } - - public static string AuthenticatorAppTitle { - get { - return ResourceManager.GetString("AuthenticatorAppTitle", resourceCulture); - } - } - - public static string EnterVerificationCodeApp { - get { - return ResourceManager.GetString("EnterVerificationCodeApp", resourceCulture); - } - } - - public static string EnterVerificationCodeEmail { - get { - return ResourceManager.GetString("EnterVerificationCodeEmail", resourceCulture); - } - } - - public static string LoginUnavailable { - get { - return ResourceManager.GetString("LoginUnavailable", resourceCulture); - } - } - - public static string NoTwoStepAvailable { - get { - return ResourceManager.GetString("NoTwoStepAvailable", resourceCulture); - } - } - - public static string RecoveryCodeTitle { - get { - return ResourceManager.GetString("RecoveryCodeTitle", resourceCulture); - } - } - - public static string RememberMe { - get { - return ResourceManager.GetString("RememberMe", resourceCulture); - } - } - - public static string SendVerificationCodeAgain { - get { - return ResourceManager.GetString("SendVerificationCodeAgain", resourceCulture); - } - } - - public static string TwoStepLoginOptions { - get { - return ResourceManager.GetString("TwoStepLoginOptions", resourceCulture); - } - } - - public static string UseAnotherTwoStepMethod { - get { - return ResourceManager.GetString("UseAnotherTwoStepMethod", resourceCulture); - } - } - - public static string VerificationEmailNotSent { - get { - return ResourceManager.GetString("VerificationEmailNotSent", resourceCulture); - } - } - - public static string VerificationEmailSent { - get { - return ResourceManager.GetString("VerificationEmailSent", resourceCulture); - } - } - - public static string YubiKeyInstruction { - get { - return ResourceManager.GetString("YubiKeyInstruction", resourceCulture); - } - } - - public static string YubiKeyTitle { - get { - return ResourceManager.GetString("YubiKeyTitle", resourceCulture); - } - } - - public static string AddNewAttachment { - get { - return ResourceManager.GetString("AddNewAttachment", resourceCulture); - } - } - - public static string Attachments { - get { - return ResourceManager.GetString("Attachments", resourceCulture); - } - } - - public static string UnableToDownloadFile { - get { - return ResourceManager.GetString("UnableToDownloadFile", resourceCulture); - } - } - - public static string UnableToOpenFile { - get { - return ResourceManager.GetString("UnableToOpenFile", resourceCulture); - } - } - - public static string Downloading { - get { - return ResourceManager.GetString("Downloading", resourceCulture); - } - } - - public static string AttachmentLargeWarning { - get { - return ResourceManager.GetString("AttachmentLargeWarning", resourceCulture); - } - } - - public static string AuthenticatorKey { - get { - return ResourceManager.GetString("AuthenticatorKey", resourceCulture); - } - } - - public static string VerificationCodeTotp { - get { - return ResourceManager.GetString("VerificationCodeTotp", resourceCulture); - } - } - - public static string AuthenticatorKeyAdded { - get { - return ResourceManager.GetString("AuthenticatorKeyAdded", resourceCulture); - } - } - - public static string AuthenticatorKeyReadError { - get { - return ResourceManager.GetString("AuthenticatorKeyReadError", resourceCulture); - } - } - - public static string CameraInstructionBottom { - get { - return ResourceManager.GetString("CameraInstructionBottom", resourceCulture); - } - } - - public static string CameraInstructionTop { - get { - return ResourceManager.GetString("CameraInstructionTop", resourceCulture); - } - } - - public static string ScanQrTitle { - get { - return ResourceManager.GetString("ScanQrTitle", resourceCulture); - } - } - - public static string Camera { - get { - return ResourceManager.GetString("Camera", resourceCulture); - } - } - - public static string Photos { - get { - return ResourceManager.GetString("Photos", resourceCulture); - } - } - - public static string CopyTotp { - get { - return ResourceManager.GetString("CopyTotp", resourceCulture); - } - } - - public static string CopyTotpAutomaticallyDescription { - get { - return ResourceManager.GetString("CopyTotpAutomaticallyDescription", resourceCulture); - } - } - - public static string CopyTotpAutomatically { - get { - return ResourceManager.GetString("CopyTotpAutomatically", resourceCulture); - } - } - - public static string PremiumRequired { - get { - return ResourceManager.GetString("PremiumRequired", resourceCulture); - } - } - - public static string AttachementAdded { - get { - return ResourceManager.GetString("AttachementAdded", resourceCulture); - } - } - - public static string AttachmentDeleted { - get { - return ResourceManager.GetString("AttachmentDeleted", resourceCulture); - } - } - - public static string ChooseFile { - get { - return ResourceManager.GetString("ChooseFile", resourceCulture); - } - } - - public static string File { - get { - return ResourceManager.GetString("File", resourceCulture); - } - } - - public static string NoFileChosen { - get { - return ResourceManager.GetString("NoFileChosen", resourceCulture); - } - } - - public static string NoAttachments { - get { - return ResourceManager.GetString("NoAttachments", resourceCulture); - } - } - - public static string FileSource { - get { - return ResourceManager.GetString("FileSource", resourceCulture); - } - } - - public static string FeatureUnavailable { - get { - return ResourceManager.GetString("FeatureUnavailable", resourceCulture); - } - } - - public static string MaxFileSize { - get { - return ResourceManager.GetString("MaxFileSize", resourceCulture); - } - } - - public static string UpdateKey { - get { - return ResourceManager.GetString("UpdateKey", resourceCulture); - } - } - - public static string LearnMore { - get { - return ResourceManager.GetString("LearnMore", resourceCulture); - } - } - - public static string ApiUrl { - get { - return ResourceManager.GetString("ApiUrl", resourceCulture); - } - } - - public static string CustomEnvironment { - get { - return ResourceManager.GetString("CustomEnvironment", resourceCulture); - } - } - - public static string CustomEnvironmentFooter { - get { - return ResourceManager.GetString("CustomEnvironmentFooter", resourceCulture); - } - } - - public static string EnvironmentSaved { - get { - return ResourceManager.GetString("EnvironmentSaved", resourceCulture); - } - } - - public static string FormattedIncorrectly { - get { - return ResourceManager.GetString("FormattedIncorrectly", resourceCulture); - } - } - - public static string IdentityUrl { - get { - return ResourceManager.GetString("IdentityUrl", resourceCulture); - } - } - - public static string SelfHostedEnvironment { - get { - return ResourceManager.GetString("SelfHostedEnvironment", resourceCulture); - } - } - - public static string SelfHostedEnvironmentFooter { - get { - return ResourceManager.GetString("SelfHostedEnvironmentFooter", resourceCulture); - } - } - - public static string ServerUrl { - get { - return ResourceManager.GetString("ServerUrl", resourceCulture); - } - } - - public static string WebVaultUrl { - get { - return ResourceManager.GetString("WebVaultUrl", resourceCulture); - } - } - - public static string BitwardenAutofillServiceNotificationContentOld { - get { - return ResourceManager.GetString("BitwardenAutofillServiceNotificationContentOld", resourceCulture); - } - } - - public static string CustomFields { - get { - return ResourceManager.GetString("CustomFields", resourceCulture); - } - } - - public static string CopyNumber { - get { - return ResourceManager.GetString("CopyNumber", resourceCulture); - } - } - - public static string CopySecurityCode { - get { - return ResourceManager.GetString("CopySecurityCode", resourceCulture); - } - } - - public static string Number { - get { - return ResourceManager.GetString("Number", resourceCulture); - } - } - - public static string SecurityCode { - get { - return ResourceManager.GetString("SecurityCode", resourceCulture); - } - } - - public static string TypeCard { - get { - return ResourceManager.GetString("TypeCard", resourceCulture); - } - } - - public static string TypeIdentity { - get { - return ResourceManager.GetString("TypeIdentity", resourceCulture); - } - } - - public static string TypeLogin { - get { - return ResourceManager.GetString("TypeLogin", resourceCulture); - } - } - - public static string TypeSecureNote { - get { - return ResourceManager.GetString("TypeSecureNote", resourceCulture); - } - } - - public static string Address1 { - get { - return ResourceManager.GetString("Address1", resourceCulture); - } - } - - public static string Address2 { - get { - return ResourceManager.GetString("Address2", resourceCulture); - } - } - - public static string Address3 { - get { - return ResourceManager.GetString("Address3", resourceCulture); - } - } - - public static string April { - get { - return ResourceManager.GetString("April", resourceCulture); - } - } - - public static string August { - get { - return ResourceManager.GetString("August", resourceCulture); - } - } - - public static string Brand { - get { - return ResourceManager.GetString("Brand", resourceCulture); - } - } - - public static string CardholderName { - get { - return ResourceManager.GetString("CardholderName", resourceCulture); - } - } - - public static string CityTown { - get { - return ResourceManager.GetString("CityTown", resourceCulture); - } - } - - public static string Company { - get { - return ResourceManager.GetString("Company", resourceCulture); - } - } - - public static string Country { - get { - return ResourceManager.GetString("Country", resourceCulture); - } - } - - public static string December { - get { - return ResourceManager.GetString("December", resourceCulture); - } - } - - public static string Dr { - get { - return ResourceManager.GetString("Dr", resourceCulture); - } - } - - public static string ExpirationMonth { - get { - return ResourceManager.GetString("ExpirationMonth", resourceCulture); - } - } - - public static string ExpirationYear { - get { - return ResourceManager.GetString("ExpirationYear", resourceCulture); - } - } - - public static string February { - get { - return ResourceManager.GetString("February", resourceCulture); - } - } - - public static string FirstName { - get { - return ResourceManager.GetString("FirstName", resourceCulture); - } - } - - public static string January { - get { - return ResourceManager.GetString("January", resourceCulture); - } - } - - public static string July { - get { - return ResourceManager.GetString("July", resourceCulture); - } - } - - public static string June { - get { - return ResourceManager.GetString("June", resourceCulture); - } - } - - public static string LastName { - get { - return ResourceManager.GetString("LastName", resourceCulture); - } - } - - public static string FullName { - get { - return ResourceManager.GetString("FullName", resourceCulture); - } - } - - public static string LicenseNumber { - get { - return ResourceManager.GetString("LicenseNumber", resourceCulture); - } - } - - public static string March { - get { - return ResourceManager.GetString("March", resourceCulture); - } - } - - public static string May { - get { - return ResourceManager.GetString("May", resourceCulture); - } - } - - public static string MiddleName { - get { - return ResourceManager.GetString("MiddleName", resourceCulture); - } - } - - public static string Mr { - get { - return ResourceManager.GetString("Mr", resourceCulture); - } - } - - public static string Mrs { - get { - return ResourceManager.GetString("Mrs", resourceCulture); - } - } - - public static string Ms { - get { - return ResourceManager.GetString("Ms", resourceCulture); - } - } - - public static string November { - get { - return ResourceManager.GetString("November", resourceCulture); - } - } - - public static string October { - get { - return ResourceManager.GetString("October", resourceCulture); - } - } - - public static string PassportNumber { - get { - return ResourceManager.GetString("PassportNumber", resourceCulture); - } - } - - public static string Phone { - get { - return ResourceManager.GetString("Phone", resourceCulture); - } - } - - public static string September { - get { - return ResourceManager.GetString("September", resourceCulture); - } - } - - public static string SSN { - get { - return ResourceManager.GetString("SSN", resourceCulture); - } - } - - public static string StateProvince { - get { - return ResourceManager.GetString("StateProvince", resourceCulture); - } - } - - public static string Title { - get { - return ResourceManager.GetString("Title", resourceCulture); - } - } - - public static string ZipPostalCode { - get { - return ResourceManager.GetString("ZipPostalCode", resourceCulture); - } - } - - public static string Address { - get { - return ResourceManager.GetString("Address", resourceCulture); - } - } - - public static string Expiration { - get { - return ResourceManager.GetString("Expiration", resourceCulture); - } - } - - public static string ShowWebsiteIcons { - get { - return ResourceManager.GetString("ShowWebsiteIcons", resourceCulture); - } - } - - public static string ShowWebsiteIconsDescription { - get { - return ResourceManager.GetString("ShowWebsiteIconsDescription", resourceCulture); - } - } - - public static string IconsUrl { - get { - return ResourceManager.GetString("IconsUrl", resourceCulture); - } - } - - public static string AutofillWithBitwarden { - get { - return ResourceManager.GetString("AutofillWithBitwarden", resourceCulture); - } - } - - public static string VaultIsLocked { - get { - return ResourceManager.GetString("VaultIsLocked", resourceCulture); - } - } - - public static string GoToMyVault { - get { - return ResourceManager.GetString("GoToMyVault", resourceCulture); - } - } - - public static string Collections { - get { - return ResourceManager.GetString("Collections", resourceCulture); - } - } - - public static string NoItemsCollection { - get { - return ResourceManager.GetString("NoItemsCollection", resourceCulture); - } - } - - public static string NoItemsFolder { - get { - return ResourceManager.GetString("NoItemsFolder", resourceCulture); - } - } - - public static string NoItemsTrash { - get { - return ResourceManager.GetString("NoItemsTrash", resourceCulture); - } - } - - public static string AutofillAccessibilityService { - get { - return ResourceManager.GetString("AutofillAccessibilityService", resourceCulture); - } - } - - public static string AutofillServiceDescription { - get { - return ResourceManager.GetString("AutofillServiceDescription", resourceCulture); - } - } - - public static string BitwardenAutofillServiceDescription { - get { - return ResourceManager.GetString("BitwardenAutofillServiceDescription", resourceCulture); - } - } - - public static string BitwardenAutofillServiceOpenAutofillSettings { - get { - return ResourceManager.GetString("BitwardenAutofillServiceOpenAutofillSettings", resourceCulture); - } - } - - public static string FaceID { - get { - return ResourceManager.GetString("FaceID", resourceCulture); - } - } - - public static string FaceIDDirection { - get { - return ResourceManager.GetString("FaceIDDirection", resourceCulture); - } - } - - public static string UseFaceIDToUnlock { - get { - return ResourceManager.GetString("UseFaceIDToUnlock", resourceCulture); - } - } - - public static string VerifyFaceID { - get { - return ResourceManager.GetString("VerifyFaceID", resourceCulture); - } - } - - public static string WindowsHello { - get { - return ResourceManager.GetString("WindowsHello", resourceCulture); - } - } - - public static string BitwardenAutofillGoToSettings { - get { - return ResourceManager.GetString("BitwardenAutofillGoToSettings", resourceCulture); - } - } - - public static string CustomFieldName { - get { - return ResourceManager.GetString("CustomFieldName", resourceCulture); - } - } - - public static string FieldTypeBoolean { - get { - return ResourceManager.GetString("FieldTypeBoolean", resourceCulture); - } - } - - public static string FieldTypeHidden { - get { - return ResourceManager.GetString("FieldTypeHidden", resourceCulture); - } - } - - public static string FieldTypeLinked { - get { - return ResourceManager.GetString("FieldTypeLinked", resourceCulture); - } - } - - public static string FieldTypeText { - get { - return ResourceManager.GetString("FieldTypeText", resourceCulture); - } - } - - public static string NewCustomField { - get { - return ResourceManager.GetString("NewCustomField", resourceCulture); - } - } - - public static string SelectTypeField { - get { - return ResourceManager.GetString("SelectTypeField", resourceCulture); - } - } - - public static string Remove { - get { - return ResourceManager.GetString("Remove", resourceCulture); - } - } - - public static string NewUri { - get { - return ResourceManager.GetString("NewUri", resourceCulture); - } - } - - public static string URIPosition { - get { - return ResourceManager.GetString("URIPosition", resourceCulture); - } - } - - public static string BaseDomain { - get { - return ResourceManager.GetString("BaseDomain", resourceCulture); - } - } - - public static string Default { - get { - return ResourceManager.GetString("Default", resourceCulture); - } - } - - public static string Exact { - get { - return ResourceManager.GetString("Exact", resourceCulture); - } - } - - public static string Host { - get { - return ResourceManager.GetString("Host", resourceCulture); - } - } - - public static string RegEx { - get { - return ResourceManager.GetString("RegEx", resourceCulture); - } - } - - public static string StartsWith { - get { - return ResourceManager.GetString("StartsWith", resourceCulture); - } - } - - public static string URIMatchDetection { - get { - return ResourceManager.GetString("URIMatchDetection", resourceCulture); - } - } - - public static string MatchDetection { - get { - return ResourceManager.GetString("MatchDetection", resourceCulture); - } - } - - public static string YesAndSave { - get { - return ResourceManager.GetString("YesAndSave", resourceCulture); - } - } - - public static string AutofillAndSave { - get { - return ResourceManager.GetString("AutofillAndSave", resourceCulture); - } - } - - public static string Organization { - get { - return ResourceManager.GetString("Organization", resourceCulture); - } - } - - public static string HoldYubikeyNearTop { - get { - return ResourceManager.GetString("HoldYubikeyNearTop", resourceCulture); - } - } - - public static string TryAgain { - get { - return ResourceManager.GetString("TryAgain", resourceCulture); - } - } - - public static string YubiKeyInstructionIos { - get { - return ResourceManager.GetString("YubiKeyInstructionIos", resourceCulture); - } - } - - public static string BitwardenAutofillAccessibilityServiceDescription2 { - get { - return ResourceManager.GetString("BitwardenAutofillAccessibilityServiceDescription2", resourceCulture); - } - } - - public static string DatePasswordUpdated { - get { - return ResourceManager.GetString("DatePasswordUpdated", resourceCulture); - } - } - - public static string DateUpdated { - get { - return ResourceManager.GetString("DateUpdated", resourceCulture); - } - } - - public static string AutofillActivated { - get { - return ResourceManager.GetString("AutofillActivated", resourceCulture); - } - } - - public static string MustLogInMainAppAutofill { - get { - return ResourceManager.GetString("MustLogInMainAppAutofill", resourceCulture); - } - } - - public static string AutofillSetup { - get { - return ResourceManager.GetString("AutofillSetup", resourceCulture); - } - } - - public static string AutofillSetup2 { - get { - return ResourceManager.GetString("AutofillSetup2", resourceCulture); - } - } - - public static string BitwardenAutofillDescription { - get { - return ResourceManager.GetString("BitwardenAutofillDescription", resourceCulture); - } - } - - public static string AutofillTurnOn { - get { - return ResourceManager.GetString("AutofillTurnOn", resourceCulture); - } - } - - public static string AutofillTurnOn1 { - get { - return ResourceManager.GetString("AutofillTurnOn1", resourceCulture); - } - } - - public static string AutofillTurnOn2 { - get { - return ResourceManager.GetString("AutofillTurnOn2", resourceCulture); - } - } - - public static string AutofillTurnOn3 { - get { - return ResourceManager.GetString("AutofillTurnOn3", resourceCulture); - } - } - - public static string AutofillTurnOn4 { - get { - return ResourceManager.GetString("AutofillTurnOn4", resourceCulture); - } - } - - public static string AutofillTurnOn5 { - get { - return ResourceManager.GetString("AutofillTurnOn5", resourceCulture); - } - } - - public static string PasswordAutofill { - get { - return ResourceManager.GetString("PasswordAutofill", resourceCulture); - } - } - - public static string BitwardenAutofillAlert2 { - get { - return ResourceManager.GetString("BitwardenAutofillAlert2", resourceCulture); - } - } - - public static string InvalidEmail { - get { - return ResourceManager.GetString("InvalidEmail", resourceCulture); - } - } - - public static string Cards { - get { - return ResourceManager.GetString("Cards", resourceCulture); - } - } - - public static string Identities { - get { - return ResourceManager.GetString("Identities", resourceCulture); - } - } - - public static string Logins { - get { - return ResourceManager.GetString("Logins", resourceCulture); - } - } - - public static string SecureNotes { - get { - return ResourceManager.GetString("SecureNotes", resourceCulture); - } - } - - public static string AllItems { - get { - return ResourceManager.GetString("AllItems", resourceCulture); - } - } - - public static string URIs { - get { - return ResourceManager.GetString("URIs", resourceCulture); - } - } - - public static string CheckingPassword { - get { - return ResourceManager.GetString("CheckingPassword", resourceCulture); - } - } - - public static string CheckPassword { - get { - return ResourceManager.GetString("CheckPassword", resourceCulture); - } - } - - public static string PasswordExposed { - get { - return ResourceManager.GetString("PasswordExposed", resourceCulture); - } - } - - public static string PasswordSafe { - get { - return ResourceManager.GetString("PasswordSafe", resourceCulture); - } - } - - public static string IdentityName { - get { - return ResourceManager.GetString("IdentityName", resourceCulture); - } - } - - public static string Value { - get { - return ResourceManager.GetString("Value", resourceCulture); - } - } - - public static string PasswordHistory { - get { - return ResourceManager.GetString("PasswordHistory", resourceCulture); - } - } - - public static string Types { - get { - return ResourceManager.GetString("Types", resourceCulture); - } - } - - public static string NoPasswordsToList { - get { - return ResourceManager.GetString("NoPasswordsToList", resourceCulture); - } - } - - public static string NoItemsToList { - get { - return ResourceManager.GetString("NoItemsToList", resourceCulture); - } - } - - public static string SearchCollection { - get { - return ResourceManager.GetString("SearchCollection", resourceCulture); - } - } - - public static string SearchFileSends { - get { - return ResourceManager.GetString("SearchFileSends", resourceCulture); - } - } - - public static string SearchTextSends { - get { - return ResourceManager.GetString("SearchTextSends", resourceCulture); - } - } - - public static string SearchGroup { - get { - return ResourceManager.GetString("SearchGroup", resourceCulture); - } - } - - public static string Type { - get { - return ResourceManager.GetString("Type", resourceCulture); - } - } - - public static string MoveDown { - get { - return ResourceManager.GetString("MoveDown", resourceCulture); - } - } - - public static string MoveUp { - get { - return ResourceManager.GetString("MoveUp", resourceCulture); - } - } - - public static string Miscellaneous { - get { - return ResourceManager.GetString("Miscellaneous", resourceCulture); - } - } - - public static string Ownership { - get { - return ResourceManager.GetString("Ownership", resourceCulture); - } - } - - public static string WhoOwnsThisItem { - get { - return ResourceManager.GetString("WhoOwnsThisItem", resourceCulture); - } - } - - public static string NoCollectionsToList { - get { - return ResourceManager.GetString("NoCollectionsToList", resourceCulture); - } - } - - public static string MovedItemToOrg { - get { - return ResourceManager.GetString("MovedItemToOrg", resourceCulture); - } - } - - public static string ItemShared { - get { - return ResourceManager.GetString("ItemShared", resourceCulture); - } - } - - public static string SelectOneCollection { - get { - return ResourceManager.GetString("SelectOneCollection", resourceCulture); - } - } - - public static string Share { - get { - return ResourceManager.GetString("Share", resourceCulture); - } - } - - public static string ShareItem { - get { - return ResourceManager.GetString("ShareItem", resourceCulture); - } - } - - public static string MoveToOrganization { - get { - return ResourceManager.GetString("MoveToOrganization", resourceCulture); - } - } - - public static string NoOrgsToList { - get { - return ResourceManager.GetString("NoOrgsToList", resourceCulture); - } - } - - public static string MoveToOrgDesc { - get { - return ResourceManager.GetString("MoveToOrgDesc", resourceCulture); - } - } - - public static string NumberOfWords { - get { - return ResourceManager.GetString("NumberOfWords", resourceCulture); - } - } - - public static string Passphrase { - get { - return ResourceManager.GetString("Passphrase", resourceCulture); - } - } - - public static string WordSeparator { - get { - return ResourceManager.GetString("WordSeparator", resourceCulture); - } - } - - public static string Clear { - get { - return ResourceManager.GetString("Clear", resourceCulture); - } - } - - public static string Generator { - get { - return ResourceManager.GetString("Generator", resourceCulture); - } - } - - public static string NoFoldersToList { - get { - return ResourceManager.GetString("NoFoldersToList", resourceCulture); - } - } - - public static string FingerprintPhrase { - get { - return ResourceManager.GetString("FingerprintPhrase", resourceCulture); - } - } - - public static string YourAccountsFingerprint { - get { - return ResourceManager.GetString("YourAccountsFingerprint", resourceCulture); - } - } - - public static string LearnOrgConfirmation { - get { - return ResourceManager.GetString("LearnOrgConfirmation", resourceCulture); - } - } - - public static string ExportVault { - get { - return ResourceManager.GetString("ExportVault", resourceCulture); - } - } - - public static string LockNow { - get { - return ResourceManager.GetString("LockNow", resourceCulture); - } - } - - public static string PIN { - get { - return ResourceManager.GetString("PIN", resourceCulture); - } - } - - public static string Unlock { - get { - return ResourceManager.GetString("Unlock", resourceCulture); - } - } - - public static string UnlockVault { - get { - return ResourceManager.GetString("UnlockVault", resourceCulture); - } - } - - public static string ThirtyMinutes { - get { - return ResourceManager.GetString("ThirtyMinutes", resourceCulture); - } - } - - public static string SetPINDescription { - get { - return ResourceManager.GetString("SetPINDescription", resourceCulture); - } - } - - public static string LoggedInAsOn { - get { - return ResourceManager.GetString("LoggedInAsOn", resourceCulture); - } - } - - public static string VaultLockedMasterPassword { - get { - return ResourceManager.GetString("VaultLockedMasterPassword", resourceCulture); - } - } - - public static string VaultLockedPIN { - get { - return ResourceManager.GetString("VaultLockedPIN", resourceCulture); - } - } - - public static string VaultLockedIdentity { - get { - return ResourceManager.GetString("VaultLockedIdentity", resourceCulture); - } - } - - public static string Dark { - get { - return ResourceManager.GetString("Dark", resourceCulture); - } - } - - public static string Light { - get { - return ResourceManager.GetString("Light", resourceCulture); - } - } - - public static string FiveMinutes { - get { - return ResourceManager.GetString("FiveMinutes", resourceCulture); - } - } - - public static string TenSeconds { - get { - return ResourceManager.GetString("TenSeconds", resourceCulture); - } - } - - public static string ThirtySeconds { - get { - return ResourceManager.GetString("ThirtySeconds", resourceCulture); - } - } - - public static string TwentySeconds { - get { - return ResourceManager.GetString("TwentySeconds", resourceCulture); - } - } - - public static string TwoMinutes { - get { - return ResourceManager.GetString("TwoMinutes", resourceCulture); - } - } - - public static string ClearClipboard { - get { - return ResourceManager.GetString("ClearClipboard", resourceCulture); - } - } - - public static string ClearClipboardDescription { - get { - return ResourceManager.GetString("ClearClipboardDescription", resourceCulture); - } - } - - public static string DefaultUriMatchDetection { - get { - return ResourceManager.GetString("DefaultUriMatchDetection", resourceCulture); - } - } - - public static string DefaultUriMatchDetectionDescription { - get { - return ResourceManager.GetString("DefaultUriMatchDetectionDescription", resourceCulture); - } - } - - public static string Theme { - get { - return ResourceManager.GetString("Theme", resourceCulture); - } - } - - public static string ThemeDescription { - get { - return ResourceManager.GetString("ThemeDescription", resourceCulture); - } - } - - public static string ThemeDefault { - get { - return ResourceManager.GetString("ThemeDefault", resourceCulture); - } - } - - public static string DefaultDarkTheme { - get { - return ResourceManager.GetString("DefaultDarkTheme", resourceCulture); - } - } - - public static string DefaultDarkThemeDescription { - get { - return ResourceManager.GetString("DefaultDarkThemeDescription", resourceCulture); - } - } - - public static string CopyNotes { - get { - return ResourceManager.GetString("CopyNotes", resourceCulture); - } - } - - public static string Exit { - get { - return ResourceManager.GetString("Exit", resourceCulture); - } - } - - public static string ExitConfirmation { - get { - return ResourceManager.GetString("ExitConfirmation", resourceCulture); - } - } - - public static string PINRequireMasterPasswordRestart { - get { - return ResourceManager.GetString("PINRequireMasterPasswordRestart", resourceCulture); - } - } - - public static string Black { - get { - return ResourceManager.GetString("Black", resourceCulture); - } - } - - public static string Nord { - get { - return ResourceManager.GetString("Nord", resourceCulture); - } - } - - public static string BlacklistedUris { - get { - return ResourceManager.GetString("BlacklistedUris", resourceCulture); - } - } - - public static string BlacklistedUrisDescription { - get { - return ResourceManager.GetString("BlacklistedUrisDescription", resourceCulture); - } - } - - public static string AskToAddLogin { - get { - return ResourceManager.GetString("AskToAddLogin", resourceCulture); - } - } - - public static string AskToAddLoginDescription { - get { - return ResourceManager.GetString("AskToAddLoginDescription", resourceCulture); - } - } - - public static string OnRestart { - get { - return ResourceManager.GetString("OnRestart", resourceCulture); - } - } - - public static string AutofillServiceNotEnabled { - get { - return ResourceManager.GetString("AutofillServiceNotEnabled", resourceCulture); - } - } - - public static string ThemeAppliedOnRestart { - get { - return ResourceManager.GetString("ThemeAppliedOnRestart", resourceCulture); - } - } - - public static string Capitalize { - get { - return ResourceManager.GetString("Capitalize", resourceCulture); - } - } - - public static string IncludeNumber { - get { - return ResourceManager.GetString("IncludeNumber", resourceCulture); - } - } - - public static string Download { - get { - return ResourceManager.GetString("Download", resourceCulture); - } - } - - public static string Shared { - get { - return ResourceManager.GetString("Shared", resourceCulture); - } - } - - public static string ToggleVisibility { - get { - return ResourceManager.GetString("ToggleVisibility", resourceCulture); - } - } - - public static string LoginExpired { - get { - return ResourceManager.GetString("LoginExpired", resourceCulture); - } - } - - public static string BiometricsDirection { - get { - return ResourceManager.GetString("BiometricsDirection", resourceCulture); - } - } - - public static string Biometrics { - get { - return ResourceManager.GetString("Biometrics", resourceCulture); - } - } - - public static string UseBiometricsToUnlock { - get { - return ResourceManager.GetString("UseBiometricsToUnlock", resourceCulture); - } - } - - public static string AccessibilityOverlayPermissionAlert { - get { - return ResourceManager.GetString("AccessibilityOverlayPermissionAlert", resourceCulture); - } - } - - public static string BitwardenAutofillServiceOverlayPermission { - get { - return ResourceManager.GetString("BitwardenAutofillServiceOverlayPermission", resourceCulture); - } - } - - public static string OverlayPermission { - get { - return ResourceManager.GetString("OverlayPermission", resourceCulture); - } - } - - public static string BitwardenAutofillServiceOpenOverlayPermissionSettings { - get { - return ResourceManager.GetString("BitwardenAutofillServiceOpenOverlayPermissionSettings", resourceCulture); - } - } - - public static string BitwardenAutofillServiceStep3 { - get { - return ResourceManager.GetString("BitwardenAutofillServiceStep3", resourceCulture); - } - } - - public static string Denied { - get { - return ResourceManager.GetString("Denied", resourceCulture); - } - } - - public static string Granted { - get { - return ResourceManager.GetString("Granted", resourceCulture); - } - } - - public static string FileFormat { - get { - return ResourceManager.GetString("FileFormat", resourceCulture); - } - } - - public static string ExportVaultMasterPasswordDescription { - get { - return ResourceManager.GetString("ExportVaultMasterPasswordDescription", resourceCulture); - } - } - - public static string SendVerificationCodeToEmail { - get { - return ResourceManager.GetString("SendVerificationCodeToEmail", resourceCulture); - } - } - - public static string CodeSent { - get { - return ResourceManager.GetString("CodeSent", resourceCulture); - } - } - - public static string ConfirmYourIdentity { - get { - return ResourceManager.GetString("ConfirmYourIdentity", resourceCulture); - } - } - - public static string ExportVaultWarning { - get { - return ResourceManager.GetString("ExportVaultWarning", resourceCulture); - } - } - - public static string EncExportKeyWarning { - get { - return ResourceManager.GetString("EncExportKeyWarning", resourceCulture); - } - } - - public static string EncExportAccountWarning { - get { - return ResourceManager.GetString("EncExportAccountWarning", resourceCulture); - } - } - - public static string ExportVaultConfirmationTitle { - get { - return ResourceManager.GetString("ExportVaultConfirmationTitle", resourceCulture); - } - } - - public static string Warning { - get { - return ResourceManager.GetString("Warning", resourceCulture); - } - } - - public static string ExportVaultFailure { - get { - return ResourceManager.GetString("ExportVaultFailure", resourceCulture); - } - } - - public static string ExportVaultSuccess { - get { - return ResourceManager.GetString("ExportVaultSuccess", resourceCulture); - } - } - - public static string Clone { - get { - return ResourceManager.GetString("Clone", resourceCulture); - } - } - - public static string PasswordGeneratorPolicyInEffect { - get { - return ResourceManager.GetString("PasswordGeneratorPolicyInEffect", resourceCulture); - } - } - - public static string Open { - get { - return ResourceManager.GetString("Open", resourceCulture); - } - } - - public static string UnableToSaveAttachment { - get { - return ResourceManager.GetString("UnableToSaveAttachment", resourceCulture); - } - } - - public static string SaveAttachmentSuccess { - get { - return ResourceManager.GetString("SaveAttachmentSuccess", resourceCulture); - } - } - - public static string AutofillTileAccessibilityRequired { - get { - return ResourceManager.GetString("AutofillTileAccessibilityRequired", resourceCulture); - } - } - - public static string AutofillTileUriNotFound { - get { - return ResourceManager.GetString("AutofillTileUriNotFound", resourceCulture); - } - } - - public static string SoftDeleting { - get { - return ResourceManager.GetString("SoftDeleting", resourceCulture); - } - } - - public static string ItemSoftDeleted { - get { - return ResourceManager.GetString("ItemSoftDeleted", resourceCulture); - } - } - - public static string Restore { - get { - return ResourceManager.GetString("Restore", resourceCulture); - } - } - - public static string Restoring { - get { - return ResourceManager.GetString("Restoring", resourceCulture); - } - } - - public static string ItemRestored { - get { - return ResourceManager.GetString("ItemRestored", resourceCulture); - } - } - - public static string Trash { - get { - return ResourceManager.GetString("Trash", resourceCulture); - } - } - - public static string SearchTrash { - get { - return ResourceManager.GetString("SearchTrash", resourceCulture); - } - } - - public static string DoYouReallyWantToPermanentlyDeleteCipher { - get { - return ResourceManager.GetString("DoYouReallyWantToPermanentlyDeleteCipher", resourceCulture); - } - } - - public static string DoYouReallyWantToRestoreCipher { - get { - return ResourceManager.GetString("DoYouReallyWantToRestoreCipher", resourceCulture); - } - } - - public static string DoYouReallyWantToSoftDeleteCipher { - get { - return ResourceManager.GetString("DoYouReallyWantToSoftDeleteCipher", resourceCulture); - } - } - - public static string BiometricInvalidated { - get { - return ResourceManager.GetString("BiometricInvalidated", resourceCulture); - } - } - - public static string BiometricInvalidatedExtension { - get { - return ResourceManager.GetString("BiometricInvalidatedExtension", resourceCulture); - } - } - - public static string EnableSyncOnRefresh { - get { - return ResourceManager.GetString("EnableSyncOnRefresh", resourceCulture); - } - } - - public static string EnableSyncOnRefreshDescription { - get { - return ResourceManager.GetString("EnableSyncOnRefreshDescription", resourceCulture); - } - } - - public static string LogInSso { - get { - return ResourceManager.GetString("LogInSso", resourceCulture); - } - } - - public static string LogInSsoSummary { - get { - return ResourceManager.GetString("LogInSsoSummary", resourceCulture); - } - } - - public static string OrgIdentifier { - get { - return ResourceManager.GetString("OrgIdentifier", resourceCulture); - } - } - - public static string LoginSsoError { - get { - return ResourceManager.GetString("LoginSsoError", resourceCulture); - } - } - - public static string SetMasterPassword { - get { - return ResourceManager.GetString("SetMasterPassword", resourceCulture); - } - } - - public static string SetMasterPasswordSummary { - get { - return ResourceManager.GetString("SetMasterPasswordSummary", resourceCulture); - } - } - - public static string MasterPasswordPolicyInEffect { - get { - return ResourceManager.GetString("MasterPasswordPolicyInEffect", resourceCulture); - } - } - - public static string PolicyInEffectMinComplexity { - get { - return ResourceManager.GetString("PolicyInEffectMinComplexity", resourceCulture); - } - } - - public static string PolicyInEffectMinLength { - get { - return ResourceManager.GetString("PolicyInEffectMinLength", resourceCulture); - } - } - - public static string PolicyInEffectUppercase { - get { - return ResourceManager.GetString("PolicyInEffectUppercase", resourceCulture); - } - } - - public static string PolicyInEffectLowercase { - get { - return ResourceManager.GetString("PolicyInEffectLowercase", resourceCulture); - } - } - - public static string PolicyInEffectNumbers { - get { - return ResourceManager.GetString("PolicyInEffectNumbers", resourceCulture); - } - } - - public static string PolicyInEffectSpecial { - get { - return ResourceManager.GetString("PolicyInEffectSpecial", resourceCulture); - } - } - - public static string MasterPasswordPolicyValidationTitle { - get { - return ResourceManager.GetString("MasterPasswordPolicyValidationTitle", resourceCulture); - } - } - - public static string MasterPasswordPolicyValidationMessage { - get { - return ResourceManager.GetString("MasterPasswordPolicyValidationMessage", resourceCulture); - } - } - - public static string Loading { - get { - return ResourceManager.GetString("Loading", resourceCulture); - } - } - - public static string AcceptPolicies { - get { - return ResourceManager.GetString("AcceptPolicies", resourceCulture); - } - } - - public static string AcceptPoliciesError { - get { - return ResourceManager.GetString("AcceptPoliciesError", resourceCulture); - } - } - - public static string TermsOfService { - get { - return ResourceManager.GetString("TermsOfService", resourceCulture); - } - } - - public static string PrivacyPolicy { - get { - return ResourceManager.GetString("PrivacyPolicy", resourceCulture); - } - } - - public static string AccessibilityDrawOverPermissionAlert { - get { - return ResourceManager.GetString("AccessibilityDrawOverPermissionAlert", resourceCulture); - } - } - - public static string AutofillServices { - get { - return ResourceManager.GetString("AutofillServices", resourceCulture); - } - } - - public static string InlineAutofill { - get { - return ResourceManager.GetString("InlineAutofill", resourceCulture); - } - } - - public static string InlineAutofillDescription { - get { - return ResourceManager.GetString("InlineAutofillDescription", resourceCulture); - } - } - - public static string Accessibility { - get { - return ResourceManager.GetString("Accessibility", resourceCulture); - } - } - - public static string AccessibilityDescription { - get { - return ResourceManager.GetString("AccessibilityDescription", resourceCulture); - } - } - - public static string AccessibilityDescription2 { - get { - return ResourceManager.GetString("AccessibilityDescription2", resourceCulture); - } - } - - public static string AccessibilityDescription3 { - get { - return ResourceManager.GetString("AccessibilityDescription3", resourceCulture); - } - } - - public static string AccessibilityDescription4 { - get { - return ResourceManager.GetString("AccessibilityDescription4", resourceCulture); - } - } - - public static string DrawOver { - get { - return ResourceManager.GetString("DrawOver", resourceCulture); - } - } - - public static string DrawOverDescription { - get { - return ResourceManager.GetString("DrawOverDescription", resourceCulture); - } - } - - public static string DrawOverDescription2 { - get { - return ResourceManager.GetString("DrawOverDescription2", resourceCulture); - } - } - - public static string DrawOverDescription3 { - get { - return ResourceManager.GetString("DrawOverDescription3", resourceCulture); - } - } - - public static string PersonalOwnershipSubmitError { - get { - return ResourceManager.GetString("PersonalOwnershipSubmitError", resourceCulture); - } - } - - public static string PersonalOwnershipPolicyInEffect { - get { - return ResourceManager.GetString("PersonalOwnershipPolicyInEffect", resourceCulture); - } - } - - public static string Send { - get { - return ResourceManager.GetString("Send", resourceCulture); - } - } - - public static string AllSends { - get { - return ResourceManager.GetString("AllSends", resourceCulture); - } - } - - public static string Sends { - get { - return ResourceManager.GetString("Sends", resourceCulture); - } - } - - public static string NameInfo { - get { - return ResourceManager.GetString("NameInfo", resourceCulture); - } - } - - public static string Text { - get { - return ResourceManager.GetString("Text", resourceCulture); - } - } - - public static string TypeText { - get { - return ResourceManager.GetString("TypeText", resourceCulture); - } - } - - public static string TypeTextInfo { - get { - return ResourceManager.GetString("TypeTextInfo", resourceCulture); - } - } - - public static string HideTextByDefault { - get { - return ResourceManager.GetString("HideTextByDefault", resourceCulture); - } - } - - public static string TypeFile { - get { - return ResourceManager.GetString("TypeFile", resourceCulture); - } - } - - public static string TypeFileInfo { - get { - return ResourceManager.GetString("TypeFileInfo", resourceCulture); - } - } - - public static string FileTypeIsSelected { - get { - return ResourceManager.GetString("FileTypeIsSelected", resourceCulture); - } - } - - public static string FileTypeIsNotSelected { - get { - return ResourceManager.GetString("FileTypeIsNotSelected", resourceCulture); - } - } - - public static string TextTypeIsSelected { - get { - return ResourceManager.GetString("TextTypeIsSelected", resourceCulture); - } - } - - public static string TextTypeIsNotSelected { - get { - return ResourceManager.GetString("TextTypeIsNotSelected", resourceCulture); - } - } - - public static string DeletionDate { - get { - return ResourceManager.GetString("DeletionDate", resourceCulture); - } - } - - public static string DeletionTime { - get { - return ResourceManager.GetString("DeletionTime", resourceCulture); - } - } - - public static string DeletionDateInfo { - get { - return ResourceManager.GetString("DeletionDateInfo", resourceCulture); - } - } - - public static string PendingDelete { - get { - return ResourceManager.GetString("PendingDelete", resourceCulture); - } - } - - public static string ExpirationDate { - get { - return ResourceManager.GetString("ExpirationDate", resourceCulture); - } - } - - public static string ExpirationTime { - get { - return ResourceManager.GetString("ExpirationTime", resourceCulture); - } - } - - public static string ExpirationDateInfo { - get { - return ResourceManager.GetString("ExpirationDateInfo", resourceCulture); - } - } - - public static string Expired { - get { - return ResourceManager.GetString("Expired", resourceCulture); - } - } - - public static string MaximumAccessCount { - get { - return ResourceManager.GetString("MaximumAccessCount", resourceCulture); - } - } - - public static string MaximumAccessCountInfo { - get { - return ResourceManager.GetString("MaximumAccessCountInfo", resourceCulture); - } - } - - public static string MaximumAccessCountReached { - get { - return ResourceManager.GetString("MaximumAccessCountReached", resourceCulture); - } - } - - public static string CurrentAccessCount { - get { - return ResourceManager.GetString("CurrentAccessCount", resourceCulture); - } - } - - public static string NewPassword { - get { - return ResourceManager.GetString("NewPassword", resourceCulture); - } - } - - public static string PasswordInfo { - get { - return ResourceManager.GetString("PasswordInfo", resourceCulture); - } - } - - public static string RemovePassword { - get { - return ResourceManager.GetString("RemovePassword", resourceCulture); - } - } - - public static string AreYouSureRemoveSendPassword { - get { - return ResourceManager.GetString("AreYouSureRemoveSendPassword", resourceCulture); - } - } - - public static string RemovingSendPassword { - get { - return ResourceManager.GetString("RemovingSendPassword", resourceCulture); - } - } - - public static string SendPasswordRemoved { - get { - return ResourceManager.GetString("SendPasswordRemoved", resourceCulture); - } - } - - public static string NotesInfo { - get { - return ResourceManager.GetString("NotesInfo", resourceCulture); - } - } - - public static string DisableSend { - get { - return ResourceManager.GetString("DisableSend", resourceCulture); - } - } - - public static string NoSends { - get { - return ResourceManager.GetString("NoSends", resourceCulture); - } - } - - public static string AddASend { - get { - return ResourceManager.GetString("AddASend", resourceCulture); - } - } - - public static string CopyLink { - get { - return ResourceManager.GetString("CopyLink", resourceCulture); - } - } - - public static string ShareLink { - get { - return ResourceManager.GetString("ShareLink", resourceCulture); - } - } - - public static string SendLink { - get { - return ResourceManager.GetString("SendLink", resourceCulture); - } - } - - public static string SearchSends { - get { - return ResourceManager.GetString("SearchSends", resourceCulture); - } - } - - public static string EditSend { - get { - return ResourceManager.GetString("EditSend", resourceCulture); - } - } - - public static string AddSend { - get { - return ResourceManager.GetString("AddSend", resourceCulture); - } - } - - public static string AreYouSureDeleteSend { - get { - return ResourceManager.GetString("AreYouSureDeleteSend", resourceCulture); - } - } - - public static string SendDeleted { - get { - return ResourceManager.GetString("SendDeleted", resourceCulture); - } - } - - public static string SendUpdated { - get { - return ResourceManager.GetString("SendUpdated", resourceCulture); - } - } - - public static string NewSendCreated { - get { - return ResourceManager.GetString("NewSendCreated", resourceCulture); - } - } - - public static string OneDay { - get { - return ResourceManager.GetString("OneDay", resourceCulture); - } - } - - public static string TwoDays { - get { - return ResourceManager.GetString("TwoDays", resourceCulture); - } - } - - public static string ThreeDays { - get { - return ResourceManager.GetString("ThreeDays", resourceCulture); - } - } - - public static string SevenDays { - get { - return ResourceManager.GetString("SevenDays", resourceCulture); - } - } - - public static string ThirtyDays { - get { - return ResourceManager.GetString("ThirtyDays", resourceCulture); - } - } - - public static string Custom { - get { - return ResourceManager.GetString("Custom", resourceCulture); - } - } - - public static string ShareOnSave { - get { - return ResourceManager.GetString("ShareOnSave", resourceCulture); - } - } - - public static string SendDisabledWarning { - get { - return ResourceManager.GetString("SendDisabledWarning", resourceCulture); - } - } - + /// + /// Looks up a localized string similar to About Send. + /// public static string AboutSend { get { return ResourceManager.GetString("AboutSend", resourceCulture); } } - public static string HideEmail { + /// + /// Looks up a localized string similar to By activating this switch you agree to the following: + ///. + /// + public static string AcceptPolicies { get { - return ResourceManager.GetString("HideEmail", resourceCulture); + return ResourceManager.GetString("AcceptPolicies", resourceCulture); } } - public static string SendOptionsPolicyInEffect { + /// + /// Looks up a localized string similar to Terms of Service and Privacy Policy have not been acknowledged.. + /// + public static string AcceptPoliciesError { get { - return ResourceManager.GetString("SendOptionsPolicyInEffect", resourceCulture); + return ResourceManager.GetString("AcceptPoliciesError", resourceCulture); } } - public static string SendFilePremiumRequired { + /// + /// Looks up a localized string similar to Use Accessibility. + /// + public static string Accessibility { get { - return ResourceManager.GetString("SendFilePremiumRequired", resourceCulture); + return ResourceManager.GetString("Accessibility", resourceCulture); } } - public static string SendFileEmailVerificationRequired { + /// + /// Looks up a localized string similar to Use the Bitwarden Accessibility Service to auto-fill your logins across apps and the web. When enabled, we'll display a popup when login fields are selected.. + /// + public static string AccessibilityDescription { get { - return ResourceManager.GetString("SendFileEmailVerificationRequired", resourceCulture); + return ResourceManager.GetString("AccessibilityDescription", resourceCulture); } } - public static string PasswordPrompt { + /// + /// Looks up a localized string similar to Use the Bitwarden Accessibility Service to auto-fill your logins across apps and the web. (Requires Draw-Over to be enabled as well). + /// + public static string AccessibilityDescription2 { get { - return ResourceManager.GetString("PasswordPrompt", resourceCulture); + return ResourceManager.GetString("AccessibilityDescription2", resourceCulture); } } - public static string PasswordConfirmation { + /// + /// Looks up a localized string similar to Use the Bitwarden Accessibility Service to use the Autofill Quick-Action Tile, and/or show a popup using Draw-Over (if enabled).. + /// + public static string AccessibilityDescription3 { get { - return ResourceManager.GetString("PasswordConfirmation", resourceCulture); + return ResourceManager.GetString("AccessibilityDescription3", resourceCulture); } } - public static string PasswordConfirmationDesc { + /// + /// Looks up a localized string similar to Required to use the Autofill Quick-Action Tile, or to augment the Autofill Service by using Draw-Over (if enabled).. + /// + public static string AccessibilityDescription4 { get { - return ResourceManager.GetString("PasswordConfirmationDesc", resourceCulture); + return ResourceManager.GetString("AccessibilityDescription4", resourceCulture); } } - public static string CaptchaRequired { + /// + /// Looks up a localized string similar to Bitwarden needs attention - Enable "Draw-Over" in "Auto-fill Services" from Bitwarden Settings. + /// + public static string AccessibilityDrawOverPermissionAlert { get { - return ResourceManager.GetString("CaptchaRequired", resourceCulture); + return ResourceManager.GetString("AccessibilityDrawOverPermissionAlert", resourceCulture); } } - public static string CaptchaFailed { + /// + /// Looks up a localized string similar to Bitwarden needs attention - See "Auto-fill Accessibility Service" from Bitwarden Settings. + /// + public static string AccessibilityOverlayPermissionAlert { get { - return ResourceManager.GetString("CaptchaFailed", resourceCulture); + return ResourceManager.GetString("AccessibilityOverlayPermissionAlert", resourceCulture); } } - public static string UpdatedMasterPassword { + /// + /// Looks up a localized string similar to Account. + /// + public static string Account { get { - return ResourceManager.GetString("UpdatedMasterPassword", resourceCulture); + return ResourceManager.GetString("Account", resourceCulture); } } - public static string UpdateMasterPassword { + /// + /// Looks up a localized string similar to Account Already Added. + /// + public static string AccountAlreadyAdded { get { - return ResourceManager.GetString("UpdateMasterPassword", resourceCulture); + return ResourceManager.GetString("AccountAlreadyAdded", resourceCulture); } } - public static string UpdateMasterPasswordWarning { + /// + /// Looks up a localized string similar to Your new account has been created! You may now log in.. + /// + public static string AccountCreated { get { - return ResourceManager.GetString("UpdateMasterPasswordWarning", resourceCulture); - } - } - - public static string UpdatingPassword { - get { - return ResourceManager.GetString("UpdatingPassword", resourceCulture); - } - } - - public static string UpdatePasswordError { - get { - return ResourceManager.GetString("UpdatePasswordError", resourceCulture); - } - } - - public static string RemoveMasterPassword { - get { - return ResourceManager.GetString("RemoveMasterPassword", resourceCulture); - } - } - - public static string RemoveMasterPasswordWarning { - get { - return ResourceManager.GetString("RemoveMasterPasswordWarning", resourceCulture); - } - } - - public static string RemoveMasterPasswordWarning2 { - get { - return ResourceManager.GetString("RemoveMasterPasswordWarning2", resourceCulture); - } - } - - public static string LeaveOrganization { - get { - return ResourceManager.GetString("LeaveOrganization", resourceCulture); - } - } - - public static string LeaveOrganizationName { - get { - return ResourceManager.GetString("LeaveOrganizationName", resourceCulture); - } - } - - public static string Fido2Title { - get { - return ResourceManager.GetString("Fido2Title", resourceCulture); - } - } - - public static string Fido2Instruction { - get { - return ResourceManager.GetString("Fido2Instruction", resourceCulture); - } - } - - public static string Fido2Desc { - get { - return ResourceManager.GetString("Fido2Desc", resourceCulture); - } - } - - public static string Fido2AuthenticateWebAuthn { - get { - return ResourceManager.GetString("Fido2AuthenticateWebAuthn", resourceCulture); - } - } - - public static string Fido2ReturnToApp { - get { - return ResourceManager.GetString("Fido2ReturnToApp", resourceCulture); - } - } - - public static string Fido2CheckBrowser { - get { - return ResourceManager.GetString("Fido2CheckBrowser", resourceCulture); - } - } - - public static string ResetPasswordAutoEnrollInviteWarning { - get { - return ResourceManager.GetString("ResetPasswordAutoEnrollInviteWarning", resourceCulture); - } - } - - public static string VaultTimeoutPolicyInEffect { - get { - return ResourceManager.GetString("VaultTimeoutPolicyInEffect", resourceCulture); - } - } - - public static string VaultTimeoutToLarge { - get { - return ResourceManager.GetString("VaultTimeoutToLarge", resourceCulture); - } - } - - public static string DisablePersonalVaultExportPolicyInEffect { - get { - return ResourceManager.GetString("DisablePersonalVaultExportPolicyInEffect", resourceCulture); - } - } - - public static string AddAccount { - get { - return ResourceManager.GetString("AddAccount", resourceCulture); - } - } - - public static string AccountUnlocked { - get { - return ResourceManager.GetString("AccountUnlocked", resourceCulture); + return ResourceManager.GetString("AccountCreated", resourceCulture); } } + /// + /// Looks up a localized string similar to Locked. + /// public static string AccountLocked { get { return ResourceManager.GetString("AccountLocked", resourceCulture); } } - public static string AccountLoggedOut { - get { - return ResourceManager.GetString("AccountLoggedOut", resourceCulture); - } - } - - public static string AccountSwitchedAutomatically { - get { - return ResourceManager.GetString("AccountSwitchedAutomatically", resourceCulture); - } - } - + /// + /// Looks up a localized string similar to Account Locked. + /// public static string AccountLockedSuccessfully { get { return ResourceManager.GetString("AccountLockedSuccessfully", resourceCulture); } } + /// + /// Looks up a localized string similar to Logged Out. + /// + public static string AccountLoggedOut { + get { + return ResourceManager.GetString("AccountLoggedOut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Account logged out successfully. + /// public static string AccountLoggedOutSuccessfully { get { return ResourceManager.GetString("AccountLoggedOutSuccessfully", resourceCulture); } } + /// + /// Looks up a localized string similar to Account removed successfully. + /// public static string AccountRemovedSuccessfully { get { return ResourceManager.GetString("AccountRemovedSuccessfully", resourceCulture); } } - public static string DeleteAccount { + /// + /// Looks up a localized string similar to Switched to next available account. + /// + public static string AccountSwitchedAutomatically { get { - return ResourceManager.GetString("DeleteAccount", resourceCulture); + return ResourceManager.GetString("AccountSwitchedAutomatically", resourceCulture); } } - public static string DeletingYourAccountIsPermanent { + /// + /// Looks up a localized string similar to Unlocked. + /// + public static string AccountUnlocked { get { - return ResourceManager.GetString("DeletingYourAccountIsPermanent", resourceCulture); + return ResourceManager.GetString("AccountUnlocked", resourceCulture); } } - public static string DeleteAccountExplanation { + /// + /// Looks up a localized string similar to Add. + /// + public static string Add { get { - return ResourceManager.GetString("DeleteAccountExplanation", resourceCulture); + return ResourceManager.GetString("Add", resourceCulture); } } - public static string DeletingYourAccount { + /// + /// Looks up a localized string similar to Add Account. + /// + public static string AddAccount { get { - return ResourceManager.GetString("DeletingYourAccount", resourceCulture); + return ResourceManager.GetString("AddAccount", resourceCulture); } } - public static string YourAccountHasBeenPermanentlyDeleted { + /// + /// Looks up a localized string similar to Add an Item. + /// + public static string AddAnItem { get { - return ResourceManager.GetString("YourAccountHasBeenPermanentlyDeleted", resourceCulture); + return ResourceManager.GetString("AddAnItem", resourceCulture); } } - public static string InvalidVerificationCode { + /// + /// Looks up a localized string similar to Add a Send. + /// + public static string AddASend { get { - return ResourceManager.GetString("InvalidVerificationCode", resourceCulture); + return ResourceManager.GetString("AddASend", resourceCulture); } } - public static string RequestOTP { + /// + /// Looks up a localized string similar to Add Folder. + /// + public static string AddFolder { get { - return ResourceManager.GetString("RequestOTP", resourceCulture); + return ResourceManager.GetString("AddFolder", resourceCulture); } } - public static string SendCode { + /// + /// Looks up a localized string similar to Add Item. + /// + public static string AddItem { get { - return ResourceManager.GetString("SendCode", resourceCulture); + return ResourceManager.GetString("AddItem", resourceCulture); } } - public static string Sending { + /// + /// Looks up a localized string similar to Add New Attachment. + /// + public static string AddNewAttachment { get { - return ResourceManager.GetString("Sending", resourceCulture); + return ResourceManager.GetString("AddNewAttachment", resourceCulture); } } - public static string CopySendLinkOnSave { + /// + /// Looks up a localized string similar to Address. + /// + public static string Address { get { - return ResourceManager.GetString("CopySendLinkOnSave", resourceCulture); + return ResourceManager.GetString("Address", resourceCulture); } } - public static string SendingCode { + /// + /// Looks up a localized string similar to Address 1. + /// + public static string Address1 { get { - return ResourceManager.GetString("SendingCode", resourceCulture); + return ResourceManager.GetString("Address1", resourceCulture); } } - public static string Verifying { + /// + /// Looks up a localized string similar to Address 2. + /// + public static string Address2 { get { - return ResourceManager.GetString("Verifying", resourceCulture); + return ResourceManager.GetString("Address2", resourceCulture); } } - public static string ResendCode { + /// + /// Looks up a localized string similar to Address 3. + /// + public static string Address3 { get { - return ResourceManager.GetString("ResendCode", resourceCulture); + return ResourceManager.GetString("Address3", resourceCulture); } } - public static string AVerificationCodeWasSentToYourEmail { + /// + /// Looks up a localized string similar to Add Send. + /// + public static string AddSend { get { - return ResourceManager.GetString("AVerificationCodeWasSentToYourEmail", resourceCulture); + return ResourceManager.GetString("AddSend", resourceCulture); } } - public static string AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain { + /// + /// Looks up a localized string similar to All. + /// + public static string All { get { - return ResourceManager.GetString("AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain", resourceCulture); + return ResourceManager.GetString("All", resourceCulture); } } - public static string EnterTheVerificationCodeThatWasSentToYourEmail { + /// + /// Looks up a localized string similar to All Items. + /// + public static string AllItems { get { - return ResourceManager.GetString("EnterTheVerificationCodeThatWasSentToYourEmail", resourceCulture); + return ResourceManager.GetString("AllItems", resourceCulture); } } - public static string SubmitCrashLogs { + /// + /// Looks up a localized string similar to Allow Screen Capture. + /// + public static string AllowScreenCapture { get { - return ResourceManager.GetString("SubmitCrashLogs", resourceCulture); + return ResourceManager.GetString("AllowScreenCapture", resourceCulture); } } - public static string SubmitCrashLogsDescription { + /// + /// Looks up a localized string similar to All Sends. + /// + public static string AllSends { get { - return ResourceManager.GetString("SubmitCrashLogsDescription", resourceCulture); - } - } - - public static string OptionsExpanded { - get { - return ResourceManager.GetString("OptionsExpanded", resourceCulture); - } - } - - public static string OptionsCollapsed { - get { - return ResourceManager.GetString("OptionsCollapsed", resourceCulture); - } - } - - public static string UppercaseAtoZ { - get { - return ResourceManager.GetString("UppercaseAtoZ", resourceCulture); - } - } - - public static string LowercaseAtoZ { - get { - return ResourceManager.GetString("LowercaseAtoZ", resourceCulture); - } - } - - public static string NumbersZeroToNine { - get { - return ResourceManager.GetString("NumbersZeroToNine", resourceCulture); - } - } - - public static string SpecialCharacters { - get { - return ResourceManager.GetString("SpecialCharacters", resourceCulture); - } - } - - public static string TapToGoBack { - get { - return ResourceManager.GetString("TapToGoBack", resourceCulture); - } - } - - public static string PasswordIsVisibleTapToHide { - get { - return ResourceManager.GetString("PasswordIsVisibleTapToHide", resourceCulture); - } - } - - public static string PasswordIsNotVisibleTapToShow { - get { - return ResourceManager.GetString("PasswordIsNotVisibleTapToShow", resourceCulture); - } - } - - public static string FilterByVault { - get { - return ResourceManager.GetString("FilterByVault", resourceCulture); + return ResourceManager.GetString("AllSends", resourceCulture); } } + /// + /// Looks up a localized string similar to All Vaults. + /// public static string AllVaults { get { return ResourceManager.GetString("AllVaults", resourceCulture); } } - public static string Vaults { + /// + /// Looks up a localized string similar to An error has occurred.. + /// + public static string AnErrorHasOccurred { get { - return ResourceManager.GetString("Vaults", resourceCulture); + return ResourceManager.GetString("AnErrorHasOccurred", resourceCulture); } } - public static string VaultFilterDescription { + /// + /// Looks up a localized string similar to An error occurred while sending a verification code to your email. Please try again. + /// + public static string AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain { get { - return ResourceManager.GetString("VaultFilterDescription", resourceCulture); + return ResourceManager.GetString("AnErrorOccurredWhileSendingAVerificationCodeToYourEmailPleaseTryAgain", resourceCulture); } } - public static string All { + /// + /// Looks up a localized string similar to API Server URL. + /// + public static string ApiUrl { get { - return ResourceManager.GetString("All", resourceCulture); - } - } - - public static string NeverLockWarning - { - get - { - return ResourceManager.GetString("NeverLockWarning", resourceCulture); + return ResourceManager.GetString("ApiUrl", resourceCulture); } } + /// + /// Looks up a localized string similar to App extension. + /// + public static string AppExtension { + get { + return ResourceManager.GetString("AppExtension", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to April. + /// + public static string April { + get { + return ResourceManager.GetString("April", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to delete this Send?. + /// + public static string AreYouSureDeleteSend { + get { + return ResourceManager.GetString("AreYouSureDeleteSend", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to remove the password?. + /// + public static string AreYouSureRemoveSendPassword { + get { + return ResourceManager.GetString("AreYouSureRemoveSendPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to enable Screen Capture?. + /// + public static string AreYouSureYouWantToEnableScreenCapture { + get { + return ResourceManager.GetString("AreYouSureYouWantToEnableScreenCapture", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ask to add login. + /// + public static string AskToAddLogin { + get { + return ResourceManager.GetString("AskToAddLogin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ask to add an item if one isn't found in your vault.. + /// + public static string AskToAddLoginDescription { + get { + return ResourceManager.GetString("AskToAddLoginDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attachment added. + /// + public static string AttachementAdded { + get { + return ResourceManager.GetString("AttachementAdded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attachment deleted. + /// + public static string AttachmentDeleted { + get { + return ResourceManager.GetString("AttachmentDeleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This attachment is {0} in size. Are you sure you want to download it onto your device?. + /// + public static string AttachmentLargeWarning { + get { + return ResourceManager.GetString("AttachmentLargeWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attachments. + /// + public static string Attachments { + get { + return ResourceManager.GetString("Attachments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to August. + /// + public static string August { + get { + return ResourceManager.GetString("August", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authenticator App. + /// + public static string AuthenticatorAppTitle { + get { + return ResourceManager.GetString("AuthenticatorAppTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authenticator Key (TOTP). + /// + public static string AuthenticatorKey { + get { + return ResourceManager.GetString("AuthenticatorKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authenticator key added.. + /// + public static string AuthenticatorKeyAdded { + get { + return ResourceManager.GetString("AuthenticatorKeyAdded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot read authenticator key.. + /// + public static string AuthenticatorKeyReadError { + get { + return ResourceManager.GetString("AuthenticatorKeyReadError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill. + /// + public static string Autofill { + get { + return ResourceManager.GetString("Autofill", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the Bitwarden accessibility service to auto-fill your logins across apps and the web.. + /// + public static string AutofillAccessibilityDescription { + get { + return ResourceManager.GetString("AutofillAccessibilityDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill Accessibility Service. + /// + public static string AutofillAccessibilityService { + get { + return ResourceManager.GetString("AutofillAccessibilityService", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to AutoFill Activated!. + /// + public static string AutofillActivated { + get { + return ResourceManager.GetString("AutofillActivated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill and save. + /// + public static string AutofillAndSave { + get { + return ResourceManager.GetString("AutofillAndSave", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to auto-fill or view this item?. + /// + public static string AutofillOrView { + get { + return ResourceManager.GetString("AutofillOrView", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill Service. + /// + public static string AutofillService { + get { + return ResourceManager.GetString("AutofillService", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Bitwarden auto-fill service uses the Android Autofill Framework to assist in filling login information into other apps on your device.. + /// + public static string AutofillServiceDescription { + get { + return ResourceManager.GetString("AutofillServiceDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill makes it easy to securely access your Bitwarden vault from other websites and apps. It looks like you have not enabled an auto-fill service for Bitwarden. Enable auto-fill for Bitwarden from the "Settings" screen.. + /// + public static string AutofillServiceNotEnabled { + get { + return ResourceManager.GetString("AutofillServiceNotEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill Services. + /// + public static string AutofillServices { + get { + return ResourceManager.GetString("AutofillServices", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your logins are now easily accessible right from your keyboard while logging into apps and websites.. + /// + public static string AutofillSetup { + get { + return ResourceManager.GetString("AutofillSetup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to We recommend disabling any other AutoFill apps under Settings if you do not plan to use them.. + /// + public static string AutofillSetup2 { + get { + return ResourceManager.GetString("AutofillSetup2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please enable "Auto-fill Accessibility Service" from Bitwarden Settings to use the Auto-fill tile.. + /// + public static string AutofillTileAccessibilityRequired { + get { + return ResourceManager.GetString("AutofillTileAccessibilityRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No password fields detected. + /// + public static string AutofillTileUriNotFound { + get { + return ResourceManager.GetString("AutofillTileUriNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To enable password autofill on your device, follow these instructions:. + /// + public static string AutofillTurnOn { + get { + return ResourceManager.GetString("AutofillTurnOn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1. Go to the iOS "Settings" app. + /// + public static string AutofillTurnOn1 { + get { + return ResourceManager.GetString("AutofillTurnOn1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2. Tap "Passwords". + /// + public static string AutofillTurnOn2 { + get { + return ResourceManager.GetString("AutofillTurnOn2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3. Tap "AutoFill Passwords". + /// + public static string AutofillTurnOn3 { + get { + return ResourceManager.GetString("AutofillTurnOn3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 4. Turn on AutoFill. + /// + public static string AutofillTurnOn4 { + get { + return ResourceManager.GetString("AutofillTurnOn4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 5. Select "Bitwarden". + /// + public static string AutofillTurnOn5 { + get { + return ResourceManager.GetString("AutofillTurnOn5", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto-fill with Bitwarden. + /// + public static string AutofillWithBitwarden { + get { + return ResourceManager.GetString("AutofillWithBitwarden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A verification code was sent to your email. + /// + public static string AVerificationCodeWasSentToYourEmail { + get { + return ResourceManager.GetString("AVerificationCodeWasSentToYourEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Avoid Ambiguous Characters. + /// + public static string AvoidAmbiguousCharacters { + get { + return ResourceManager.GetString("AvoidAmbiguousCharacters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Back. + /// + public static string Back { + get { + return ResourceManager.GetString("Back", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Base domain. + /// + public static string BaseDomain { + get { + return ResourceManager.GetString("BaseDomain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Biometric unlock disabled pending verification of master password.. + /// + public static string BiometricInvalidated { + get { + return ResourceManager.GetString("BiometricInvalidated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Biometric unlock for autofill disabled pending verification of master password.. + /// + public static string BiometricInvalidatedExtension { + get { + return ResourceManager.GetString("BiometricInvalidatedExtension", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Biometrics. + /// + public static string Biometrics { + get { + return ResourceManager.GetString("Biometrics", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Biometric Verification. + /// + public static string BiometricsDirection { + get { + return ResourceManager.GetString("BiometricsDirection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bitwarden. + /// + public static string Bitwarden { + get { + return ResourceManager.GetString("Bitwarden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bitwarden App Extension. + /// + public static string BitwardenAppExtension { + get { + return ResourceManager.GetString("BitwardenAppExtension", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The easiest way to add new logins to your vault is from the Bitwarden App Extension. Learn more about using the Bitwarden App Extension by navigating to the "Settings" screen.. + /// + public static string BitwardenAppExtensionAlert2 { + get { + return ResourceManager.GetString("BitwardenAppExtensionAlert2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Bitwarden in Safari and other apps to auto-fill your logins.. + /// + public static string BitwardenAppExtensionDescription { + get { + return ResourceManager.GetString("BitwardenAppExtensionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the Bitwarden accessibility service to auto-fill your logins.. + /// + public static string BitwardenAutofillAccessibilityServiceDescription { + get { + return ResourceManager.GetString("BitwardenAutofillAccessibilityServiceDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The accessibility service may be helpful to use when apps do not support the standard auto-fill service.. + /// + public static string BitwardenAutofillAccessibilityServiceDescription2 { + get { + return ResourceManager.GetString("BitwardenAutofillAccessibilityServiceDescription2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The easiest way to add new logins to your vault is by using the Bitwarden Password AutoFill extension. Learn more about using the Bitwarden Password AutoFill extension by navigating to the "Settings" screen.. + /// + public static string BitwardenAutofillAlert2 { + get { + return ResourceManager.GetString("BitwardenAutofillAlert2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Access your vault directly from your keyboard to quickly autofill passwords.. + /// + public static string BitwardenAutofillDescription { + get { + return ResourceManager.GetString("BitwardenAutofillDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to We were unable to automatically open the Android autofill settings menu for you. You can navigate to the autofill settings menu manually from Android Settings > System > Languages and input > Advanced > Autofill service.. + /// + public static string BitwardenAutofillGoToSettings { + get { + return ResourceManager.GetString("BitwardenAutofillGoToSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bitwarden Auto-fill Service. + /// + public static string BitwardenAutofillService { + get { + return ResourceManager.GetString("BitwardenAutofillService", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The easiest way to add new logins to your vault is from the Bitwarden Auto-fill Service. Learn more about using the Bitwarden Auto-fill Service by navigating to the "Settings" screen.. + /// + public static string BitwardenAutofillServiceAlert2 { + get { + return ResourceManager.GetString("BitwardenAutofillServiceAlert2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use the Bitwarden auto-fill service to fill login information into other apps.. + /// + public static string BitwardenAutofillServiceDescription { + get { + return ResourceManager.GetString("BitwardenAutofillServiceDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to auto-fill this item? It is not a complete match for "{0}".. + /// + public static string BitwardenAutofillServiceMatchConfirm { + get { + return ResourceManager.GetString("BitwardenAutofillServiceMatchConfirm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap this notification to auto-fill an item from your vault.. + /// + public static string BitwardenAutofillServiceNotificationContent { + get { + return ResourceManager.GetString("BitwardenAutofillServiceNotificationContent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap this notification to view items from your vault.. + /// + public static string BitwardenAutofillServiceNotificationContentOld { + get { + return ResourceManager.GetString("BitwardenAutofillServiceNotificationContentOld", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open Accessibility Settings. + /// + public static string BitwardenAutofillServiceOpenAccessibilitySettings { + get { + return ResourceManager.GetString("BitwardenAutofillServiceOpenAccessibilitySettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open Autofill Settings. + /// + public static string BitwardenAutofillServiceOpenAutofillSettings { + get { + return ResourceManager.GetString("BitwardenAutofillServiceOpenAutofillSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open Overlay Permission Settings. + /// + public static string BitwardenAutofillServiceOpenOverlayPermissionSettings { + get { + return ResourceManager.GetString("BitwardenAutofillServiceOpenOverlayPermissionSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to When you select an input field and see a Bitwarden auto-fill overlay, you can tap it to launch the auto-fill service.. + /// + public static string BitwardenAutofillServiceOverlay { + get { + return ResourceManager.GetString("BitwardenAutofillServiceOverlay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3. On the Android App Settings screen for Bitwarden, go to the "Display over other apps" options (under Advanced) and tap the toggle to enable overlay support.. + /// + public static string BitwardenAutofillServiceOverlayPermission { + get { + return ResourceManager.GetString("BitwardenAutofillServiceOverlayPermission", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You are searching for an auto-fill item for "{0}".. + /// + public static string BitwardenAutofillServiceSearch { + get { + return ResourceManager.GetString("BitwardenAutofillServiceSearch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1. On the Android Accessibility Settings screen, touch "Bitwarden" under the Services heading.. + /// + public static string BitwardenAutofillServiceStep1 { + get { + return ResourceManager.GetString("BitwardenAutofillServiceStep1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2. Switch on the toggle and press OK to accept.. + /// + public static string BitwardenAutofillServiceStep2 { + get { + return ResourceManager.GetString("BitwardenAutofillServiceStep2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3. On the Android App Settings screen for Bitwarden, select "Display over other apps" (under "Advanced") and switch on the toggle to allow the overlay.. + /// + public static string BitwardenAutofillServiceStep3 { + get { + return ResourceManager.GetString("BitwardenAutofillServiceStep3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Black. + /// + public static string Black { + get { + return ResourceManager.GetString("Black", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Blacklisted URIs. + /// + public static string BlacklistedUris { + get { + return ResourceManager.GetString("BlacklistedUris", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URIs that are blacklisted will not offer auto-fill. The list should be comma separated. Ex: "https://twitter.com, androidapp://com.twitter.android".. + /// + public static string BlacklistedUrisDescription { + get { + return ResourceManager.GetString("BlacklistedUrisDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Brand. + /// + public static string Brand { + get { + return ResourceManager.GetString("Brand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Camera. + /// + public static string Camera { + get { + return ResourceManager.GetString("Camera", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scanning will happen automatically.. + /// + public static string CameraInstructionBottom { + get { + return ResourceManager.GetString("CameraInstructionBottom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Point your camera at the QR code.. + /// + public static string CameraInstructionTop { + get { + return ResourceManager.GetString("CameraInstructionTop", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string Cancel { + get { + return ResourceManager.GetString("Cancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot open the app "{0}".. + /// + public static string CannotOpenApp { + get { + return ResourceManager.GetString("CannotOpenApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Capitalize. + /// + public static string Capitalize { + get { + return ResourceManager.GetString("Capitalize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Captcha Failed. Please try again.. + /// + public static string CaptchaFailed { + get { + return ResourceManager.GetString("CaptchaFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Captcha Required. + /// + public static string CaptchaRequired { + get { + return ResourceManager.GetString("CaptchaRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cardholder Name. + /// + public static string CardholderName { + get { + return ResourceManager.GetString("CardholderName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cards. + /// + public static string Cards { + get { + return ResourceManager.GetString("Cards", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Email. + /// + public static string ChangeEmail { + get { + return ResourceManager.GetString("ChangeEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can change your email address on the bitwarden.com web vault. Do you want to visit the website now?. + /// + public static string ChangeEmailConfirmation { + get { + return ResourceManager.GetString("ChangeEmailConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Master Password. + /// + public static string ChangeMasterPassword { + get { + return ResourceManager.GetString("ChangeMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can change your master password on the bitwarden.com web vault. Do you want to visit the website now?. + /// + public static string ChangePasswordConfirmation { + get { + return ResourceManager.GetString("ChangePasswordConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Checking password.... + /// + public static string CheckingPassword { + get { + return ResourceManager.GetString("CheckingPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check if password has been exposed.. + /// + public static string CheckPassword { + get { + return ResourceManager.GetString("CheckPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose File. + /// + public static string ChooseFile { + get { + return ResourceManager.GetString("ChooseFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to City / Town. + /// + public static string CityTown { + get { + return ResourceManager.GetString("CityTown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear. + /// + public static string Clear { + get { + return ResourceManager.GetString("Clear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear clipboard. + /// + public static string ClearClipboard { + get { + return ResourceManager.GetString("ClearClipboard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Automatically clear copied values from your clipboard.. + /// + public static string ClearClipboardDescription { + get { + return ResourceManager.GetString("ClearClipboardDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clone. + /// + public static string Clone { + get { + return ResourceManager.GetString("Clone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + public static string Close { + get { + return ResourceManager.GetString("Close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Code Sent!. + /// + public static string CodeSent { + get { + return ResourceManager.GetString("CodeSent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collections. + /// + public static string Collections { + get { + return ResourceManager.GetString("Collections", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Company. + /// + public static string Company { + get { + return ResourceManager.GetString("Company", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirm your identity to continue.. + /// + public static string ConfirmYourIdentity { + get { + return ResourceManager.GetString("ConfirmYourIdentity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Continue. + /// + public static string Continue { + get { + return ResourceManager.GetString("Continue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy. + /// + public static string Copy { + get { + return ResourceManager.GetString("Copy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Link. + /// + public static string CopyLink { + get { + return ResourceManager.GetString("CopyLink", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Note. + /// + public static string CopyNotes { + get { + return ResourceManager.GetString("CopyNotes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Number. + /// + public static string CopyNumber { + get { + return ResourceManager.GetString("CopyNumber", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Password. + /// + public static string CopyPassword { + get { + return ResourceManager.GetString("CopyPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Security Code. + /// + public static string CopySecurityCode { + get { + return ResourceManager.GetString("CopySecurityCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Send link on save. + /// + public static string CopySendLinkOnSave { + get { + return ResourceManager.GetString("CopySendLinkOnSave", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy TOTP. + /// + public static string CopyTotp { + get { + return ResourceManager.GetString("CopyTotp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy TOTP automatically. + /// + public static string CopyTotpAutomatically { + get { + return ResourceManager.GetString("CopyTotpAutomatically", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If a login has an authenticator key, copy the TOTP verification code to your clip-board when you auto-fill the login.. + /// + public static string CopyTotpAutomaticallyDescription { + get { + return ResourceManager.GetString("CopyTotpAutomaticallyDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copy Username. + /// + public static string CopyUsername { + get { + return ResourceManager.GetString("CopyUsername", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Country. + /// + public static string Country { + get { + return ResourceManager.GetString("Country", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Create Account. + /// + public static string CreateAccount { + get { + return ResourceManager.GetString("CreateAccount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Creating account.... + /// + public static string CreatingAccount { + get { + return ResourceManager.GetString("CreatingAccount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Credits. + /// + public static string Credits { + get { + return ResourceManager.GetString("Credits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current Access Count. + /// + public static string CurrentAccessCount { + get { + return ResourceManager.GetString("CurrentAccessCount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom. + /// + public static string Custom { + get { + return ResourceManager.GetString("Custom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom Environment. + /// + public static string CustomEnvironment { + get { + return ResourceManager.GetString("CustomEnvironment", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to For advanced users. You can specify the base URL of each service independently.. + /// + public static string CustomEnvironmentFooter { + get { + return ResourceManager.GetString("CustomEnvironmentFooter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom Field Name. + /// + public static string CustomFieldName { + get { + return ResourceManager.GetString("CustomFieldName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom Fields. + /// + public static string CustomFields { + get { + return ResourceManager.GetString("CustomFields", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dark. + /// + public static string Dark { + get { + return ResourceManager.GetString("Dark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password Updated. + /// + public static string DatePasswordUpdated { + get { + return ResourceManager.GetString("DatePasswordUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Updated. + /// + public static string DateUpdated { + get { + return ResourceManager.GetString("DateUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to December. + /// + public static string December { + get { + return ResourceManager.GetString("December", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default. + /// + public static string Default { + get { + return ResourceManager.GetString("Default", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default Dark Theme. + /// + public static string DefaultDarkTheme { + get { + return ResourceManager.GetString("DefaultDarkTheme", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose the dark theme to use when using Default (System) theme while your device's dark mode is enabled. + /// + public static string DefaultDarkThemeDescription { + get { + return ResourceManager.GetString("DefaultDarkThemeDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default URI match detection. + /// + public static string DefaultUriMatchDetection { + get { + return ResourceManager.GetString("DefaultUriMatchDetection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose the default way that URI match detection is handled for logins when performing actions such as auto-fill.. + /// + public static string DefaultUriMatchDetectionDescription { + get { + return ResourceManager.GetString("DefaultUriMatchDetectionDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete. + /// + public static string Delete { + get { + return ResourceManager.GetString("Delete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete account. + /// + public static string DeleteAccount { + get { + return ResourceManager.GetString("DeleteAccount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your account and all vault data will be erased and unrecoverable. Are you sure you want to continue?. + /// + public static string DeleteAccountExplanation { + get { + return ResourceManager.GetString("DeleteAccountExplanation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deleting.... + /// + public static string Deleting { + get { + return ResourceManager.GetString("Deleting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deleting your account. + /// + public static string DeletingYourAccount { + get { + return ResourceManager.GetString("DeletingYourAccount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deleting your account is permanent. + /// + public static string DeletingYourAccountIsPermanent { + get { + return ResourceManager.GetString("DeletingYourAccountIsPermanent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deletion Date. + /// + public static string DeletionDate { + get { + return ResourceManager.GetString("DeletionDate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The Send will be permanently deleted on the specified date and time.. + /// + public static string DeletionDateInfo { + get { + return ResourceManager.GetString("DeletionDateInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Deletion Time. + /// + public static string DeletionTime { + get { + return ResourceManager.GetString("DeletionTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Denied. + /// + public static string Denied { + get { + return ResourceManager.GetString("Denied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disabled. + /// + public static string Disabled { + get { + return ResourceManager.GetString("Disabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to One or more organization policies prevents your from exporting your personal vault.. + /// + public static string DisablePersonalVaultExportPolicyInEffect { + get { + return ResourceManager.GetString("DisablePersonalVaultExportPolicyInEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable this Send so that no one can access it. + /// + public static string DisableSend { + get { + return ResourceManager.GetString("DisableSend", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Download. + /// + public static string Download { + get { + return ResourceManager.GetString("Download", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Downloading.... + /// + public static string Downloading { + get { + return ResourceManager.GetString("Downloading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you really want to delete? This cannot be undone.. + /// + public static string DoYouReallyWantToDelete { + get { + return ResourceManager.GetString("DoYouReallyWantToDelete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you really want to permanently delete? This cannot be undone.. + /// + public static string DoYouReallyWantToPermanentlyDeleteCipher { + get { + return ResourceManager.GetString("DoYouReallyWantToPermanentlyDeleteCipher", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you really want to restore this item?. + /// + public static string DoYouReallyWantToRestoreCipher { + get { + return ResourceManager.GetString("DoYouReallyWantToRestoreCipher", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you really want to send to the trash?. + /// + public static string DoYouReallyWantToSoftDeleteCipher { + get { + return ResourceManager.GetString("DoYouReallyWantToSoftDeleteCipher", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dr. + /// + public static string Dr { + get { + return ResourceManager.GetString("Dr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Draw-Over. + /// + public static string DrawOver { + get { + return ResourceManager.GetString("DrawOver", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to When enabled, allows the Bitwarden Accessibility Service to display a popup when login fields are selected.. + /// + public static string DrawOverDescription { + get { + return ResourceManager.GetString("DrawOverDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If enabled, the Bitwarden Accessibility Service will display a popup when login fields are selected to assist with auto-filling your logins.. + /// + public static string DrawOverDescription2 { + get { + return ResourceManager.GetString("DrawOverDescription2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If enabled, accessibility will show a popup to augment the Autofill Service for older apps that don't support the Android Autofill Framework.. + /// + public static string DrawOverDescription3 { + get { + return ResourceManager.GetString("DrawOverDescription3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + public static string Edit { + get { + return ResourceManager.GetString("Edit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Folder. + /// + public static string EditFolder { + get { + return ResourceManager.GetString("EditFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Item. + /// + public static string EditItem { + get { + return ResourceManager.GetString("EditItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Send. + /// + public static string EditSend { + get { + return ResourceManager.GetString("EditSend", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Email. + /// + public static string Email { + get { + return ResourceManager.GetString("Email", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Email Address. + /// + public static string EmailAddress { + get { + return ResourceManager.GetString("EmailAddress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Email Us. + /// + public static string EmailUs { + get { + return ResourceManager.GetString("EmailUs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Email us directly to get help or leave feedback.. + /// + public static string EmailUsDescription { + get { + return ResourceManager.GetString("EmailUsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Automatic Syncing. + /// + public static string EnableAutomaticSyncing { + get { + return ResourceManager.GetString("EnableAutomaticSyncing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enabled. + /// + public static string Enabled { + get { + return ResourceManager.GetString("Enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable sync on refresh. + /// + public static string EnableSyncOnRefresh { + get { + return ResourceManager.GetString("EnableSyncOnRefresh", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Syncing vault with pull down gesture.. + /// + public static string EnableSyncOnRefreshDescription { + get { + return ResourceManager.GetString("EnableSyncOnRefreshDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Account encryption keys are unique to each Bitwarden user account, so you can't import an encrypted export into a different account.. + /// + public static string EncExportAccountWarning { + get { + return ResourceManager.GetString("EncExportAccountWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This export encrypts your data using your account's encryption key. If you ever rotate your account's encryption key you should export again since you will not be able to decrypt this export file.. + /// + public static string EncExportKeyWarning { + get { + return ResourceManager.GetString("EncExportKeyWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter your account email address to receive your master password hint.. + /// + public static string EnterEmailForHint { + get { + return ResourceManager.GetString("EnterEmailForHint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter your PIN code.. + /// + public static string EnterPIN { + get { + return ResourceManager.GetString("EnterPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the verification code that was sent to your email. + /// + public static string EnterTheVerificationCodeThatWasSentToYourEmail { + get { + return ResourceManager.GetString("EnterTheVerificationCodeThatWasSentToYourEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the 6 digit verification code from your authenticator app.. + /// + public static string EnterVerificationCodeApp { + get { + return ResourceManager.GetString("EnterVerificationCodeApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter the 6 digit verification code that was emailed to {0}.. + /// + public static string EnterVerificationCodeEmail { + get { + return ResourceManager.GetString("EnterVerificationCodeEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to One or more of the URLs entered are invalid. Please revise it and try to save again.. + /// public static string EnvironmentPageUrlsError { get { return ResourceManager.GetString("EnvironmentPageUrlsError", resourceCulture); } } + /// + /// Looks up a localized string similar to The environment URLs have been saved.. + /// + public static string EnvironmentSaved { + get { + return ResourceManager.GetString("EnvironmentSaved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exact. + /// + public static string Exact { + get { + return ResourceManager.GetString("Exact", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exit. + /// + public static string Exit { + get { + return ResourceManager.GetString("Exit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to exit Bitwarden?. + /// + public static string ExitConfirmation { + get { + return ResourceManager.GetString("ExitConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Re-enable App Extension. + /// + public static string ExntesionReenable { + get { + return ResourceManager.GetString("ExntesionReenable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expiration. + /// + public static string Expiration { + get { + return ResourceManager.GetString("Expiration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expiration Date. + /// + public static string ExpirationDate { + get { + return ResourceManager.GetString("ExpirationDate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If set, access to this Send will expire on the specified date and time.. + /// + public static string ExpirationDateInfo { + get { + return ResourceManager.GetString("ExpirationDateInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expiration Month. + /// + public static string ExpirationMonth { + get { + return ResourceManager.GetString("ExpirationMonth", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expiration Time. + /// + public static string ExpirationTime { + get { + return ResourceManager.GetString("ExpirationTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expiration Year. + /// + public static string ExpirationYear { + get { + return ResourceManager.GetString("ExpirationYear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Expired. + /// + public static string Expired { + get { + return ResourceManager.GetString("Expired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export vault. + /// + public static string ExportVault { + get { + return ResourceManager.GetString("ExportVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirm Vault Export. + /// + public static string ExportVaultConfirmationTitle { + get { + return ResourceManager.GetString("ExportVaultConfirmationTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was a problem exporting your vault. If the problem persists, you'll need to export from the web vault.. + /// + public static string ExportVaultFailure { + get { + return ResourceManager.GetString("ExportVaultFailure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter your master password to export your vault data.. + /// + public static string ExportVaultMasterPasswordDescription { + get { + return ResourceManager.GetString("ExportVaultMasterPasswordDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vault exported successfully. + /// + public static string ExportVaultSuccess { + get { + return ResourceManager.GetString("ExportVaultSuccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This export contains your vault data in an unencrypted format. You should not store or send the exported file over unsecure channels (such as email). Delete it immediately after you are done using it.. + /// + public static string ExportVaultWarning { + get { + return ResourceManager.GetString("ExportVaultWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extension Activated!. + /// + public static string ExtensionActivated { + get { + return ResourceManager.GetString("ExtensionActivated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Almost done!. + /// + public static string ExtensionAlmostDone { + get { + return ResourceManager.GetString("ExtensionAlmostDone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable App Extension. + /// + public static string ExtensionEnable { + get { + return ResourceManager.GetString("ExtensionEnable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In Safari, find Bitwarden using the share icon (hint: scroll to the right on the bottom row of the menu).. + /// + public static string ExtensionInSafari { + get { + return ResourceManager.GetString("ExtensionInSafari", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Get instant access to your passwords!. + /// + public static string ExtensionInstantAccess { + get { + return ResourceManager.GetString("ExtensionInstantAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You're ready to log in!. + /// + public static string ExtensionReady { + get { + return ResourceManager.GetString("ExtensionReady", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your logins are now easily accessible from Safari, Chrome, and other supported apps.. + /// + public static string ExtensionSetup { + get { + return ResourceManager.GetString("ExtensionSetup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In Safari and Chrome, find Bitwarden using the share icon (hint: scroll to the right on the bottom row of the share menu).. + /// + public static string ExtensionSetup2 { + get { + return ResourceManager.GetString("ExtensionSetup2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap the Bitwarden icon in the menu to launch the extension.. + /// + public static string ExtensionTapIcon { + get { + return ResourceManager.GetString("ExtensionTapIcon", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To turn on Bitwarden in Safari and other apps, tap the "more" icon on the bottom row of the menu.. + /// + public static string ExtensionTurnOn { + get { + return ResourceManager.GetString("ExtensionTurnOn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Face ID. + /// + public static string FaceID { + get { + return ResourceManager.GetString("FaceID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Face ID to verify.. + /// + public static string FaceIDDirection { + get { + return ResourceManager.GetString("FaceIDDirection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Favorite. + /// + public static string Favorite { + get { + return ResourceManager.GetString("Favorite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Favorites. + /// + public static string Favorites { + get { + return ResourceManager.GetString("Favorites", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feature Unavailable. + /// + public static string FeatureUnavailable { + get { + return ResourceManager.GetString("FeatureUnavailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to February. + /// + public static string February { + get { + return ResourceManager.GetString("February", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authenticate WebAuthn. + /// + public static string Fido2AuthenticateWebAuthn { + get { + return ResourceManager.GetString("Fido2AuthenticateWebAuthn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please make sure your default browser supports WebAuthn and try again.. + /// + public static string Fido2CheckBrowser { + get { + return ResourceManager.GetString("Fido2CheckBrowser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication using FIDO2 WebAuthn, you can authenticate using an external security key.. + /// + public static string Fido2Desc { + get { + return ResourceManager.GetString("Fido2Desc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To continue, have your FIDO2 WebAuthn enabled security key ready, then follow the instructions after clicking 'Authenticate WebAuthn' on the next screen.. + /// + public static string Fido2Instruction { + get { + return ResourceManager.GetString("Fido2Instruction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Return to App. + /// + public static string Fido2ReturnToApp { + get { + return ResourceManager.GetString("Fido2ReturnToApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FIDO2 WebAuthn. + /// + public static string Fido2Title { + get { + return ResourceManager.GetString("Fido2Title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Boolean. + /// + public static string FieldTypeBoolean { + get { + return ResourceManager.GetString("FieldTypeBoolean", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hidden. + /// + public static string FieldTypeHidden { + get { + return ResourceManager.GetString("FieldTypeHidden", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Linked. + /// + public static string FieldTypeLinked { + get { + return ResourceManager.GetString("FieldTypeLinked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text. + /// + public static string FieldTypeText { + get { + return ResourceManager.GetString("FieldTypeText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 15 minutes. + /// + public static string FifteenMinutes { + get { + return ResourceManager.GetString("FifteenMinutes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File. + /// + public static string File { + get { + return ResourceManager.GetString("File", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File a Bug Report. + /// + public static string FileBugReport { + get { + return ResourceManager.GetString("FileBugReport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open an issue at our GitHub repository.. + /// + public static string FileBugReportDescription { + get { + return ResourceManager.GetString("FileBugReportDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File Format. + /// + public static string FileFormat { + get { + return ResourceManager.GetString("FileFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File Source. + /// + public static string FileSource { + get { + return ResourceManager.GetString("FileSource", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File type is not selected, tap to select.. + /// + public static string FileTypeIsNotSelected { + get { + return ResourceManager.GetString("FileTypeIsNotSelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File type is selected.. + /// + public static string FileTypeIsSelected { + get { + return ResourceManager.GetString("FileTypeIsSelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Filter items by vault. + /// + public static string FilterByVault { + get { + return ResourceManager.GetString("FilterByVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fingerprint. + /// + public static string Fingerprint { + get { + return ResourceManager.GetString("Fingerprint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use your fingerprint to verify.. + /// + public static string FingerprintDirection { + get { + return ResourceManager.GetString("FingerprintDirection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fingerprint phrase. + /// + public static string FingerprintPhrase { + get { + return ResourceManager.GetString("FingerprintPhrase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First Name. + /// + public static string FirstName { + get { + return ResourceManager.GetString("FirstName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 5 minutes. + /// + public static string FiveMinutes { + get { + return ResourceManager.GetString("FiveMinutes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Folder. + /// + public static string Folder { + get { + return ResourceManager.GetString("Folder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New folder created.. + /// + public static string FolderCreated { + get { + return ResourceManager.GetString("FolderCreated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Folder deleted.. + /// + public static string FolderDeleted { + get { + return ResourceManager.GetString("FolderDeleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No Folder. + /// + public static string FolderNone { + get { + return ResourceManager.GetString("FolderNone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Folders. + /// + public static string Folders { + get { + return ResourceManager.GetString("Folders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Folder updated.. + /// + public static string FolderUpdated { + get { + return ResourceManager.GetString("FolderUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is not correctly formatted.. + /// + public static string FormattedIncorrectly { + get { + return ResourceManager.GetString("FormattedIncorrectly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 4 hours. + /// + public static string FourHours { + get { + return ResourceManager.GetString("FourHours", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full Name. + /// + public static string FullName { + get { + return ResourceManager.GetString("FullName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generate Password. + /// + public static string GeneratePassword { + get { + return ResourceManager.GetString("GeneratePassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Generator. + /// + public static string Generator { + get { + return ResourceManager.GetString("Generator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to We were unable to process your request. Please try again or contact us.. + /// public static string GenericErrorMessage { get { return ResourceManager.GetString("GenericErrorMessage", resourceCulture); } } + + /// + /// Looks up a localized string similar to Get your master password hint. + /// + public static string GetPasswordHint { + get { + return ResourceManager.GetString("GetPasswordHint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Go to my vault. + /// + public static string GoToMyVault { + get { + return ResourceManager.GetString("GoToMyVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Go To Website. + /// + public static string GoToWebsite { + get { + return ResourceManager.GetString("GoToWebsite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Granted. + /// + public static string Granted { + get { + return ResourceManager.GetString("Granted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Help and feedback. + /// + public static string HelpAndFeedback { + get { + return ResourceManager.GetString("HelpAndFeedback", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide. + /// + public static string Hide { + get { + return ResourceManager.GetString("Hide", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide my email address from recipients. + /// + public static string HideEmail { + get { + return ResourceManager.GetString("HideEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to When accessing the Send, hide the text by default. + /// + public static string HideTextByDefault { + get { + return ResourceManager.GetString("HideTextByDefault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hold your Yubikey near the top of the device.. + /// + public static string HoldYubikeyNearTop { + get { + return ResourceManager.GetString("HoldYubikeyNearTop", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Host. + /// + public static string Host { + get { + return ResourceManager.GetString("Host", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Icons. + /// + public static string Icons { + get { + return ResourceManager.GetString("Icons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Icons Server URL. + /// + public static string IconsUrl { + get { + return ResourceManager.GetString("IconsUrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identities. + /// + public static string Identities { + get { + return ResourceManager.GetString("Identities", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identity Name. + /// + public static string IdentityName { + get { + return ResourceManager.GetString("IdentityName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identity Server URL. + /// + public static string IdentityUrl { + get { + return ResourceManager.GetString("IdentityUrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Immediately. + /// + public static string Immediately { + get { + return ResourceManager.GetString("Immediately", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Import items. + /// + public static string ImportItems { + get { + return ResourceManager.GetString("ImportItems", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can bulk import items from the bitwarden.com web vault. Do you want to visit the website now?. + /// + public static string ImportItemsConfirmation { + get { + return ResourceManager.GetString("ImportItemsConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quickly bulk import your items from other password management apps.. + /// + public static string ImportItemsDescription { + get { + return ResourceManager.GetString("ImportItemsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Include Number. + /// + public static string IncludeNumber { + get { + return ResourceManager.GetString("IncludeNumber", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Inline Autofill. + /// + public static string InlineAutofill { + get { + return ResourceManager.GetString("InlineAutofill", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use inline autofill if your selected IME (keyboard) supports it. If your configuration is not supported (or this option is disabled), the default Autofill overlay will be used.. + /// + public static string InlineAutofillDescription { + get { + return ResourceManager.GetString("InlineAutofillDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please connect to the internet before continuing.. + /// + public static string InternetConnectionRequiredMessage { + get { + return ResourceManager.GetString("InternetConnectionRequiredMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Internet Connection Required. + /// + public static string InternetConnectionRequiredTitle { + get { + return ResourceManager.GetString("InternetConnectionRequiredTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid email address.. + /// + public static string InvalidEmail { + get { + return ResourceManager.GetString("InvalidEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Master Password. Try again.. + /// + public static string InvalidMasterPassword { + get { + return ResourceManager.GetString("InvalidMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid PIN. Try again.. + /// + public static string InvalidPIN { + get { + return ResourceManager.GetString("InvalidPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Verification Code.. + /// + public static string InvalidVerificationCode { + get { + return ResourceManager.GetString("InvalidVerificationCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item has been deleted.. + /// + public static string ItemDeleted { + get { + return ResourceManager.GetString("ItemDeleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item Information. + /// + public static string ItemInformation { + get { + return ResourceManager.GetString("ItemInformation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item has been restored.. + /// + public static string ItemRestored { + get { + return ResourceManager.GetString("ItemRestored", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Items. + /// + public static string Items { + get { + return ResourceManager.GetString("Items", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Items for {0}. + /// + public static string ItemsForUri { + get { + return ResourceManager.GetString("ItemsForUri", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item has been shared.. + /// + public static string ItemShared { + get { + return ResourceManager.GetString("ItemShared", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item has been sent to trash.. + /// + public static string ItemSoftDeleted { + get { + return ResourceManager.GetString("ItemSoftDeleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Item updated.. + /// + public static string ItemUpdated { + get { + return ResourceManager.GetString("ItemUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to January. + /// + public static string January { + get { + return ResourceManager.GetString("January", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to July. + /// + public static string July { + get { + return ResourceManager.GetString("July", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to June. + /// + public static string June { + get { + return ResourceManager.GetString("June", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last Name. + /// + public static string LastName { + get { + return ResourceManager.GetString("LastName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Last Sync:. + /// + public static string LastSync { + get { + return ResourceManager.GetString("LastSync", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch. + /// + public static string Launch { + get { + return ResourceManager.GetString("Launch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Learn More. + /// + public static string LearnMore { + get { + return ResourceManager.GetString("LearnMore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Learn About Organizations. + /// + public static string LearnOrg { + get { + return ResourceManager.GetString("LearnOrg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bitwarden allows you to share your vault items with others by using an organization account. Would you like to visit the bitwarden.com website to learn more?. + /// + public static string LearnOrgConfirmation { + get { + return ResourceManager.GetString("LearnOrgConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Leave Organization. + /// + public static string LeaveOrganization { + get { + return ResourceManager.GetString("LeaveOrganization", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Leave {0}?. + /// + public static string LeaveOrganizationName { + get { + return ResourceManager.GetString("LeaveOrganizationName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Length. + /// + public static string Length { + get { + return ResourceManager.GetString("Length", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to License Number. + /// + public static string LicenseNumber { + get { + return ResourceManager.GetString("LicenseNumber", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Light. + /// + public static string Light { + get { + return ResourceManager.GetString("Light", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Loading. + /// + public static string Loading { + get { + return ResourceManager.GetString("Loading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock. + /// + public static string Lock { + get { + return ResourceManager.GetString("Lock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lock now. + /// + public static string LockNow { + get { + return ResourceManager.GetString("LockNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logged in as {0} on {1}.. + /// + public static string LoggedInAsOn { + get { + return ResourceManager.GetString("LoggedInAsOn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logging in.... + /// + public static string LoggingIn { + get { + return ResourceManager.GetString("LoggingIn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log In. + /// + public static string LogIn { + get { + return ResourceManager.GetString("LogIn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your login session has expired.. + /// + public static string LoginExpired { + get { + return ResourceManager.GetString("LoginExpired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Login. + /// + public static string LogInNoun { + get { + return ResourceManager.GetString("LogInNoun", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log in or create a new account to access your secure vault.. + /// + public static string LoginOrCreateNewAccount { + get { + return ResourceManager.GetString("LoginOrCreateNewAccount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logins. + /// + public static string Logins { + get { + return ResourceManager.GetString("Logins", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enterprise Single Sign-On. + /// + public static string LogInSso { + get { + return ResourceManager.GetString("LogInSso", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Currently unable to login with SSO. + /// + public static string LoginSsoError { + get { + return ResourceManager.GetString("LoginSsoError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quickly log in using your organization's single sign-on portal. Please enter your organization's identifier to begin.. + /// + public static string LogInSsoSummary { + get { + return ResourceManager.GetString("LogInSsoSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Login Unavailable. + /// + public static string LoginUnavailable { + get { + return ResourceManager.GetString("LoginUnavailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log out. + /// + public static string LogOut { + get { + return ResourceManager.GetString("LogOut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to log out?. + /// + public static string LogoutConfirmation { + get { + return ResourceManager.GetString("LogoutConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lost authenticator app?. + /// + public static string Lost2FAApp { + get { + return ResourceManager.GetString("Lost2FAApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lowercase (A to Z). + /// + public static string LowercaseAtoZ { + get { + return ResourceManager.GetString("LowercaseAtoZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Manage. + /// + public static string Manage { + get { + return ResourceManager.GetString("Manage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to March. + /// + public static string March { + get { + return ResourceManager.GetString("March", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Master Password. + /// + public static string MasterPassword { + get { + return ResourceManager.GetString("MasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password confirmation is not correct.. + /// + public static string MasterPasswordConfirmationValMessage { + get { + return ResourceManager.GetString("MasterPasswordConfirmationValMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The master password is the password you use to access your vault. It is very important that you do not forget your master password. There is no way to recover the password in the event that you forget it.. + /// + public static string MasterPasswordDescription { + get { + return ResourceManager.GetString("MasterPasswordDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Master Password Hint (optional). + /// + public static string MasterPasswordHint { + get { + return ResourceManager.GetString("MasterPasswordHint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A master password hint can help you remember your password if you forget it.. + /// + public static string MasterPasswordHintDescription { + get { + return ResourceManager.GetString("MasterPasswordHintDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Master password must be at least 8 characters long.. + /// + public static string MasterPasswordLengthValMessage { + get { + return ResourceManager.GetString("MasterPasswordLengthValMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to One or more organization policies require your master password to meet the following requirements:. + /// + public static string MasterPasswordPolicyInEffect { + get { + return ResourceManager.GetString("MasterPasswordPolicyInEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password does not meet organization requirements. Please check the policy information and try again.. + /// + public static string MasterPasswordPolicyValidationMessage { + get { + return ResourceManager.GetString("MasterPasswordPolicyValidationMessage", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Password. + /// + public static string MasterPasswordPolicyValidationTitle { + get { + return ResourceManager.GetString("MasterPasswordPolicyValidationTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Match Detection. + /// + public static string MatchDetection { + get { + return ResourceManager.GetString("MatchDetection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Matching Items. + /// + public static string MatchingItems { + get { + return ResourceManager.GetString("MatchingItems", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum file size is 100 MB.. + /// + public static string MaxFileSize { + get { + return ResourceManager.GetString("MaxFileSize", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maximum Access Count. + /// + public static string MaximumAccessCount { + get { + return ResourceManager.GetString("MaximumAccessCount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If set, users will no longer be able to access this Send once the maximum access count is reached.. + /// + public static string MaximumAccessCountInfo { + get { + return ResourceManager.GetString("MaximumAccessCountInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max access count reached. + /// + public static string MaximumAccessCountReached { + get { + return ResourceManager.GetString("MaximumAccessCountReached", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to May. + /// + public static string May { + get { + return ResourceManager.GetString("May", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Middle Name. + /// + public static string MiddleName { + get { + return ResourceManager.GetString("MiddleName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum Numbers. + /// + public static string MinNumbers { + get { + return ResourceManager.GetString("MinNumbers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum Special. + /// + public static string MinSpecial { + get { + return ResourceManager.GetString("MinSpecial", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Miscellaneous. + /// + public static string Miscellaneous { + get { + return ResourceManager.GetString("Miscellaneous", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More. + /// + public static string More { + get { + return ResourceManager.GetString("More", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More Settings. + /// + public static string MoreSettings { + get { + return ResourceManager.GetString("MoreSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move. + /// + public static string Move { + get { + return ResourceManager.GetString("Move", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} moved to {1}.. + /// + public static string MovedItemToOrg { + get { + return ResourceManager.GetString("MovedItemToOrg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move Down. + /// + public static string MoveDown { + get { + return ResourceManager.GetString("MoveDown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move to Organization. + /// + public static string MoveToOrganization { + get { + return ResourceManager.GetString("MoveToOrganization", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose an organization that you wish to move this item to. Moving to an organization transfers ownership of the item to that organization. You will no longer be the direct owner of this item once it has been moved.. + /// + public static string MoveToOrgDesc { + get { + return ResourceManager.GetString("MoveToOrgDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move Up. + /// + public static string MoveUp { + get { + return ResourceManager.GetString("MoveUp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mr. + /// + public static string Mr { + get { + return ResourceManager.GetString("Mr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mrs. + /// + public static string Mrs { + get { + return ResourceManager.GetString("Mrs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ms. + /// + public static string Ms { + get { + return ResourceManager.GetString("Ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must log into the main Bitwarden app before you can use the extension.. + /// + public static string MustLogInMainApp { + get { + return ResourceManager.GetString("MustLogInMainApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must log into the main Bitwarden app before you can use AutoFill.. + /// + public static string MustLogInMainAppAutofill { + get { + return ResourceManager.GetString("MustLogInMainAppAutofill", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to My Vault. + /// + public static string MyVault { + get { + return ResourceManager.GetString("MyVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A friendly name to describe this Send.. + /// + public static string NameInfo { + get { + return ResourceManager.GetString("NameInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Never. + /// + public static string Never { + get { + return ResourceManager.GetString("Never", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting your lock options to “Never” keeps your vault available to anyone with access to your device. If you use this option, you should ensure that you keep your device properly protected.. + /// + public static string NeverLockWarning { + get { + return ResourceManager.GetString("NeverLockWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Custom Field. + /// + public static string NewCustomField { + get { + return ResourceManager.GetString("NewCustomField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New item created.. + /// + public static string NewItemCreated { + get { + return ResourceManager.GetString("NewItemCreated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Password. + /// + public static string NewPassword { + get { + return ResourceManager.GetString("NewPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New send created.. + /// + public static string NewSendCreated { + get { + return ResourceManager.GetString("NewSendCreated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New URI. + /// + public static string NewUri { + get { + return ResourceManager.GetString("NewUri", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + public static string No { + get { + return ResourceManager.GetString("No", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no attachments.. + /// + public static string NoAttachments { + get { + return ResourceManager.GetString("NoAttachments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no collections to list.. + /// + public static string NoCollectionsToList { + get { + return ResourceManager.GetString("NoCollectionsToList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no favorites in your vault.. + /// + public static string NoFavorites { + get { + return ResourceManager.GetString("NoFavorites", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No file chosen. + /// + public static string NoFileChosen { + get { + return ResourceManager.GetString("NoFileChosen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no folders to list.. + /// + public static string NoFoldersToList { + get { + return ResourceManager.GetString("NoFoldersToList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items in your vault.. + /// + public static string NoItems { + get { + return ResourceManager.GetString("NoItems", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items in this collection.. + /// + public static string NoItemsCollection { + get { + return ResourceManager.GetString("NoItemsCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items in this folder.. + /// + public static string NoItemsFolder { + get { + return ResourceManager.GetString("NoItemsFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items in your vault for {0}.. + /// + public static string NoItemsForUri { + get { + return ResourceManager.GetString("NoItemsForUri", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items in your vault for this website/app. Tap to add one.. + /// + public static string NoItemsTap { + get { + return ResourceManager.GetString("NoItemsTap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items to list.. + /// + public static string NoItemsToList { + get { + return ResourceManager.GetString("NoItemsToList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no items in the trash.. + /// + public static string NoItemsTrash { + get { + return ResourceManager.GetString("NoItemsTrash", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No organizations to list.. + /// + public static string NoOrgsToList { + get { + return ResourceManager.GetString("NoOrgsToList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No passwords to list.. + /// + public static string NoPasswordsToList { + get { + return ResourceManager.GetString("NoPasswordsToList", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nord. + /// + public static string Nord { + get { + return ResourceManager.GetString("Nord", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are no Sends in your account.. + /// + public static string NoSends { + get { + return ResourceManager.GetString("NoSends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notes. + /// + public static string Notes { + get { + return ResourceManager.GetString("Notes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Private notes about this Send.. + /// + public static string NotesInfo { + get { + return ResourceManager.GetString("NotesInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This account has two-step login enabled, however, none of the configured two-step providers are supported on this device. Please use a supported device and/or add additional providers that are better supported across devices (such as an authenticator app).. + /// + public static string NoTwoStepAvailable { + get { + return ResourceManager.GetString("NoTwoStepAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This login does not have a username or password configured.. + /// + public static string NoUsernamePasswordConfigured { + get { + return ResourceManager.GetString("NoUsernamePasswordConfigured", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to November. + /// + public static string November { + get { + return ResourceManager.GetString("November", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number. + /// + public static string Number { + get { + return ResourceManager.GetString("Number", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Number of Words. + /// + public static string NumberOfWords { + get { + return ResourceManager.GetString("NumberOfWords", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Numbers (0 to 9). + /// + public static string NumbersZeroToNine { + get { + return ResourceManager.GetString("NumbersZeroToNine", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to October. + /// + public static string October { + get { + return ResourceManager.GetString("October", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ok. + /// + public static string Ok { + get { + return ResourceManager.GetString("Ok", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ok, got it!. + /// + public static string OkGotIt { + get { + return ResourceManager.GetString("OkGotIt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 day. + /// + public static string OneDay { + get { + return ResourceManager.GetString("OneDay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 hour. + /// + public static string OneHour { + get { + return ResourceManager.GetString("OneHour", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1 minute. + /// + public static string OneMinute { + get { + return ResourceManager.GetString("OneMinute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to On app restart. + /// + public static string OnRestart { + get { + return ResourceManager.GetString("OnRestart", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Open. + /// + public static string Open { + get { + return ResourceManager.GetString("Open", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Option defaults are set from the main Bitwarden app's password generator tool.. + /// + public static string OptionDefaults { + get { + return ResourceManager.GetString("OptionDefaults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Options. + /// + public static string Options { + get { + return ResourceManager.GetString("Options", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Options are collapsed, tap to expand.. + /// + public static string OptionsCollapsed { + get { + return ResourceManager.GetString("OptionsCollapsed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Options are expanded, tap to collapse.. + /// + public static string OptionsExpanded { + get { + return ResourceManager.GetString("OptionsExpanded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Organization. + /// + public static string Organization { + get { + return ResourceManager.GetString("Organization", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Organization Identifier. + /// + public static string OrgIdentifier { + get { + return ResourceManager.GetString("OrgIdentifier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Other. + /// + public static string Other { + get { + return ResourceManager.GetString("Other", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Permission. + /// + public static string OverlayPermission { + get { + return ResourceManager.GetString("OverlayPermission", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ownership. + /// + public static string Ownership { + get { + return ResourceManager.GetString("Ownership", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passphrase. + /// + public static string Passphrase { + get { + return ResourceManager.GetString("Passphrase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passport Number. + /// + public static string PassportNumber { + get { + return ResourceManager.GetString("PassportNumber", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password. + /// + public static string Password { + get { + return ResourceManager.GetString("Password", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password auto-fill. + /// + public static string PasswordAutofill { + get { + return ResourceManager.GetString("PasswordAutofill", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Master password confirmation. + /// + public static string PasswordConfirmation { + get { + return ResourceManager.GetString("PasswordConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This action is protected, to continue please re-enter your master password to verify your identity.. + /// + public static string PasswordConfirmationDesc { + get { + return ResourceManager.GetString("PasswordConfirmationDesc", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This password has been exposed {0} time(s) in data breaches. You should change it.. + /// + public static string PasswordExposed { + get { + return ResourceManager.GetString("PasswordExposed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password generated.. + /// + public static string PasswordGenerated { + get { + return ResourceManager.GetString("PasswordGenerated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password Generator. + /// + public static string PasswordGenerator { + get { + return ResourceManager.GetString("PasswordGenerator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to One or more organization policies are affecting your generator settings. + /// + public static string PasswordGeneratorPolicyInEffect { + get { + return ResourceManager.GetString("PasswordGeneratorPolicyInEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password Hint. + /// + public static string PasswordHint { + get { + return ResourceManager.GetString("PasswordHint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to We've sent you an email with your master password hint.. + /// + public static string PasswordHintAlert { + get { + return ResourceManager.GetString("PasswordHintAlert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password History. + /// + public static string PasswordHistory { + get { + return ResourceManager.GetString("PasswordHistory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Optionally require a password for users to access this Send.. + /// + public static string PasswordInfo { + get { + return ResourceManager.GetString("PasswordInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password is not visible, tap to show.. + /// + public static string PasswordIsNotVisibleTapToShow { + get { + return ResourceManager.GetString("PasswordIsNotVisibleTapToShow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password is visible, tap to hide.. + /// + public static string PasswordIsVisibleTapToHide { + get { + return ResourceManager.GetString("PasswordIsVisibleTapToHide", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to overwrite the current password?. + /// + public static string PasswordOverrideAlert { + get { + return ResourceManager.GetString("PasswordOverrideAlert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Master password re-prompt. + /// + public static string PasswordPrompt { + get { + return ResourceManager.GetString("PasswordPrompt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This password was not found in any known data breaches. It should be safe to use.. + /// + public static string PasswordSafe { + get { + return ResourceManager.GetString("PasswordSafe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pending deletion. + /// + public static string PendingDelete { + get { + return ResourceManager.GetString("PendingDelete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An organization policy is affecting your ownership options.. + /// + public static string PersonalOwnershipPolicyInEffect { + get { + return ResourceManager.GetString("PersonalOwnershipPolicyInEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Due to an Enterprise Policy, you are restricted from saving items to your personal vault. Change the Ownership option to an organization and choose from available Collections.. + /// + public static string PersonalOwnershipSubmitError { + get { + return ResourceManager.GetString("PersonalOwnershipSubmitError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Phone. + /// + public static string Phone { + get { + return ResourceManager.GetString("Phone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Photos. + /// + public static string Photos { + get { + return ResourceManager.GetString("Photos", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to PIN. + /// + public static string PIN { + get { + return ResourceManager.GetString("PIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to require unlocking with your master password when the application is restarted?. + /// + public static string PINRequireMasterPasswordRestart { + get { + return ResourceManager.GetString("PINRequireMasterPasswordRestart", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Contain one or more lowercase characters. + /// + public static string PolicyInEffectLowercase { + get { + return ResourceManager.GetString("PolicyInEffectLowercase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum complexity score of {0}. + /// + public static string PolicyInEffectMinComplexity { + get { + return ResourceManager.GetString("PolicyInEffectMinComplexity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum length of {0}. + /// + public static string PolicyInEffectMinLength { + get { + return ResourceManager.GetString("PolicyInEffectMinLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Contain one or more numbers. + /// + public static string PolicyInEffectNumbers { + get { + return ResourceManager.GetString("PolicyInEffectNumbers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Contain one or more of the following special characters: {0}. + /// + public static string PolicyInEffectSpecial { + get { + return ResourceManager.GetString("PolicyInEffectSpecial", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Contain one or more uppercase characters. + /// + public static string PolicyInEffectUppercase { + get { + return ResourceManager.GetString("PolicyInEffectUppercase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Possible Matching Items. + /// + public static string PossibleMatchingItems { + get { + return ResourceManager.GetString("PossibleMatchingItems", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to A premium membership is required to use this feature.. + /// + public static string PremiumRequired { + get { + return ResourceManager.GetString("PremiumRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Privacy Policy. + /// + public static string PrivacyPolicy { + get { + return ResourceManager.GetString("PrivacyPolicy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bitwarden keeps your vault automatically synced by using push notifications. For the best possible experience, please select "Allow" on the following prompt when asked to enable push notifications.. + /// + public static string PushNotificationAlert { + get { + return ResourceManager.GetString("PushNotificationAlert", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rate the app. + /// + public static string RateTheApp { + get { + return ResourceManager.GetString("RateTheApp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please consider helping us out with a good review!. + /// + public static string RateTheAppDescription { + get { + return ResourceManager.GetString("RateTheAppDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recovery Code. + /// + public static string RecoveryCodeTitle { + get { + return ResourceManager.GetString("RecoveryCodeTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Regenerate Password. + /// + public static string RegeneratePassword { + get { + return ResourceManager.GetString("RegeneratePassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Regular expression. + /// + public static string RegEx { + get { + return ResourceManager.GetString("RegEx", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remember me. + /// + public static string RememberMe { + get { + return ResourceManager.GetString("RememberMe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + public static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Account. + /// + public static string RemoveAccount { + get { + return ResourceManager.GetString("RemoveAccount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Are you sure you want to remove this account?. + /// + public static string RemoveAccountConfirmation { + get { + return ResourceManager.GetString("RemoveAccountConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Master Password. + /// + public static string RemoveMasterPassword { + get { + return ResourceManager.GetString("RemoveMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is using SSO with customer-managed encryption. Continuing will remove your Master Password from your account and require SSO to login.. + /// + public static string RemoveMasterPasswordWarning { + get { + return ResourceManager.GetString("RemoveMasterPasswordWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If you do not want to remove your Master Password, you may leave this organization.. + /// + public static string RemoveMasterPasswordWarning2 { + get { + return ResourceManager.GetString("RemoveMasterPasswordWarning2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Password. + /// + public static string RemovePassword { + get { + return ResourceManager.GetString("RemovePassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Removing password. + /// + public static string RemovingSendPassword { + get { + return ResourceManager.GetString("RemovingSendPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Request one-time password. + /// + public static string RequestOTP { + get { + return ResourceManager.GetString("RequestOTP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Resend Code. + /// + public static string ResendCode { + get { + return ResourceManager.GetString("ResendCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This organization has an enterprise policy that will automatically enroll you in password reset. Enrollment will allow organization administrators to change your master password.. + /// + public static string ResetPasswordAutoEnrollInviteWarning { + get { + return ResourceManager.GetString("ResetPasswordAutoEnrollInviteWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restore. + /// + public static string Restore { + get { + return ResourceManager.GetString("Restore", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Restoring.... + /// + public static string Restoring { + get { + return ResourceManager.GetString("Restoring", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Re-type Master Password. + /// + public static string RetypeMasterPassword { + get { + return ResourceManager.GetString("RetypeMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + public static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attachment saved successfully. + /// + public static string SaveAttachmentSuccess { + get { + return ResourceManager.GetString("SaveAttachmentSuccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Saving.... + /// + public static string Saving { + get { + return ResourceManager.GetString("Saving", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scan QR Code. + /// + public static string ScanQrTitle { + get { + return ResourceManager.GetString("ScanQrTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search. + /// + public static string Search { + get { + return ResourceManager.GetString("Search", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search collection. + /// + public static string SearchCollection { + get { + return ResourceManager.GetString("SearchCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search File Sends. + /// + public static string SearchFileSends { + get { + return ResourceManager.GetString("SearchFileSends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search {0}. + /// + public static string SearchGroup { + get { + return ResourceManager.GetString("SearchGroup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search Sends. + /// + public static string SearchSends { + get { + return ResourceManager.GetString("SearchSends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search Text Sends. + /// + public static string SearchTextSends { + get { + return ResourceManager.GetString("SearchTextSends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search trash. + /// + public static string SearchTrash { + get { + return ResourceManager.GetString("SearchTrash", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Search Vault. + /// + public static string SearchVault { + get { + return ResourceManager.GetString("SearchVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Secure Notes. + /// + public static string SecureNotes { + get { + return ResourceManager.GetString("SecureNotes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security. + /// + public static string Security { + get { + return ResourceManager.GetString("Security", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Security Code. + /// + public static string SecurityCode { + get { + return ResourceManager.GetString("SecurityCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select. + /// + public static string Select { + get { + return ResourceManager.GetString("Select", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must select at least one collection.. + /// + public static string SelectOneCollection { + get { + return ResourceManager.GetString("SelectOneCollection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to What type of custom field do you want to add?. + /// + public static string SelectTypeField { + get { + return ResourceManager.GetString("SelectTypeField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Self-hosted Environment. + /// + public static string SelfHostedEnvironment { + get { + return ResourceManager.GetString("SelfHostedEnvironment", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specify the base URL of your on-premise hosted Bitwarden installation.. + /// + public static string SelfHostedEnvironmentFooter { + get { + return ResourceManager.GetString("SelfHostedEnvironmentFooter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send. + /// + public static string Send { + get { + return ResourceManager.GetString("Send", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send Code. + /// + public static string SendCode { + get { + return ResourceManager.GetString("SendCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send has been deleted.. + /// + public static string SendDeleted { + get { + return ResourceManager.GetString("SendDeleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Due to an enterprise policy, you are only able to delete an existing Send.. + /// + public static string SendDisabledWarning { + get { + return ResourceManager.GetString("SendDisabledWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must verify your email to use files with Send. You can verify your email in the web vault.. + /// + public static string SendFileEmailVerificationRequired { + get { + return ResourceManager.GetString("SendFileEmailVerificationRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Free accounts are restricted to sharing text only. A premium membership is required to use files with Send.. + /// + public static string SendFilePremiumRequired { + get { + return ResourceManager.GetString("SendFilePremiumRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sending. + /// + public static string Sending { + get { + return ResourceManager.GetString("Sending", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sending code. + /// + public static string SendingCode { + get { + return ResourceManager.GetString("SendingCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send link. + /// + public static string SendLink { + get { + return ResourceManager.GetString("SendLink", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to One or more organization policies are affecting your Send options.. + /// + public static string SendOptionsPolicyInEffect { + get { + return ResourceManager.GetString("SendOptionsPolicyInEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password has been removed.. + /// + public static string SendPasswordRemoved { + get { + return ResourceManager.GetString("SendPasswordRemoved", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sends. + /// + public static string Sends { + get { + return ResourceManager.GetString("Sends", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send updated.. + /// + public static string SendUpdated { + get { + return ResourceManager.GetString("SendUpdated", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send verification code email again. + /// + public static string SendVerificationCodeAgain { + get { + return ResourceManager.GetString("SendVerificationCodeAgain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Send a verification code to your email. + /// + public static string SendVerificationCodeToEmail { + get { + return ResourceManager.GetString("SendVerificationCodeToEmail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to September. + /// + public static string September { + get { + return ResourceManager.GetString("September", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Server URL. + /// + public static string ServerUrl { + get { + return ResourceManager.GetString("ServerUrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set Master Password. + /// + public static string SetMasterPassword { + get { + return ResourceManager.GetString("SetMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In order to complete logging in with SSO, please set a master password to access and protect your vault.. + /// + public static string SetMasterPasswordSummary { + get { + return ResourceManager.GetString("SetMasterPasswordSummary", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set PIN. + /// + public static string SetPIN { + get { + return ResourceManager.GetString("SetPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set your PIN code for unlocking Bitwarden. Your PIN settings will be reset if you ever fully log out of the application.. + /// + public static string SetPINDescription { + get { + return ResourceManager.GetString("SetPINDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enter a 4 digit PIN code to unlock the app with.. + /// + public static string SetPINDirection { + get { + return ResourceManager.GetString("SetPINDirection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Settings. + /// + public static string Settings { + get { + return ResourceManager.GetString("Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 7 days. + /// + public static string SevenDays { + get { + return ResourceManager.GetString("SevenDays", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Share. + /// + public static string Share { + get { + return ResourceManager.GetString("Share", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shared. + /// + public static string Shared { + get { + return ResourceManager.GetString("Shared", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Share Item. + /// + public static string ShareItem { + get { + return ResourceManager.GetString("ShareItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Share Link. + /// + public static string ShareLink { + get { + return ResourceManager.GetString("ShareLink", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Share this Send upon save. + /// + public static string ShareOnSave { + get { + return ResourceManager.GetString("ShareOnSave", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show. + /// + public static string Show { + get { + return ResourceManager.GetString("Show", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show website icons. + /// + public static string ShowWebsiteIcons { + get { + return ResourceManager.GetString("ShowWebsiteIcons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show a recognizable image next to each login.. + /// + public static string ShowWebsiteIconsDescription { + get { + return ResourceManager.GetString("ShowWebsiteIconsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sending to trash.... + /// + public static string SoftDeleting { + get { + return ResourceManager.GetString("SoftDeleting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Special Characters (!@#$%^&*). + /// + public static string SpecialCharacters { + get { + return ResourceManager.GetString("SpecialCharacters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Social Security Number. + /// + public static string SSN { + get { + return ResourceManager.GetString("SSN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Starts with. + /// + public static string StartsWith { + get { + return ResourceManager.GetString("StartsWith", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to State / Province. + /// + public static string StateProvince { + get { + return ResourceManager.GetString("StateProvince", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Status. + /// + public static string Status { + get { + return ResourceManager.GetString("Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Submit. + /// + public static string Submit { + get { + return ResourceManager.GetString("Submit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Submit crash logs. + /// + public static string SubmitCrashLogs { + get { + return ResourceManager.GetString("SubmitCrashLogs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Help Bitwarden improve app stability by submitting crash reports.. + /// + public static string SubmitCrashLogsDescription { + get { + return ResourceManager.GetString("SubmitCrashLogsDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Submitting.... + /// + public static string Submitting { + get { + return ResourceManager.GetString("Submitting", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Would you like to switch to it now?. + /// + public static string SwitchToAlreadyAddedAccountConfirmation { + get { + return ResourceManager.GetString("SwitchToAlreadyAddedAccountConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sync. + /// + public static string Sync { + get { + return ResourceManager.GetString("Sync", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Syncing.... + /// + public static string Syncing { + get { + return ResourceManager.GetString("Syncing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Syncing complete.. + /// + public static string SyncingComplete { + get { + return ResourceManager.GetString("SyncingComplete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Syncing failed.. + /// + public static string SyncingFailed { + get { + return ResourceManager.GetString("SyncingFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sync Vault Now. + /// + public static string SyncVaultNow { + get { + return ResourceManager.GetString("SyncVaultNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap to go back. + /// + public static string TapToGoBack { + get { + return ResourceManager.GetString("TapToGoBack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 10 seconds. + /// + public static string TenSeconds { + get { + return ResourceManager.GetString("TenSeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Terms of Service. + /// + public static string TermsOfService { + get { + return ResourceManager.GetString("TermsOfService", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text. + /// + public static string Text { + get { + return ResourceManager.GetString("Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text type is not selected, tap to select.. + /// + public static string TextTypeIsNotSelected { + get { + return ResourceManager.GetString("TextTypeIsNotSelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text type is selected.. + /// + public static string TextTypeIsSelected { + get { + return ResourceManager.GetString("TextTypeIsSelected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Thank You. + /// + public static string ThankYou { + get { + return ResourceManager.GetString("ThankYou", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Theme. + /// + public static string Theme { + get { + return ResourceManager.GetString("Theme", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your theme changes will apply when the app is restarted.. + /// + public static string ThemeAppliedOnRestart { + get { + return ResourceManager.GetString("ThemeAppliedOnRestart", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default (System). + /// + public static string ThemeDefault { + get { + return ResourceManager.GetString("ThemeDefault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change the application's color theme.. + /// + public static string ThemeDescription { + get { + return ResourceManager.GetString("ThemeDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 30 days. + /// + public static string ThirtyDays { + get { + return ResourceManager.GetString("ThirtyDays", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 30 minutes. + /// + public static string ThirtyMinutes { + get { + return ResourceManager.GetString("ThirtyMinutes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 30 seconds. + /// + public static string ThirtySeconds { + get { + return ResourceManager.GetString("ThirtySeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 3 days. + /// + public static string ThreeDays { + get { + return ResourceManager.GetString("ThreeDays", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Title. + /// + public static string Title { + get { + return ResourceManager.GetString("Title", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toggle Visibility. + /// + public static string ToggleVisibility { + get { + return ResourceManager.GetString("ToggleVisibility", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tools. + /// + public static string Tools { + get { + return ResourceManager.GetString("Tools", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Touch ID. + /// + public static string TouchID { + get { + return ResourceManager.GetString("TouchID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Translations. + /// + public static string Translations { + get { + return ResourceManager.GetString("Translations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trash. + /// + public static string Trash { + get { + return ResourceManager.GetString("Trash", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Try again. + /// + public static string TryAgain { + get { + return ResourceManager.GetString("TryAgain", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 20 seconds. + /// + public static string TwentySeconds { + get { + return ResourceManager.GetString("TwentySeconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2 days. + /// + public static string TwoDays { + get { + return ResourceManager.GetString("TwoDays", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 2 minutes. + /// + public static string TwoMinutes { + get { + return ResourceManager.GetString("TwoMinutes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Two-step login. + /// + public static string TwoStepLogin { + get { + return ResourceManager.GetString("TwoStepLogin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Two-step login makes your account more secure by requiring you to verify your login with another device such as a security key, authenticator app, SMS, phone call, or email. Two-step login can be enabled on the bitwarden.com web vault. Do you want to visit the website now?. + /// + public static string TwoStepLoginConfirmation { + get { + return ResourceManager.GetString("TwoStepLoginConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Two-step Login Options. + /// + public static string TwoStepLoginOptions { + get { + return ResourceManager.GetString("TwoStepLoginOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type. + /// + public static string Type { + get { + return ResourceManager.GetString("Type", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Card. + /// + public static string TypeCard { + get { + return ResourceManager.GetString("TypeCard", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File. + /// + public static string TypeFile { + get { + return ResourceManager.GetString("TypeFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The file you want to send.. + /// + public static string TypeFileInfo { + get { + return ResourceManager.GetString("TypeFileInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Identity. + /// + public static string TypeIdentity { + get { + return ResourceManager.GetString("TypeIdentity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Login. + /// + public static string TypeLogin { + get { + return ResourceManager.GetString("TypeLogin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Types. + /// + public static string Types { + get { + return ResourceManager.GetString("Types", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Secure Note. + /// + public static string TypeSecureNote { + get { + return ResourceManager.GetString("TypeSecureNote", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Text. + /// + public static string TypeText { + get { + return ResourceManager.GetString("TypeText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The text you want to send.. + /// + public static string TypeTextInfo { + get { + return ResourceManager.GetString("TypeTextInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to download file.. + /// + public static string UnableToDownloadFile { + get { + return ResourceManager.GetString("UnableToDownloadFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your device cannot open this type of file.. + /// + public static string UnableToOpenFile { + get { + return ResourceManager.GetString("UnableToOpenFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was a problem saving this attachment. If the problem persists, you can save it from the web vault.. + /// + public static string UnableToSaveAttachment { + get { + return ResourceManager.GetString("UnableToSaveAttachment", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock. + /// + public static string Unlock { + get { + return ResourceManager.GetString("Unlock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock Vault. + /// + public static string UnlockVault { + get { + return ResourceManager.GetString("UnlockVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock with {0}. + /// + public static string UnlockWith { + get { + return ResourceManager.GetString("UnlockWith", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unlock with PIN code. + /// + public static string UnlockWithPIN { + get { + return ResourceManager.GetString("UnlockWithPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Updated Master Password. + /// + public static string UpdatedMasterPassword { + get { + return ResourceManager.GetString("UpdatedMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You cannot use this feature until you update your encryption key.. + /// + public static string UpdateKey { + get { + return ResourceManager.GetString("UpdateKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Update Master Password. + /// + public static string UpdateMasterPassword { + get { + return ResourceManager.GetString("UpdateMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your Master Password was recently changed by an administrator in your organization. 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.. + /// + public static string UpdateMasterPasswordWarning { + get { + return ResourceManager.GetString("UpdateMasterPasswordWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Currently unable to update password. + /// + public static string UpdatePasswordError { + get { + return ResourceManager.GetString("UpdatePasswordError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Updating Password. + /// + public static string UpdatingPassword { + get { + return ResourceManager.GetString("UpdatingPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uppercase (A to Z). + /// + public static string UppercaseAtoZ { + get { + return ResourceManager.GetString("UppercaseAtoZ", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URI. + /// + public static string URI { + get { + return ResourceManager.GetString("URI", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URI Match Detection. + /// + public static string URIMatchDetection { + get { + return ResourceManager.GetString("URIMatchDetection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URI {0}. + /// + public static string URIPosition { + get { + return ResourceManager.GetString("URIPosition", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to URIs. + /// + public static string URIs { + get { + return ResourceManager.GetString("URIs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use another two-step login method. + /// + public static string UseAnotherTwoStepMethod { + get { + return ResourceManager.GetString("UseAnotherTwoStepMethod", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Biometrics To Unlock. + /// + public static string UseBiometricsToUnlock { + get { + return ResourceManager.GetString("UseBiometricsToUnlock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Face ID To Unlock. + /// + public static string UseFaceIDToUnlock { + get { + return ResourceManager.GetString("UseFaceIDToUnlock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Fingerprint to Unlock. + /// + public static string UseFingerprintToUnlock { + get { + return ResourceManager.GetString("UseFingerprintToUnlock", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Username. + /// + public static string Username { + get { + return ResourceManager.GetString("Username", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Validating. + /// + public static string Validating { + get { + return ResourceManager.GetString("Validating", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The {0} field is required.. + /// + public static string ValidationFieldRequired { + get { + return ResourceManager.GetString("ValidationFieldRequired", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value. + /// + public static string Value { + get { + return ResourceManager.GetString("Value", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} has been copied.. + /// + public static string ValueHasBeenCopied { + get { + return ResourceManager.GetString("ValueHasBeenCopied", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vault: {0}. + /// + public static string VaultFilterDescription { + get { + return ResourceManager.GetString("VaultFilterDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vault is locked. + /// + public static string VaultIsLocked { + get { + return ResourceManager.GetString("VaultIsLocked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your vault is locked. Verify your identity to continue.. + /// + public static string VaultLockedIdentity { + get { + return ResourceManager.GetString("VaultLockedIdentity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your vault is locked. Verify your master password to continue.. + /// + public static string VaultLockedMasterPassword { + get { + return ResourceManager.GetString("VaultLockedMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your vault is locked. Verify your PIN code to continue.. + /// + public static string VaultLockedPIN { + get { + return ResourceManager.GetString("VaultLockedPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vaults. + /// + public static string Vaults { + get { + return ResourceManager.GetString("Vaults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vault timeout. + /// + public static string VaultTimeout { + get { + return ResourceManager.GetString("VaultTimeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vault timeout action. + /// + public static string VaultTimeoutAction { + get { + return ResourceManager.GetString("VaultTimeoutAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Logging out will remove all access to your vault and requires online authentication after the timeout period. Are you sure you want to use this setting?. + /// + public static string VaultTimeoutLogOutConfirmation { + get { + return ResourceManager.GetString("VaultTimeoutLogOutConfirmation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your organization policies are affecting your vault timeout. Maximum allowed Vault Timeout is {0} hour(s) and {1} minute(s). + /// + public static string VaultTimeoutPolicyInEffect { + get { + return ResourceManager.GetString("VaultTimeoutPolicyInEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your vault timeout exceeds the restrictions set by your organization.. + /// + public static string VaultTimeoutToLarge { + get { + return ResourceManager.GetString("VaultTimeoutToLarge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verification Code. + /// + public static string VerificationCode { + get { + return ResourceManager.GetString("VerificationCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verification Code (TOTP). + /// + public static string VerificationCodeTotp { + get { + return ResourceManager.GetString("VerificationCodeTotp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not send verification email. Try again.. + /// + public static string VerificationEmailNotSent { + get { + return ResourceManager.GetString("VerificationEmailNotSent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verification email sent.. + /// + public static string VerificationEmailSent { + get { + return ResourceManager.GetString("VerificationEmailSent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verify Face ID. + /// + public static string VerifyFaceID { + get { + return ResourceManager.GetString("VerifyFaceID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verify Fingerprint. + /// + public static string VerifyFingerprint { + get { + return ResourceManager.GetString("VerifyFingerprint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verifying. + /// + public static string Verifying { + get { + return ResourceManager.GetString("Verifying", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verify Master Password. + /// + public static string VerifyMasterPassword { + get { + return ResourceManager.GetString("VerifyMasterPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verify PIN. + /// + public static string VerifyPIN { + get { + return ResourceManager.GetString("VerifyPIN", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version. + /// + public static string Version { + get { + return ResourceManager.GetString("Version", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to View. + /// + public static string View { + get { + return ResourceManager.GetString("View", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to View Item. + /// + public static string ViewItem { + get { + return ResourceManager.GetString("ViewItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Visit Our Website. + /// + public static string VisitOurWebsite { + get { + return ResourceManager.GetString("VisitOurWebsite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Visit our website to get help, news, email us, and/or learn more about how to use Bitwarden.. + /// + public static string VisitOurWebsiteDescription { + get { + return ResourceManager.GetString("VisitOurWebsiteDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warning. + /// + public static string Warning { + get { + return ResourceManager.GetString("Warning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Website. + /// + public static string Website { + get { + return ResourceManager.GetString("Website", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bitwarden Web Vault. + /// + public static string WebVault { + get { + return ResourceManager.GetString("WebVault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Web Vault Server URL. + /// + public static string WebVaultUrl { + get { + return ResourceManager.GetString("WebVaultUrl", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Who owns this item?. + /// + public static string WhoOwnsThisItem { + get { + return ResourceManager.GetString("WhoOwnsThisItem", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows Hello. + /// + public static string WindowsHello { + get { + return ResourceManager.GetString("WindowsHello", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Word Separator. + /// + public static string WordSeparator { + get { + return ResourceManager.GetString("WordSeparator", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes. + /// + public static string Yes { + get { + return ResourceManager.GetString("Yes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes, and Save. + /// + public static string YesAndSave { + get { + return ResourceManager.GetString("YesAndSave", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your account has been permanently deleted. + /// + public static string YourAccountHasBeenPermanentlyDeleted { + get { + return ResourceManager.GetString("YourAccountHasBeenPermanentlyDeleted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Your account's fingerprint phrase. + /// + public static string YourAccountsFingerprint { + get { + return ResourceManager.GetString("YourAccountsFingerprint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To continue, hold your YubiKey NEO against the back of the device or insert your YubiKey into your device's USB port, then touch its button.. + /// + public static string YubiKeyInstruction { + get { + return ResourceManager.GetString("YubiKeyInstruction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to To continue, hold your YubiKey NEO against the back of the device.. + /// + public static string YubiKeyInstructionIos { + get { + return ResourceManager.GetString("YubiKeyInstructionIos", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to YubiKey Security Key. + /// + public static string YubiKeyTitle { + get { + return ResourceManager.GetString("YubiKeyTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Zip / Postal Code. + /// + public static string ZipPostalCode { + get { + return ResourceManager.GetString("ZipPostalCode", resourceCulture); + } + } } } diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 58cc1f7c9..58619fb00 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -2263,4 +2263,10 @@ We were unable to process your request. Please try again or contact us. + + Allow Screen Capture + + + Are you sure you want to enable Screen Capture? + diff --git a/src/Core/Abstractions/IStateService.cs b/src/Core/Abstractions/IStateService.cs index 5e0cb94bd..578635395 100644 --- a/src/Core/Abstractions/IStateService.cs +++ b/src/Core/Abstractions/IStateService.cs @@ -148,6 +148,8 @@ namespace Bit.Core.Abstractions Task SetRefreshTokenAsync(string value, bool skipTokenStorage, string userId = null); Task GetTwoFactorTokenAsync(string email = null); Task SetTwoFactorTokenAsync(string value, string email = null); + Task GetScreenCaptureAllowedAsync(string userId = null); + Task SetScreenCaptureAllowedAsync(bool value, string userId = null); Task SaveExtensionActiveUserIdToStorageAsync(string userId); } } diff --git a/src/Core/Models/Domain/Account.cs b/src/Core/Models/Domain/Account.cs index cc65e92fe..75a493ccc 100644 --- a/src/Core/Models/Domain/Account.cs +++ b/src/Core/Models/Domain/Account.cs @@ -94,11 +94,13 @@ namespace Bit.Core.Models.Domain EnvironmentUrls = copy.EnvironmentUrls; VaultTimeout = copy.VaultTimeout; VaultTimeoutAction = copy.VaultTimeoutAction; + ScreenCaptureAllowed = copy.ScreenCaptureAllowed; } public EnvironmentUrlData EnvironmentUrls; public int? VaultTimeout; public VaultTimeoutAction? VaultTimeoutAction; + public bool ScreenCaptureAllowed; } public class AccountVolatileData diff --git a/src/Core/Services/StateMigrationService.cs b/src/Core/Services/StateMigrationService.cs index 5574ad72f..52a33005a 100644 --- a/src/Core/Services/StateMigrationService.cs +++ b/src/Core/Services/StateMigrationService.cs @@ -191,7 +191,7 @@ namespace Bit.Core.Services EnvironmentUrls = environmentUrls, VaultTimeout = vaultTimeout, VaultTimeoutAction = - vaultTimeoutAction == "logout" ? VaultTimeoutAction.Logout : VaultTimeoutAction.Lock, + vaultTimeoutAction == "logout" ? VaultTimeoutAction.Logout : VaultTimeoutAction.Lock }; var state = new State { Accounts = new Dictionary { [userId] = account } }; state.ActiveUserId = userId; diff --git a/src/Core/Services/StateService.cs b/src/Core/Services/StateService.cs index c9f7bda15..8ef20e8aa 100644 --- a/src/Core/Services/StateService.cs +++ b/src/Core/Services/StateService.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Bit.Core.Abstractions; @@ -558,6 +559,27 @@ namespace Bit.Core.Services await SaveAccountAsync(account, reconciledOptions); } + public async Task GetScreenCaptureAllowedAsync(string userId = null) + { + if (CoreHelpers.ForceScreenCaptureEnabled()) + { + return true; + } + + return (await GetAccountAsync( + ReconcileOptions(new StorageOptions { UserId = userId }, await GetDefaultStorageOptionsAsync()) + ))?.Settings?.ScreenCaptureAllowed ?? false; + } + + public async Task SetScreenCaptureAllowedAsync(bool value, string userId = null) + { + var reconciledOptions = ReconcileOptions(new StorageOptions { UserId = userId }, + await GetDefaultStorageOptionsAsync()); + var account = await GetAccountAsync(reconciledOptions); + account.Settings.ScreenCaptureAllowed = value; + await SaveAccountAsync(account, reconciledOptions); + } + public async Task GetLastFileCacheClearAsync() { var options = await GetDefaultStorageOptionsAsync(); @@ -1461,6 +1483,7 @@ namespace Bit.Core.Services var existingAccount = state.Accounts[account.Profile.UserId]; account.Settings.VaultTimeout = existingAccount.Settings.VaultTimeout; account.Settings.VaultTimeoutAction = existingAccount.Settings.VaultTimeoutAction; + account.Settings.ScreenCaptureAllowed = existingAccount.Settings.ScreenCaptureAllowed; } // New account defaults diff --git a/src/Core/Utilities/CoreHelpers.cs b/src/Core/Utilities/CoreHelpers.cs index f871c54ff..bb3d5586b 100644 --- a/src/Core/Utilities/CoreHelpers.cs +++ b/src/Core/Utilities/CoreHelpers.cs @@ -34,6 +34,25 @@ namespace Bit.Core.Utilities #endif } + /// + /// Returns whether to force enabling the screen capture. + /// On Debug it will allow screen capture by default but this method + /// makes it easier to test the change on enabling/disabling the feature + /// on debug. + /// + /// + /// To test enabling/disabling in DEBUG, just return false in the #if condition + /// and that's it. + /// + public static bool ForceScreenCaptureEnabled() + { +#if DEBUG + return true; +#else + return false; +#endif + } + public static string GetHostname(string uriString) { var uri = GetUri(uriString); diff --git a/src/iOS.Core/Services/DeviceActionService.cs b/src/iOS.Core/Services/DeviceActionService.cs index 28b12703a..22701bc73 100644 --- a/src/iOS.Core/Services/DeviceActionService.cs +++ b/src/iOS.Core/Services/DeviceActionService.cs @@ -604,6 +604,12 @@ namespace Bit.iOS.Core.Services await ASHelpers.ReplaceAllIdentities(); } + public Task SetScreenCaptureAllowedAsync() + { + // only used by Android. Not possible in iOS + return Task.CompletedTask; + } + public class PickerDelegate : UIDocumentPickerDelegate { private readonly DeviceActionService _deviceActionService; From 5e61fb0a141a7fe31471b0cf85be5cdc12fe78d8 Mon Sep 17 00:00:00 2001 From: Federico Maccaroni Date: Fri, 15 Jul 2022 13:35:21 -0300 Subject: [PATCH 16/16] EC-325 fix format (#1995) --- src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs b/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs index e0e9a7fe2..84f42e67f 100644 --- a/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs +++ b/src/App/Pages/Vault/GroupingsPage/GroupingsPageViewModel.cs @@ -298,7 +298,7 @@ namespace Bit.App.Pages } }, AppResources.Trash, _deletedCount, uppercaseGroupNames, false)); } - + // TODO: refactor this if (Device.RuntimePlatform == Device.Android ||