X-Git-Url: https://code.octet-stream.net/hashgood/blobdiff_plain/a81302dca6183729495f32f396e4f7a793b89e96..1519fdaacd380be03c2e24128027cf97de6e02f6:/src/verify.rs diff --git a/src/verify.rs b/src/verify.rs index f5ba2a2..0811606 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -43,17 +43,18 @@ fn get_by_parameter(param: &str) -> Result { /// Generate a candidate hash from the system clipboard, or throw an error. fn get_from_clipboard() -> Result { - #[cfg(feature = "paste")] { + #[cfg(feature = "paste")] + { let mut ctx: ClipboardContext = match ClipboardProvider::new() { Ok(ctx) => ctx, Err(e) => return Err(format!("Error getting system clipboard: {}", e)), }; - + let possible_hash = match ctx.get_contents() { Ok(value) => value, Err(e) => format!("Error reading from clipboard: {}", e), }; - + let bytes = hex::decode(&possible_hash) .map_err(|_| "Clipboard contains invalid or truncated hex".to_owned())?; let alg = Algorithm::from_len(bytes.len())?; @@ -67,7 +68,8 @@ fn get_from_clipboard() -> Result { source: VerificationSource::Clipboard, }); } - #[cfg(not(feature = "paste"))] { + #[cfg(not(feature = "paste"))] + { return Err("Paste not implemented".to_owned()); } } @@ -279,3 +281,56 @@ pub fn verify_hash<'a>(calculated: &Hash, candidates: &'a CandidateHashes) -> Ve messages, } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_read_raw_inputs() { + let example_path: PathBuf = "some_file".into(); + let valid_md5 = "d229da563da18fe5d58cd95a6467d584"; + let valid_sha1 = "b314c7ebb7d599944981908b7f3ed33a30e78f3a"; + let valid_sha1_2 = valid_sha1.to_uppercase(); + let valid_sha256 = "1eb85fc97224598dad1852b5d6483bbcf0aa8608790dcc657a5a2a761ae9c8c6"; + + let invalid1 = "x"; + let invalid2 = "a"; + let invalid3 = "d229da563da18fe5d58cd95a6467d58"; + let invalid4 = "1eb85fc97224598dad1852b5d6483bbcf0aa8608790dcc657a5a2a761ae9c8c67"; + let invalid5 = "1eb85fc97224598dad1852b5d 483bbcf0aa8608790dcc657a5a2a761ae9c8c6"; + + assert!(matches!( + read_raw_candidate_from_file(valid_md5, &example_path), + Some(CandidateHashes { + alg: Algorithm::Md5, + .. + }) + )); + assert!(matches!( + read_raw_candidate_from_file(valid_sha1, &example_path), + Some(CandidateHashes { + alg: Algorithm::Sha1, + .. + }) + )); + assert!(matches!( + read_raw_candidate_from_file(&valid_sha1_2, &example_path), + Some(CandidateHashes { + alg: Algorithm::Sha1, + .. + }) + )); + assert!(matches!( + read_raw_candidate_from_file(valid_sha256, &example_path), + Some(CandidateHashes { + alg: Algorithm::Sha256, + .. + }) + )); + + for i in &[invalid1, invalid2, invalid3, invalid4, invalid5] { + assert!(read_raw_candidate_from_file(*i, &example_path).is_none()); + } + } +}