From cc8551e3575d5accb6507d3fb2c0bea68a9a60b3 Mon Sep 17 00:00:00 2001 From: Damian Poddebniak Date: Mon, 22 Feb 2021 16:33:18 +0100 Subject: [PATCH] Update to nom 6 --- Cargo.toml | 4 ++-- src/parse/command.rs | 32 ++++++++++++++++---------------- src/parse/mod.rs | 2 +- src/parse/replies.rs | 2 +- src/parse/response.rs | 9 ++++----- 5 files changed, 24 insertions(+), 25 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f47dae5..98372f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,5 +7,5 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -nom = "5.1" -abnf-core = "0.3.0" \ No newline at end of file +nom = "6" +abnf-core = "0.4.0" diff --git a/src/parse/command.rs b/src/parse/command.rs index 38b60f8..ab6d833 100644 --- a/src/parse/command.rs +++ b/src/parse/command.rs @@ -17,7 +17,7 @@ use nom::{ }; pub fn command(input: &[u8]) -> IResult<&[u8], Command> { - let parser = alt(( + let mut parser = alt(( helo, ehlo, mail, rcpt, data, rset, vrfy, expn, help, noop, quit, starttls, // Extensions auth_login, // https://interoperability.blob.core.windows.net/files/MS-XLOGIN/[MS-XLOGIN].pdf @@ -31,7 +31,7 @@ pub fn command(input: &[u8]) -> IResult<&[u8], Command> { /// helo = "HELO" SP Domain CRLF pub fn helo(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple(( + let mut parser = tuple(( tag_no_case(b"HELO"), SP, alt((Domain, address_literal)), // address_literal alternative for Geary @@ -50,7 +50,7 @@ pub fn helo(input: &[u8]) -> IResult<&[u8], Command> { /// ehlo = "EHLO" SP ( Domain / address-literal ) CRLF pub fn ehlo(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple(( + let mut parser = tuple(( tag_no_case(b"EHLO"), SP, alt((Domain, address_literal)), @@ -69,7 +69,7 @@ pub fn ehlo(input: &[u8]) -> IResult<&[u8], Command> { /// mail = "MAIL FROM:" Reverse-path [SP Mail-parameters] CRLF pub fn mail(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple(( + let mut parser = tuple(( tag_no_case(b"MAIL FROM:"), opt(SP), // Out-of-Spec, but Outlook does it ... Reverse_path, @@ -94,7 +94,7 @@ pub fn mail(input: &[u8]) -> IResult<&[u8], Command> { /// local-parts, the "Postmaster" string shown above is /// treated as case-insensitive. pub fn rcpt(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple(( + let mut parser = tuple(( tag_no_case(b"RCPT TO:"), opt(SP), // Out-of-Spec, but Outlook does it ... alt(( @@ -119,7 +119,7 @@ pub fn rcpt(input: &[u8]) -> IResult<&[u8], Command> { /// data = "DATA" CRLF pub fn data(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"DATA"), CRLF)); + let mut parser = tuple((tag_no_case(b"DATA"), CRLF)); let (remaining, _) = parser(input)?; @@ -128,7 +128,7 @@ pub fn data(input: &[u8]) -> IResult<&[u8], Command> { /// rset = "RSET" CRLF pub fn rset(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"RSET"), CRLF)); + let mut parser = tuple((tag_no_case(b"RSET"), CRLF)); let (remaining, _) = parser(input)?; @@ -137,7 +137,7 @@ pub fn rset(input: &[u8]) -> IResult<&[u8], Command> { /// vrfy = "VRFY" SP String CRLF pub fn vrfy(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"VRFY"), SP, String, CRLF)); + let mut parser = tuple((tag_no_case(b"VRFY"), SP, String, CRLF)); let (remaining, (_, _, data, _)) = parser(input)?; @@ -151,7 +151,7 @@ pub fn vrfy(input: &[u8]) -> IResult<&[u8], Command> { /// expn = "EXPN" SP String CRLF pub fn expn(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"EXPN"), SP, String, CRLF)); + let mut parser = tuple((tag_no_case(b"EXPN"), SP, String, CRLF)); let (remaining, (_, _, data, _)) = parser(input)?; @@ -165,7 +165,7 @@ pub fn expn(input: &[u8]) -> IResult<&[u8], Command> { /// help = "HELP" [ SP String ] CRLF pub fn help(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"HELP"), opt(preceded(SP, String)), CRLF)); + let mut parser = tuple((tag_no_case(b"HELP"), opt(preceded(SP, String)), CRLF)); let (remaining, (_, maybe_data, _)) = parser(input)?; @@ -179,7 +179,7 @@ pub fn help(input: &[u8]) -> IResult<&[u8], Command> { /// noop = "NOOP" [ SP String ] CRLF pub fn noop(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"NOOP"), opt(preceded(SP, String)), CRLF)); + let mut parser = tuple((tag_no_case(b"NOOP"), opt(preceded(SP, String)), CRLF)); let (remaining, (_, maybe_data, _)) = parser(input)?; @@ -193,7 +193,7 @@ pub fn noop(input: &[u8]) -> IResult<&[u8], Command> { /// quit = "QUIT" CRLF pub fn quit(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"QUIT"), CRLF)); + let mut parser = tuple((tag_no_case(b"QUIT"), CRLF)); let (remaining, _) = parser(input)?; @@ -201,7 +201,7 @@ pub fn quit(input: &[u8]) -> IResult<&[u8], Command> { } pub fn starttls(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple((tag_no_case(b"STARTTLS"), CRLF)); + let mut parser = tuple((tag_no_case(b"STARTTLS"), CRLF)); let (remaining, _) = parser(input)?; @@ -220,7 +220,7 @@ pub fn starttls(input: &[u8]) -> IResult<&[u8], Command> { /// auth_login_password_challenge = "334 UGFzc3dvcmQ6" CRLF /// auth_login_password_response = password CRLF pub fn auth_login(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple(( + let mut parser = tuple(( tag_no_case(b"AUTH"), SP, tag_no_case("LOGIN"), @@ -237,7 +237,7 @@ pub fn auth_login(input: &[u8]) -> IResult<&[u8], Command> { } pub fn auth_plain(input: &[u8]) -> IResult<&[u8], Command> { - let parser = tuple(( + let mut parser = tuple(( tag_no_case(b"AUTH"), SP, tag_no_case("PLAIN"), @@ -420,7 +420,7 @@ pub fn Ldh_str(input: &[u8]) -> IResult<&[u8], &[u8]> { /// ) "]" /// ; See Section 4.1.3 pub fn address_literal(input: &[u8]) -> IResult<&[u8], &str> { - let parser = delimited( + let mut parser = delimited( tag(b"["), map_res( alt(( diff --git a/src/parse/mod.rs b/src/parse/mod.rs index 0e95968..083fc96 100644 --- a/src/parse/mod.rs +++ b/src/parse/mod.rs @@ -23,7 +23,7 @@ fn is_base64_char(i: u8) -> bool { } pub fn base64(input: &[u8]) -> IResult<&[u8], &str> { - let parser = map_res( + let mut parser = map_res( recognize(tuple(( take_while(is_base64_char), opt(alt((tag("=="), tag("=")))), diff --git a/src/parse/replies.rs b/src/parse/replies.rs index 6c3f78e..efe5383 100644 --- a/src/parse/replies.rs +++ b/src/parse/replies.rs @@ -19,7 +19,7 @@ use nom::{ /// *( "220-" [ textstring ] CRLF ) /// "220" [ SP textstring ] CRLF ) pub fn Greeting(input: &[u8]) -> IResult<&[u8], GreetingType> { - let parser = alt(( + let mut parser = alt(( map( tuple(( tag(b"220 "), diff --git a/src/parse/response.rs b/src/parse/response.rs index 5d3bd1e..91b43e4 100644 --- a/src/parse/response.rs +++ b/src/parse/response.rs @@ -1,11 +1,10 @@ use crate::{parse::command::Domain, types::EhloOkResp}; use abnf_core::streaming::{is_ALPHA, is_DIGIT, CRLF, SP}; -use nom::multi::separated_list; use nom::{ branch::alt, bytes::streaming::{tag, take_while, take_while1, take_while_m_n}, combinator::{map, map_res, opt, recognize}, - multi::many0, + multi::{many0, separated_list0}, sequence::{delimited, preceded, tuple}, IResult, }; @@ -17,7 +16,7 @@ use nom::{ /// /// Edit: collapsed ("250" SP) to ("250 ") pub fn ehlo_ok_rsp(input: &[u8]) -> IResult<&[u8], EhloOkResp> { - let parser = alt(( + let mut parser = alt(( map( tuple((tag(b"250 "), Domain, opt(preceded(SP, ehlo_greet)), CRLF)), |(_, domain, maybe_ehlo, _)| EhloOkResp { @@ -87,11 +86,11 @@ pub fn ehlo_greet(input: &[u8]) -> IResult<&[u8], &str> { /// /// TODO: SMTP servers often respond with "AUTH=LOGIN PLAIN". Why? pub fn ehlo_line(input: &[u8]) -> IResult<&[u8], (&str, Vec<&str>)> { - let parser = tuple(( + let mut parser = tuple(( map_res(ehlo_keyword, std::str::from_utf8), opt(preceded( alt((SP, tag("="))), // TODO: For Outlook? - separated_list(SP, ehlo_param), + separated_list0(SP, ehlo_param), )), ));