From 5595a17a39949253118b8d9f11ab68091892a0c7 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Sat, 18 Jun 2016 11:04:00 +0100 Subject: Strip out whitespace before base64-decoding the mail body --- src/lib.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs index db94d89..4005961 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -405,7 +405,15 @@ impl<'a> ParsedMail<'a> { let transfer_coding = try!(self.headers.get_first_value("Content-Transfer-Encoding")) .map(|s| s.to_lowercase()); let decoded = match transfer_coding.unwrap_or(String::new()).as_ref() { - "base64" => try!(base64::u8de(self.body)), + "base64" => { + let cleaned = self.body.iter().filter_map( + |&c| match c { + b' ' | b'\t' | b'\r' | b'\n' => None, + v => Some(v), + } + ).collect::>(); + try!(base64::u8de(&cleaned)) + } "quoted-printable" => try!(quoted_printable::decode(self.body, quoted_printable::ParseMode::Robust)), _ => Vec::::from(self.body), }; @@ -653,6 +661,7 @@ mod tests { assert_eq!(mail.ctype.charset, "us-ascii"); assert_eq!(mail.ctype.boundary, None); assert_eq!(mail.body, b"Some body stuffs"); + assert_eq!(mail.get_body().unwrap(), "Some body stuffs"); assert_eq!(mail.subparts.len(), 0); let mail = parse_mail(b"Content-Type: MULTIpart/alternative; bounDAry=myboundary\r\n\r\n \ @@ -675,5 +684,8 @@ mod tests { assert_eq!(mail.subparts[1].ctype.mimetype, "text/html"); assert_eq!(mail.subparts[1].ctype.charset, "utf-8"); assert_eq!(mail.subparts[1].ctype.boundary, None); + + let mail = parse_mail(b"Content-Transfer-Encoding: base64\r\n\r\naGVsbG 8gd\r\n29ybGQ=").unwrap(); + assert_eq!(mail.get_body().unwrap(), "hello world"); } } -- cgit v1.2.3