Merge branch 'libimagmail-better-hash' into master
This merges improvements for the libimagmail hasher. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
This commit is contained in:
commit
ac914b27e2
2 changed files with 26 additions and 6 deletions
|
@ -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<P: AsRef<Path>>(path: P) -> Result<String> {
|
||||
::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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<P: AsRef<Path>>(path: P) -> Result<String> {
|
||||
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)?))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue