Pass attachment names through decoding

Attachment names in Content-Type parameters can be encoded (eg
=?UTF-8...), so try decoding with phrase() first
embed
Manos Pitsidianakis 2019-09-27 22:21:35 +03:00
parent 19ec6e54fc
commit 250129665b
Signed by: Manos Pitsidianakis
GPG Key ID: 73627C2F690DF710
2 changed files with 12 additions and 7 deletions

View File

@ -787,6 +787,7 @@ named_args!(pub parts<'a>(boundary: &'a [u8]) < Vec<&'this_is_probably_unique_i_
( { Vec::<&[u8]>::new() } )) ( { Vec::<&[u8]>::new() } ))
)); ));
/* Caution: values should be passed through phrase() */
named!( named!(
content_type_parameter<(&[u8], &[u8])>, content_type_parameter<(&[u8], &[u8])>,
do_parse!( do_parse!(
@ -1190,5 +1191,4 @@ mod tests {
} }
} }
} }
} }

View File

@ -875,13 +875,18 @@ impl Component for MailView {
ContentType::Other { ref name, .. } => { ContentType::Other { ref name, .. } => {
let attachment_type = u.mime_type(); let attachment_type = u.mime_type();
let binary = query_default_app(&attachment_type); let binary = query_default_app(&attachment_type);
let mut name_opt = name.as_ref().and_then(|n| {
melib::email::parser::phrase(n.as_bytes())
.to_full_result()
.ok()
.and_then(|n| String::from_utf8(n).ok())
});
if name_opt.is_none() {
name_opt = name.as_ref().map(|n| n.clone());
}
if let Ok(binary) = binary { if let Ok(binary) = binary {
let p = create_temp_file( let p =
&decode(u, None), create_temp_file(&decode(u, None), name_opt, None, true);
name.as_ref().map(|n| n.clone()),
None,
true,
);
Command::new(&binary) Command::new(&binary)
.arg(p.path()) .arg(p.path())
.stdin(Stdio::piped()) .stdin(Stdio::piped())