use super::funejson::Value; use super::auth_password_policy_data::POLICIES; /// A named policy from the data, so a browser and an API that both ask for /// "nist-800-63b-4-single-factor" enforce exactly the same numbers. /// /// # Panics /// Panics on a name the data does not have. pub fn password_policy(name: &str) -> PasswordPolicy { for row in POLICIES { if row.name == name { return PasswordPolicy { name: row.name.to_string(), min_length: row.min_length, max_length: row.max_length, min_character_classes: row.min_character_classes, block_common: row.block_common, block_personal: row.block_personal, }; } } let known: Vec<&str> = POLICIES.iter().map(|row| row.name).collect(); panic!("unknown password policy \"{}\"; known policies: {}", name, known.join(", ")); } pub fn password_policy_to_value(policy: &PasswordPolicy) -> Value { Value::obj(vec![ ("name", Value::str(&policy.name)), ("minLength", Value::Int(policy.min_length)), ("maxLength", Value::Int(policy.max_length)), ("minCharacterClasses", Value::Int(policy.min_character_classes)), ("blockCommon", Value::Bool(policy.block_common)), ("blockPersonal", Value::Bool(policy.block_personal)), ]) } pub fn fune_vector(args: &[Value]) -> Value { password_policy_to_value(&password_policy(args[0].as_str())) }