use log::warn;
use mail_parser::{Header, HeaderName, Message};
pub(crate) fn is_encrypted(msg: &Message<'_>) -> bool {
if let Some(content_type) = msg
.header(HeaderName::ContentType)
.and_then(|content_type| content_type.as_content_type())
{
(content_type.ctype() == "application"
&& content_type.subtype() == Some("pkcs7-mime"))
|| (content_type.ctype() == "multipart"
&& content_type.subtype() == Some("encrypted"))
} else {
false
}
}
pub(crate) fn split_content_headers<'x>(msg: &mut Message<'x>) -> Vec<Header<'x>> {
let mut i = 0;
let headers = &mut msg.parts[0].headers;
let mut content_headers = Vec::new();
while i < headers.len() {
if headers[i]
.name()
.to_ascii_lowercase()
.starts_with("content-")
{
content_headers.push(headers.remove(i));
} else {
i += 1;
}
}
content_headers
}
pub(crate) fn raw_header<'m>(msg: &'m Message<'_>, header: &Header<'_>) -> &'m [u8] {
&msg.raw_message[header.offset_field as usize .. header.offset_end as usize]
}
fn raw_body<'m>(msg: &'m Message<'_>) -> &'m [u8] {
let part = msg.root_part();
&msg.raw_message[part.offset_body as usize .. part.offset_end as usize]
}
pub(crate) fn plaintext_message(msg: &Message<'_>, headers: &[Header<'_>]) -> Vec<u8> {
let mut plaintext = Vec::new();
if headers.is_empty() {
warn!("Message with empty content headers, inserting Content-Type: text/plain");
plaintext.extend_from_slice(b"Content-Type: text/plain\r\n");
} else {
for header in headers {
plaintext.extend_from_slice(raw_header(msg, header));
}
}
plaintext.extend_from_slice(b"\r\n");
plaintext.extend_from_slice(raw_body(msg));
plaintext
}