From 95ed425097e7d9eb39b596bff383c25b4422348a Mon Sep 17 00:00:00 2001 From: Christian Joergensen Date: Thu, 17 Jul 2014 16:49:58 +0200 Subject: [PATCH] Reset envelope on duplicate HELO/EHLO and after DATA. --- protocol.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/protocol.go b/protocol.go index 4a17c8e..f77512c 100644 --- a/protocol.go +++ b/protocol.go @@ -93,6 +93,11 @@ func (session *session) handleHELO(cmd command) { return } + if session.peer.HeloName != "" { + // Reset envelope in case of duplicate HELO + session.envelope = nil + } + session.peer.HeloName = cmd.fields[1] if session.server.HeloChecker != nil { @@ -116,6 +121,11 @@ func (session *session) handleEHLO(cmd command) { return } + if session.peer.HeloName != "" { + // Reset envelope in case of duplicate EHLO + session.envelope = nil + } + session.peer.HeloName = cmd.fields[1] if session.server.HeloChecker != nil { @@ -152,6 +162,11 @@ func (session *session) handleMAIL(cmd command) { return } + if session.envelope != nil { + session.reply(502, "Duplicate MAIL") + return + } + addr, err := parseAddress(cmd.params[1]) if err != nil { @@ -228,8 +243,8 @@ func (session *session) handleSTARTTLS(cmd command) { return } - // Reset HeloName as a new EHLO/HELO is required after STARTTLS - session.peer.HeloName = "" + // Reset envelope as a new EHLO/HELO is required after STARTTLS + session.envelope = nil // Reset deadlines on the underlying connection before I replace it // with a TLS connection @@ -270,12 +285,15 @@ func (session *session) handleDATA(cmd command) { // Accept and deliver message session.envelope.Data = data.Bytes() + if err := session.deliver(); err != nil { session.error(err) } else { session.reply(250, "Thank you.") } + session.envelope = nil + } if err != nil { @@ -296,6 +314,8 @@ func (session *session) handleDATA(cmd command) { session.server.MaxMessageSize, )) + session.envelope = nil + return }