X-Git-Url: https://code.octet-stream.net/hashgood/blobdiff_plain/1dec1ec82f55d639d9fad0d0933545aa509c4272..7fb2bb217993b73d21793decc56fec1f4dc190fe:/src/verify.rs diff --git a/src/verify.rs b/src/verify.rs index 6ad9ea9..0811606 100644 --- a/src/verify.rs +++ b/src/verify.rs @@ -2,8 +2,8 @@ use super::{ Algorithm, CandidateHash, CandidateHashes, Hash, MatchLevel, MessageLevel, Opt, Verification, VerificationSource, }; -use clipboard::ClipboardContext; -use clipboard::ClipboardProvider; +#[cfg(feature = "paste")] +use clipboard::{ClipboardContext, ClipboardProvider}; use regex::Regex; use std::fs::File; use std::io; @@ -17,7 +17,7 @@ use std::path::PathBuf; pub fn get_candidate_hashes(opt: &Opt) -> Result, String> { if let Some(hash_string) = &opt.hash { return Ok(Some(get_by_parameter(hash_string)?)); - } else if opt.paste { + } else if opt.get_paste() { return Ok(Some(get_from_clipboard()?)); } else if let Some(hash_file) = &opt.hash_file { return Ok(Some(get_from_file(hash_file)?)); @@ -43,28 +43,35 @@ fn get_by_parameter(param: &str) -> Result { /// Generate a candidate hash from the system clipboard, or throw an error. fn get_from_clipboard() -> Result { - let mut ctx: ClipboardContext = match ClipboardProvider::new() { - Ok(ctx) => ctx, - Err(e) => return Err(format!("Error getting system clipboard: {}", e)), - }; + #[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 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())?; - let candidate = CandidateHash { - filename: None, - bytes, - }; - Ok(CandidateHashes { - alg, - hashes: vec![candidate], - source: VerificationSource::Clipboard, - }) + let bytes = hex::decode(&possible_hash) + .map_err(|_| "Clipboard contains invalid or truncated hex".to_owned())?; + let alg = Algorithm::from_len(bytes.len())?; + let candidate = CandidateHash { + filename: None, + bytes, + }; + return Ok(CandidateHashes { + alg, + hashes: vec![candidate], + source: VerificationSource::Clipboard, + }); + } + #[cfg(not(feature = "paste"))] + { + return Err("Paste not implemented".to_owned()); + } } /// Generate a candidate hash from the digests file specified (could be "-" for STDIN), or throw an error. @@ -274,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()); + } + } +}