From 434ddca4792e01967fd3993ecb3b9662605a6786 Mon Sep 17 00:00:00 2001 From: "fox.cpp" Date: Sun, 21 Jan 2024 14:16:31 +0300 Subject: [PATCH] Parse DATA\r\n\r\n.\r\n as \r\n\r\n message --- data.go | 4 ++++ server_test.go | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/data.go b/data.go index 4456774..7ee8dbc 100644 --- a/data.go +++ b/data.go @@ -106,6 +106,10 @@ func (r *dataReader) Read(b []byte) (n int, err error) { r.state = stateDot continue } + if c == '\r' { + r.state = stateCR + break + } r.state = stateData case stateDot: if c == '\r' { diff --git a/server_test.go b/server_test.go index cc6543b..f814407 100644 --- a/server_test.go +++ b/server_test.go @@ -636,6 +636,45 @@ func TestServer_LFDotLF(t *testing.T) { } } +func TestServer_EmptyMessage(t *testing.T) { + be, s, c, scanner := testServerAuthenticated(t) + defer s.Close() + defer c.Close() + + io.WriteString(c, "MAIL FROM:\r\n") + scanner.Scan() + if !strings.HasPrefix(scanner.Text(), "250 ") { + t.Fatal("Invalid MAIL response:", scanner.Text()) + } + + io.WriteString(c, "RCPT TO:\r\n") + scanner.Scan() + if !strings.HasPrefix(scanner.Text(), "250 ") { + t.Fatal("Invalid RCPT response:", scanner.Text()) + } + + io.WriteString(c, "DATA\r\n") + scanner.Scan() + if !strings.HasPrefix(scanner.Text(), "354 ") { + t.Fatal("Invalid DATA response:", scanner.Text()) + } + + io.WriteString(c, "\r\n\r\n.\r\n") + scanner.Scan() + if !strings.HasPrefix(scanner.Text(), "250 ") { + t.Fatal("Invalid DATA response:", scanner.Text()) + } + + if len(be.messages) != 1 || len(be.anonmsgs) != 0 { + t.Fatal("Invalid number of sent messages:", be.messages, be.anonmsgs) + } + + msg := be.messages[0] + if string(msg.Data) != "\r\n\r\n" { + t.Fatal("Invalid mail data:", string(msg.Data), msg.Data) + } +} + func TestServer_authDisabled(t *testing.T) { _, s, c, scanner, caps := testServerEhlo(t, authDisabled) defer s.Close()