summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-02-22 11:30:12 +0100
committerMatthias Beyer <mail@beyermatthias.de>2019-02-22 11:30:12 +0100
commit596af2fc76c2bd03fa9217e26c4ffd711b961b8a (patch)
tree94f2a90f1e4638151a592a67c38f88c7b53424bb
parentd32f41aeab89a8b97c3233f2c763fbb18f169c5b (diff)
downloadimag-596af2fc76c2bd03fa9217e26c4ffd711b961b8a.zip
imag-596af2fc76c2bd03fa9217e26c4ffd711b961b8a.tar.gz
Reimplement the hasher
We create a sha1 over the path of the file and the Message-ID of the mail itself. The file name is not constant with mail files, because flags are encoded in the filename. The path is also not constant with mail files, because they can be moved between boxes. This approach is not yet the best one, but better than before. Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--lib/domain/libimagmail/src/hasher.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/domain/libimagmail/src/hasher.rs b/lib/domain/libimagmail/src/hasher.rs
index 270b177..3d6dd59 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<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))
}
}