Add matching rust implementation for Go HashMessage.

This commit is contained in:
2023-02-22 20:47:14 -08:00
parent af87a3cade
commit 7bbdaec84b
5 changed files with 180 additions and 33 deletions

View File

@@ -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
View 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"
);
}
}