Add range binds and sanity checks (#167)

This commit is contained in:
Leendert de Borst
2025-03-18 10:47:06 +01:00
parent b0e939ef23
commit 65110abf4c
2 changed files with 45 additions and 7 deletions

View File

@@ -10,31 +10,36 @@
<label for="password-length" class="block text-sm font-medium text-gray-700 dark:text-gray-300">Password Length: @PasswordSettings.Length</label>
<input type="range" id="password-length" min="8" max="64"
class="mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-primary-500 focus:ring-primary-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white"
@bind="PasswordSettings.Length" @bind:event="oninput">
@bind="PasswordSettings.Length" @oninput="HandleLengthInput">
</div>
<div class="flex items-center">
<input id="use-lowercase" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600" @bind="PasswordSettings.UseLowercase">
<input id="use-lowercase" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600"
@bind="PasswordSettings.UseLowercase" @bind:after="OnPasswordSettingsChanged">
<label for="use-lowercase" class="ml-2 block text-sm text-gray-700 dark:text-gray-300">Include lowercase letters (a-z)</label>
</div>
<div class="flex items-center">
<input id="use-uppercase" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600" @bind="PasswordSettings.UseUppercase">
<input id="use-uppercase" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600"
@bind="PasswordSettings.UseUppercase" @bind:after="OnPasswordSettingsChanged">
<label for="use-uppercase" class="ml-2 block text-sm text-gray-700 dark:text-gray-300">Include uppercase letters (A-Z)</label>
</div>
<div class="flex items-center">
<input id="use-numbers" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600" @bind="PasswordSettings.UseNumbers">
<input id="use-numbers" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600"
@bind="PasswordSettings.UseNumbers" @bind:after="OnPasswordSettingsChanged">
<label for="use-numbers" class="ml-2 block text-sm text-gray-700 dark:text-gray-300">Include numbers (0-9)</label>
</div>
<div class="flex items-center">
<input id="use-special-chars" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600" @bind="PasswordSettings.UseSpecialChars">
<input id="use-special-chars" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600"
@bind="PasswordSettings.UseSpecialChars" @bind:after="OnPasswordSettingsChanged">
<label for="use-special-chars" class="ml-2 block text-sm text-gray-700 dark:text-gray-300">Include special characters (!@@#$%^&amp;*)</label>
</div>
<div class="flex items-center">
<input id="use-non-ambiguous" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600" @bind="PasswordSettings.UseNonAmbiguousChars">
<input id="use-non-ambiguous" type="checkbox" class="h-4 w-4 text-primary-600 focus:ring-primary-500 border-gray-300 rounded dark:bg-gray-700 dark:border-gray-600"
@bind="PasswordSettings.UseNonAmbiguousChars" @bind:after="OnPasswordSettingsChanged">
<label for="use-non-ambiguous" class="ml-2 block text-sm text-gray-700 dark:text-gray-300">Avoid ambiguous characters (1, l, I, 0, O, etc.)</label>
</div>
@@ -105,7 +110,34 @@
private void RefreshPreview()
{
_previewPassword = CredentialService.GenerateRandomPassword(PasswordSettings);
try {
_previewPassword = CredentialService.GenerateRandomPassword(PasswordSettings);
}
catch
{
// If password generation fails, ignore it. This can happen if the settings are invalid.
}
}
/// <summary>
/// Handle input from the password length input.
/// </summary>
private void HandleLengthInput(ChangeEventArgs e)
{
int newLength;
if (int.TryParse(e.Value?.ToString(), out newLength))
{
PasswordSettings.Length = newLength;
RefreshPreview();
}
}
/// <summary>
/// Handle changes to the password settings.
/// </summary>
private void OnPasswordSettingsChanged()
{
RefreshPreview();
}
/// <summary>

View File

@@ -40,6 +40,12 @@ public sealed class CredentialService(HttpClient httpClient, DbService dbService
// Generate a random password using a IPasswordGenerator implementation.
var passwordBuilder = new SpamOK.PasswordGenerator.BasicPasswordBuilder();
// Sanity check: if all settings are false, then default to use lowercase letters only.
if (!settings.UseLowercase && !settings.UseUppercase && !settings.UseNumbers && !settings.UseSpecialChars && !settings.UseNonAmbiguousChars)
{
settings.UseLowercase = true;
}
// Apply the settings.
var password = passwordBuilder
.SetLength(settings.Length)