Removed magic values from gen_password. Made generate_password accept constants for the amount the length of the password
This commit is contained in:
parent
5087f8e2c6
commit
b0f4d1927a
@ -16,7 +16,7 @@ bitflags::bitflags! {
|
|||||||
/// Returns true if the generated master password is valid.
|
/// Returns true if the generated master password is valid.
|
||||||
/// It checks that it has at least one lowercase, one uppercase, one number and one punctuation char
|
/// It checks that it has at least one lowercase, one uppercase, one number and one punctuation char
|
||||||
#[inline]
|
#[inline]
|
||||||
fn check_generated_password(password: &[u8; 32]) -> bool {
|
fn check_generated_password<const LENGTH: usize>(password: &[u8; LENGTH]) -> bool {
|
||||||
let mut flags = PasswordFlags::empty();
|
let mut flags = PasswordFlags::empty();
|
||||||
for &byte in password {
|
for &byte in password {
|
||||||
match byte {
|
match byte {
|
||||||
@ -36,12 +36,12 @@ fn check_generated_password(password: &[u8; 32]) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn generate_password<R>(rng: &mut R) -> ArrayString<32>
|
fn generate_password<R, const LENGTH: usize>(rng: &mut R) -> ArrayString<LENGTH>
|
||||||
where
|
where
|
||||||
R: Rng + CryptoRng,
|
R: Rng + CryptoRng,
|
||||||
{
|
{
|
||||||
loop {
|
loop {
|
||||||
let password: [u8; 32] = array::from_fn(|_| *CHARS.choose(rng).unwrap());
|
let password = array::from_fn(|_| *CHARS.choose(rng).unwrap());
|
||||||
if check_generated_password(&password) {
|
if check_generated_password(&password) {
|
||||||
return ArrayString::from_byte_string(&password).unwrap();
|
return ArrayString::from_byte_string(&password).unwrap();
|
||||||
}
|
}
|
||||||
@ -50,7 +50,8 @@ where
|
|||||||
|
|
||||||
/// Continuously generates the password until it passes the checks
|
/// Continuously generates the password until it passes the checks
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn generate_passwords() -> [ArrayString<32>; 10] {
|
pub fn generate_passwords<const AMOUNT: usize, const LENGTH: usize>(
|
||||||
|
) -> [ArrayString<LENGTH>; AMOUNT] {
|
||||||
let mut rng = thread_rng();
|
let mut rng = thread_rng();
|
||||||
array::from_fn(|_| generate_password(&mut rng))
|
array::from_fn(|_| generate_password(&mut rng))
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,18 @@ use std::fmt::Write;
|
|||||||
use teloxide::{adaptors::Throttle, prelude::*, types::ParseMode};
|
use teloxide::{adaptors::Throttle, prelude::*, types::ParseMode};
|
||||||
use tokio::task::spawn_blocking;
|
use tokio::task::spawn_blocking;
|
||||||
|
|
||||||
|
const MESSAGE_HEADER: &str = "Passwords:";
|
||||||
|
const PASSWORD_LENGTH: usize = 32;
|
||||||
|
const PASSWORD_PADDING_LENGTH: usize = 3;
|
||||||
|
const AMOUNT_OF_PASSWORDS: usize = 10;
|
||||||
|
type PasswordArray = [ArrayString<PASSWORD_LENGTH>; AMOUNT_OF_PASSWORDS];
|
||||||
|
const BUFFER_LENGTH: usize =
|
||||||
|
MESSAGE_HEADER.len() + (PASSWORD_LENGTH + PASSWORD_PADDING_LENGTH) * AMOUNT_OF_PASSWORDS;
|
||||||
|
|
||||||
/// Handles /gen_password command by generating 10 copyable passwords and sending them to the user
|
/// Handles /gen_password command by generating 10 copyable passwords and sending them to the user
|
||||||
pub async fn gen_password(bot: Throttle<Bot>, msg: Message) -> crate::Result<()> {
|
pub async fn gen_password(bot: Throttle<Bot>, msg: Message) -> crate::Result<()> {
|
||||||
let mut message: ArrayString<{ 10 + 35 * 10 }> = "Passwords:".try_into().unwrap();
|
let mut message: ArrayString<BUFFER_LENGTH> = MESSAGE_HEADER.try_into().unwrap();
|
||||||
let passwords = spawn_blocking(generate_passwords).await?;
|
let passwords: PasswordArray = spawn_blocking(generate_passwords).await?;
|
||||||
for password in passwords {
|
for password in passwords {
|
||||||
write!(message, "\n`{password}`").unwrap();
|
write!(message, "\n`{password}`").unwrap();
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user