🐛 Use of the zxcvbn::Score enum
All checks were successful
ci/woodpecker/pr/lint Pipeline was successful
ci/woodpecker/pr/audit Pipeline was successful

This commit is contained in:
2025-07-15 08:02:09 +02:00
parent 0cffafcd77
commit ff578ab849
2 changed files with 6 additions and 8 deletions

View File

@@ -31,7 +31,7 @@ validator = { version = "0.17.0", features = ["derive"] }
# Http client # Http client
reqwest = "0.12.0" reqwest = "0.12.0"
# Password strength estimation # Password strength estimation
zxcvbn = "3.0.0" zxcvbn = { version = "3.0.0", features = ["ser"] }
# Image processing/conversion # Image processing/conversion
image = "0.25.1" image = "0.25.1"
# Get the application version # Get the application version

View File

@@ -4,7 +4,7 @@ use const_format::formatcp;
use dioxus::prelude::*; use dioxus::prelude::*;
use tracing::{debug, error, warn}; use tracing::{debug, error, warn};
use validator::{Validate, ValidateArgs, ValidateEmail, ValidationError, ValidationErrors}; use validator::{Validate, ValidateArgs, ValidateEmail, ValidationError, ValidationErrors};
use zxcvbn::zxcvbn; use zxcvbn::{zxcvbn, Score};
use crate::{ use crate::{
domain::model::session::Session, domain::model::session::Session,
@@ -348,14 +348,14 @@ fn validate_id(id: &Option<String>, process: &Process) -> Result<(), ValidationE
} }
struct PasswordValidationResult { struct PasswordValidationResult {
score: u8, score: Score,
rating: f64, // 0 <= rating <= 1 rating: f64, // 0 <= rating <= 1
suggestions: Vec<String>, suggestions: Vec<String>,
} }
impl PasswordValidationResult { impl PasswordValidationResult {
pub fn new() -> Self { pub fn new() -> Self {
PasswordValidationResult { PasswordValidationResult {
score: 0, score: Score::Zero,
rating: 0.0, rating: 0.0,
suggestions: Vec::<String>::new(), suggestions: Vec::<String>::new(),
} }
@@ -366,9 +366,7 @@ fn compute_password_score(
password: &str, password: &str,
with_suggestions: Option<bool>, with_suggestions: Option<bool>,
) -> Option<PasswordValidationResult> { ) -> Option<PasswordValidationResult> {
let Ok(estimate) = zxcvbn(password, &[]) else { let estimate = zxcvbn(password, &[]);
return None;
};
let mut result = PasswordValidationResult::new(); let mut result = PasswordValidationResult::new();
result.score = estimate.score(); result.score = estimate.score();
@@ -396,7 +394,7 @@ fn validate_password(password: &Option<String>, process: &Process) -> Result<(),
if let Some(password) = password { if let Some(password) = password {
if let Some(result) = compute_password_score(password, Some(true)) { if let Some(result) = compute_password_score(password, Some(true)) {
// TODO: To configuration? // TODO: To configuration?
if result.score <= 2 { if [Score::Zero, Score::One, Score::Two].contains(&result.score) {
let mut err = ValidationError::new(TOO_WEAK_PASSWORD_ERROR_NAME); let mut err = ValidationError::new(TOO_WEAK_PASSWORD_ERROR_NAME);
err.add_param(Cow::from("score"), &result.score); err.add_param(Cow::from("score"), &result.score);
err.add_param(Cow::from("rating"), &result.rating); err.add_param(Cow::from("rating"), &result.rating);