Add matching rust implementation for Go HashMessage.
This commit is contained in:
@@ -1,12 +1,6 @@
|
||||
use std::env;
|
||||
use std::error::Error;
|
||||
use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
use std::process::exit;
|
||||
use std::slice::Iter;
|
||||
use std::{env, error::Error, fs::File, io::prelude::*, process::exit, slice::Iter};
|
||||
|
||||
use mailparse::dateparse;
|
||||
use mailparse::MailHeaderMap;
|
||||
use mailparse::{dateparse, MailHeaderMap};
|
||||
|
||||
fn newline(b: &u8) -> bool {
|
||||
*b == b'\n'
|
||||
@@ -57,15 +51,15 @@ fn parse_mbox(mbox_bytes: &Vec<u8>) -> Result<(), Box<dyn Error>> {
|
||||
let mail = mailparse::parse_mail(mail_bytes).unwrap();
|
||||
println!(
|
||||
"{:?} {:?} from {:?}",
|
||||
match mail.headers.get_first_value("Date")? {
|
||||
match mail.headers.get_first_value("Date") {
|
||||
Some(date) => date,
|
||||
None => "NO DATE".to_string(),
|
||||
},
|
||||
match mail.headers.get_first_value("Subject")? {
|
||||
match mail.headers.get_first_value("Subject") {
|
||||
Some(subject) => subject,
|
||||
None => "NO SUBJECT".to_string(),
|
||||
},
|
||||
match mail.headers.get_first_value("From")? {
|
||||
match mail.headers.get_first_value("From") {
|
||||
Some(from) => from,
|
||||
None => "NO FROM".to_string(),
|
||||
},
|
||||
|
||||
53
src/lib.rs
Normal file
53
src/lib.rs
Normal file
@@ -0,0 +1,53 @@
|
||||
use mailparse::{parse_headers, MailHeader, MailHeaderMap};
|
||||
use sha1::{Digest, Sha1};
|
||||
|
||||
// Keep these sorted to match Go implementation.
|
||||
const IMPORTANT_HEADERS: &[&str] = &[
|
||||
"cc",
|
||||
"date",
|
||||
"from",
|
||||
"message-id",
|
||||
"received",
|
||||
"subject",
|
||||
"to",
|
||||
];
|
||||
|
||||
pub fn hash_headers(hdrs: &[MailHeader]) -> String {
|
||||
// create a Sha1 object
|
||||
let mut hasher = Sha1::new();
|
||||
|
||||
for h in IMPORTANT_HEADERS {
|
||||
if let Some(v) = hdrs.get_first_value(h) {
|
||||
eprintln!("V [{}]", v);
|
||||
hasher.update(v);
|
||||
}
|
||||
}
|
||||
format!("{:x}", hasher.finalize())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use mailparse::{parse_headers, MailHeader, MailHeaderMap};
|
||||
#[test]
|
||||
fn hash_headers() {
|
||||
let (hdrs, _) = parse_headers(
|
||||
concat!(
|
||||
"Subject: Test\n",
|
||||
"From: me@myself.com\n",
|
||||
"To: you@yourself.com"
|
||||
)
|
||||
.as_bytes(),
|
||||
)
|
||||
.unwrap();
|
||||
assert_eq!(hdrs[1].get_key(), "From");
|
||||
assert_eq!(
|
||||
hdrs.get_first_value("To"),
|
||||
Some("you@yourself.com".to_string())
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
super::hash_headers(&hdrs),
|
||||
"1b25d59ed0ade6a762145c58643717477b054fd1"
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user