add capitalize and include num to generator

This commit is contained in:
Kyle Spearrin 2019-07-01 15:35:26 -04:00
parent 225db6397d
commit 33ba4d3871
6 changed files with 120 additions and 3 deletions

View file

@ -100,6 +100,27 @@
IsTextPredictionEnabled="False" IsTextPredictionEnabled="False"
StyleClass="box-value" /> StyleClass="box-value" />
</StackLayout> </StackLayout>
<StackLayout StyleClass="box-row, box-row-switch">
<Label
Text="{u:I18n Capitalize}"
StyleClass="box-label, box-label-regular"
HorizontalOptions="StartAndExpand" />
<Switch
IsToggled="{Binding Capitalize}"
StyleClass="box-value"
HorizontalOptions="End" />
</StackLayout>
<BoxView StyleClass="box-row-separator" />
<StackLayout StyleClass="box-row, box-row-switch">
<Label
Text="{u:I18n IncludeNumber}"
StyleClass="box-label, box-label-regular"
HorizontalOptions="StartAndExpand" />
<Switch
IsToggled="{Binding IncludeNumber}"
StyleClass="box-value"
HorizontalOptions="End" />
</StackLayout>
</StackLayout> </StackLayout>
<StackLayout Spacing="0" Padding="0" IsVisible="{Binding IsPassword}"> <StackLayout Spacing="0" Padding="0" IsVisible="{Binding IsPassword}">
<StackLayout StyleClass="box-row, box-row-slider"> <StackLayout StyleClass="box-row, box-row-slider">

View file

@ -3,9 +3,7 @@ using Bit.App.Utilities;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Models.Domain; using Bit.Core.Models.Domain;
using Bit.Core.Utilities; using Bit.Core.Utilities;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xamarin.Forms; using Xamarin.Forms;
@ -29,6 +27,8 @@ namespace Bit.App.Pages
private int _length = 5; private int _length = 5;
private int _numWords = 3; private int _numWords = 3;
private string _wordSeparator; private string _wordSeparator;
private bool _capitalize;
private bool _includeNumber;
private int _typeSelectedIndex; private int _typeSelectedIndex;
private bool _doneIniting; private bool _doneIniting;
@ -196,6 +196,32 @@ namespace Bit.App.Pages
} }
} }
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();
}
}
}
public int TypeSelectedIndex public int TypeSelectedIndex
{ {
get => _typeSelectedIndex; get => _typeSelectedIndex;
@ -273,6 +299,8 @@ namespace Bit.App.Pages
Uppercase = _options.Uppercase.GetValueOrDefault(); Uppercase = _options.Uppercase.GetValueOrDefault();
Lowercase = _options.Lowercase.GetValueOrDefault(); Lowercase = _options.Lowercase.GetValueOrDefault();
Length = _options.Length.GetValueOrDefault(5); Length = _options.Length.GetValueOrDefault(5);
Capitalize = _options.Capitalize.GetValueOrDefault();
IncludeNumber = _options.IncludeNumber.GetValueOrDefault();
} }
private void SetOptions() private void SetOptions()
@ -288,6 +316,8 @@ namespace Bit.App.Pages
_options.Uppercase = Uppercase; _options.Uppercase = Uppercase;
_options.Lowercase = Lowercase; _options.Lowercase = Lowercase;
_options.Length = Length; _options.Length = Length;
_options.Capitalize = Capitalize;
_options.IncludeNumber = IncludeNumber;
} }
} }
} }

View file

@ -807,6 +807,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Capitalize.
/// </summary>
public static string Capitalize {
get {
return ResourceManager.GetString("Capitalize", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Cardholder Name. /// Looks up a localized string similar to Cardholder Name.
/// </summary> /// </summary>
@ -1932,6 +1941,15 @@ namespace Bit.App.Resources {
} }
} }
/// <summary>
/// Looks up a localized string similar to Include Number.
/// </summary>
public static string IncludeNumber {
get {
return ResourceManager.GetString("IncludeNumber", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to Please connect to the internet before continuing.. /// Looks up a localized string similar to Please connect to the internet before continuing..
/// </summary> /// </summary>

View file

@ -1559,4 +1559,11 @@
<data name="ThemeAppliedOnRestart" xml:space="preserve"> <data name="ThemeAppliedOnRestart" xml:space="preserve">
<value>Your theme changes will apply when the app is restarted.</value> <value>Your theme changes will apply when the app is restarted.</value>
</data> </data>
<data name="Capitalize" xml:space="preserve">
<value>Capitalize</value>
<comment>ex. Uppercase the first character of a word.</comment>
</data>
<data name="IncludeNumber" xml:space="preserve">
<value>Include Number</value>
</data>
</root> </root>

View file

@ -21,6 +21,8 @@
Type = "password"; Type = "password";
NumWords = 3; NumWords = 3;
WordSeparator = "-"; WordSeparator = "-";
Capitalize = false;
IncludeNumber = false;
} }
} }
@ -37,6 +39,8 @@
public string Type { get; set; } public string Type { get; set; }
public int? NumWords { get; set; } public int? NumWords { get; set; }
public string WordSeparator { get; set; } public string WordSeparator { get; set; }
public bool? Capitalize { get; set; }
public bool? IncludeNumber { get; set; }
public void Merge(PasswordGenerationOptions defaults) public void Merge(PasswordGenerationOptions defaults)
{ {
@ -53,6 +57,8 @@
Type = Type ?? defaults.Type; Type = Type ?? defaults.Type;
NumWords = NumWords ?? defaults.NumWords; NumWords = NumWords ?? defaults.NumWords;
WordSeparator = WordSeparator ?? defaults.WordSeparator; WordSeparator = WordSeparator ?? defaults.WordSeparator;
Capitalize = Capitalize ?? defaults.Capitalize;
IncludeNumber = IncludeNumber ?? defaults.IncludeNumber;
} }
} }
} }

View file

@ -192,12 +192,31 @@ namespace Bit.Core.Services
{ {
options.WordSeparator = " "; options.WordSeparator = " ";
} }
if(options.Capitalize == null)
{
options.Capitalize = false;
}
if(options.IncludeNumber == null)
{
options.IncludeNumber = false;
}
var listLength = EEFLongWordList.Instance.List.Count - 1; var listLength = EEFLongWordList.Instance.List.Count - 1;
var wordList = new List<string>(); var wordList = new List<string>();
for(int i = 0; i < options.NumWords.GetValueOrDefault(); i++) for(int i = 0; i < options.NumWords.GetValueOrDefault(); i++)
{ {
var wordIndex = await _cryptoService.RandomNumberAsync(0, listLength); var wordIndex = await _cryptoService.RandomNumberAsync(0, listLength);
wordList.Add(EEFLongWordList.Instance.List[wordIndex]); if(options.Capitalize.GetValueOrDefault())
{
wordList.Add(Capitalize(EEFLongWordList.Instance.List[wordIndex]));
}
else
{
wordList.Add(EEFLongWordList.Instance.List[wordIndex]);
}
}
if(options.IncludeNumber.GetValueOrDefault())
{
await AppendRandomNumberToRandomWordAsync(wordList);
} }
return string.Join(options.WordSeparator, wordList); return string.Join(options.WordSeparator, wordList);
} }
@ -400,5 +419,21 @@ namespace Bit.Core.Services
} }
return history.Last().Password == password; return history.Last().Password == password;
} }
private string Capitalize(string str)
{
return str.First().ToString().ToUpper() + str.Substring(1);
}
private async Task AppendRandomNumberToRandomWordAsync(List<string> wordList)
{
if(wordList == null || wordList.Count <= 0)
{
return;
}
var index = await _cryptoService.RandomNumberAsync(0, wordList.Count - 1);
var num = await _cryptoService.RandomNumberAsync(0, 9);
wordList[index] = wordList[index] + num;
}
} }
} }