From 01e1f4111cba34bee2b195a4460e944de2630f48 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 22 Jun 2020 17:27:48 +0300 Subject: [PATCH] imap: make hostname optional in ENVELOPE address parser --- melib/src/backends/imap/protocol_parser.rs | 48 +++++++++++++++------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/melib/src/backends/imap/protocol_parser.rs b/melib/src/backends/imap/protocol_parser.rs index ed3c3f29..6d983232 100644 --- a/melib/src/backends/imap/protocol_parser.rs +++ b/melib/src/backends/imap/protocol_parser.rs @@ -1343,6 +1343,7 @@ pub fn envelope_addresses<'a>(input: &'a [u8]) -> IResult<&'a [u8], Option IResult<&[u8], Address> { let (input, _) = alt((quoted, map(tag("NIL"), |_| Vec::new())))(input)?; let (input, _) = is_a("\r\n\t ")(input)?; let (input, mailbox_name) = alt((quoted, map(tag("NIL"), |_| Vec::new())))(input)?; - let (input, _) = is_a("\r\n\t ")(input)?; - let (input, host_name) = alt((quoted, map(tag("NIL"), |_| Vec::new())))(input)?; + let (input, host_name) = opt(preceded( + is_a("\r\n\t "), + alt((quoted, map(tag("NIL"), |_| Vec::new()))), + ))(input)?; Ok(( input, Address::Mailbox(MailboxAddress { - raw: format!( - "{}{}<{}@{}>", - to_str!(&name), - if name.is_empty() { "" } else { " " }, - to_str!(&mailbox_name), - to_str!(&host_name) - ) - .into_bytes(), + raw: if let Some(host_name) = host_name.as_ref() { + format!( + "{}{}<{}@{}>", + to_str!(&name), + if name.is_empty() { "" } else { " " }, + to_str!(&mailbox_name), + to_str!(&host_name) + ) + .into_bytes() + } else { + format!( + "{}{}{}", + to_str!(&name), + if name.is_empty() { "" } else { " " }, + to_str!(&mailbox_name), + ) + .into_bytes() + }, display_name: str_builder!(0, name.len()), - address_spec: str_builder!( - if name.is_empty() { 1 } else { name.len() + 2 }, - mailbox_name.len() + host_name.len() + 1 - ), + address_spec: if let Some(host_name) = host_name.as_ref() { + str_builder!( + if name.is_empty() { 1 } else { name.len() + 2 }, + mailbox_name.len() + host_name.len() + 1 + ) + } else { + str_builder!( + if name.is_empty() { 0 } else { name.len() + 1 }, + mailbox_name.len() + ) + }, }), )) /*