From f6eb169c606fa8f979df6a7b3bc819a6d75bbb18 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sun, 14 Feb 2021 18:45:01 +0300 Subject: [PATCH] mimefactory: implement hidden headers --- src/mimefactory.rs | 53 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 13 deletions(-) diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 514cb3042..8a9b0b245 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -102,6 +102,12 @@ struct MessageHeaders { /// individually over IMAP without downloading the message body. This is why Chat-Version is /// placed here. pub unprotected: Vec
, + + /// Headers that MUST NOT go into IMF header section. + /// + /// These are large headers which may hit the header section size limit on the server, such as + /// Chat-User-Avatar with a base64-encoded image inside. + pub hidden: Vec
, } impl<'a> MimeFactory<'a> { @@ -588,13 +594,19 @@ impl<'a> MimeFactory<'a> { ) }; - // Store protected headers in the inner message. - let mut message = headers - .protected - .into_iter() - .fold(message, |message, header| message.header(header)); - let outer_message = if is_encrypted { + // Store protected headers in the inner message. + let message = headers + .protected + .into_iter() + .fold(message, |message, header| message.header(header)); + + // Add hidden headers to encrypted payload. + let mut message = headers + .hidden + .into_iter() + .fold(message, |message, header| message.header(header)); + // Add gossip headers in chats with multiple recipients if peerstates.len() > 1 && self.should_do_gossip(context).await? { for peerstate in peerstates.iter().filter_map(|(state, _)| state.as_ref()) { @@ -628,12 +640,6 @@ impl<'a> MimeFactory<'a> { "multipart/encrypted; protocol=\"application/pgp-encrypted\"".to_string(), )); - // Store the unprotected headers on the outer message. - let outer_message = headers - .unprotected - .into_iter() - .fold(outer_message, |message, header| message.header(header)); - if std::env::var(crate::DCC_MIME_DEBUG).is_ok() { info!(context, "mimefactory: outgoing message mime:"); let raw_message = message.clone().build().as_string(); @@ -668,12 +674,33 @@ impl<'a> MimeFactory<'a> { ) .header(("Subject".to_string(), "...".to_string())) } else { + let message = if headers.hidden.is_empty() { + message + } else { + // Store hidden headers in the inner unencrypted message. + let message = headers + .hidden + .into_iter() + .fold(message, |message, header| message.header(header)); + + PartBuilder::new() + .message_type(MimeMultipartType::Mixed) + .child(message.build()) + }; + + // Store protected headers in the outer message. headers - .unprotected + .protected .into_iter() .fold(message, |message, header| message.header(header)) }; + // Store the unprotected headers on the outer message. + let outer_message = headers + .unprotected + .into_iter() + .fold(outer_message, |message, header| message.header(header)); + let MimeFactory { last_added_location_id, ..