Reset envelope on duplicate HELO/EHLO and after DATA.

This commit is contained in:
Christian Joergensen 2014-07-17 16:49:58 +02:00
parent 2d30d62009
commit 95ed425097

View file

@ -93,6 +93,11 @@ func (session *session) handleHELO(cmd command) {
return return
} }
if session.peer.HeloName != "" {
// Reset envelope in case of duplicate HELO
session.envelope = nil
}
session.peer.HeloName = cmd.fields[1] session.peer.HeloName = cmd.fields[1]
if session.server.HeloChecker != nil { if session.server.HeloChecker != nil {
@ -116,6 +121,11 @@ func (session *session) handleEHLO(cmd command) {
return return
} }
if session.peer.HeloName != "" {
// Reset envelope in case of duplicate EHLO
session.envelope = nil
}
session.peer.HeloName = cmd.fields[1] session.peer.HeloName = cmd.fields[1]
if session.server.HeloChecker != nil { if session.server.HeloChecker != nil {
@ -152,6 +162,11 @@ func (session *session) handleMAIL(cmd command) {
return return
} }
if session.envelope != nil {
session.reply(502, "Duplicate MAIL")
return
}
addr, err := parseAddress(cmd.params[1]) addr, err := parseAddress(cmd.params[1])
if err != nil { if err != nil {
@ -228,8 +243,8 @@ func (session *session) handleSTARTTLS(cmd command) {
return return
} }
// Reset HeloName as a new EHLO/HELO is required after STARTTLS // Reset envelope as a new EHLO/HELO is required after STARTTLS
session.peer.HeloName = "" session.envelope = nil
// Reset deadlines on the underlying connection before I replace it // Reset deadlines on the underlying connection before I replace it
// with a TLS connection // with a TLS connection
@ -270,12 +285,15 @@ func (session *session) handleDATA(cmd command) {
// Accept and deliver message // Accept and deliver message
session.envelope.Data = data.Bytes() session.envelope.Data = data.Bytes()
if err := session.deliver(); err != nil { if err := session.deliver(); err != nil {
session.error(err) session.error(err)
} else { } else {
session.reply(250, "Thank you.") session.reply(250, "Thank you.")
} }
session.envelope = nil
} }
if err != nil { if err != nil {
@ -296,6 +314,8 @@ func (session *session) handleDATA(cmd command) {
session.server.MaxMessageSize, session.server.MaxMessageSize,
)) ))
session.envelope = nil
return return
} }