diff --git a/lib/domain/libimagmail/src/hasher.rs b/lib/domain/libimagmail/src/hasher.rs index 270b1777..3d6dd590 100644 --- a/lib/domain/libimagmail/src/hasher.rs +++ b/lib/domain/libimagmail/src/hasher.rs @@ -22,6 +22,8 @@ use std::path::Path; use failure::Fallible as Result; use libimagentryref::hasher::Hasher; +use libimagerror::errors::ErrorMsg; +use libimagentryref::hasher::sha1::Sha1Hasher; pub struct MailHasher; @@ -30,11 +32,24 @@ impl Hasher for MailHasher { /// hash the file at path `path` /// - /// TODO: This is the expensive implementation. We use the message Id as hash, which is - /// convenient and _should_ be safe + /// We create a sha1 over the path of the file (which is NOT safe, because mails can move) and + /// the Message-ID of the mail itself. /// - /// TODO: Confirm that this approach is right + /// # TODO: Fix + /// + /// The file name is not constant with mail files, because flags are encoded in the filename. + /// The path is not constant with mail files, because they can be moved between boxes. fn hash>(path: P) -> Result { - ::util::get_message_id_for_mailfile(path) + let mut path_str = path + .as_ref() + .to_str() + .map(String::from) + .ok_or_else(|| ErrorMsg::UTF8Error)?; + + let message_id = ::util::get_message_id_for_mailfile(path)?; + + path_str.push_str(&message_id); + + Ok(Sha1Hasher::sha1_hash(&path_str)) } } diff --git a/lib/entry/libimagentryref/src/hasher.rs b/lib/entry/libimagentryref/src/hasher.rs index aec7eebc..adadd606 100644 --- a/lib/entry/libimagentryref/src/hasher.rs +++ b/lib/entry/libimagentryref/src/hasher.rs @@ -42,12 +42,17 @@ pub mod sha1 { pub struct Sha1Hasher; + impl Sha1Hasher { + pub fn sha1_hash(s: &str) -> String { + format!("{:x}", Sha1::digest(s.as_bytes())) // TODO: Ugh... + } + } + impl Hasher for Sha1Hasher { const NAME : &'static str = "sha1"; fn hash>(path: P) -> Result { - let digest = Sha1::digest(::std::fs::read_to_string(path)?.as_bytes()); - Ok(format!("{:x}", digest)) // TODO: Ugh... + Ok(Sha1Hasher::sha1_hash(&::std::fs::read_to_string(path)?)) } }