diff --git a/Cargo.lock b/Cargo.lock index 60cad4ec8..2331dec13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -620,6 +620,7 @@ dependencies = [ "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", "debug_stub_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "deltachat_derive 0.1.0", + "encoded-words 0.1.0 (git+https://github.com/async-email/encoded-words)", "escaper 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", @@ -639,7 +640,6 @@ dependencies = [ "pretty_env_logger 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "proptest 0.9.4 (registry+https://github.com/rust-lang/crates.io-index)", "quick-xml 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quoted_printable 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "r2d2 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", "r2d2_sqlite 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -797,6 +797,20 @@ dependencies = [ "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "encoded-words" +version = "0.1.0" +source = "git+https://github.com/async-email/encoded-words#019e833f0c9ea7d4b0b693aab44e66d78d18f1d0" +dependencies = [ + "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "charset 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding_rs 0.8.20 (registry+https://github.com/rust-lang/crates.io-index)", + "hex 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "encoding" version = "0.2.33" @@ -2761,6 +2775,24 @@ dependencies = [ "wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "thiserror" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread-local-object" version = "0.1.0" @@ -3429,6 +3461,7 @@ dependencies = [ "checksum ed25519-dalek 1.0.0-pre.2 (registry+https://github.com/rust-lang/crates.io-index)" = "845aaacc16f01178f33349e7c992ecd0cee095aa5e577f0f4dee35971bd36455" "checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" "checksum email 0.0.21 (git+https://github.com/deltachat/rust-email)" = "" +"checksum encoded-words 0.1.0 (git+https://github.com/async-email/encoded-words)" = "" "checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" "checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" "checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" @@ -3645,6 +3678,8 @@ dependencies = [ "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" "checksum termcolor 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "adc4587ead41bf016f11af03e55a624c06568b5a19db4e90fde573d805074f83" "checksum termcolor 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "96d6098003bde162e4277c70665bd87c326f5a0c3f3fbfb285787fa482d54e6e" +"checksum thiserror 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6f357d1814b33bc2dc221243f8424104bfe72dbe911d5b71b3816a2dff1c977e" +"checksum thiserror-impl 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2e25d25307eb8436894f727aba8f65d07adf02e5b35a13cebed48bd282bfef" "checksum thread-local-object 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7da3caa820d0308c84c8654f6cafd81cc3195d45433311cbe22fcf44fc8be071" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" diff --git a/Cargo.toml b/Cargo.toml index 2d22a721f..348482113 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,7 @@ rustls = "0.16.0" webpki-roots = "0.18.0" webpki = "0.21.0" mailparse = "0.10.1" -quoted_printable = "0.4.1" +encoded-words = { git = "https://github.com/async-email/encoded-words", branch="master" } [dev-dependencies] tempfile = "3.0" diff --git a/src/lib.rs b/src/lib.rs index b7a7be057..203a52c18 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,5 @@ #![deny(clippy::correctness, missing_debug_implementations, clippy::all)] -// for now we hide warnings to not clutter/hide errors during "cargo check" +// for now we hide warnings to not clutter/hide errors during "cargo clippy" #![allow( clippy::type_complexity, clippy::cognitive_complexity, diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 6c38f3615..44ffe1120 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -382,7 +382,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> { let mut unprotected_headers: Vec
= Vec::new(); let from = Address::new_mailbox_with_name( - quoted_printable::encode_to_str(&self.from_displayname), + encode_words(&self.from_displayname), self.from_addr.clone(), ); @@ -394,7 +394,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> { to.push(Address::new_mailbox(addr.clone())); } else { to.push(Address::new_mailbox_with_name( - quoted_printable::encode_to_str(name), + encode_words(name), addr.clone(), )); } @@ -450,7 +450,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> { let e2ee_guranteed = self.is_e2ee_guranteed(); let mut encrypt_helper = EncryptHelper::new(self.context)?; - let subject = quoted_printable::encode_to_str(&subject_str); + let subject = encode_words(&subject_str); let mut message = match self.loaded { Loaded::Message => { @@ -610,7 +610,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> { if chat.typ == Chattype::Group || chat.typ == Chattype::VerifiedGroup { protected_headers.push(Header::new("Chat-Group-ID".into(), chat.grpid.clone())); - let encoded = quoted_printable::encode_to_str(&chat.name); + let encoded = encode_words(&chat.name); protected_headers.push(Header::new("Chat-Group-Name".into(), encoded)); match command { @@ -988,7 +988,7 @@ fn build_body_file( let cd_value = if needs_encoding(&filename_to_send) { format!( "attachment; filename*=\"{}\"", - quoted_printable::encode_to_str(&filename_to_send) + encode_words(&filename_to_send) ) } else { format!("attachment; filename=\"{}\"", &filename_to_send) @@ -1030,6 +1030,10 @@ fn is_file_size_okay(context: &Context, msg: &Message) -> bool { * Encode/decode header words, RFC 2047 ******************************************************************************/ +fn encode_words(word: &str) -> String { + encoded_words::encode(word, None, encoded_words::EncodingFlag::Shortest, None) +} + pub fn needs_encoding(to_check: impl AsRef) -> bool { let to_check = to_check.as_ref(); diff --git a/src/mimeparser.rs b/src/mimeparser.rs index 08d95ded7..a345f8900 100644 --- a/src/mimeparser.rs +++ b/src/mimeparser.rs @@ -579,23 +579,14 @@ impl<'a> MimeParser<'a> { // `Content-Disposition: ... filename*=...` // or `Content-Disposition: ... filename*0*=... filename*1*=... filename*2*=...` // or `Content-Disposition: ... filename=...` - use quoted_printable::ParseMode::Robust; let ct = mail.get_content_disposition()?; let mut desired_filename = ct .params .iter() .filter(|(key, _value)| key.starts_with("filename")) - .fold(String::new(), |mut acc, (key, value)| { - if key.starts_with("filename*") { - quoted_printable::decode(&value, Robust) - .map(|ref res| { - acc += &String::from_utf8_lossy(res); - }) - .ok(); - } else { - acc += value; - }; + .fold(String::new(), |mut acc, (_key, value)| { + acc += value; acc });