mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 04:46:29 +03:00
Return PartBuilder vector from MimeFactory.render_message()
This will allow MimeFactory.render() to put protected headers into main_part and wrap it into single-part multipart/mixed if protected headers are too large to put into the outermost IMF.
This commit is contained in:
@@ -483,14 +483,6 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
encode_words(&subject_str)
|
encode_words(&subject_str)
|
||||||
};
|
};
|
||||||
|
|
||||||
let message = match self.loaded {
|
|
||||||
Loaded::Message { .. } => {
|
|
||||||
self.render_message(&mut protected_headers, &mut unprotected_headers, &grpimage)
|
|
||||||
.await?
|
|
||||||
}
|
|
||||||
Loaded::MDN { .. } => self.render_mdn().await?,
|
|
||||||
};
|
|
||||||
|
|
||||||
if !skip_autocrypt {
|
if !skip_autocrypt {
|
||||||
// unless determined otherwise we add the Autocrypt header
|
// unless determined otherwise we add the Autocrypt header
|
||||||
let aheader = encrypt_helper.get_aheader().to_string();
|
let aheader = encrypt_helper.get_aheader().to_string();
|
||||||
@@ -499,11 +491,6 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
|
|
||||||
protected_headers.push(Header::new("Subject".into(), subject));
|
protected_headers.push(Header::new("Subject".into(), subject));
|
||||||
|
|
||||||
let peerstates = self.peerstates_for_recipients().await?;
|
|
||||||
let should_encrypt =
|
|
||||||
encrypt_helper.should_encrypt(self.context, e2ee_guaranteed, &peerstates)?;
|
|
||||||
let is_encrypted = should_encrypt && !force_plaintext;
|
|
||||||
|
|
||||||
let rfc724_mid = match self.loaded {
|
let rfc724_mid = match self.loaded {
|
||||||
Loaded::Message { .. } => self.msg.rfc724_mid.clone(),
|
Loaded::Message { .. } => self.msg.rfc724_mid.clone(),
|
||||||
Loaded::MDN { .. } => dc_create_outgoing_rfc724_mid(None, &self.from_addr),
|
Loaded::MDN { .. } => dc_create_outgoing_rfc724_mid(None, &self.from_addr),
|
||||||
@@ -533,6 +520,32 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
|
|
||||||
let mut is_gossiped = false;
|
let mut is_gossiped = false;
|
||||||
|
|
||||||
|
let (main_part, parts) = match self.loaded {
|
||||||
|
Loaded::Message { .. } => {
|
||||||
|
self.render_message(&mut protected_headers, &mut unprotected_headers, &grpimage)
|
||||||
|
.await?
|
||||||
|
}
|
||||||
|
Loaded::MDN { .. } => (self.render_mdn().await?, Vec::new()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let peerstates = self.peerstates_for_recipients().await?;
|
||||||
|
let should_encrypt =
|
||||||
|
encrypt_helper.should_encrypt(self.context, e2ee_guaranteed, &peerstates)?;
|
||||||
|
let is_encrypted = should_encrypt && !force_plaintext;
|
||||||
|
|
||||||
|
let message = if parts.is_empty() {
|
||||||
|
// Single part, render as regular message.
|
||||||
|
main_part
|
||||||
|
} else {
|
||||||
|
// Multiple parts, render as multipart.
|
||||||
|
parts.into_iter().fold(
|
||||||
|
PartBuilder::new()
|
||||||
|
.message_type(MimeMultipartType::Mixed)
|
||||||
|
.child(main_part.build()),
|
||||||
|
|message, part| message.child(part.build()),
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
// Store protected headers in the inner message.
|
// Store protected headers in the inner message.
|
||||||
let mut message = protected_headers
|
let mut message = protected_headers
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@@ -677,7 +690,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
protected_headers: &mut Vec<Header>,
|
protected_headers: &mut Vec<Header>,
|
||||||
unprotected_headers: &mut Vec<Header>,
|
unprotected_headers: &mut Vec<Header>,
|
||||||
grpimage: &Option<String>,
|
grpimage: &Option<String>,
|
||||||
) -> Result<PartBuilder, Error> {
|
) -> Result<(PartBuilder, Vec<PartBuilder>), Error> {
|
||||||
let context = self.context;
|
let context = self.context;
|
||||||
let chat = match &self.loaded {
|
let chat = match &self.loaded {
|
||||||
Loaded::Message { chat } => chat,
|
Loaded::Message { chat } => chat,
|
||||||
@@ -993,18 +1006,7 @@ impl<'a, 'b> MimeFactory<'a, 'b> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if parts.is_empty() {
|
Ok((main_part, parts))
|
||||||
// Single part, render as regular message.
|
|
||||||
Ok(main_part)
|
|
||||||
} else {
|
|
||||||
// Multiple parts, render as multipart.
|
|
||||||
let mut message = PartBuilder::new().message_type(MimeMultipartType::Mixed);
|
|
||||||
message = message.child(main_part.build());
|
|
||||||
for part in parts.into_iter() {
|
|
||||||
message = message.child(part.build());
|
|
||||||
}
|
|
||||||
Ok(message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Render an MDN
|
/// Render an MDN
|
||||||
|
|||||||
Reference in New Issue
Block a user