feat: added min_password_strength validator

This commit is contained in:
Oscar Beaumont 2021-12-30 13:53:22 +08:00
parent b8431541c9
commit df8f4f2791
4 changed files with 46 additions and 0 deletions

View File

@ -23,6 +23,7 @@ tracing = ["tracinglib", "tracing-futures"]
decimal = ["rust_decimal"]
cbor = ["serde_cbor"]
chrono-duration = ["chrono", "iso8601-duration"]
password-strength-validator = ["zxcvbn"]
[dependencies]
async-graphql-derive = { path = "derive", version = "3.0.19" }
@ -63,6 +64,7 @@ uuid = { version = "0.8.2", optional = true, features = ["v4", "serde"] }
rust_decimal = { version = "1.14.3", optional = true }
url = { version = "2.2.1", optional = true }
smol_str = { version = "0.1.21", optional = true }
zxcvbn = { version = "2.1.2", optional = true }
# Non-feature optional dependencies
blocking = { version = "1.0.2", optional = true }

View File

@ -34,6 +34,8 @@ pub struct Validators {
#[darling(default)]
multiple_of: Option<Number>,
#[darling(default)]
min_password_strength: Option<u8>,
#[darling(default)]
maximum: Option<Number>,
#[darling(default)]
minimum: Option<Number>,
@ -93,6 +95,12 @@ impl Validators {
});
}
if let Some(n) = &self.min_password_strength {
elem_validators.push(quote! {
#crate_name::validators::min_password_strength(__raw_value, #n)
});
}
if let Some(n) = &self.maximum {
elem_validators.push(quote! {
#crate_name::validators::maximum(__raw_value, #n)

View File

@ -0,0 +1,34 @@
use crate::{InputType, InputValueError};
use zxcvbn::{zxcvbn, ZxcvbnError};
pub fn min_password_strength<T: AsRef<str> + InputType>(
value: &T,
min_score: u8,
) -> Result<(), InputValueError<T>> {
match zxcvbn(value.as_ref(), &[]) {
Ok(password_strength) => {
if password_strength.score() < min_score {
Err("password is too weak".into())
} else {
Ok(())
}
}
Err(ZxcvbnError::BlankPassword) => Err("password is too weak".into()),
_ => Err("error processing password strength".into()),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_min_password_strength() {
assert!(min_password_strength(&"password".to_string(), 3).is_err());
assert!(min_password_strength(&"query".to_string(), 3).is_err());
assert!(min_password_strength(&"P@ssword1".to_string(), 3).is_err());
assert!(min_password_strength(&"".to_string(), 3).is_err());
assert!(min_password_strength(&"Some!Secure!Password".to_string(), 3).is_ok());
}
}

View File

@ -7,6 +7,8 @@ mod max_length;
mod maximum;
mod min_items;
mod min_length;
#[cfg(feature = "password-strength-validator")]
mod min_password_strength;
mod minimum;
mod multiple_of;
mod regex;