use serde::{Deserialize, Serialize};
use zxcvbn::zxcvbn;
#[derive(Debug, Serialize, Deserialize)]
pub struct StrengthResult {
pub score: u8,
pub crack_time_seconds: f64,
pub warning: Option<String>,
pub suggestions: Vec<String>,
}
pub fn check_strength(password: &str) -> StrengthResult {
let result = zxcvbn(password, &[]);
let feedback = result.feedback();
let warning = if let Some(feedback) = feedback {
if feedback.warning().is_some() {
feedback.warning().map(|w| w.to_string())
} else {
None
}
} else {
None
};
let suggestions = if let Some(feedback) = feedback {
feedback
.suggestions()
.iter()
.map(|s| s.to_string())
.collect()
} else {
Vec::new()
};
let crack_time_seconds = 0.0;
StrengthResult {
score: result.score().try_into().unwrap_or(0),
crack_time_seconds,
warning,
suggestions,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_weak_password() {
let result = check_strength("password");
assert_eq!(result.score, 0);
}
#[test]
fn test_strong_password() {
let result = check_strength("correct horse battery staple");
assert!(result.score >= 3);
}
}