bitwarden-mobile/src/App/Pages/Generator/GeneratorPageViewModel.cs

352 lines
10 KiB
C#
Raw Normal View History

2022-04-26 17:21:17 +02:00
using System.Collections.Generic;
using System.Threading.Tasks;
using Bit.App.Resources;
2019-05-14 14:32:07 +02:00
using Bit.App.Utilities;
using Bit.Core.Abstractions;
using Bit.Core.Models.Domain;
using Bit.Core.Utilities;
2019-05-14 14:32:07 +02:00
using Xamarin.Forms;
2019-03-29 04:52:33 +01:00
namespace Bit.App.Pages
{
public class GeneratorPageViewModel : BaseViewModel
{
private readonly IPasswordGenerationService _passwordGenerationService;
private readonly IPlatformUtilsService _platformUtilsService;
private readonly IClipboardService _clipboardService;
private PasswordGenerationOptions _options;
private PasswordGeneratorPolicyOptions _enforcedPolicyOptions;
private string _password;
private bool _isPassword;
2019-05-13 20:43:23 +02:00
private bool _uppercase;
private bool _lowercase;
private bool _number;
private bool _special;
private bool _avoidAmbiguous;
private int _minNumber;
private int _minSpecial;
2019-05-13 22:06:56 +02:00
private int _length = 5;
private int _numWords = 3;
2019-05-13 20:43:23 +02:00
private string _wordSeparator;
private bool _capitalize;
private bool _includeNumber;
private int _typeSelectedIndex;
2019-05-13 20:43:23 +02:00
private bool _doneIniting;
2019-03-29 04:52:33 +01:00
public GeneratorPageViewModel()
{
_passwordGenerationService = ServiceContainer.Resolve<IPasswordGenerationService>(
"passwordGenerationService");
_platformUtilsService = ServiceContainer.Resolve<IPlatformUtilsService>("platformUtilsService");
_clipboardService = ServiceContainer.Resolve<IClipboardService>("clipboardService");
PageTitle = AppResources.PasswordGenerator;
TypeOptions = new List<string> { AppResources.Password, AppResources.Passphrase };
}
public List<string> TypeOptions { get; set; }
public string Password
{
get => _password;
2019-05-14 14:32:07 +02:00
set => SetProperty(ref _password, value,
additionalPropertyNames: new string[]
{
nameof(ColoredPassword)
});
}
public string ColoredPassword => PasswordFormatter.FormatPassword(Password);
2019-05-14 14:32:07 +02:00
public bool IsPassword
{
get => _isPassword;
set => SetProperty(ref _isPassword, value);
}
2019-05-13 20:43:23 +02:00
public int Length
{
2019-05-13 20:43:23 +02:00
get => _length;
set
{
if (SetProperty(ref _length, value))
2019-05-13 20:43:23 +02:00
{
_options.Length = value;
2019-05-31 17:13:46 +02:00
var task = SliderInputAsync();
2019-05-13 20:43:23 +02:00
}
}
}
public bool Uppercase
{
get => _uppercase;
set
{
if (SetProperty(ref _uppercase, value))
2019-05-13 20:43:23 +02:00
{
_options.Uppercase = value;
var task = SaveOptionsAsync();
}
}
}
public bool Lowercase
{
get => _lowercase;
set
{
if (SetProperty(ref _lowercase, value))
2019-05-13 20:43:23 +02:00
{
_options.Lowercase = value;
var task = SaveOptionsAsync();
}
}
}
public bool Number
{
get => _number;
set
{
if (SetProperty(ref _number, value))
2019-05-13 20:43:23 +02:00
{
_options.Number = value;
var task = SaveOptionsAsync();
}
}
}
public bool Special
{
get => _special;
set
{
if (SetProperty(ref _special, value))
2019-05-13 20:43:23 +02:00
{
_options.Special = value;
var task = SaveOptionsAsync();
}
}
}
public bool AvoidAmbiguous
{
get => _avoidAmbiguous;
set
{
if (SetProperty(ref _avoidAmbiguous, value))
2019-05-13 20:43:23 +02:00
{
_options.Ambiguous = !value;
var task = SaveOptionsAsync();
}
}
}
public int MinNumber
{
get => _minNumber;
set
{
if (SetProperty(ref _minNumber, value))
2019-05-13 20:43:23 +02:00
{
_options.MinNumber = value;
var task = SaveOptionsAsync();
}
}
}
public int MinSpecial
{
get => _minSpecial;
set
{
if (SetProperty(ref _minSpecial, value))
2019-05-13 20:43:23 +02:00
{
_options.MinSpecial = value;
var task = SaveOptionsAsync();
}
}
}
public int NumWords
{
get => _numWords;
set
{
if (SetProperty(ref _numWords, value))
2019-05-13 20:43:23 +02:00
{
_options.NumWords = value;
var task = SaveOptionsAsync();
}
}
}
public string WordSeparator
{
get => _wordSeparator;
set
{
if (value == null)
2019-06-03 20:32:43 +02:00
{
return;
}
2019-05-13 22:06:56 +02:00
var val = value.Trim();
if (SetProperty(ref _wordSeparator, val))
2019-05-13 20:43:23 +02:00
{
2019-05-13 22:06:56 +02:00
_options.WordSeparator = val;
2019-05-13 20:43:23 +02:00
var task = SaveOptionsAsync();
}
}
}
public bool Capitalize
{
get => _capitalize;
set
{
if (SetProperty(ref _capitalize, value))
{
_options.Capitalize = value;
var task = SaveOptionsAsync();
}
}
}
public bool IncludeNumber
{
get => _includeNumber;
set
{
if (SetProperty(ref _includeNumber, value))
{
_options.Number = value;
var task = SaveOptionsAsync();
}
}
}
2022-04-26 17:21:17 +02:00
public PasswordGeneratorPolicyOptions EnforcedPolicyOptions
{
get => _enforcedPolicyOptions;
set => SetProperty(ref _enforcedPolicyOptions, value,
additionalPropertyNames: new[]
{
nameof(IsPolicyInEffect)
});
}
public bool IsPolicyInEffect => _enforcedPolicyOptions.InEffect();
public int TypeSelectedIndex
{
get => _typeSelectedIndex;
set
{
if (SetProperty(ref _typeSelectedIndex, value))
{
2019-05-13 20:43:23 +02:00
IsPassword = value == 0;
var task = SaveOptionsAsync();
}
}
}
public async Task InitAsync()
{
(_options, EnforcedPolicyOptions) = await _passwordGenerationService.GetOptionsAsync();
2019-05-13 20:43:23 +02:00
LoadFromOptions();
await RegenerateAsync();
2019-05-13 20:43:23 +02:00
_doneIniting = true;
}
public async Task RegenerateAsync()
{
2019-05-13 20:43:23 +02:00
Password = await _passwordGenerationService.GeneratePasswordAsync(_options);
await _passwordGenerationService.AddHistoryAsync(Password);
}
public void RedrawPassword()
{
if (!string.IsNullOrEmpty(_password))
{
TriggerPropertyChanged(nameof(ColoredPassword));
}
}
public async Task SaveOptionsAsync(bool regenerate = true)
{
if (!_doneIniting)
2019-05-13 20:43:23 +02:00
{
return;
}
SetOptions();
_passwordGenerationService.NormalizeOptions(_options, _enforcedPolicyOptions);
2019-05-13 20:43:23 +02:00
await _passwordGenerationService.SaveOptionsAsync(_options);
LoadFromOptions();
if (regenerate)
{
await RegenerateAsync();
}
}
2019-05-31 17:13:46 +02:00
public async Task SliderChangedAsync()
{
await SaveOptionsAsync(false);
await _passwordGenerationService.AddHistoryAsync(Password);
}
public async Task SliderInputAsync()
{
if (!_doneIniting)
{
return;
}
SetOptions();
_passwordGenerationService.NormalizeOptions(_options, _enforcedPolicyOptions);
Password = await _passwordGenerationService.GeneratePasswordAsync(_options);
}
public async Task CopyAsync()
{
await _clipboardService.CopyTextAsync(Password);
2019-06-04 15:48:08 +02:00
_platformUtilsService.ShowToast("success", null,
string.Format(AppResources.ValueHasBeenCopied, AppResources.Password));
}
2019-05-13 20:43:23 +02:00
private void LoadFromOptions()
{
2019-05-13 20:43:23 +02:00
AvoidAmbiguous = !_options.Ambiguous.GetValueOrDefault();
TypeSelectedIndex = _options.Type == "passphrase" ? 1 : 0;
IsPassword = TypeSelectedIndex == 0;
2019-05-13 20:43:23 +02:00
MinNumber = _options.MinNumber.GetValueOrDefault();
MinSpecial = _options.MinSpecial.GetValueOrDefault();
Special = _options.Special.GetValueOrDefault();
Number = _options.Number.GetValueOrDefault();
NumWords = _options.NumWords.GetValueOrDefault();
WordSeparator = _options.WordSeparator;
Uppercase = _options.Uppercase.GetValueOrDefault();
Lowercase = _options.Lowercase.GetValueOrDefault();
2019-05-13 22:06:56 +02:00
Length = _options.Length.GetValueOrDefault(5);
Capitalize = _options.Capitalize.GetValueOrDefault();
IncludeNumber = _options.IncludeNumber.GetValueOrDefault();
2019-05-13 20:43:23 +02:00
}
private void SetOptions()
{
_options.Ambiguous = !AvoidAmbiguous;
_options.Type = TypeSelectedIndex == 1 ? "passphrase" : "password";
_options.MinNumber = MinNumber;
_options.MinSpecial = MinSpecial;
_options.Special = Special;
_options.NumWords = NumWords;
_options.Number = Number;
_options.WordSeparator = WordSeparator;
_options.Uppercase = Uppercase;
_options.Lowercase = Lowercase;
2019-05-13 22:06:56 +02:00
_options.Length = Length;
_options.Capitalize = Capitalize;
_options.IncludeNumber = IncludeNumber;
2019-03-29 04:52:33 +01:00
}
}
}