use std::{error::Error, process::Command};
pub fn get_jarm_fingerprint(domain: &str) -> Result<String, Box<dyn Error>> {
let output = Command::new("python3")
.args(&["jarm.py", domain])
.output()?;
if output.status.success() {
let raw_output = String::from_utf8(output.stdout)?;
let jarm_fingerprint_option = raw_output.split_whitespace().last();
#[allow(unused_assignments)]
let mut jarm_fingerprint: &str = "";
match jarm_fingerprint_option {
Some(j) => {
jarm_fingerprint = j;
}
None => {
jarm_fingerprint = "";
}
};
Ok(jarm_fingerprint.to_string())
} else {
let err = String::from_utf8(output.stderr)?;
error_chain::bail!("Error generating JARM fingerprint:\n {}", err)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn generate_jarm_fingerprint() -> Result<(), Box<dyn std::error::Error>> {
let cnn_fingerprint: &str =
"29d29d00029d29d21c29d29d29d29d7803e63b02b0ffde37ab35a15e335653";
assert_eq!(get_jarm_fingerprint("cnn.com")?, cnn_fingerprint);
Ok(())
}
}