Skip to main content

LengthComplexityRule

Struct LengthComplexityRule 

Source
pub struct LengthComplexityRule { /* private fields */ }
Expand description

Rule for determining if a password contains the desired complexity for a certain length. In order to meet the criteria of this rule, passwords must meet all the supplied rules for a given password length.

§Example

 use passay_rs::rule::PasswordData;
 use passay_rs::rule::illegal_sequence::IllegalSequenceRule;
 use passay_rs::rule::sequence_data::EnglishSequenceData;
 use passay_rs::rule::character::CharacterRule;
 use passay_rs::rule::character_data::EnglishCharacterData;
 use passay_rs::rule::character_characteristics::CharacterCharacteristics;
 use passay_rs::rule::length_complexity::LengthComplexityRule;
 use passay_rs::rule::length::LengthRule;
 use passay_rs::rule::repeat_character::RepeatCharacterRule;
 use passay_rs::rule::username::UsernameRule;
 use passay_rs::rule::Rule;

  let char_rules = vec![
     CharacterRule::new(Box::new(EnglishCharacterData::Digit), 1).unwrap(),
     CharacterRule::new(Box::new(EnglishCharacterData::Special), 1).unwrap(),
     CharacterRule::new(Box::new(EnglishCharacterData::UpperCase), 1).unwrap(),
     CharacterRule::new(Box::new(EnglishCharacterData::LowerCase), 1).unwrap(),
 ];

 let rules: Vec<Box<dyn Rule>> = vec![
     Box::new(LengthRule::new(8, 64)),
     Box::new(
         CharacterCharacteristics::with_rules_and_characteristics(char_rules, 4).unwrap(),
     ),
     Box::new(UsernameRule::with_match_backwards_and_ignore_case(
         true, true,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Alphabetical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Numerical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::USQwerty,
     )),
     Box::new(RepeatCharacterRule::default()),
 ];
 let mut rule = LengthComplexityRule::default();
 let _ = rule.add_rules(0..12, rules);

 let char_rules = vec![
     CharacterRule::new(Box::new(EnglishCharacterData::Digit), 1).unwrap(),
     CharacterRule::new(Box::new(EnglishCharacterData::UpperCase), 1).unwrap(),
     CharacterRule::new(Box::new(EnglishCharacterData::LowerCase), 1).unwrap(),
 ];
 let rules: Vec<Box<dyn Rule>> = vec![
     Box::new(LengthRule::new(8, 64)),
     Box::new(
         CharacterCharacteristics::with_rules_and_characteristics(char_rules, 3).unwrap(),
     ),
     Box::new(UsernameRule::with_match_backwards_and_ignore_case(
         true, true,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Alphabetical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Numerical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::USQwerty,
     )),
     Box::new(RepeatCharacterRule::default()),
 ];
 let _ = rule.add_rules(12..16, rules);

 let char_rules = vec![
     CharacterRule::new(Box::new(EnglishCharacterData::UpperCase), 1).unwrap(),
     CharacterRule::new(Box::new(EnglishCharacterData::LowerCase), 1).unwrap(),
 ];
 let rules: Vec<Box<dyn Rule>> = vec![
     Box::new(LengthRule::new(8, 64)),
     Box::new(
         CharacterCharacteristics::with_rules_and_characteristics(char_rules, 2).unwrap(),
     ),
     Box::new(UsernameRule::with_match_backwards_and_ignore_case(
         true, true,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Alphabetical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Numerical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::USQwerty,
     )),
     Box::new(RepeatCharacterRule::default()),
 ];
 let _ = rule.add_rules(16..20, rules);

 let rules: Vec<Box<dyn Rule>> = vec![
     Box::new(LengthRule::new(8, 64)),
     Box::new(UsernameRule::with_match_backwards_and_ignore_case(
         true, true,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Alphabetical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::Numerical,
     )),
     Box::new(IllegalSequenceRule::with_sequence_data(
         EnglishSequenceData::USQwerty,
     )),
     Box::new(RepeatCharacterRule::default()),
 ];
 let _ = rule.add_rules(20..128, rules);

 let password = PasswordData::with_password_and_user(
     "rPscvEW2e".to_string(),
     Some("alfred".to_string()),
 );
 let result = rule.validate(&password);
 assert!(!result.valid());

Implementations§

Source§

impl LengthComplexityRule

Source

pub fn new( rules: HashMap<Range<usize>, Vec<Box<dyn Rule>>>, report_failure: bool, report_rule_failures: bool, ) -> Self

Source

pub fn rules_mut(&mut self) -> &mut HashMap<Range<usize>, Vec<Box<dyn Rule>>>

Source

pub fn add_rules( &mut self, interval: Range<usize>, rules: Vec<Box<dyn Rule>>, ) -> Result<(), String>

Trait Implementations§

Source§

impl Default for LengthComplexityRule

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl Rule for LengthComplexityRule

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V