mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 21:06:31 +03:00
use encoded-words crate, which friedel ported from python
This commit is contained in:
37
Cargo.lock
generated
37
Cargo.lock
generated
@@ -620,6 +620,7 @@ dependencies = [
|
|||||||
"chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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)",
|
"debug_stub_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"deltachat_derive 0.1.0",
|
"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)",
|
"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 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)",
|
"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)",
|
"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)",
|
"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)",
|
"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 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)",
|
"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)",
|
"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)",
|
"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]]
|
[[package]]
|
||||||
name = "encoding"
|
name = "encoding"
|
||||||
version = "0.2.33"
|
version = "0.2.33"
|
||||||
@@ -2761,6 +2775,24 @@ dependencies = [
|
|||||||
"wincolor 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"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]]
|
[[package]]
|
||||||
name = "thread-local-object"
|
name = "thread-local-object"
|
||||||
version = "0.1.0"
|
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 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 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)" = "<none>"
|
"checksum email 0.0.21 (git+https://github.com/deltachat/rust-email)" = "<none>"
|
||||||
|
"checksum encoded-words 0.1.0 (git+https://github.com/async-email/encoded-words)" = "<none>"
|
||||||
"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
|
"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-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"
|
"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 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 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 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-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 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"
|
"checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f"
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ rustls = "0.16.0"
|
|||||||
webpki-roots = "0.18.0"
|
webpki-roots = "0.18.0"
|
||||||
webpki = "0.21.0"
|
webpki = "0.21.0"
|
||||||
mailparse = "0.10.1"
|
mailparse = "0.10.1"
|
||||||
quoted_printable = "0.4.1"
|
encoded-words = { git = "https://github.com/async-email/encoded-words", branch="master" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempfile = "3.0"
|
tempfile = "3.0"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#![deny(clippy::correctness, missing_debug_implementations, clippy::all)]
|
#![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(
|
#![allow(
|
||||||
clippy::type_complexity,
|
clippy::type_complexity,
|
||||||
clippy::cognitive_complexity,
|
clippy::cognitive_complexity,
|
||||||
|
|||||||
@@ -382,7 +382,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
let mut unprotected_headers: Vec<Header> = Vec::new();
|
let mut unprotected_headers: Vec<Header> = Vec::new();
|
||||||
|
|
||||||
let from = Address::new_mailbox_with_name(
|
let from = Address::new_mailbox_with_name(
|
||||||
quoted_printable::encode_to_str(&self.from_displayname),
|
encode_words(&self.from_displayname),
|
||||||
self.from_addr.clone(),
|
self.from_addr.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -394,7 +394,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
to.push(Address::new_mailbox(addr.clone()));
|
to.push(Address::new_mailbox(addr.clone()));
|
||||||
} else {
|
} else {
|
||||||
to.push(Address::new_mailbox_with_name(
|
to.push(Address::new_mailbox_with_name(
|
||||||
quoted_printable::encode_to_str(name),
|
encode_words(name),
|
||||||
addr.clone(),
|
addr.clone(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@@ -450,7 +450,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
let e2ee_guranteed = self.is_e2ee_guranteed();
|
let e2ee_guranteed = self.is_e2ee_guranteed();
|
||||||
let mut encrypt_helper = EncryptHelper::new(self.context)?;
|
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 {
|
let mut message = match self.loaded {
|
||||||
Loaded::Message => {
|
Loaded::Message => {
|
||||||
@@ -610,7 +610,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
if chat.typ == Chattype::Group || chat.typ == Chattype::VerifiedGroup {
|
if chat.typ == Chattype::Group || chat.typ == Chattype::VerifiedGroup {
|
||||||
protected_headers.push(Header::new("Chat-Group-ID".into(), chat.grpid.clone()));
|
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));
|
protected_headers.push(Header::new("Chat-Group-Name".into(), encoded));
|
||||||
|
|
||||||
match command {
|
match command {
|
||||||
@@ -988,7 +988,7 @@ fn build_body_file(
|
|||||||
let cd_value = if needs_encoding(&filename_to_send) {
|
let cd_value = if needs_encoding(&filename_to_send) {
|
||||||
format!(
|
format!(
|
||||||
"attachment; filename*=\"{}\"",
|
"attachment; filename*=\"{}\"",
|
||||||
quoted_printable::encode_to_str(&filename_to_send)
|
encode_words(&filename_to_send)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
format!("attachment; filename=\"{}\"", &filename_to_send)
|
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
|
* 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<str>) -> bool {
|
pub fn needs_encoding(to_check: impl AsRef<str>) -> bool {
|
||||||
let to_check = to_check.as_ref();
|
let to_check = to_check.as_ref();
|
||||||
|
|
||||||
|
|||||||
@@ -579,23 +579,14 @@ impl<'a> MimeParser<'a> {
|
|||||||
// `Content-Disposition: ... filename*=...`
|
// `Content-Disposition: ... filename*=...`
|
||||||
// or `Content-Disposition: ... filename*0*=... filename*1*=... filename*2*=...`
|
// or `Content-Disposition: ... filename*0*=... filename*1*=... filename*2*=...`
|
||||||
// or `Content-Disposition: ... filename=...`
|
// or `Content-Disposition: ... filename=...`
|
||||||
use quoted_printable::ParseMode::Robust;
|
|
||||||
|
|
||||||
let ct = mail.get_content_disposition()?;
|
let ct = mail.get_content_disposition()?;
|
||||||
let mut desired_filename = ct
|
let mut desired_filename = ct
|
||||||
.params
|
.params
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|(key, _value)| key.starts_with("filename"))
|
.filter(|(key, _value)| key.starts_with("filename"))
|
||||||
.fold(String::new(), |mut acc, (key, value)| {
|
.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;
|
acc += value;
|
||||||
};
|
|
||||||
acc
|
acc
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user