From f1419a75f6441f25dcae0fc20b310c47b2993782 Mon Sep 17 00:00:00 2001 From: Matt Portune <59324545+mportune-bw@users.noreply.github.com> Date: Thu, 3 Sep 2020 12:30:40 -0400 Subject: [PATCH] Added SSO flows and functionality (#1047) * SSO login flow for pre-existing user and no 2FA * 2FA progress * 2FA support * Added SSO flows and functionality * Handle webauthenticator cancellation gracefully * updates & bugfixes * Added state validation to web auth response handling * SSO auth, account registration, and environment settings support for iOS extensions * Added SSO prevalidation to auth process * prevalidation now hitting identity service base url * additional error handling * Requested changes * fixed case --- src/Android/Android.csproj | 3 +- src/Android/MainActivity.cs | 1 + src/Android/WebAuthCallbackActivity.cs | 11 + src/App/App.csproj | 10 +- src/App/Models/AppOptions.cs | 23 + .../Pages/Accounts/EnvironmentPage.xaml.cs | 21 +- .../Accounts/EnvironmentPageViewModel.cs | 8 +- src/App/Pages/Accounts/HomePage.xaml | 8 +- src/App/Pages/Accounts/HomePage.xaml.cs | 55 +- src/App/Pages/Accounts/HomePageViewModel.cs | 9 +- src/App/Pages/Accounts/LockPage.xaml.cs | 21 +- src/App/Pages/Accounts/LockPageViewModel.cs | 34 +- src/App/Pages/Accounts/LoginPage.xaml.cs | 29 +- src/App/Pages/Accounts/LoginPageViewModel.cs | 4 +- src/App/Pages/Accounts/LoginSsoPage.xaml | 42 + src/App/Pages/Accounts/LoginSsoPage.xaml.cs | 114 + .../Pages/Accounts/LoginSsoPageViewModel.cs | 218 + src/App/Pages/Accounts/RegisterPage.xaml.cs | 23 +- .../Pages/Accounts/RegisterPageViewModel.cs | 1 + src/App/Pages/Accounts/SetPasswordPage.xaml | 146 + .../Pages/Accounts/SetPasswordPage.xaml.cs | 82 + .../Accounts/SetPasswordPageViewModel.cs | 259 + src/App/Pages/Accounts/TwoFactorPage.xaml.cs | 48 +- .../Pages/Accounts/TwoFactorPageViewModel.cs | 26 +- src/App/Resources/AppResources.Designer.cs | 6453 +++++++---------- src/App/Resources/AppResources.resx | 48 + src/App/Utilities/AppHelpers.cs | 30 + src/Core/Abstractions/IApiService.cs | 3 + src/Core/Abstractions/IAuthService.cs | 8 +- .../IPasswordGenerationService.cs | 2 +- src/Core/Abstractions/IPolicyService.cs | 3 + src/Core/Core.csproj | 1 + src/Core/Models/Domain/AuthResult.cs | 1 + .../Domain/MasterPasswordPolicyOptions.cs | 22 + .../Request/PasswordVerificationRequest.cs | 7 + src/Core/Models/Request/SetPasswordRequest.cs | 14 + src/Core/Models/Request/TokenRequest.cs | 51 +- .../Models/Response/IdentityTokenResponse.cs | 7 +- src/Core/Services/ApiService.cs | 57 +- src/Core/Services/AuthService.cs | 104 +- .../Services/PasswordGenerationService.cs | 24 +- src/Core/Services/PolicyService.cs | 152 + .../CredentialProviderViewController.cs | 127 +- src/iOS.Extension/LoadingViewController.cs | 119 +- src/iOS/AppDelegate.cs | 9 + src/iOS/iOS.csproj | 2 +- 46 files changed, 4368 insertions(+), 4072 deletions(-) create mode 100644 src/Android/WebAuthCallbackActivity.cs create mode 100644 src/App/Pages/Accounts/LoginSsoPage.xaml create mode 100644 src/App/Pages/Accounts/LoginSsoPage.xaml.cs create mode 100644 src/App/Pages/Accounts/LoginSsoPageViewModel.cs create mode 100644 src/App/Pages/Accounts/SetPasswordPage.xaml create mode 100644 src/App/Pages/Accounts/SetPasswordPage.xaml.cs create mode 100644 src/App/Pages/Accounts/SetPasswordPageViewModel.cs create mode 100644 src/Core/Models/Domain/MasterPasswordPolicyOptions.cs create mode 100644 src/Core/Models/Request/PasswordVerificationRequest.cs create mode 100644 src/Core/Models/Request/SetPasswordRequest.cs diff --git a/src/Android/Android.csproj b/src/Android/Android.csproj index bc28a1654..41867dcb9 100644 --- a/src/Android/Android.csproj +++ b/src/Android/Android.csproj @@ -78,7 +78,7 @@ 1.8.6.7 - 1.5.3.1 + 1.5.3.2 71.1740.0 @@ -142,6 +142,7 @@ + diff --git a/src/Android/MainActivity.cs b/src/Android/MainActivity.cs index 1cf8ba7fb..0eecb4567 100644 --- a/src/Android/MainActivity.cs +++ b/src/Android/MainActivity.cs @@ -144,6 +144,7 @@ namespace Bit.Droid protected override void OnResume() { base.OnResume(); + Xamarin.Essentials.Platform.OnResume(); if (_deviceActionService.SupportsNfc()) { try diff --git a/src/Android/WebAuthCallbackActivity.cs b/src/Android/WebAuthCallbackActivity.cs new file mode 100644 index 000000000..c551adf40 --- /dev/null +++ b/src/Android/WebAuthCallbackActivity.cs @@ -0,0 +1,11 @@ +using Android.App; +using Android.Content.PM; + +namespace Bit.Droid +{ + [Activity(NoHistory = true, LaunchMode = LaunchMode.SingleTop)] + [IntentFilter(new[] { Android.Content.Intent.ActionView }, + Categories = new[] { Android.Content.Intent.CategoryDefault, Android.Content.Intent.CategoryBrowsable }, + DataScheme = "bitwarden")] + public class WebAuthCallbackActivity : Xamarin.Essentials.WebAuthenticatorCallbackActivity { } +} diff --git a/src/App/App.csproj b/src/App/App.csproj index 576a4c572..e50a78334 100644 --- a/src/App/App.csproj +++ b/src/App/App.csproj @@ -15,7 +15,7 @@ - + @@ -111,6 +111,14 @@ GroupingsPage.xaml + + LoginSsoPage.xaml + Code + + + ResetMasterPasswordPage.xaml + Code + diff --git a/src/App/Models/AppOptions.cs b/src/App/Models/AppOptions.cs index 0d3e424a7..564ab5704 100644 --- a/src/App/Models/AppOptions.cs +++ b/src/App/Models/AppOptions.cs @@ -19,5 +19,28 @@ namespace Bit.App.Models public string SaveCardExpYear { get; set; } public string SaveCardCode { get; set; } public bool IosExtension { get; set; } + + public void SetAllFrom(AppOptions o) + { + if (o == null) + { + return; + } + MyVaultTile = o.MyVaultTile; + GeneratorTile = o.GeneratorTile; + FromAutofillFramework = o.FromAutofillFramework; + FillType = o.FillType; + Uri = o.Uri; + SaveType = o.SaveType; + SaveName = o.SaveName; + SaveUsername = o.SaveUsername; + SavePassword = o.SavePassword; + SaveCardName = o.SaveCardName; + SaveCardNumber = o.SaveCardNumber; + SaveCardExpMonth = o.SaveCardExpMonth; + SaveCardExpYear = o.SaveCardExpYear; + SaveCardCode = o.SaveCardCode; + IosExtension = o.IosExtension; + } } } diff --git a/src/App/Pages/Accounts/EnvironmentPage.xaml.cs b/src/App/Pages/Accounts/EnvironmentPage.xaml.cs index f5fc51531..d6a916131 100644 --- a/src/App/Pages/Accounts/EnvironmentPage.xaml.cs +++ b/src/App/Pages/Accounts/EnvironmentPage.xaml.cs @@ -1,17 +1,21 @@ using Bit.Core.Abstractions; using Bit.Core.Utilities; using System; +using System.Threading.Tasks; +using Bit.App.Resources; using Xamarin.Forms; namespace Bit.App.Pages { public partial class EnvironmentPage : BaseContentPage { + private readonly IPlatformUtilsService _platformUtilsService; private readonly IMessagingService _messagingService; private readonly EnvironmentPageViewModel _vm; public EnvironmentPage() { + _platformUtilsService = ServiceContainer.Resolve("platformUtilsService"); _messagingService = ServiceContainer.Resolve("messagingService"); _messagingService.Send("showStatusBar", true); InitializeComponent(); @@ -28,6 +32,12 @@ namespace Bit.App.Pages _apiEntry.ReturnCommand = new Command(() => _identityEntry.Focus()); _identityEntry.ReturnType = ReturnType.Next; _identityEntry.ReturnCommand = new Command(() => _iconsEntry.Focus()); + _vm.SubmitSuccessAction = () => Device.BeginInvokeOnMainThread(async () => await SubmitSuccessAsync()); + _vm.CloseAction = async () => + { + _messagingService.Send("showStatusBar", false); + await Navigation.PopModalAsync(); + }; } private async void Submit_Clicked(object sender, EventArgs e) @@ -38,12 +48,17 @@ namespace Bit.App.Pages } } - private async void Close_Clicked(object sender, EventArgs e) + private async Task SubmitSuccessAsync() + { + _platformUtilsService.ShowToast("success", null, AppResources.EnvironmentSaved); + await Navigation.PopModalAsync(); + } + + private void Close_Clicked(object sender, EventArgs e) { if (DoOnce()) { - _messagingService.Send("showStatusBar", false); - await Navigation.PopModalAsync(); + _vm.CloseAction(); } } } diff --git a/src/App/Pages/Accounts/EnvironmentPageViewModel.cs b/src/App/Pages/Accounts/EnvironmentPageViewModel.cs index 09eaf7f3a..c47491668 100644 --- a/src/App/Pages/Accounts/EnvironmentPageViewModel.cs +++ b/src/App/Pages/Accounts/EnvironmentPageViewModel.cs @@ -1,6 +1,7 @@ using Bit.App.Resources; using Bit.Core.Abstractions; using Bit.Core.Utilities; +using System; using System.Threading.Tasks; using Xamarin.Forms; @@ -8,12 +9,10 @@ namespace Bit.App.Pages { public class EnvironmentPageViewModel : BaseViewModel { - private readonly IPlatformUtilsService _platformUtilsService; private readonly IEnvironmentService _environmentService; public EnvironmentPageViewModel() { - _platformUtilsService = ServiceContainer.Resolve("platformUtilsService"); _environmentService = ServiceContainer.Resolve("environmentService"); PageTitle = AppResources.Settings; @@ -33,6 +32,8 @@ namespace Bit.App.Pages public string WebVaultUrl { get; set; } public string IconsUrl { get; set; } public string NotificationsUrls { get; set; } + public Action SubmitSuccessAction { get; set; } + public Action CloseAction { get; set; } public async Task SubmitAsync() { @@ -54,8 +55,7 @@ namespace Bit.App.Pages IconsUrl = resUrls.Icons; NotificationsUrls = resUrls.Notifications; - _platformUtilsService.ShowToast("success", null, AppResources.EnvironmentSaved); - await Page.Navigation.PopModalAsync(); + SubmitSuccessAction?.Invoke(); } } } diff --git a/src/App/Pages/Accounts/HomePage.xaml b/src/App/Pages/Accounts/HomePage.xaml index ea4562cf2..62896ba2f 100644 --- a/src/App/Pages/Accounts/HomePage.xaml +++ b/src/App/Pages/Accounts/HomePage.xaml @@ -11,12 +11,16 @@ + + + + @@ -39,6 +43,8 @@ Clicked="LogIn_Clicked"> + diff --git a/src/App/Pages/Accounts/HomePage.xaml.cs b/src/App/Pages/Accounts/HomePage.xaml.cs index 67cc3b2f4..204f389a1 100644 --- a/src/App/Pages/Accounts/HomePage.xaml.cs +++ b/src/App/Pages/Accounts/HomePage.xaml.cs @@ -10,6 +10,7 @@ namespace Bit.App.Pages { public partial class HomePage : BaseContentPage { + private readonly HomeViewModel _vm; private readonly AppOptions _appOptions; private IMessagingService _messagingService; @@ -19,6 +20,12 @@ namespace Bit.App.Pages _messagingService.Send("showStatusBar", false); _appOptions = appOptions; InitializeComponent(); + _vm = BindingContext as HomeViewModel; + _vm.Page = this; + _vm.StartLoginAction = () => Device.BeginInvokeOnMainThread(async () => await StartLoginAsync()); + _vm.StartRegisterAction = () => Device.BeginInvokeOnMainThread(async () => await StartRegisterAsync()); + _vm.StartSsoLoginAction = () => Device.BeginInvokeOnMainThread(async () => await StartSsoLoginAsync()); + _vm.StartEnvironmentAction = () => Device.BeginInvokeOnMainThread(async () => await StartEnvironmentAsync()); _logo.Source = !ThemeManager.UsingLightTheme ? "logo_white.png" : "logo.png"; } @@ -33,29 +40,69 @@ namespace Bit.App.Pages base.OnAppearing(); _messagingService.Send("showStatusBar", false); } + + private void Close_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + _vm.CloseAction(); + } + } private void LogIn_Clicked(object sender, EventArgs e) { if (DoOnce()) { - Navigation.PushModalAsync(new NavigationPage(new LoginPage(null, _appOptions))); + _vm.StartLoginAction(); } } + private async Task StartLoginAsync() + { + var page = new LoginPage(null, _appOptions); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + private void Register_Clicked(object sender, EventArgs e) { if (DoOnce()) { - Navigation.PushModalAsync(new NavigationPage(new RegisterPage(this))); + _vm.StartRegisterAction(); } } + + private async Task StartRegisterAsync() + { + var page = new RegisterPage(this); + await Navigation.PushModalAsync(new NavigationPage(page)); + } - private void Settings_Clicked(object sender, EventArgs e) + private void LogInSso_Clicked(object sender, EventArgs e) { if (DoOnce()) { - Navigation.PushModalAsync(new NavigationPage(new EnvironmentPage())); + _vm.StartSsoLoginAction(); } } + + private async Task StartSsoLoginAsync() + { + var page = new LoginSsoPage(_appOptions); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + + private void Environment_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + _vm.StartEnvironmentAction(); + } + } + + private async Task StartEnvironmentAsync() + { + var page = new EnvironmentPage(); + await Navigation.PushModalAsync(new NavigationPage(page)); + } } } diff --git a/src/App/Pages/Accounts/HomePageViewModel.cs b/src/App/Pages/Accounts/HomePageViewModel.cs index 3dbd0c946..31474634e 100644 --- a/src/App/Pages/Accounts/HomePageViewModel.cs +++ b/src/App/Pages/Accounts/HomePageViewModel.cs @@ -1,4 +1,5 @@ using System; +using Bit.App.Resources; namespace Bit.App.Pages { @@ -6,7 +7,13 @@ namespace Bit.App.Pages { public HomeViewModel() { - PageTitle = "Home Page"; + PageTitle = AppResources.Bitwarden; } + + public Action StartLoginAction { get; set; } + public Action StartRegisterAction { get; set; } + public Action StartSsoLoginAction { get; set; } + public Action StartEnvironmentAction { get; set; } + public Action CloseAction { get; set; } } } diff --git a/src/App/Pages/Accounts/LockPage.xaml.cs b/src/App/Pages/Accounts/LockPage.xaml.cs index ccc5b2761..25107c65b 100644 --- a/src/App/Pages/Accounts/LockPage.xaml.cs +++ b/src/App/Pages/Accounts/LockPage.xaml.cs @@ -1,9 +1,9 @@ using Bit.App.Models; -using Bit.Core; using Bit.Core.Abstractions; using Bit.Core.Utilities; using System; using System.Threading.Tasks; +using Bit.App.Utilities; using Xamarin.Forms; namespace Bit.App.Pages @@ -99,24 +99,11 @@ namespace Bit.App.Pages private async Task UnlockedAsync() { - if (_appOptions != null) + if (AppHelpers.SetAlternateMainPage(_appOptions)) { - if (_appOptions.FromAutofillFramework && _appOptions.SaveType.HasValue) - { - Application.Current.MainPage = new NavigationPage(new AddEditPage(appOptions: _appOptions)); - return; - } - if (_appOptions.Uri != null) - { - Application.Current.MainPage = new NavigationPage(new AutofillCiphersPage(_appOptions)); - return; - } - } - var previousPage = await _storageService.GetAsync(Constants.PreviousPageKey); - if (previousPage != null) - { - await _storageService.RemoveAsync(Constants.PreviousPageKey); + return; } + var previousPage = await AppHelpers.ClearPreviousPage(); Application.Current.MainPage = new TabsPage(_appOptions, previousPage); } } diff --git a/src/App/Pages/Accounts/LockPageViewModel.cs b/src/App/Pages/Accounts/LockPageViewModel.cs index fec02b33d..44974a2ea 100644 --- a/src/App/Pages/Accounts/LockPageViewModel.cs +++ b/src/App/Pages/Accounts/LockPageViewModel.cs @@ -8,12 +8,14 @@ using Bit.Core.Models.Domain; using Bit.Core.Utilities; using System; using System.Threading.Tasks; +using Bit.Core.Models.Request; using Xamarin.Forms; namespace Bit.App.Pages { public class LockPageViewModel : BaseViewModel { + private readonly IApiService _apiService; private readonly IPlatformUtilsService _platformUtilsService; private readonly IDeviceActionService _deviceActionService; private readonly IVaultTimeoutService _vaultTimeoutService; @@ -39,6 +41,7 @@ namespace Bit.App.Pages public LockPageViewModel() { + _apiService = ServiceContainer.Resolve("apiService"); _platformUtilsService = ServiceContainer.Resolve("platformUtilsService"); _deviceActionService = ServiceContainer.Resolve("deviceActionService"); _vaultTimeoutService = ServiceContainer.Resolve("vaultTimeoutService"); @@ -224,18 +227,33 @@ namespace Bit.App.Pages { var key = await _cryptoService.MakeKeyAsync(MasterPassword, _email, kdf, kdfIterations); var keyHash = await _cryptoService.HashPasswordAsync(MasterPassword, key); - var storedKeyHash = await _cryptoService.GetKeyHashAsync(); - if (storedKeyHash == null) + var passwordValid = false; + if (keyHash != null) { - var oldKey = await _secureStorageService.GetAsync("oldKey"); - if (key.KeyB64 == oldKey) + var storedKeyHash = await _cryptoService.GetKeyHashAsync(); + if (storedKeyHash != null) { - await _secureStorageService.RemoveAsync("oldKey"); - await _cryptoService.SetKeyHashAsync(keyHash); - storedKeyHash = keyHash; + passwordValid = storedKeyHash == keyHash; + } + else + { + await _deviceActionService.ShowLoadingAsync(AppResources.Loading); + var request = new PasswordVerificationRequest(); + request.MasterPasswordHash = keyHash; + try + { + await _apiService.PostAccountVerifyPasswordAsync(request); + passwordValid = true; + await _cryptoService.SetKeyHashAsync(keyHash); + } + catch (Exception e) + { + System.Diagnostics.Debug.WriteLine(">>> {0}: {1}", e.GetType(), e.StackTrace); + } + await _deviceActionService.HideLoadingAsync(); } } - if (storedKeyHash != null && keyHash != null && storedKeyHash == keyHash) + if (passwordValid) { if (_pinSet.Item1) { diff --git a/src/App/Pages/Accounts/LoginPage.xaml.cs b/src/App/Pages/Accounts/LoginPage.xaml.cs index c23637dbe..bef8f47d7 100644 --- a/src/App/Pages/Accounts/LoginPage.xaml.cs +++ b/src/App/Pages/Accounts/LoginPage.xaml.cs @@ -1,9 +1,9 @@ using Bit.App.Models; -using Bit.Core; using Bit.Core.Abstractions; using Bit.Core.Utilities; using System; using System.Threading.Tasks; +using Bit.App.Utilities; using Xamarin.Forms; namespace Bit.App.Pages @@ -25,7 +25,7 @@ namespace Bit.App.Pages _vm = BindingContext as LoginPageViewModel; _vm.Page = this; _vm.StartTwoFactorAction = () => Device.BeginInvokeOnMainThread(async () => await StartTwoFactorAsync()); - _vm.LoggedInAction = () => Device.BeginInvokeOnMainThread(async () => await LoggedInAsync()); + _vm.LogInSuccessAction = () => Device.BeginInvokeOnMainThread(async () => await LogInSuccessAsync()); _vm.CloseAction = async () => { _messagingService.Send("showStatusBar", false); @@ -74,7 +74,7 @@ namespace Bit.App.Pages } } - private async void Close_Clicked(object sender, EventArgs e) + private void Close_Clicked(object sender, EventArgs e) { if (DoOnce()) { @@ -84,30 +84,17 @@ namespace Bit.App.Pages private async Task StartTwoFactorAsync() { - var page = new TwoFactorPage(); + var page = new TwoFactorPage(false, _appOptions); await Navigation.PushModalAsync(new NavigationPage(page)); } - private async Task LoggedInAsync() + private async Task LogInSuccessAsync() { - if (_appOptions != null) + if (AppHelpers.SetAlternateMainPage(_appOptions)) { - if (_appOptions.FromAutofillFramework && _appOptions.SaveType.HasValue) - { - Application.Current.MainPage = new NavigationPage(new AddEditPage(appOptions: _appOptions)); - return; - } - if (_appOptions.Uri != null) - { - Application.Current.MainPage = new NavigationPage(new AutofillCiphersPage(_appOptions)); - return; - } - } - var previousPage = await _storageService.GetAsync(Constants.PreviousPageKey); - if (previousPage != null) - { - await _storageService.RemoveAsync(Constants.PreviousPageKey); + return; } + var previousPage = await AppHelpers.ClearPreviousPage(); Application.Current.MainPage = new TabsPage(_appOptions, previousPage); } } diff --git a/src/App/Pages/Accounts/LoginPageViewModel.cs b/src/App/Pages/Accounts/LoginPageViewModel.cs index 531c64773..b7a82919d 100644 --- a/src/App/Pages/Accounts/LoginPageViewModel.cs +++ b/src/App/Pages/Accounts/LoginPageViewModel.cs @@ -68,7 +68,7 @@ namespace Bit.App.Pages public string ShowPasswordIcon => ShowPassword ? "" : ""; public bool RememberEmail { get; set; } public Action StartTwoFactorAction { get; set; } - public Action LoggedInAction { get; set; } + public Action LogInSuccessAction { get; set; } public Action CloseAction { get; set; } public bool HideHintButton @@ -142,7 +142,7 @@ namespace Bit.App.Pages var disableFavicon = await _storageService.GetAsync(Constants.DisableFaviconKey); await _stateService.SaveAsync(Constants.DisableFaviconKey, disableFavicon.GetValueOrDefault()); var task = Task.Run(async () => await _syncService.FullSyncAsync(true)); - LoggedInAction?.Invoke(); + LogInSuccessAction?.Invoke(); } } catch (ApiException e) diff --git a/src/App/Pages/Accounts/LoginSsoPage.xaml b/src/App/Pages/Accounts/LoginSsoPage.xaml new file mode 100644 index 000000000..e58b69df4 --- /dev/null +++ b/src/App/Pages/Accounts/LoginSsoPage.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App/Pages/Accounts/LoginSsoPage.xaml.cs b/src/App/Pages/Accounts/LoginSsoPage.xaml.cs new file mode 100644 index 000000000..675676bcd --- /dev/null +++ b/src/App/Pages/Accounts/LoginSsoPage.xaml.cs @@ -0,0 +1,114 @@ +using Bit.App.Models; +using Bit.Core.Abstractions; +using Bit.Core.Utilities; +using System; +using System.Threading.Tasks; +using Bit.App.Utilities; +using Xamarin.Forms; + +namespace Bit.App.Pages +{ + public partial class LoginSsoPage : BaseContentPage + { + private readonly IStorageService _storageService; + private readonly IMessagingService _messagingService; + private readonly IVaultTimeoutService _vaultTimeoutService; + private readonly LoginSsoPageViewModel _vm; + private readonly AppOptions _appOptions; + + private AppOptions _appOptionsCopy; + + public LoginSsoPage(AppOptions appOptions = null) + { + _storageService = ServiceContainer.Resolve("storageService"); + _messagingService = ServiceContainer.Resolve("messagingService"); + _vaultTimeoutService = ServiceContainer.Resolve("vaultTimeoutService"); + _messagingService.Send("showStatusBar", true); + _appOptions = appOptions; + InitializeComponent(); + _vm = BindingContext as LoginSsoPageViewModel; + _vm.Page = this; + _vm.StartTwoFactorAction = () => Device.BeginInvokeOnMainThread(async () => await StartTwoFactorAsync()); + _vm.StartSetPasswordAction = () => + Device.BeginInvokeOnMainThread(async () => await StartSetPasswordAsync()); + _vm.SsoAuthSuccessAction = () => Device.BeginInvokeOnMainThread(async () => await SsoAuthSuccessAsync()); + _vm.CloseAction = async () => + { + _messagingService.Send("showStatusBar", false); + await Navigation.PopModalAsync(); + }; + if (Device.RuntimePlatform == Device.Android) + { + ToolbarItems.RemoveAt(0); + } + } + + protected override async void OnAppearing() + { + base.OnAppearing(); + await _vm.InitAsync(); + if (string.IsNullOrWhiteSpace(_vm.OrgIdentifier)) + { + RequestFocus(_orgIdentifier); + } + } + + private void CopyAppOptions() + { + if (_appOptions != null) + { + // create an object copy of _appOptions to persist values when app is exited during web auth flow + _appOptionsCopy = new AppOptions(); + _appOptionsCopy.SetAllFrom(_appOptions); + } + } + + private void RestoreAppOptionsFromCopy() + { + if (_appOptions != null) + { + // restore values to original readonly _appOptions object from copy + _appOptions.SetAllFrom(_appOptionsCopy); + _appOptionsCopy = null; + } + } + + private async void LogIn_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + CopyAppOptions(); + await _vm.LogInAsync(); + } + } + + private void Close_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + _vm.CloseAction(); + } + } + + private async Task StartTwoFactorAsync() + { + RestoreAppOptionsFromCopy(); + var page = new TwoFactorPage(true, _appOptions); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + + private async Task StartSetPasswordAsync() + { + RestoreAppOptionsFromCopy(); + var page = new SetPasswordPage(_appOptions); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + + private async Task SsoAuthSuccessAsync() + { + RestoreAppOptionsFromCopy(); + await AppHelpers.ClearPreviousPage(); + Application.Current.MainPage = new NavigationPage(new LockPage(_appOptions)); + } + } +} diff --git a/src/App/Pages/Accounts/LoginSsoPageViewModel.cs b/src/App/Pages/Accounts/LoginSsoPageViewModel.cs new file mode 100644 index 000000000..9a733091f --- /dev/null +++ b/src/App/Pages/Accounts/LoginSsoPageViewModel.cs @@ -0,0 +1,218 @@ +using Bit.App.Abstractions; +using Bit.App.Resources; +using Bit.Core; +using Bit.Core.Abstractions; +using Bit.Core.Utilities; +using System; +using System.Threading.Tasks; +using Bit.Core.Enums; +using Bit.Core.Exceptions; +using Bit.Core.Models.Domain; +using Xamarin.Essentials; +using Xamarin.Forms; + +namespace Bit.App.Pages +{ + public class LoginSsoPageViewModel : BaseViewModel + { + private const string Keys_RememberedOrgIdentifier = "rememberedOrgIdentifier"; + private const string Keys_RememberOrgIdentifier = "rememberOrgIdentifier"; + + private readonly IDeviceActionService _deviceActionService; + private readonly IAuthService _authService; + private readonly ISyncService _syncService; + private readonly IApiService _apiService; + private readonly IPasswordGenerationService _passwordGenerationService; + private readonly ICryptoFunctionService _cryptoFunctionService; + private readonly IStorageService _storageService; + private readonly IPlatformUtilsService _platformUtilsService; + private readonly IStateService _stateService; + + private string _orgIdentifier; + + public LoginSsoPageViewModel() + { + _deviceActionService = ServiceContainer.Resolve("deviceActionService"); + _authService = ServiceContainer.Resolve("authService"); + _syncService = ServiceContainer.Resolve("syncService"); + _apiService = ServiceContainer.Resolve("apiService"); + _passwordGenerationService = + ServiceContainer.Resolve("passwordGenerationService"); + _cryptoFunctionService = ServiceContainer.Resolve("cryptoFunctionService"); + _storageService = ServiceContainer.Resolve("storageService"); + _platformUtilsService = ServiceContainer.Resolve("platformUtilsService"); + _stateService = ServiceContainer.Resolve("stateService"); + + PageTitle = AppResources.Bitwarden; + LogInCommand = new Command(async () => await LogInAsync()); + } + + public string OrgIdentifier + { + get => _orgIdentifier; + set => SetProperty(ref _orgIdentifier, value); + } + + public Command LogInCommand { get; } + public bool RememberOrgIdentifier { get; set; } + public Action StartTwoFactorAction { get; set; } + public Action StartSetPasswordAction { get; set; } + public Action SsoAuthSuccessAction { get; set; } + public Action CloseAction { get; set; } + + public async Task InitAsync() + { + if (string.IsNullOrWhiteSpace(OrgIdentifier)) + { + OrgIdentifier = await _storageService.GetAsync(Keys_RememberedOrgIdentifier); + } + var rememberOrgIdentifier = await _storageService.GetAsync(Keys_RememberOrgIdentifier); + RememberOrgIdentifier = rememberOrgIdentifier.GetValueOrDefault(true); + } + + public async Task LogInAsync() + { + if (Connectivity.NetworkAccess == NetworkAccess.None) + { + await _platformUtilsService.ShowDialogAsync(AppResources.InternetConnectionRequiredMessage, + AppResources.InternetConnectionRequiredTitle); + return; + } + if (string.IsNullOrWhiteSpace(OrgIdentifier)) + { + await _platformUtilsService.ShowDialogAsync( + string.Format(AppResources.ValidationFieldRequired, AppResources.OrgIdentifier), + AppResources.AnErrorHasOccurred, + AppResources.Ok); + return; + } + + await _deviceActionService.ShowLoadingAsync(AppResources.LoggingIn); + + try + { + await _apiService.PreValidateSso(OrgIdentifier); + } + catch (ApiException e) + { + await _deviceActionService.HideLoadingAsync(); + await _platformUtilsService.ShowDialogAsync( + (e?.Error != null ? e.Error.GetSingleMessage() : AppResources.LoginSsoError), + AppResources.AnErrorHasOccurred); + return; + } + + var passwordOptions = new PasswordGenerationOptions(true); + passwordOptions.Length = 64; + + var codeVerifier = await _passwordGenerationService.GeneratePasswordAsync(passwordOptions); + var codeVerifierHash = await _cryptoFunctionService.HashAsync(codeVerifier, CryptoHashAlgorithm.Sha256); + var codeChallenge = CoreHelpers.Base64UrlEncode(codeVerifierHash); + + var state = await _passwordGenerationService.GeneratePasswordAsync(passwordOptions); + + var redirectUri = "bitwarden://sso-callback"; + + var url = _apiService.IdentityBaseUrl + "/connect/authorize?" + + "client_id=" + _platformUtilsService.IdentityClientId + "&" + + "redirect_uri=" + Uri.EscapeDataString(redirectUri) + "&" + + "response_type=code&scope=api%20offline_access&" + + "state=" + state + "&code_challenge=" + codeChallenge + "&" + + "code_challenge_method=S256&response_mode=query&" + + "domain_hint=" + Uri.EscapeDataString(OrgIdentifier); + + WebAuthenticatorResult authResult = null; + bool cancelled = false; + try + { + authResult = await WebAuthenticator.AuthenticateAsync(new Uri(url), + new Uri(redirectUri)); + } + catch (TaskCanceledException taskCanceledException) + { + await _deviceActionService.HideLoadingAsync(); + cancelled = true; + } + catch (Exception e) + { + // WebAuthenticator throws NSErrorException if iOS flow is cancelled - by setting cancelled to true + // here we maintain the appearance of a clean cancellation (we don't want to do this across the board + // because we still want to present legitimate errors). If/when this is fixed, we can remove this + // particular catch block (catching taskCanceledException above must remain) + // https://github.com/xamarin/Essentials/issues/1240 + if (Device.RuntimePlatform == Device.iOS) + { + await _deviceActionService.HideLoadingAsync(); + cancelled = true; + } + } + if (!cancelled) + { + var code = GetResultCode(authResult, state); + if (!string.IsNullOrEmpty(code)) + { + await LogIn(code, codeVerifier, redirectUri); + } + else + { + await _deviceActionService.HideLoadingAsync(); + await _platformUtilsService.ShowDialogAsync(AppResources.LoginSsoError, + AppResources.AnErrorHasOccurred); + } + } + } + + private string GetResultCode(WebAuthenticatorResult authResult, string state) + { + string code = null; + if (authResult != null) + { + authResult.Properties.TryGetValue("state", out var resultState); + if (resultState == state) + { + authResult.Properties.TryGetValue("code", out var resultCode); + code = resultCode; + } + } + return code; + } + + private async Task LogIn(string code, string codeVerifier, string redirectUri) + { + try + { + var response = await _authService.LogInSsoAsync(code, codeVerifier, redirectUri); + if (RememberOrgIdentifier) + { + await _storageService.SaveAsync(Keys_RememberedOrgIdentifier, OrgIdentifier); + } + else + { + await _storageService.RemoveAsync(Keys_RememberedOrgIdentifier); + } + await _deviceActionService.HideLoadingAsync(); + if (response.TwoFactor) + { + StartTwoFactorAction?.Invoke(); + } + else if (response.ResetMasterPassword) + { + StartSetPasswordAction?.Invoke(); + } + else + { + var disableFavicon = await _storageService.GetAsync(Constants.DisableFaviconKey); + await _stateService.SaveAsync(Constants.DisableFaviconKey, disableFavicon.GetValueOrDefault()); + var task = Task.Run(async () => await _syncService.FullSyncAsync(true)); + SsoAuthSuccessAction?.Invoke(); + } + } + catch (Exception e) + { + await _deviceActionService.HideLoadingAsync(); + await _platformUtilsService.ShowDialogAsync(AppResources.LoginSsoError, + AppResources.AnErrorHasOccurred); + } + } + } +} diff --git a/src/App/Pages/Accounts/RegisterPage.xaml.cs b/src/App/Pages/Accounts/RegisterPage.xaml.cs index 0966bc78b..1589da34f 100644 --- a/src/App/Pages/Accounts/RegisterPage.xaml.cs +++ b/src/App/Pages/Accounts/RegisterPage.xaml.cs @@ -1,6 +1,7 @@ using Bit.Core.Abstractions; using Bit.Core.Utilities; using System; +using System.Threading.Tasks; using Xamarin.Forms; namespace Bit.App.Pages @@ -17,12 +18,11 @@ namespace Bit.App.Pages InitializeComponent(); _vm = BindingContext as RegisterPageViewModel; _vm.Page = this; - _vm.RegistrationSuccess = async () => + _vm.RegistrationSuccess = () => Device.BeginInvokeOnMainThread(async () => await RegistrationSuccessAsync(homePage)); + _vm.CloseAction = async () => { - if (homePage != null) - { - await homePage.DismissRegisterPageAndLogInAsync(_vm.Email); - } + _messagingService.Send("showStatusBar", false); + await Navigation.PopModalAsync(); }; MasterPasswordEntry = _masterPassword; ConfirmMasterPasswordEntry = _confirmMasterPassword; @@ -55,13 +55,20 @@ namespace Bit.App.Pages await _vm.SubmitAsync(); } } + + private async Task RegistrationSuccessAsync(HomePage homePage) + { + if (homePage != null) + { + await homePage.DismissRegisterPageAndLogInAsync(_vm.Email); + } + } - private async void Close_Clicked(object sender, EventArgs e) + private void Close_Clicked(object sender, EventArgs e) { if (DoOnce()) { - _messagingService.Send("showStatusBar", false); - await Navigation.PopModalAsync(); + _vm.CloseAction(); } } } diff --git a/src/App/Pages/Accounts/RegisterPageViewModel.cs b/src/App/Pages/Accounts/RegisterPageViewModel.cs index 0f771a36f..fd6728661 100644 --- a/src/App/Pages/Accounts/RegisterPageViewModel.cs +++ b/src/App/Pages/Accounts/RegisterPageViewModel.cs @@ -52,6 +52,7 @@ namespace Bit.App.Pages public string ConfirmMasterPassword { get; set; } public string Hint { get; set; } public Action RegistrationSuccess { get; set; } + public Action CloseAction { get; set; } public async Task SubmitAsync() { diff --git a/src/App/Pages/Accounts/SetPasswordPage.xaml b/src/App/Pages/Accounts/SetPasswordPage.xaml new file mode 100644 index 000000000..ce0b2286f --- /dev/null +++ b/src/App/Pages/Accounts/SetPasswordPage.xaml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App/Pages/Accounts/SetPasswordPage.xaml.cs b/src/App/Pages/Accounts/SetPasswordPage.xaml.cs new file mode 100644 index 000000000..8b351d35a --- /dev/null +++ b/src/App/Pages/Accounts/SetPasswordPage.xaml.cs @@ -0,0 +1,82 @@ +using Bit.Core.Abstractions; +using Bit.Core.Utilities; +using System; +using System.Threading.Tasks; +using Bit.App.Models; +using Bit.App.Utilities; +using Xamarin.Forms; + +namespace Bit.App.Pages +{ + public partial class SetPasswordPage : BaseContentPage + { + private readonly IMessagingService _messagingService; + private readonly SetPasswordPageViewModel _vm; + private readonly AppOptions _appOptions; + + public SetPasswordPage(AppOptions appOptions = null) + { + _messagingService = ServiceContainer.Resolve("messagingService"); + _messagingService.Send("showStatusBar", true); + _appOptions = appOptions; + InitializeComponent(); + _vm = BindingContext as SetPasswordPageViewModel; + _vm.Page = this; + _vm.SetPasswordSuccessAction = + () => Device.BeginInvokeOnMainThread(async () => await SetPasswordSuccessAsync()); + _vm.CloseAction = async () => + { + _messagingService.Send("showStatusBar", false); + await Navigation.PopModalAsync(); + }; + if (Device.RuntimePlatform == Device.Android) + { + ToolbarItems.RemoveAt(0); + } + + MasterPasswordEntry = _masterPassword; + ConfirmMasterPasswordEntry = _confirmMasterPassword; + + _masterPassword.ReturnType = ReturnType.Next; + _masterPassword.ReturnCommand = new Command(() => _confirmMasterPassword.Focus()); + _confirmMasterPassword.ReturnType = ReturnType.Next; + _confirmMasterPassword.ReturnCommand = new Command(() => _hint.Focus()); + } + + public Entry MasterPasswordEntry { get; set; } + public Entry ConfirmMasterPasswordEntry { get; set; } + + protected override async void OnAppearing() + { + base.OnAppearing(); + await _vm.InitAsync(); + RequestFocus(_masterPassword); + } + + private async void Submit_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + await _vm.SubmitAsync(); + } + } + + private async void Close_Clicked(object sender, EventArgs e) + { + if (DoOnce()) + { + _vm.CloseAction(); + } + } + + private async Task SetPasswordSuccessAsync() + { + if (AppHelpers.SetAlternateMainPage(_appOptions)) + { + return; + } + var previousPage = await AppHelpers.ClearPreviousPage(); + Application.Current.MainPage = new TabsPage(_appOptions, previousPage); + } + } +} diff --git a/src/App/Pages/Accounts/SetPasswordPageViewModel.cs b/src/App/Pages/Accounts/SetPasswordPageViewModel.cs new file mode 100644 index 000000000..be7f7d5b6 --- /dev/null +++ b/src/App/Pages/Accounts/SetPasswordPageViewModel.cs @@ -0,0 +1,259 @@ +using Bit.App.Abstractions; +using Bit.App.Resources; +using Bit.Core.Abstractions; +using Bit.Core.Enums; +using Bit.Core.Exceptions; +using Bit.Core.Models.Request; +using Bit.Core.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Bit.Core.Models.Domain; +using Xamarin.Essentials; +using Xamarin.Forms; + +namespace Bit.App.Pages +{ + public class SetPasswordPageViewModel : BaseViewModel + { + private readonly IDeviceActionService _deviceActionService; + private readonly IApiService _apiService; + private readonly ICryptoService _cryptoService; + private readonly IPlatformUtilsService _platformUtilsService; + private readonly IUserService _userService; + private readonly IPolicyService _policyService; + private readonly IPasswordGenerationService _passwordGenerationService; + private readonly II18nService _i18nService; + + private bool _showPassword; + private bool _isPolicyInEffect; + private string _policySummary; + private MasterPasswordPolicyOptions _policy; + + public SetPasswordPageViewModel() + { + _deviceActionService = ServiceContainer.Resolve("deviceActionService"); + _apiService = ServiceContainer.Resolve("apiService"); + _cryptoService = ServiceContainer.Resolve("cryptoService"); + _platformUtilsService = ServiceContainer.Resolve("platformUtilsService"); + _userService = ServiceContainer.Resolve("userService"); + _policyService = ServiceContainer.Resolve("policyService"); + _passwordGenerationService = + ServiceContainer.Resolve("passwordGenerationService"); + _i18nService = ServiceContainer.Resolve("i18nService"); + + PageTitle = AppResources.SetMasterPassword; + TogglePasswordCommand = new Command(TogglePassword); + ToggleConfirmPasswordCommand = new Command(ToggleConfirmPassword); + SubmitCommand = new Command(async () => await SubmitAsync()); + } + + public bool ShowPassword + { + get => _showPassword; + set => SetProperty(ref _showPassword, value, + additionalPropertyNames: new[] { nameof(ShowPasswordIcon) }); + } + + public bool IsPolicyInEffect + { + get => _isPolicyInEffect; + set => SetProperty(ref _isPolicyInEffect, value); + } + + public string PolicySummary + { + get => _policySummary; + set => SetProperty(ref _policySummary, value); + } + + public MasterPasswordPolicyOptions Policy + { + get => _policy; + set => SetProperty(ref _policy, value); + } + + public Command SubmitCommand { get; } + public Command TogglePasswordCommand { get; } + public Command ToggleConfirmPasswordCommand { get; } + public string ShowPasswordIcon => ShowPassword ? "" : ""; + public string MasterPassword { get; set; } + public string ConfirmMasterPassword { get; set; } + public string Hint { get; set; } + public Action SetPasswordSuccessAction { get; set; } + public Action CloseAction { get; set; } + + public async Task InitAsync() + { + await CheckPasswordPolicy(); + } + + public async Task SubmitAsync() + { + if (Connectivity.NetworkAccess == NetworkAccess.None) + { + await _platformUtilsService.ShowDialogAsync(AppResources.InternetConnectionRequiredMessage, + AppResources.InternetConnectionRequiredTitle); + return; + } + if (string.IsNullOrWhiteSpace(MasterPassword)) + { + await Page.DisplayAlert(AppResources.AnErrorHasOccurred, + string.Format(AppResources.ValidationFieldRequired, AppResources.MasterPassword), + AppResources.Ok); + return; + } + if (IsPolicyInEffect) + { + var userInput = await GetPasswordStrengthUserInput(); + var passwordStrength = _passwordGenerationService.PasswordStrength(MasterPassword, userInput); + if (!await _policyService.EvaluateMasterPassword(passwordStrength.Score, MasterPassword, Policy)) + { + await Page.DisplayAlert(AppResources.MasterPasswordPolicyValidationTitle, + AppResources.MasterPasswordPolicyValidationMessage, AppResources.Ok); + return; + } + } + else + { + if (MasterPassword.Length < 8) + { + await Page.DisplayAlert(AppResources.MasterPasswordPolicyValidationTitle, + AppResources.MasterPasswordLengthValMessage, AppResources.Ok); + return; + } + } + if (MasterPassword != ConfirmMasterPassword) + { + await Page.DisplayAlert(AppResources.AnErrorHasOccurred, + AppResources.MasterPasswordConfirmationValMessage, AppResources.Ok); + return; + } + + var kdf = KdfType.PBKDF2_SHA256; + var kdfIterations = 100000; + var email = await _userService.GetEmailAsync(); + var key = await _cryptoService.MakeKeyAsync(MasterPassword, email, kdf, kdfIterations); + var masterPasswordHash = await _cryptoService.HashPasswordAsync(MasterPassword, key); + + Tuple encKey; + var existingEncKey = await _cryptoService.GetEncKeyAsync(); + if (existingEncKey == null) + { + encKey = await _cryptoService.MakeEncKeyAsync(key); + } + else + { + encKey = await _cryptoService.RemakeEncKeyAsync(key); + } + + var keys = await _cryptoService.MakeKeyPairAsync(encKey.Item1); + var request = new SetPasswordRequest + { + MasterPasswordHash = masterPasswordHash, + Key = encKey.Item2.EncryptedString, + MasterPasswordHint = Hint, + Kdf = kdf, + KdfIterations = kdfIterations, + Keys = new KeysRequest + { + PublicKey = keys.Item1, + EncryptedPrivateKey = keys.Item2.EncryptedString + } + }; + + try + { + await _deviceActionService.ShowLoadingAsync(AppResources.CreatingAccount); + await _apiService.SetPasswordAsync(request); + await _userService.SetInformationAsync(await _userService.GetUserIdAsync(), + await _userService.GetEmailAsync(), kdf, kdfIterations); + await _cryptoService.SetKeyAsync(key); + await _cryptoService.SetKeyHashAsync(masterPasswordHash); + await _cryptoService.SetEncKeyAsync(encKey.Item2.EncryptedString); + await _cryptoService.SetEncPrivateKeyAsync(keys.Item2.EncryptedString); + await _deviceActionService.HideLoadingAsync(); + + SetPasswordSuccessAction?.Invoke(); + } + catch (ApiException e) + { + await _deviceActionService.HideLoadingAsync(); + if (e?.Error != null) + { + await _platformUtilsService.ShowDialogAsync(e.Error.GetSingleMessage(), + AppResources.AnErrorHasOccurred); + } + } + } + + public void TogglePassword() + { + ShowPassword = !ShowPassword; + (Page as SetPasswordPage).MasterPasswordEntry.Focus(); + } + + public void ToggleConfirmPassword() + { + ShowPassword = !ShowPassword; + (Page as SetPasswordPage).ConfirmMasterPasswordEntry.Focus(); + } + + private async Task CheckPasswordPolicy() + { + Policy = await _policyService.GetMasterPasswordPolicyOptions(); + IsPolicyInEffect = Policy?.InEffect() ?? false; + if (!IsPolicyInEffect) + { + return; + } + + var bullet = "\n" + "".PadLeft(4) + "\u2022 "; + var sb = new StringBuilder(); + sb.Append(_i18nService.T("MasterPasswordPolicyInEffect")); + if (Policy.MinComplexity > 0) + { + sb.Append(bullet) + .Append(string.Format(_i18nService.T("PolicyInEffectMinComplexity"), Policy.MinComplexity)); + } + if (Policy.MinLength > 0) + { + sb.Append(bullet).Append(string.Format(_i18nService.T("PolicyInEffectMinLength"), Policy.MinLength)); + } + if (Policy.RequireUpper) + { + sb.Append(bullet).Append(_i18nService.T("PolicyInEffectUppercase")); + } + if (Policy.RequireLower) + { + sb.Append(bullet).Append(_i18nService.T("PolicyInEffectLowercase")); + } + if (Policy.RequireNumbers) + { + sb.Append(bullet).Append(_i18nService.T("PolicyInEffectNumbers")); + } + if (Policy.RequireSpecial) + { + sb.Append(bullet).Append(string.Format(_i18nService.T("PolicyInEffectSpecial"), "!@#$%^&*")); + } + PolicySummary = sb.ToString(); + } + + private async Task> GetPasswordStrengthUserInput() + { + var email = await _userService.GetEmailAsync(); + List userInput = null; + var atPosition = email.IndexOf('@'); + if (atPosition > -1) + { + var rx = new Regex("/[^A-Za-z0-9]/", RegexOptions.Compiled); + var data = rx.Split(email.Substring(0, atPosition).Trim().ToLower()); + userInput = new List(data); + } + return userInput; + } + } +} diff --git a/src/App/Pages/Accounts/TwoFactorPage.xaml.cs b/src/App/Pages/Accounts/TwoFactorPage.xaml.cs index cd7815903..3d7a3b2e2 100644 --- a/src/App/Pages/Accounts/TwoFactorPage.xaml.cs +++ b/src/App/Pages/Accounts/TwoFactorPage.xaml.cs @@ -1,10 +1,10 @@ using Bit.App.Controls; using Bit.App.Models; -using Bit.Core; using Bit.Core.Abstractions; using Bit.Core.Utilities; using System; using System.Threading.Tasks; +using Bit.App.Utilities; using Xamarin.Forms; namespace Bit.App.Pages @@ -14,22 +14,29 @@ namespace Bit.App.Pages private readonly IBroadcasterService _broadcasterService; private readonly IMessagingService _messagingService; private readonly IStorageService _storageService; + private readonly IVaultTimeoutService _vaultTimeoutService; private readonly AppOptions _appOptions; private TwoFactorPageViewModel _vm; private bool _inited; + private bool _authingWithSso; - public TwoFactorPage(AppOptions appOptions = null) + public TwoFactorPage(bool? authingWithSso = false, AppOptions appOptions = null) { InitializeComponent(); SetActivityIndicator(); + _authingWithSso = authingWithSso ?? false; _appOptions = appOptions; _storageService = ServiceContainer.Resolve("storageService"); _broadcasterService = ServiceContainer.Resolve("broadcasterService"); _messagingService = ServiceContainer.Resolve("messagingService"); + _vaultTimeoutService = ServiceContainer.Resolve("vaultTimeoutService"); _vm = BindingContext as TwoFactorPageViewModel; _vm.Page = this; - _vm.TwoFactorAction = () => Device.BeginInvokeOnMainThread(async () => await TwoFactorAuthAsync()); + _vm.StartSetPasswordAction = () => + Device.BeginInvokeOnMainThread(async () => await StartSetPasswordAsync()); + _vm.TwoFactorAuthSuccessAction = () => + Device.BeginInvokeOnMainThread(async () => await TwoFactorAuthSuccessAsync()); _vm.CloseAction = async () => await Navigation.PopModalAsync(); DuoWebView = _duoWebView; if (Device.RuntimePlatform == Device.Android) @@ -141,7 +148,7 @@ namespace Bit.App.Pages } } - private async void Close_Clicked(object sender, System.EventArgs e) + private void Close_Clicked(object sender, System.EventArgs e) { if (DoOnce()) { @@ -159,28 +166,29 @@ namespace Bit.App.Pages } } } - - private async Task TwoFactorAuthAsync() + + private async Task StartSetPasswordAsync() { - if (_appOptions != null) + _vm.CloseAction(); + var page = new SetPasswordPage(_appOptions); + await Navigation.PushModalAsync(new NavigationPage(page)); + } + + private async Task TwoFactorAuthSuccessAsync() + { + if (_authingWithSso) { - if (_appOptions.FromAutofillFramework && _appOptions.SaveType.HasValue) + Application.Current.MainPage = new NavigationPage(new LockPage(_appOptions)); + } + else + { + if (AppHelpers.SetAlternateMainPage(_appOptions)) { - Application.Current.MainPage = new NavigationPage(new AddEditPage(appOptions: _appOptions)); - return; - } - if (_appOptions.Uri != null) - { - Application.Current.MainPage = new NavigationPage(new AutofillCiphersPage(_appOptions)); return; } + var previousPage = await AppHelpers.ClearPreviousPage(); + Application.Current.MainPage = new TabsPage(_appOptions, previousPage); } - var previousPage = await _storageService.GetAsync(Constants.PreviousPageKey); - if (previousPage != null) - { - await _storageService.RemoveAsync(Constants.PreviousPageKey); - } - Application.Current.MainPage = new TabsPage(_appOptions, previousPage); } } } diff --git a/src/App/Pages/Accounts/TwoFactorPageViewModel.cs b/src/App/Pages/Accounts/TwoFactorPageViewModel.cs index 5cc229296..5a0815f10 100644 --- a/src/App/Pages/Accounts/TwoFactorPageViewModel.cs +++ b/src/App/Pages/Accounts/TwoFactorPageViewModel.cs @@ -31,6 +31,7 @@ namespace Bit.App.Pages private TwoFactorProviderType? _selectedProviderType; private string _totpInstruction; private string _webVaultUrl = "https://vault.bitwarden.com"; + private bool _authingWithSso = false; public TwoFactorPageViewModel() { @@ -89,19 +90,21 @@ namespace Bit.App.Pages }); } public Command SubmitCommand { get; } - public Action TwoFactorAction { get; set; } + public Action TwoFactorAuthSuccessAction { get; set; } + public Action StartSetPasswordAction { get; set; } public Action CloseAction { get; set; } public void Init() { - if (string.IsNullOrWhiteSpace(_authService.Email) || - string.IsNullOrWhiteSpace(_authService.MasterPasswordHash) || + if ((!_authService.AuthingWithSso() && !_authService.AuthingWithPassword()) || _authService.TwoFactorProvidersData == null) { // TODO: dismiss modal? return; } + _authingWithSso = _authService.AuthingWithSso(); + if (!string.IsNullOrWhiteSpace(_environmentService.BaseUrl)) { _webVaultUrl = _environmentService.BaseUrl; @@ -204,14 +207,21 @@ namespace Bit.App.Pages try { await _deviceActionService.ShowLoadingAsync(AppResources.Validating); - await _authService.LogInTwoFactorAsync(SelectedProviderType.Value, Token, Remember); - await _deviceActionService.HideLoadingAsync(); + var result = await _authService.LogInTwoFactorAsync(SelectedProviderType.Value, Token, Remember); var task = Task.Run(() => _syncService.FullSyncAsync(true)); + await _deviceActionService.HideLoadingAsync(); _messagingService.Send("listenYubiKeyOTP", false); _broadcasterService.Unsubscribe(nameof(TwoFactorPage)); - var disableFavicon = await _storageService.GetAsync(Constants.DisableFaviconKey); - await _stateService.SaveAsync(Constants.DisableFaviconKey, disableFavicon.GetValueOrDefault()); - TwoFactorAction?.Invoke(); + if (_authingWithSso && result.ResetMasterPassword) + { + StartSetPasswordAction?.Invoke(); + } + else + { + var disableFavicon = await _storageService.GetAsync(Constants.DisableFaviconKey); + await _stateService.SaveAsync(Constants.DisableFaviconKey, disableFavicon.GetValueOrDefault()); + TwoFactorAuthSuccessAction?.Invoke(); + } } catch (ApiException e) { diff --git a/src/App/Resources/AppResources.Designer.cs b/src/App/Resources/AppResources.Designer.cs index fc9449c10..bc5e3f12a 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. @@ -12,46 +11,32 @@ namespace Bit.App.Resources { using System; - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] public class AppResources { - private static global::System.Resources.ResourceManager resourceMan; + private static System.Resources.ResourceManager resourceMan; - private static global::System.Globalization.CultureInfo resourceCulture; + private static System.Globalization.CultureInfo resourceCulture; - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] internal AppResources() { } - /// - /// 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 { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager { get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Bit.App.Resources.AppResources", typeof(AppResources).Assembly); + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Bit.App.Resources.AppResources", typeof(AppResources).Assembly); resourceMan = temp; } return resourceMan; } } - /// - /// 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 { + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -60,4360 +45,3010 @@ namespace Bit.App.Resources { } } - /// - /// Looks up a localized string similar to About. - /// public static string About { get { return ResourceManager.GetString("About", resourceCulture); } } - /// - /// 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("AccessibilityOverlayPermissionAlert", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Account. - /// - public static string Account { - get { - return ResourceManager.GetString("Account", resourceCulture); - } - } - - /// - /// 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("AccountCreated", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Add. - /// public static string Add { get { return ResourceManager.GetString("Add", resourceCulture); } } - /// - /// Looks up a localized string similar to Add an Item. - /// - public static string AddAnItem { - get { - return ResourceManager.GetString("AddAnItem", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Add Folder. - /// public static string AddFolder { get { return ResourceManager.GetString("AddFolder", resourceCulture); } } - /// - /// Looks up a localized string similar to Add Item. - /// public static string AddItem { get { return ResourceManager.GetString("AddItem", resourceCulture); } } - /// - /// Looks up a localized string similar to Add New Attachment. - /// - public static string AddNewAttachment { - get { - return ResourceManager.GetString("AddNewAttachment", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Address. - /// - public static string Address { - get { - return ResourceManager.GetString("Address", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Address 1. - /// - public static string Address1 { - get { - return ResourceManager.GetString("Address1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Address 2. - /// - public static string Address2 { - get { - return ResourceManager.GetString("Address2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Address 3. - /// - public static string Address3 { - get { - return ResourceManager.GetString("Address3", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to All Items. - /// - public static string AllItems { - get { - return ResourceManager.GetString("AllItems", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An error has occurred.. - /// public static string AnErrorHasOccurred { get { return ResourceManager.GetString("AnErrorHasOccurred", resourceCulture); } } - /// - /// Looks up a localized string similar to API Server URL. - /// - public static string ApiUrl { - get { - 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 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 logins, credit cards, and identity 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 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 & Accounts". - /// - 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 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 Biometrics. - /// - public static string Biometrics { - get { - return ResourceManager.GetString("Biometrics", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Use biometrics to verify.. - /// - 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 logins, credit cards, and identity 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 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 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 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 Notes. - /// - 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 TOTP. - /// - public static string CopyTotp { - get { - return ResourceManager.GetString("CopyTotp", 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 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 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 Deleting.... - /// public static string Deleting { get { return ResourceManager.GetString("Deleting", 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 Disable Automatic TOTP Copy. - /// - public static string DisableAutoTotpCopy { - get { - return ResourceManager.GetString("DisableAutoTotpCopy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to 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.. - /// - public static string DisableAutoTotpCopyDescription { - get { - return ResourceManager.GetString("DisableAutoTotpCopyDescription", 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 Disable Save Prompt. - /// - public static string DisableSavePrompt { - get { - return ResourceManager.GetString("DisableSavePrompt", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The "Save Prompt" automatically prompts you to save new items to your vault whenever you enter them for the first time.. - /// - public static string DisableSavePromptDescription { - get { - return ResourceManager.GetString("DisableSavePromptDescription", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Disable Website Icons. - /// - public static string DisableWebsiteIcons { - get { - return ResourceManager.GetString("DisableWebsiteIcons", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Website Icons provide a recognizable image next to each login item in your vault.. - /// - public static string DisableWebsiteIconsDescription { - get { - return ResourceManager.GetString("DisableWebsiteIconsDescription", 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 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 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 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 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 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 Month. - /// - public static string ExpirationMonth { - get { - return ResourceManager.GetString("ExpirationMonth", 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 Export Vault. - /// - public static string ExportVault { - get { - return ResourceManager.GetString("ExportVault", 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 Down. - /// - public static string MoveDown { - get { - return ResourceManager.GetString("MoveDown", 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 Never. - /// - public static string Never { - get { - return ResourceManager.GetString("Never", 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 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 Notes. - /// public static string Notes { get { return ResourceManager.GetString("Notes", 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 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 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 Organization. - /// - public static string Organization { - get { - return ResourceManager.GetString("Organization", 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 AutoFill. - /// - public static string PasswordAutofill { - get { - return ResourceManager.GetString("PasswordAutofill", 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 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 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 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 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 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 Restarting.... - /// - public static string Restarting { - get { - return ResourceManager.GetString("Restarting", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Restart is required.. - /// - public static string RestartIsRequired { - get { - return ResourceManager.GetString("RestartIsRequired", 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 folder. - /// - public static string SearchFolder { - get { - return ResourceManager.GetString("SearchFolder", 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 type. - /// - public static string SearchType { - get { - return ResourceManager.GetString("SearchType", 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 verification code email again. - /// - public static string SendVerificationCodeAgain { - get { - return ResourceManager.GetString("SendVerificationCodeAgain", 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 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 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 Choose an organization that you wish to share this item with. Sharing transfers ownership of the item to the organization. You will no longer be the direct owner of this item once it has been shared.. - /// - public static string ShareDesc { - get { - return ResourceManager.GetString("ShareDesc", 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 Your Vault. - /// - public static string ShareVault { - get { - return ResourceManager.GetString("ShareVault", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Bitwarden allows you to share your vault with others by using an organization account. Would you like to visit the bitwarden.com website to learn more?. - /// - public static string ShareVaultConfirmation { - get { - return ResourceManager.GetString("ShareVaultConfirmation", 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 Sending to trash.... - /// - public static string SoftDeleting { + public static string ItemDeleted { get { - return ResourceManager.GetString("SoftDeleting", resourceCulture); + return ResourceManager.GetString("ItemDeleted", 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 Submitting.... - /// - public static string Submitting { - get { - return ResourceManager.GetString("Submitting", 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 10 seconds. - /// - public static string TenSeconds { - get { - return ResourceManager.GetString("TenSeconds", 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 Change the application's color theme.. - /// - public static string ThemeDescription { - get { - return ResourceManager.GetString("ThemeDescription", 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 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 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 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 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 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 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 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 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 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 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 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 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 { + public static string Account { get { - return ResourceManager.GetString("YesAndSave", resourceCulture); + return ResourceManager.GetString("Account", resourceCulture); } } - /// - /// Looks up a localized string similar to Your account's fingerprint phrase. - /// - public static string YourAccountsFingerprint { + public static string AccountCreated { get { - return ResourceManager.GetString("YourAccountsFingerprint", resourceCulture); + 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 ShareVault { + get { + return ResourceManager.GetString("ShareVault", 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); } } - /// - /// 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 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 DisableAutoTotpCopyDescription { + get { + return ResourceManager.GetString("DisableAutoTotpCopyDescription", resourceCulture); + } + } + + public static string DisableAutoTotpCopy { + get { + return ResourceManager.GetString("DisableAutoTotpCopy", 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 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 DisableWebsiteIcons { + get { + return ResourceManager.GetString("DisableWebsiteIcons", resourceCulture); + } + } + + public static string DisableWebsiteIconsDescription { + get { + return ResourceManager.GetString("DisableWebsiteIconsDescription", 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 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 SearchFolder { + get { + return ResourceManager.GetString("SearchFolder", resourceCulture); + } + } + + public static string SearchType { + get { + return ResourceManager.GetString("SearchType", 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 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 NoOrgsToList { + get { + return ResourceManager.GetString("NoOrgsToList", resourceCulture); + } + } + + public static string ShareDesc { + get { + return ResourceManager.GetString("ShareDesc", 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 ShareVaultConfirmation { + get { + return ResourceManager.GetString("ShareVaultConfirmation", 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 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 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 RestartIsRequired { + get { + return ResourceManager.GetString("RestartIsRequired", resourceCulture); + } + } + + public static string Restarting { + get { + return ResourceManager.GetString("Restarting", 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 BlacklistedUris { + get { + return ResourceManager.GetString("BlacklistedUris", resourceCulture); + } + } + + public static string BlacklistedUrisDescription { + get { + return ResourceManager.GetString("BlacklistedUrisDescription", resourceCulture); + } + } + + public static string DisableSavePrompt { + get { + return ResourceManager.GetString("DisableSavePrompt", resourceCulture); + } + } + + public static string DisableSavePromptDescription { + get { + return ResourceManager.GetString("DisableSavePromptDescription", 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 ExportVaultWarning { + get { + return ResourceManager.GetString("ExportVaultWarning", 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 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); + } + } } } diff --git a/src/App/Resources/AppResources.resx b/src/App/Resources/AppResources.resx index 6fd7f97fe..69590d849 100644 --- a/src/App/Resources/AppResources.resx +++ b/src/App/Resources/AppResources.resx @@ -1683,4 +1683,52 @@ Syncing vault with pull down gesture. + + Enterprise Single Sign-On + + + Quickly log in using your organization's single sign-on portal. Please enter your organization's identifier to begin. + + + Organization Identifier + + + Currently unable to login with SSO + + + Set Master Password + + + In order to complete logging in with SSO, please set a master password to access and protect your vault. + + + One or more organization policies require your master password to meet the following requirements: + + + Minimum complexity score of {0} + + + Minimum length of {0} + + + Contain one or more uppercase characters + + + Contain one or more lowercase characters + + + Contain one or more numbers + + + Contain one or more of the following special characters: {0} + + + Invalid Password + + + Password does not meet organization requirements. Please check the policy information and try again. + + + Loading + \ No newline at end of file diff --git a/src/App/Utilities/AppHelpers.cs b/src/App/Utilities/AppHelpers.cs index 3dd8f0149..3703eac39 100644 --- a/src/App/Utilities/AppHelpers.cs +++ b/src/App/Utilities/AppHelpers.cs @@ -8,6 +8,7 @@ using Bit.Core.Utilities; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Bit.App.Models; using Xamarin.Forms; namespace Bit.App.Utilities @@ -192,5 +193,34 @@ namespace Bit.App.Utilities } } } + + public static bool SetAlternateMainPage(AppOptions appOptions) + { + if (appOptions != null) + { + if (appOptions.FromAutofillFramework && appOptions.SaveType.HasValue) + { + Application.Current.MainPage = new NavigationPage(new AddEditPage(appOptions: appOptions)); + return true; + } + if (appOptions.Uri != null) + { + Application.Current.MainPage = new NavigationPage(new AutofillCiphersPage(appOptions)); + return true; + } + } + return false; + } + + public static async Task ClearPreviousPage() + { + var storageService = ServiceContainer.Resolve("storageService"); + var previousPage = await storageService.GetAsync(Constants.PreviousPageKey); + if (previousPage != null) + { + await storageService.RemoveAsync(Constants.PreviousPageKey); + } + return previousPage; + } } } diff --git a/src/Core/Abstractions/IApiService.cs b/src/Core/Abstractions/IApiService.cs index 9cc3140fb..e03d06c21 100644 --- a/src/Core/Abstractions/IApiService.cs +++ b/src/Core/Abstractions/IApiService.cs @@ -26,11 +26,13 @@ namespace Bit.Core.Abstractions Task GetProfileAsync(); Task GetSyncAsync(); Task PostAccountKeysAsync(KeysRequest request); + Task PostAccountVerifyPasswordAsync(PasswordVerificationRequest request); Task PostCipherAsync(CipherRequest request); Task PostCipherCreateAsync(CipherCreateRequest request); Task PostFolderAsync(FolderRequest request); Task> PostIdentityTokenAsync(TokenRequest request); Task PostPasswordHintAsync(PasswordHintRequest request); + Task SetPasswordAsync(SetPasswordRequest request); Task PostPreloginAsync(PreloginRequest request); Task PostRegisterAsync(RegisterRequest request); Task PutCipherAsync(string id, CipherRequest request); @@ -40,6 +42,7 @@ namespace Bit.Core.Abstractions Task PutDeleteCipherAsync(string id); Task PutRestoreCipherAsync(string id); Task RefreshIdentityTokenAsync(); + Task PreValidateSso(string identifier); Task SendAsync(HttpMethod method, string path, TRequest body, bool authed, bool hasResponse); void SetUrls(EnvironmentUrls urls); diff --git a/src/Core/Abstractions/IAuthService.cs b/src/Core/Abstractions/IAuthService.cs index 538abf338..3e495edf1 100644 --- a/src/Core/Abstractions/IAuthService.cs +++ b/src/Core/Abstractions/IAuthService.cs @@ -10,16 +10,22 @@ namespace Bit.Core.Abstractions { string Email { get; set; } string MasterPasswordHash { get; set; } + string Code { get; set; } + string CodeVerifier { get; set; } + string SsoRedirectUrl { get; set; } TwoFactorProviderType? SelectedTwoFactorProviderType { get; set; } Dictionary TwoFactorProviders { get; set; } Dictionary> TwoFactorProvidersData { get; set; } TwoFactorProviderType? GetDefaultTwoFactorProvider(bool u2fSupported); + bool AuthingWithSso(); + bool AuthingWithPassword(); List GetSupportedTwoFactorProviders(); Task LogInAsync(string email, string masterPassword); + Task LogInSsoAsync(string code, string codeVerifier, string redirectUrl); Task LogInCompleteAsync(string email, string masterPassword, TwoFactorProviderType twoFactorProvider, string twoFactorToken, bool? remember = null); Task LogInTwoFactorAsync(TwoFactorProviderType twoFactorProvider, string twoFactorToken, bool? remember = null); void LogOut(Action callback); void Init(); } -} \ No newline at end of file +} diff --git a/src/Core/Abstractions/IPasswordGenerationService.cs b/src/Core/Abstractions/IPasswordGenerationService.cs index 75a304aa2..0bdc80b05 100644 --- a/src/Core/Abstractions/IPasswordGenerationService.cs +++ b/src/Core/Abstractions/IPasswordGenerationService.cs @@ -15,7 +15,7 @@ namespace Bit.Core.Abstractions Task<(PasswordGenerationOptions, PasswordGeneratorPolicyOptions)> GetOptionsAsync(); Task<(PasswordGenerationOptions, PasswordGeneratorPolicyOptions)> EnforcePasswordGeneratorPoliciesOnOptionsAsync(PasswordGenerationOptions options); - Task PasswordStrength(string password, List userInputs = null); + Zxcvbn.Result PasswordStrength(string password, List userInputs = null); Task SaveOptionsAsync(PasswordGenerationOptions options); void NormalizeOptions(PasswordGenerationOptions options, PasswordGeneratorPolicyOptions enforcedPolicyOptions); } diff --git a/src/Core/Abstractions/IPolicyService.cs b/src/Core/Abstractions/IPolicyService.cs index 6a870a4b0..cab335f0f 100644 --- a/src/Core/Abstractions/IPolicyService.cs +++ b/src/Core/Abstractions/IPolicyService.cs @@ -12,5 +12,8 @@ namespace Bit.Core.Abstractions Task> GetAll(PolicyType? type); Task Replace(Dictionary policies); Task Clear(string userId); + Task GetMasterPasswordPolicyOptions(IEnumerable policies = null); + Task EvaluateMasterPassword(int passwordStrength, string newPassword, + MasterPasswordPolicyOptions enforcedPolicyOptions); } } diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj index 923688580..69718766a 100644 --- a/src/Core/Core.csproj +++ b/src/Core/Core.csproj @@ -27,6 +27,7 @@ + diff --git a/src/Core/Models/Domain/AuthResult.cs b/src/Core/Models/Domain/AuthResult.cs index 1286bb0d5..495b273ab 100644 --- a/src/Core/Models/Domain/AuthResult.cs +++ b/src/Core/Models/Domain/AuthResult.cs @@ -6,6 +6,7 @@ namespace Bit.Core.Models.Domain public class AuthResult { public bool TwoFactor { get; set; } + public bool ResetMasterPassword { get; set; } public Dictionary> TwoFactorProviders { get; set; } } } diff --git a/src/Core/Models/Domain/MasterPasswordPolicyOptions.cs b/src/Core/Models/Domain/MasterPasswordPolicyOptions.cs new file mode 100644 index 000000000..b8bd526db --- /dev/null +++ b/src/Core/Models/Domain/MasterPasswordPolicyOptions.cs @@ -0,0 +1,22 @@ +namespace Bit.Core.Models.Domain +{ + public class MasterPasswordPolicyOptions + { + public int MinComplexity { get; set; } + public int MinLength { get; set; } + public bool RequireUpper { get; set; } + public bool RequireLower { get; set; } + public bool RequireNumbers { get; set; } + public bool RequireSpecial { get; set; } + + public bool InEffect() + { + return MinComplexity > 0 || + MinLength > 0 || + RequireUpper || + RequireLower || + RequireNumbers || + RequireSpecial; + } + } +} diff --git a/src/Core/Models/Request/PasswordVerificationRequest.cs b/src/Core/Models/Request/PasswordVerificationRequest.cs new file mode 100644 index 000000000..bb37b043c --- /dev/null +++ b/src/Core/Models/Request/PasswordVerificationRequest.cs @@ -0,0 +1,7 @@ +namespace Bit.Core.Models.Request +{ + public class PasswordVerificationRequest + { + public string MasterPasswordHash { get; set; } + } +} diff --git a/src/Core/Models/Request/SetPasswordRequest.cs b/src/Core/Models/Request/SetPasswordRequest.cs new file mode 100644 index 000000000..5682af3ce --- /dev/null +++ b/src/Core/Models/Request/SetPasswordRequest.cs @@ -0,0 +1,14 @@ +using Bit.Core.Enums; + +namespace Bit.Core.Models.Request +{ + public class SetPasswordRequest + { + public string MasterPasswordHash { get; set; } + public string Key { get; set; } + public string MasterPasswordHint { get; set; } + public KeysRequest Keys { get; set; } + public KdfType Kdf { get; set; } + public int KdfIterations { get; set; } + } +} diff --git a/src/Core/Models/Request/TokenRequest.cs b/src/Core/Models/Request/TokenRequest.cs index 2cf4f60dc..d6a58bd95 100644 --- a/src/Core/Models/Request/TokenRequest.cs +++ b/src/Core/Models/Request/TokenRequest.cs @@ -9,21 +9,60 @@ namespace Bit.Core.Models.Request { public string Email { get; set; } public string MasterPasswordHash { get; set; } + public string Code { get; set; } + public string CodeVerifier { get; set; } + public string RedirectUri { get; set; } public string Token { get; set; } public TwoFactorProviderType? Provider { get; set; } - public bool Remember { get; set; } + public bool? Remember { get; set; } public DeviceRequest Device { get; set; } + public TokenRequest(string[] credentials, string[] codes, TwoFactorProviderType? provider, string token, + bool? remember, DeviceRequest device = null) + { + if (credentials != null && credentials.Length > 1) + { + Email = credentials[0]; + MasterPasswordHash = credentials[1]; + } + else if (codes != null && codes.Length > 2) + { + Code = codes[0]; + CodeVerifier = codes[1]; + RedirectUri = codes[2]; + } + Token = token; + Provider = provider; + Remember = remember; + Device = device; + } + public Dictionary ToIdentityToken(string clientId) { var obj = new Dictionary { - ["grant_type"] = "password", - ["username"] = Email, - ["password"] = MasterPasswordHash, ["scope"] = "api offline_access", ["client_id"] = clientId }; + + if (MasterPasswordHash != null && Email != null) + { + obj.Add("grant_type", "password"); + obj.Add("username", Email); + obj.Add("password", MasterPasswordHash); + } + else if (Code != null && CodeVerifier != null && RedirectUri != null) + { + obj.Add("grant_type", "authorization_code"); + obj.Add("code", Code); + obj.Add("code_verifier", CodeVerifier); + obj.Add("redirect_uri", RedirectUri); + } + else + { + throw new Exception("must provide credentials or codes"); + } + if (Device != null) { obj.Add("deviceType", ((int)Device.Type).ToString()); @@ -31,11 +70,11 @@ namespace Bit.Core.Models.Request obj.Add("deviceName", Device.Name); obj.Add("devicePushToken", Device.PushToken); } - if (!string.IsNullOrWhiteSpace(Token) && Provider != null) + if (!string.IsNullOrWhiteSpace(Token) && Provider != null && Remember.HasValue) { obj.Add("twoFactorToken", Token); obj.Add("twoFactorProvider", ((int)Provider.Value).ToString()); - obj.Add("twoFactorRemember", Remember ? "1" : "0"); + obj.Add("twoFactorRemember", Remember.GetValueOrDefault() ? "1" : "0"); } return obj; } diff --git a/src/Core/Models/Response/IdentityTokenResponse.cs b/src/Core/Models/Response/IdentityTokenResponse.cs index e55d03b53..6ccc9d6bc 100644 --- a/src/Core/Models/Response/IdentityTokenResponse.cs +++ b/src/Core/Models/Response/IdentityTokenResponse.cs @@ -1,4 +1,5 @@ -using Newtonsoft.Json; +using Bit.Core.Enums; +using Newtonsoft.Json; namespace Bit.Core.Models.Response { @@ -12,8 +13,12 @@ namespace Bit.Core.Models.Response public string RefreshToken { get; set; } [JsonProperty("token_type")] public string TokenType { get; set; } + + public bool ResetMasterPassword { get; set; } public string PrivateKey { get; set; } public string Key { get; set; } public string TwoFactorToken { get; set; } + public KdfType Kdf { get; set; } + public int KdfIterations { get; set; } } } diff --git a/src/Core/Services/ApiService.cs b/src/Core/Services/ApiService.cs index 72a98e60c..d139f8991 100644 --- a/src/Core/Services/ApiService.cs +++ b/src/Core/Services/ApiService.cs @@ -165,6 +165,12 @@ namespace Bit.Core.Services request, false, false); } + public Task SetPasswordAsync(SetPasswordRequest request) + { + return SendAsync(HttpMethod.Post, "/accounts/set-password", request, true, + false); + } + public Task PostRegisterAsync(RegisterRequest request) { return SendAsync(HttpMethod.Post, "/accounts/register", request, false, false); @@ -175,6 +181,12 @@ namespace Bit.Core.Services return SendAsync(HttpMethod.Post, "/accounts/keys", request, true, false); } + public Task PostAccountVerifyPasswordAsync(PasswordVerificationRequest request) + { + return SendAsync(HttpMethod.Post, "/accounts/verify-password", request, + true, false); + } + #endregion #region Folder APIs @@ -365,6 +377,34 @@ namespace Bit.Core.Services return accessToken; } + public async Task PreValidateSso(string identifier) + { + var path = "/account/prevalidate?domainHint=" + WebUtility.UrlEncode(identifier); + using (var requestMessage = new HttpRequestMessage()) + { + requestMessage.Version = new Version(1, 0); + requestMessage.Method = HttpMethod.Get; + requestMessage.RequestUri = new Uri(string.Concat(IdentityBaseUrl, path)); + requestMessage.Headers.Add("Accept", "application/json"); + + HttpResponseMessage response; + try + { + response = await _httpClient.SendAsync(requestMessage); + } + catch (Exception e) + { + throw new ApiException(HandleWebError(e)); + } + if (!response.IsSuccessStatusCode) + { + var error = await HandleErrorAsync(response, false); + throw new ApiException(error); + } + return null; + } + } + public async Task SendAsync(HttpMethod method, string path, TRequest body, bool authed, bool hasResponse) { @@ -488,13 +528,20 @@ namespace Bit.Core.Services await _logoutCallbackAsync(true); return null; } - JObject responseJObject = null; - if (IsJsonResponse(response)) + try { - var responseJsonString = await response.Content.ReadAsStringAsync(); - responseJObject = JObject.Parse(responseJsonString); + JObject responseJObject = null; + if (IsJsonResponse(response)) + { + var responseJsonString = await response.Content.ReadAsStringAsync(); + responseJObject = JObject.Parse(responseJsonString); + } + return new ErrorResponse(responseJObject, response.StatusCode, tokenError); + } + catch + { + return null; } - return new ErrorResponse(responseJObject, response.StatusCode, tokenError); } private bool IsJsonResponse(HttpResponseMessage response) diff --git a/src/Core/Services/AuthService.cs b/src/Core/Services/AuthService.cs index 0870cc1e9..0cf15f90f 100644 --- a/src/Core/Services/AuthService.cs +++ b/src/Core/Services/AuthService.cs @@ -23,8 +23,6 @@ namespace Bit.Core.Services private readonly bool _setCryptoKeys; private SymmetricCryptoKey _key; - private KdfType? _kdf; - private int? _kdfIterations; public AuthService( ICryptoService cryptoService, @@ -95,6 +93,9 @@ namespace Bit.Core.Services public string Email { get; set; } public string MasterPasswordHash { get; set; } + public string Code { get; set; } + public string CodeVerifier { get; set; } + public string SsoRedirectUrl { get; set; } public Dictionary TwoFactorProviders { get; set; } public Dictionary> TwoFactorProvidersData { get; set; } public TwoFactorProviderType? SelectedTwoFactorProviderType { get; set; } @@ -122,13 +123,20 @@ namespace Bit.Core.Services SelectedTwoFactorProviderType = null; var key = await MakePreloginKeyAsync(masterPassword, email); var hashedPassword = await _cryptoService.HashPasswordAsync(masterPassword, key); - return await LogInHelperAsync(email, hashedPassword, key); + return await LogInHelperAsync(email, hashedPassword, null, null, null, key, null, null, null); + } + + public async Task LogInSsoAsync(string code, string codeVerifier, string redirectUrl) + { + SelectedTwoFactorProviderType = null; + return await LogInHelperAsync(null, null, code, codeVerifier, redirectUrl, null, null, null, null); } public Task LogInTwoFactorAsync(TwoFactorProviderType twoFactorProvider, string twoFactorToken, bool? remember = null) { - return LogInHelperAsync(Email, MasterPasswordHash, _key, twoFactorProvider, twoFactorToken, remember); + return LogInHelperAsync(Email, MasterPasswordHash, Code, CodeVerifier, SsoRedirectUrl, _key, + twoFactorProvider, twoFactorToken, remember); } public async Task LogInCompleteAsync(string email, string masterPassword, @@ -137,7 +145,16 @@ namespace Bit.Core.Services SelectedTwoFactorProviderType = null; var key = await MakePreloginKeyAsync(masterPassword, email); var hashedPassword = await _cryptoService.HashPasswordAsync(masterPassword, key); - return await LogInHelperAsync(email, hashedPassword, key, twoFactorProvider, twoFactorToken, remember); + return await LogInHelperAsync(email, hashedPassword, null, null, null, key, twoFactorProvider, + twoFactorToken, remember); + } + + public async Task LogInSsoCompleteAsync(string code, string codeVerifier, string redirectUrl, + TwoFactorProviderType twoFactorProvider, string twoFactorToken, bool? remember = null) + { + SelectedTwoFactorProviderType = null; + return await LogInHelperAsync(null, null, code, codeVerifier, redirectUrl, null, twoFactorProvider, + twoFactorToken, remember); } public void LogOut(Action callback) @@ -213,20 +230,30 @@ namespace Bit.Core.Services return providerType; } + public bool AuthingWithSso() + { + return Code != null && CodeVerifier != null && SsoRedirectUrl != null; + } + + public bool AuthingWithPassword() + { + return Email != null && MasterPasswordHash != null; + } + // Helpers private async Task MakePreloginKeyAsync(string masterPassword, string email) { email = email.Trim().ToLower(); - _kdf = null; - _kdfIterations = null; + KdfType? kdf = null; + int? kdfIterations = null; try { var preloginResponse = await _apiService.PostPreloginAsync(new PreloginRequest { Email = email }); if (preloginResponse != null) { - _kdf = preloginResponse.Kdf; - _kdfIterations = preloginResponse.KdfIterations; + kdf = preloginResponse.Kdf; + kdfIterations = preloginResponse.KdfIterations; } } catch (ApiException e) @@ -236,46 +263,64 @@ namespace Bit.Core.Services throw e; } } - return await _cryptoService.MakeKeyAsync(masterPassword, email, _kdf, _kdfIterations); + return await _cryptoService.MakeKeyAsync(masterPassword, email, kdf, kdfIterations); } - private async Task LogInHelperAsync(string email, string hashedPassword, SymmetricCryptoKey key, + private async Task LogInHelperAsync(string email, string hashedPassword, string code, + string codeVerifier, string redirectUrl, SymmetricCryptoKey key, TwoFactorProviderType? twoFactorProvider = null, string twoFactorToken = null, bool? remember = null) { var storedTwoFactorToken = await _tokenService.GetTwoFactorTokenAsync(email); var appId = await _appIdService.GetAppIdAsync(); var deviceRequest = new DeviceRequest(appId, _platformUtilsService); - var request = new TokenRequest + + string[] emailPassword; + string[] codeCodeVerifier; + if (email != null && hashedPassword != null) { - Email = email, - MasterPasswordHash = hashedPassword, - Device = deviceRequest, - Remember = false - }; + emailPassword = new[] { email, hashedPassword }; + } + else + { + emailPassword = null; + } + if (code != null && codeVerifier != null && redirectUrl != null) + { + codeCodeVerifier = new[] { code, codeVerifier, redirectUrl }; + } + else + { + codeCodeVerifier = null; + } + + TokenRequest request; if (twoFactorToken != null && twoFactorProvider != null) { - request.Provider = twoFactorProvider; - request.Token = twoFactorToken; - request.Remember = remember.GetValueOrDefault(); + request = new TokenRequest(emailPassword, codeCodeVerifier, twoFactorProvider, twoFactorToken, remember, + deviceRequest); } else if (storedTwoFactorToken != null) { - request.Provider = TwoFactorProviderType.Remember; - request.Token = storedTwoFactorToken; + request = new TokenRequest(emailPassword, codeCodeVerifier, TwoFactorProviderType.Remember, + storedTwoFactorToken, false, deviceRequest); + } + else + { + request = new TokenRequest(emailPassword, codeCodeVerifier, null, null, false, deviceRequest); } var response = await _apiService.PostIdentityTokenAsync(request); ClearState(); - var result = new AuthResult - { - TwoFactor = response.Item2 != null - }; + var result = new AuthResult { TwoFactor = response.Item2 != null }; if (result.TwoFactor) { // Two factor required. var twoFactorResponse = response.Item2; Email = email; MasterPasswordHash = hashedPassword; + Code = code; + CodeVerifier = codeVerifier; + SsoRedirectUrl = redirectUrl; _key = _setCryptoKeys ? key : null; TwoFactorProvidersData = twoFactorResponse.TwoFactorProviders2; result.TwoFactorProviders = twoFactorResponse.TwoFactorProviders2; @@ -283,13 +328,14 @@ namespace Bit.Core.Services } var tokenResponse = response.Item1; + result.ResetMasterPassword = tokenResponse.ResetMasterPassword; if (tokenResponse.TwoFactorToken != null) { await _tokenService.SetTwoFactorTokenAsync(tokenResponse.TwoFactorToken, email); } await _tokenService.SetTokensAsync(tokenResponse.AccessToken, tokenResponse.RefreshToken); await _userService.SetInformationAsync(_tokenService.GetUserId(), _tokenService.GetEmail(), - _kdf.Value, _kdfIterations.Value); + tokenResponse.Kdf, tokenResponse.KdfIterations); if (_setCryptoKeys) { await _cryptoService.SetKeyAsync(key); @@ -322,8 +368,12 @@ namespace Bit.Core.Services private void ClearState() { + _key = null; Email = null; MasterPasswordHash = null; + Code = null; + CodeVerifier = null; + SsoRedirectUrl = null; TwoFactorProvidersData = null; SelectedTwoFactorProviderType = null; } diff --git a/src/Core/Services/PasswordGenerationService.cs b/src/Core/Services/PasswordGenerationService.cs index 3487b8d83..42ae56ba1 100644 --- a/src/Core/Services/PasswordGenerationService.cs +++ b/src/Core/Services/PasswordGenerationService.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Bit.Core.Enums; +using Zxcvbn; namespace Bit.Core.Services { @@ -481,9 +482,28 @@ namespace Bit.Core.Services await _storageService.RemoveAsync(Keys_History); } - public Task PasswordStrength(string password, List userInputs = null) + public Result PasswordStrength(string password, List userInputs = null) { - throw new NotImplementedException(); + if (string.IsNullOrEmpty(password)) + { + return null; + } + var globalUserInputs = new List + { + "bitwarden", + "bit", + "warden" + }; + if (userInputs != null && userInputs.Any()) + { + globalUserInputs.AddRange(userInputs); + } + // Use a hash set to get rid of any duplicate user inputs + var hashSet = new HashSet(globalUserInputs); + var finalUserInputs = new string[hashSet.Count]; + hashSet.CopyTo(finalUserInputs); + var result = Zxcvbn.Zxcvbn.MatchPassword(password, finalUserInputs); + return result; } public void NormalizeOptions(PasswordGenerationOptions options, diff --git a/src/Core/Services/PolicyService.cs b/src/Core/Services/PolicyService.cs index 4b3fd0881..938356e93 100644 --- a/src/Core/Services/PolicyService.cs +++ b/src/Core/Services/PolicyService.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Text.RegularExpressions; using System.Threading.Tasks; using Bit.Core.Abstractions; using Bit.Core.Enums; @@ -66,5 +67,156 @@ namespace Bit.Core.Services await _storageService.RemoveAsync(string.Format(Keys_PoliciesPrefix, userId)); _policyCache = null; } + + public async Task GetMasterPasswordPolicyOptions( + IEnumerable policies = null) + { + MasterPasswordPolicyOptions enforcedOptions = null; + + if (policies == null) + { + policies = await GetAll(PolicyType.MasterPassword); + } + else + { + policies = policies.Where(p => p.Type == PolicyType.MasterPassword); + } + + if (policies == null || !policies.Any()) + { + return enforcedOptions; + } + + foreach (var currentPolicy in policies) + { + if (!currentPolicy.Enabled || currentPolicy.Data == null) + { + continue; + } + + if (enforcedOptions == null) + { + enforcedOptions = new MasterPasswordPolicyOptions(); + } + + var minComplexity = GetPolicyInt(currentPolicy, "minComplexity"); + if (minComplexity != null && (int)(long)minComplexity > enforcedOptions.MinComplexity) + { + enforcedOptions.MinComplexity = (int)(long)minComplexity; + } + + var minLength = GetPolicyInt(currentPolicy, "minLength"); + if (minLength != null && (int)(long)minLength > enforcedOptions.MinLength) + { + enforcedOptions.MinLength = (int)(long)minLength; + } + + var requireUpper = GetPolicyBool(currentPolicy, "requireUpper"); + if (requireUpper != null && (bool)requireUpper) + { + enforcedOptions.RequireUpper = true; + } + + var requireLower = GetPolicyBool(currentPolicy, "requireLower"); + if (requireLower != null && (bool)requireLower) + { + enforcedOptions.RequireLower = true; + } + + var requireNumbers = GetPolicyBool(currentPolicy, "requireNumbers"); + if (requireNumbers != null && (bool)requireNumbers) + { + enforcedOptions.RequireNumbers = true; + } + + var requireSpecial = GetPolicyBool(currentPolicy, "requireSpecial"); + if (requireSpecial != null && (bool)requireSpecial) + { + enforcedOptions.RequireSpecial = true; + } + } + + return enforcedOptions; + } + + public async Task EvaluateMasterPassword(int passwordStrength, string newPassword, + MasterPasswordPolicyOptions enforcedPolicyOptions) + { + if (enforcedPolicyOptions == null) + { + return true; + } + + if (enforcedPolicyOptions.MinComplexity > 0 && enforcedPolicyOptions.MinComplexity > passwordStrength) + { + return false; + } + + if (enforcedPolicyOptions.MinLength > 0 && enforcedPolicyOptions.MinLength > newPassword.Length) + { + return false; + } + + if (enforcedPolicyOptions.RequireUpper && newPassword.ToLower() == newPassword) + { + return false; + } + + if (enforcedPolicyOptions.RequireLower && newPassword.ToUpper() == newPassword) + { + return false; + } + + if (enforcedPolicyOptions.RequireNumbers && !newPassword.Any(char.IsDigit)) + { + return false; + } + + if (enforcedPolicyOptions.RequireSpecial && !Regex.IsMatch(newPassword, "^.*[!@#$%\\^&*].*$")) + { + return false; + } + + return true; + } + + private int? GetPolicyInt(Policy policy, string key) + { + if (policy.Data.ContainsKey(key)) + { + var value = policy.Data[key]; + if (value != null) + { + return (int)(long)value; + } + } + return null; + } + + private bool? GetPolicyBool(Policy policy, string key) + { + if (policy.Data.ContainsKey(key)) + { + var value = policy.Data[key]; + if (value != null) + { + return (bool)value; + } + } + return null; + } + + private string GetPolicyString(Policy policy, string key) + { + if (policy.Data.ContainsKey(key)) + { + var value = policy.Data[key]; + if (value != null) + { + return (string)value; + } + } + return null; + } } } diff --git a/src/iOS.Autofill/CredentialProviderViewController.cs b/src/iOS.Autofill/CredentialProviderViewController.cs index 3564d7834..8f3e948ef 100644 --- a/src/iOS.Autofill/CredentialProviderViewController.cs +++ b/src/iOS.Autofill/CredentialProviderViewController.cs @@ -56,7 +56,7 @@ namespace Bit.iOS.Autofill } if (!await IsAuthed()) { - LaunchLoginFlow(); + LaunchHomePage(); } else if (await IsLocked()) { @@ -94,7 +94,7 @@ namespace Bit.iOS.Autofill InitAppIfNeeded(); if (!await IsAuthed()) { - LaunchLoginFlow(); + LaunchHomePage(); return; } _context.CredentialIdentity = credentialIdentity; @@ -107,7 +107,7 @@ namespace Bit.iOS.Autofill _context.Configuring = true; if (!await IsAuthed()) { - LaunchLoginFlow(); + LaunchHomePage(); return; } CheckLock(() => PerformSegue("setupSegue", this)); @@ -294,17 +294,74 @@ namespace Bit.iOS.Autofill } } - private void LaunchLoginFlow() + private void LaunchHomePage() { - var loginPage = new LoginPage(); + var homePage = new HomePage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(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.CloseAction = () => CompleteRequest(); + } + + var navigationPage = new NavigationPage(homePage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchEnvironmentFlow() + { + var environmentPage = new EnvironmentPage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(environmentPage); + if (environmentPage.BindingContext is EnvironmentPageViewModel vm) + { + vm.SubmitSuccessAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(environmentPage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchRegisterFlow() + { + var registerPage = new RegisterPage(null); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(registerPage); + if (registerPage.BindingContext is RegisterPageViewModel vm) + { + vm.RegistrationSuccess = () => DismissViewController(false, () => LaunchLoginFlow(vm.Email)); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(registerPage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchLoginFlow(string email = null) + { + var loginPage = new LoginPage(email); var app = new App.App(new AppOptions { IosExtension = true }); ThemeManager.SetTheme(false, app.Resources); ThemeManager.ApplyResourcesToPage(loginPage); if (loginPage.BindingContext is LoginPageViewModel vm) { - vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow()); - vm.LoggedInAction = () => DismissLockAndContinue(); - vm.CloseAction = () => CompleteRequest(); + vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow(false)); + vm.LogInSuccessAction = () => DismissLockAndContinue(); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); vm.HideHintButton = true; } @@ -314,16 +371,44 @@ namespace Bit.iOS.Autofill PresentViewController(loginController, true, null); } - private void LaunchTwoFactorFlow() + private void LaunchLoginSsoFlow() { - var twoFactorPage = new TwoFactorPage(); + var loginPage = new LoginSsoPage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(loginPage); + if (loginPage.BindingContext is LoginSsoPageViewModel vm) + { + vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow(true)); + vm.StartSetPasswordAction = () => DismissViewController(false, () => LaunchSetPasswordFlow()); + vm.SsoAuthSuccessAction = () => DismissLockAndContinue(); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(loginPage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchTwoFactorFlow(bool authingWithSso) + { + var twoFactorPage = new TwoFactorPage(authingWithSso); var app = new App.App(new AppOptions { IosExtension = true }); ThemeManager.SetTheme(false, app.Resources); ThemeManager.ApplyResourcesToPage(twoFactorPage); if (twoFactorPage.BindingContext is TwoFactorPageViewModel vm) { - vm.TwoFactorAction = () => DismissLockAndContinue(); - vm.CloseAction = () => DismissViewController(false, () => LaunchLoginFlow()); + vm.TwoFactorAuthSuccessAction = () => DismissLockAndContinue(); + vm.StartSetPasswordAction = () => DismissViewController(false, () => LaunchSetPasswordFlow()); + if (authingWithSso) + { + vm.CloseAction = () => DismissViewController(false, () => LaunchLoginSsoFlow()); + } + else + { + vm.CloseAction = () => DismissViewController(false, () => LaunchLoginFlow()); + } } var navigationPage = new NavigationPage(twoFactorPage); @@ -331,5 +416,23 @@ namespace Bit.iOS.Autofill twoFactorController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; PresentViewController(twoFactorController, true, null); } + + private void LaunchSetPasswordFlow() + { + var setPasswordPage = new SetPasswordPage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(setPasswordPage); + if (setPasswordPage.BindingContext is SetPasswordPageViewModel vm) + { + vm.SetPasswordSuccessAction = () => DismissLockAndContinue(); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(setPasswordPage); + var setPasswordController = navigationPage.CreateViewController(); + setPasswordController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(setPasswordController, true, null); + } } } diff --git a/src/iOS.Extension/LoadingViewController.cs b/src/iOS.Extension/LoadingViewController.cs index a76598923..45daeb1ea 100644 --- a/src/iOS.Extension/LoadingViewController.cs +++ b/src/iOS.Extension/LoadingViewController.cs @@ -73,7 +73,7 @@ namespace Bit.iOS.Extension } if (!await IsAuthed()) { - LaunchLoginFlow(); + LaunchHomePage(); return; } else if (await IsLocked()) @@ -420,16 +420,73 @@ namespace Bit.iOS.Extension return userService.IsAuthenticatedAsync(); } - private void LaunchLoginFlow() + private void LaunchHomePage() { - var loginPage = new LoginPage(); + var homePage = new HomePage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(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.CloseAction = () => CompleteRequest(null, null); + } + + var navigationPage = new NavigationPage(homePage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchEnvironmentFlow() + { + var environmentPage = new EnvironmentPage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(environmentPage); + if (environmentPage.BindingContext is EnvironmentPageViewModel vm) + { + vm.SubmitSuccessAction = () => DismissViewController(false, () => LaunchHomePage()); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(environmentPage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchRegisterFlow() + { + var registerPage = new RegisterPage(null); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(registerPage); + if (registerPage.BindingContext is RegisterPageViewModel vm) + { + vm.RegistrationSuccess = () => DismissViewController(false, () => LaunchLoginFlow(vm.Email)); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(registerPage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchLoginFlow(string email = null) + { + var loginPage = new LoginPage(email); var app = new App.App(new AppOptions { IosExtension = true }); ThemeManager.SetTheme(false, app.Resources); ThemeManager.ApplyResourcesToPage(loginPage); if (loginPage.BindingContext is LoginPageViewModel vm) { - vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow()); - vm.LoggedInAction = () => DismissLockAndContinue(); + vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow(false)); + vm.LogInSuccessAction = () => DismissLockAndContinue(); vm.CloseAction = () => CompleteRequest(null, null); vm.HideHintButton = true; } @@ -440,7 +497,27 @@ namespace Bit.iOS.Extension PresentViewController(loginController, true, null); } - private void LaunchTwoFactorFlow() + private void LaunchLoginSsoFlow() + { + var loginPage = new LoginSsoPage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(loginPage); + if (loginPage.BindingContext is LoginSsoPageViewModel vm) + { + vm.StartTwoFactorAction = () => DismissViewController(false, () => LaunchTwoFactorFlow(true)); + vm.StartSetPasswordAction = () => DismissViewController(false, () => LaunchSetPasswordFlow()); + vm.SsoAuthSuccessAction = () => DismissLockAndContinue(); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(loginPage); + var loginController = navigationPage.CreateViewController(); + loginController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(loginController, true, null); + } + + private void LaunchTwoFactorFlow(bool authingWithSso) { var twoFactorPage = new TwoFactorPage(); var app = new App.App(new AppOptions { IosExtension = true }); @@ -448,8 +525,16 @@ namespace Bit.iOS.Extension ThemeManager.ApplyResourcesToPage(twoFactorPage); if (twoFactorPage.BindingContext is TwoFactorPageViewModel vm) { - vm.TwoFactorAction = () => DismissLockAndContinue(); - vm.CloseAction = () => DismissViewController(false, () => LaunchLoginFlow()); + vm.TwoFactorAuthSuccessAction = () => DismissLockAndContinue(); + vm.StartSetPasswordAction = () => DismissViewController(false, () => LaunchSetPasswordFlow()); + if (authingWithSso) + { + vm.CloseAction = () => DismissViewController(false, () => LaunchLoginSsoFlow()); + } + else + { + vm.CloseAction = () => DismissViewController(false, () => LaunchLoginFlow()); + } } var navigationPage = new NavigationPage(twoFactorPage); @@ -457,5 +542,23 @@ namespace Bit.iOS.Extension twoFactorController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; PresentViewController(twoFactorController, true, null); } + + private void LaunchSetPasswordFlow() + { + var setPasswordPage = new SetPasswordPage(); + var app = new App.App(new AppOptions { IosExtension = true }); + ThemeManager.SetTheme(false, app.Resources); + ThemeManager.ApplyResourcesToPage(setPasswordPage); + if (setPasswordPage.BindingContext is SetPasswordPageViewModel vm) + { + vm.SetPasswordSuccessAction = () => DismissLockAndContinue(); + vm.CloseAction = () => DismissViewController(false, () => LaunchHomePage()); + } + + var navigationPage = new NavigationPage(setPasswordPage); + var setPasswordController = navigationPage.CreateViewController(); + setPasswordController.ModalPresentationStyle = UIModalPresentationStyle.FullScreen; + PresentViewController(setPasswordController, true, null); + } } } diff --git a/src/iOS/AppDelegate.cs b/src/iOS/AppDelegate.cs index a4a161768..0db17b027 100644 --- a/src/iOS/AppDelegate.cs +++ b/src/iOS/AppDelegate.cs @@ -241,6 +241,15 @@ namespace Bit.iOS return true; } + public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) + { + if (Xamarin.Essentials.Platform.OpenUrl(app, url, options)) + { + return true; + } + return base.OpenUrl(app, url, options); + } + public override void FailedToRegisterForRemoteNotifications(UIApplication application, NSError error) { _pushHandler?.OnErrorReceived(error); diff --git a/src/iOS/iOS.csproj b/src/iOS/iOS.csproj index a6573af3a..adb62740a 100644 --- a/src/iOS/iOS.csproj +++ b/src/iOS/iOS.csproj @@ -156,7 +156,7 @@ - 1.5.3.1 + 1.5.3.2