From 4c31581d392fc09ca288e2ae77d32d3a3cc9f283 Mon Sep 17 00:00:00 2001 From: Maximilian Date: Tue, 10 Jan 2023 18:35:22 -0600 Subject: [PATCH] Removed " character from allowed_chars, allow second optional argument for disallowed characters, error handling for missing or incorrect arguments --- Cargo.toml | 2 +- src/main.rs | 57 ++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index bc98731..6de0ff1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rust_pass" -version = "0.1.0" +version = "1.0.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/src/main.rs b/src/main.rs index 875600d..5f6c657 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,21 +1,50 @@ use std::env; fn main() { - // Take in two command line arguments, one i32 and one str + // Take in two command line arguments, one i32 and one optional String let args: Vec = env::args().collect(); - let new_password_length: i32 = args[1].parse().unwrap(); - let allowed_chars: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=`~!@#$%^&*()_+[]\\{}|;':\",./<>?"; - - // Generate a random string of length n - let mut new_password = String::new(); - for _ in 0..new_password_length { - new_password.push( - allowed_chars.chars() - .nth(rand::random::() % allowed_chars.len()) - .unwrap() - ); + if args.len() < 2 { // Make sure at least one argument is provided + println!("Error: First argument must be a valid integer (Ex. 32)"); + println!("Argument not supplied"); + return; } - // Print the new password - println!("{}", new_password); + let new_password_length: Option = args[1].parse().ok(); + if new_password_length.is_none() { // Make sure i32 parsed correctly + println!("Error: First argument must be a valid integer (Ex. 32)"); + return; + } + + // Disallowed_chars is an optional argument + let disallowed_chars: Option<&String> = args.get(2); + + let mut allowed_chars: String = String::from("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=`~!@#$%^&*()_+[]\\{}|;':,./<>?"); + + // Remove disallowed characters from allowed_characters if disallowed_chars is specified + if let Some(disallowed_chars) = disallowed_chars { + for disallowed_char in disallowed_chars.chars() { + allowed_chars = allowed_chars.replace(disallowed_char, ""); + } + + if allowed_chars.len() == 0 { // Make sure there are still characters left to use + println!("Error: You have disallowed all characters"); + println!("The allowed character set includes: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-=`~!@#$%^&*()_+[]\\{{}}|;':,./<>?"); + return; + } + } + + if let Some(new_password_length) = new_password_length { // Unwrap Option in i32 + // Generate a random string of length n + let mut new_password = String::new(); + for _ in 0..new_password_length { + new_password.push( + allowed_chars.chars() + .nth(rand::random::() % allowed_chars.len()) + .unwrap() + ); + } + + // Print the new password + println!("{}", new_password); + } }