From 33caf6e0f5ab1837ef0506fc42304dd617b0b0df Mon Sep 17 00:00:00 2001 From: Antony Kellermann Date: Fri, 27 Nov 2020 12:22:40 -0500 Subject: [PATCH 1/5] Implemented client id/secret validation --- src/config.rs | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/config.rs b/src/config.rs index 849d9160..3fc6f6c7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -127,14 +127,33 @@ impl ClientConfig { number += 1; } - // TODO: Handle empty input? let mut client_id = String::new(); - println!("\nEnter your Client ID: "); - stdin().read_line(&mut client_id)?; + loop { + println!("\nEnter your Client ID: "); + stdin().read_line(&mut client_id)?; + client_id = client_id.trim().to_string(); + match ClientConfig::is_client_key_valid(&client_id) { + Ok(_) => break, + Err(error_string) => { + println!("Invalid Client ID: {}", error_string); + client_id.clear(); + } + }; + } let mut client_secret = String::new(); - println!("\nEnter your Client Secret: "); - stdin().read_line(&mut client_secret)?; + loop { + println!("\nEnter your Client Secret: "); + stdin().read_line(&mut client_secret)?; + client_secret = client_secret.trim().to_string(); + match ClientConfig::is_client_key_valid(&client_secret) { + Ok(_) => break, + Err(error_string) => { + println!("Invalid Client Secret: {}", error_string); + client_secret.clear(); + } + }; + } let mut port = String::new(); println!("\nEnter port of redirect uri (default {}): ", DEFAULT_PORT); @@ -142,8 +161,8 @@ impl ClientConfig { let port = port.trim().parse::().unwrap_or(DEFAULT_PORT); let config_yml = ClientConfig { - client_id: client_id.trim().to_string(), - client_secret: client_secret.trim().to_string(), + client_id, + client_secret, device_id: None, port: Some(port), }; @@ -161,4 +180,19 @@ impl ClientConfig { Ok(()) } } + + fn is_client_key_valid(key: &String) -> Result { + const EXPECTED_LEN: usize = 32; + if key.len() != EXPECTED_LEN { + Err(format!( + "invalid length: {} (must be {})", + key.len(), + EXPECTED_LEN, + )) + } else if !key.chars().all(|c| c.is_digit(16)) { + Err("invalid character found (must be hex digits)".to_string()) + } else { + Ok(true) + } + } } From c88ee9dcee7f52c042907e4e36373390cd5dc08d Mon Sep 17 00:00:00 2001 From: Antony Kellermann Date: Fri, 27 Nov 2020 12:28:17 -0500 Subject: [PATCH 2/5] Abstract out common function --- src/config.rs | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/src/config.rs b/src/config.rs index 3fc6f6c7..9d0c5c36 100644 --- a/src/config.rs +++ b/src/config.rs @@ -127,33 +127,8 @@ impl ClientConfig { number += 1; } - let mut client_id = String::new(); - loop { - println!("\nEnter your Client ID: "); - stdin().read_line(&mut client_id)?; - client_id = client_id.trim().to_string(); - match ClientConfig::is_client_key_valid(&client_id) { - Ok(_) => break, - Err(error_string) => { - println!("Invalid Client ID: {}", error_string); - client_id.clear(); - } - }; - } - - let mut client_secret = String::new(); - loop { - println!("\nEnter your Client Secret: "); - stdin().read_line(&mut client_secret)?; - client_secret = client_secret.trim().to_string(); - match ClientConfig::is_client_key_valid(&client_secret) { - Ok(_) => break, - Err(error_string) => { - println!("Invalid Client Secret: {}", error_string); - client_secret.clear(); - } - }; - } + let client_id = ClientConfig::get_client_key_from_input("Client ID"); + let client_secret = ClientConfig::get_client_key_from_input("Client Secret"); let mut port = String::new(); println!("\nEnter port of redirect uri (default {}): ", DEFAULT_PORT); @@ -181,6 +156,22 @@ impl ClientConfig { } } + fn get_client_key_from_input(type_label: &'static str) -> String { + let mut client_key = String::new(); + loop { + println!("\nEnter your {}: ", type_label); + stdin().read_line(&mut client_key)?; + client_key = client_key.trim().to_string(); + match ClientConfig::is_client_key_valid(&client_key) { + Ok(_) => return client_key, + Err(error_string) => { + println!("Invalid {}: {}", type_label, error_string); + client_key.clear(); + } + }; + } + } + fn is_client_key_valid(key: &String) -> Result { const EXPECTED_LEN: usize = 32; if key.len() != EXPECTED_LEN { From 63f5b297a7545f985b6ad9563dc4a1df14cd17bf Mon Sep 17 00:00:00 2001 From: Antony Kellermann Date: Fri, 27 Nov 2020 12:52:15 -0500 Subject: [PATCH 3/5] Fix --- src/config.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/config.rs b/src/config.rs index 9d0c5c36..3890402a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -127,8 +127,8 @@ impl ClientConfig { number += 1; } - let client_id = ClientConfig::get_client_key_from_input("Client ID"); - let client_secret = ClientConfig::get_client_key_from_input("Client Secret"); + let client_id = ClientConfig::get_client_key_from_input("Client ID")?; + let client_secret = ClientConfig::get_client_key_from_input("Client Secret")?; let mut port = String::new(); println!("\nEnter port of redirect uri (default {}): ", DEFAULT_PORT); @@ -156,14 +156,14 @@ impl ClientConfig { } } - fn get_client_key_from_input(type_label: &'static str) -> String { + fn get_client_key_from_input(type_label: &'static str) -> Result { let mut client_key = String::new(); loop { println!("\nEnter your {}: ", type_label); stdin().read_line(&mut client_key)?; client_key = client_key.trim().to_string(); match ClientConfig::is_client_key_valid(&client_key) { - Ok(_) => return client_key, + Ok(_) => return Ok(client_key), Err(error_string) => { println!("Invalid {}: {}", type_label, error_string); client_key.clear(); @@ -172,7 +172,7 @@ impl ClientConfig { } } - fn is_client_key_valid(key: &String) -> Result { + fn is_client_key_valid(key: &String) -> Result<(), String> { const EXPECTED_LEN: usize = 32; if key.len() != EXPECTED_LEN { Err(format!( @@ -183,7 +183,7 @@ impl ClientConfig { } else if !key.chars().all(|c| c.is_digit(16)) { Err("invalid character found (must be hex digits)".to_string()) } else { - Ok(true) + Ok(()) } } } From aeedfcd6562c8f32a5f93d2f270b6328b9564b86 Mon Sep 17 00:00:00 2001 From: Antony Kellermann Date: Fri, 27 Nov 2020 13:33:47 -0500 Subject: [PATCH 4/5] Implemented error --- src/config.rs | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/config.rs b/src/config.rs index 3890402a..7d206f25 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,5 +1,5 @@ use super::banner::BANNER; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, Error, Result}; use serde::{Deserialize, Serialize}; use std::{ fs, @@ -158,30 +158,41 @@ impl ClientConfig { fn get_client_key_from_input(type_label: &'static str) -> Result { let mut client_key = String::new(); + const MAX_RETRIES: u8 = 5; + let mut num_retries = 0; loop { println!("\nEnter your {}: ", type_label); stdin().read_line(&mut client_key)?; client_key = client_key.trim().to_string(); - match ClientConfig::is_client_key_valid(&client_key) { + match ClientConfig::validate_client_key(&client_key) { Ok(_) => return Ok(client_key), Err(error_string) => { - println!("Invalid {}: {}", type_label, error_string); + println!("{}", error_string); client_key.clear(); + num_retries += 1; + if num_retries == MAX_RETRIES { + return Err(Error::from(std::io::Error::new( + std::io::ErrorKind::Other, + format!("Maximum retries ({}) exceeded.", MAX_RETRIES), + ))); + } } }; } } - fn is_client_key_valid(key: &String) -> Result<(), String> { + fn validate_client_key(key: &String) -> Result<()> { const EXPECTED_LEN: usize = 32; if key.len() != EXPECTED_LEN { - Err(format!( - "invalid length: {} (must be {})", - key.len(), - EXPECTED_LEN, - )) + Err(Error::from(std::io::Error::new( + std::io::ErrorKind::InvalidInput, + format!("invalid length: {} (must be {})", key.len(), EXPECTED_LEN,), + ))) } else if !key.chars().all(|c| c.is_digit(16)) { - Err("invalid character found (must be hex digits)".to_string()) + Err(Error::from(std::io::Error::new( + std::io::ErrorKind::InvalidInput, + "invalid character found (must be hex digits)", + ))) } else { Ok(()) } From 041bbaa47bc9baf8fc88a59c6992e8b58e718429 Mon Sep 17 00:00:00 2001 From: Antony Kellermann Date: Fri, 27 Nov 2020 13:46:52 -0500 Subject: [PATCH 5/5] Address clippy --- src/config.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.rs b/src/config.rs index 7d206f25..88105e3c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -181,7 +181,7 @@ impl ClientConfig { } } - fn validate_client_key(key: &String) -> Result<()> { + fn validate_client_key(key: &str) -> Result<()> { const EXPECTED_LEN: usize = 32; if key.len() != EXPECTED_LEN { Err(Error::from(std::io::Error::new(