1 Commits

Author SHA1 Message Date
d24f3eb651 Update Rust crate zxcvbn to v3
Some checks failed
ci/woodpecker/pr/lint Pipeline failed
ci/woodpecker/pr/audit unknown status
2025-07-14 00:01:53 +00:00
2 changed files with 9 additions and 7 deletions

View File

@@ -27,11 +27,11 @@ tokio-stream = "0.1.15"
base64 = "0.22.0" base64 = "0.22.0"
const_format = "0.2.32" const_format = "0.2.32"
rand = "0.9.1" rand = "0.9.1"
validator = { version = "0.20.0", features = ["derive"] } 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 = { version = "3.0.0", features = ["ser"] } zxcvbn = "3.0.0"
# 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, Score}; use zxcvbn::zxcvbn;
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: Score, score: u8,
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: Score::Zero, score: 0,
rating: 0.0, rating: 0.0,
suggestions: Vec::<String>::new(), suggestions: Vec::<String>::new(),
} }
@@ -366,7 +366,9 @@ fn compute_password_score(
password: &str, password: &str,
with_suggestions: Option<bool>, with_suggestions: Option<bool>,
) -> Option<PasswordValidationResult> { ) -> Option<PasswordValidationResult> {
let estimate = zxcvbn(password, &[]); let Ok(estimate) = zxcvbn(password, &[]) else {
return None;
};
let mut result = PasswordValidationResult::new(); let mut result = PasswordValidationResult::new();
result.score = estimate.score(); result.score = estimate.score();
@@ -394,7 +396,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 [Score::Zero, Score::One, Score::Two].contains(&result.score) { if result.score <= 2 {
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);