fix merging of protected headers

This commit is contained in:
holger krekel
2019-12-12 01:38:01 +01:00
parent 8ab3363097
commit 5690c48863

View File

@@ -104,7 +104,8 @@ impl<'a> MimeParser<'a> {
.and_then(|v| mailparse::dateparse(&v).ok()) .and_then(|v| mailparse::dateparse(&v).ok())
.unwrap_or_default(); .unwrap_or_default();
parser.hash_header(&mail.headers); // init known headers with what mailparse provided us
parser.merge_headers(&mail.headers);
// Memory location for a possible decrypted message. // Memory location for a possible decrypted message.
let mail_raw; let mail_raw;
@@ -129,6 +130,10 @@ impl<'a> MimeParser<'a> {
parser.gossipped_addr = parser.gossipped_addr =
update_gossip_peerstates(context, message_time, &mail, gossip_headers)?; update_gossip_peerstates(context, message_time, &mail, gossip_headers)?;
// let known protected headers from the decrypted
// part override the unencrypted top-level
parser.merge_headers(&decrypted_mail.headers);
decrypted_mail decrypted_mail
} else { } else {
// Message was not encrypted // Message was not encrypted
@@ -148,6 +153,7 @@ impl<'a> MimeParser<'a> {
} }
}; };
parser.parse_mime_recursive(&mail)?; parser.parse_mime_recursive(&mail)?;
parser.parse_headers()?; parser.parse_headers()?;
@@ -156,6 +162,7 @@ impl<'a> MimeParser<'a> {
} }
fn parse_headers(&mut self) -> Result<()> { fn parse_headers(&mut self) -> Result<()> {
info!(self.context, "parse_headers: headers = {:?}", self.header);
if self.get(HeaderDef::AutocryptSetupMessage).is_some() { if self.get(HeaderDef::AutocryptSetupMessage).is_some() {
let has_setup_file = self.parts.iter().any(|p| { let has_setup_file = self.parts.iter().any(|p| {
p.mimetype.is_some() && p.mimetype.as_ref().unwrap().as_ref() == MIME_AC_SETUP_FILE p.mimetype.is_some() && p.mimetype.as_ref().unwrap().as_ref() == MIME_AC_SETUP_FILE
@@ -341,15 +348,19 @@ impl<'a> MimeParser<'a> {
return AvatarAction::Delete; return AvatarAction::Delete;
} else { } else {
let mut i = 0; let mut i = 0;
info!(self.context, "trying to match avatar fo header value: {:?}", header_value);
while i != self.parts.len() { while i != self.parts.len() {
let part = &mut self.parts[i]; let part = &mut self.parts[i];
info!(self.context, "part.org_filename {:?}", part.org_filename);
if let Some(part_filename) = &part.org_filename { if let Some(part_filename) = &part.org_filename {
if part_filename == &header_value { if part_filename == &header_value {
if let Some(blob) = part.param.get(Param::File) { if let Some(blob) = part.param.get(Param::File) {
info!(self.context, "Avatar-action Change determined");
let res = AvatarAction::Change(blob.to_string()); let res = AvatarAction::Change(blob.to_string());
self.parts.remove(i); self.parts.remove(i);
return res; return res;
} }
info!(self.context, "Avatar-action Change: no blob determined");
break; break;
} }
} }
@@ -404,12 +415,7 @@ impl<'a> MimeParser<'a> {
return Ok(false); return Ok(false);
} }
if self.parsed_protected_headers {
warn!(self.context, "Ignoring nested protected headers"); warn!(self.context, "Ignoring nested protected headers");
} else {
self.hash_header(&mail.headers);
self.parsed_protected_headers = true;
}
} }
enum MimeS { enum MimeS {
@@ -562,6 +568,7 @@ impl<'a> MimeParser<'a> {
let raw_mime = mail.ctype.mimetype.to_lowercase(); let raw_mime = mail.ctype.mimetype.to_lowercase();
let filename = get_attachment_filename(mail); let filename = get_attachment_filename(mail);
info!( info!(
self.context, self.context,
"add_single_part_if_known {:?} {:?}", mime_type, msg_type "add_single_part_if_known {:?} {:?}", mime_type, msg_type
@@ -570,6 +577,14 @@ impl<'a> MimeParser<'a> {
let old_part_count = self.parts.len(); let old_part_count = self.parts.len();
if let Ok(filename) = filename { if let Ok(filename) = filename {
info!(
self.context,
"add_single_part_if_known filename: {:?}", filename
);
info!(
self.context,
"add_single_part_if_known headers: : {:?}", mail.headers
);
self.do_add_single_file_part( self.do_add_single_file_part(
msg_type, msg_type,
mime_type, mime_type,
@@ -578,6 +593,10 @@ impl<'a> MimeParser<'a> {
&filename, &filename,
); );
} else { } else {
info!(
self.context,
"add_single_part_if_known NO filename"
);
match mime_type.type_() { match mime_type.type_() {
mime::IMAGE | mime::AUDIO | mime::VIDEO | mime::APPLICATION => { mime::IMAGE | mime::AUDIO | mime::VIDEO | mime::APPLICATION => {
bail!("missing attachment"); bail!("missing attachment");
@@ -724,7 +743,7 @@ impl<'a> MimeParser<'a> {
} }
} }
fn hash_header(&mut self, fields: &[mailparse::MailHeader<'_>]) { fn merge_headers(&mut self, fields: &[mailparse::MailHeader<'_>]) {
for field in fields { for field in fields {
if let Ok(key) = field.get_key() { if let Ok(key) = field.get_key() {
// lowercasing all headers is technically not correct, but makes things work better // lowercasing all headers is technically not correct, but makes things work better
@@ -965,7 +984,6 @@ fn get_attachment_filename(mail: &mailparse::ParsedMail) -> Result<String> {
acc += value; acc += value;
acc acc
}); });
println!("get_attachment_filename1: {:?}", desired_filename);
if desired_filename.is_empty() { if desired_filename.is_empty() {
if let Some(param) = ct.params.get("name") { if let Some(param) = ct.params.get("name") {
@@ -973,7 +991,6 @@ fn get_attachment_filename(mail: &mailparse::ParsedMail) -> Result<String> {
desired_filename = param.to_string(); desired_filename = param.to_string();
} }
} }
println!("get_attachment_filename2: {:?}", desired_filename);
// if there is still no filename, guess one // if there is still no filename, guess one
if desired_filename.is_empty() { if desired_filename.is_empty() {
@@ -983,7 +1000,6 @@ fn get_attachment_filename(mail: &mailparse::ParsedMail) -> Result<String> {
bail!("could not determine filename: {:?}", ct.disposition); bail!("could not determine filename: {:?}", ct.disposition);
} }
} }
println!("get_attachment_filename3: {:?}", desired_filename);
Ok(desired_filename) Ok(desired_filename)
} }