for localserve, validate the incoming message

it must be completely parsable.
normally, if we receive a message that we cannot fully parse, we accept it and
treat it as opaque application/octet-stream.

also make it more clear that localserve accepts email intended for any email
address.
This commit is contained in:
Mechiel Lukkien 2023-03-12 21:42:28 +01:00
parent 19ea0d9a58
commit 7681f8bdc8
No known key found for this signature in database
3 changed files with 17 additions and 5 deletions

4
doc.go
View file

@ -307,8 +307,8 @@ automatically initialized with configuration files, an account with email
address mox@localhost and password moxmoxmox, and a newly generated self-signed address mox@localhost and password moxmoxmox, and a newly generated self-signed
TLS certificate. TLS certificate.
All incoming email is accepted (if checks pass), unless the recipient localpart All incoming email to any address is accepted (if checks pass), unless the
ends with: recipient localpart ends with:
- "temperror": fail with a temporary error code - "temperror": fail with a temporary error code
- "permerror": fail with a permanent error code - "permerror": fail with a permanent error code

View file

@ -47,8 +47,8 @@ automatically initialized with configuration files, an account with email
address mox@localhost and password moxmoxmox, and a newly generated self-signed address mox@localhost and password moxmoxmox, and a newly generated self-signed
TLS certificate. TLS certificate.
All incoming email is accepted (if checks pass), unless the recipient localpart All incoming email to any address is accepted (if checks pass), unless the
ends with: recipient localpart ends with:
- "temperror": fail with a temporary error code - "temperror": fail with a temporary error code
- "permerror": fail with a permanent error code - "permerror": fail with a permanent error code
@ -120,7 +120,7 @@ during those commands instead of during "data".
golog.Printf("the default admin password is moxadmin") golog.Printf("the default admin password is moxadmin")
golog.Printf("port numbers are those common for the services + 1000") golog.Printf("port numbers are those common for the services + 1000")
golog.Printf("tls uses generated self-signed certificate %s", filepath.Join(dir, "localhost.crt")) golog.Printf("tls uses generated self-signed certificate %s", filepath.Join(dir, "localhost.crt"))
golog.Printf("all incoming email is accepted (if checks pass), unless the recipient localpart ends with:") golog.Printf("all incoming email to any address is accepted (if checks pass), unless the recipient localpart ends with:")
golog.Print("") golog.Print("")
golog.Printf(`- "temperror": fail with a temporary error code.`) golog.Printf(`- "temperror": fail with a temporary error code.`)
golog.Printf(`- "permerror": fail with a permanent error code.`) golog.Printf(`- "permerror": fail with a permanent error code.`)

View file

@ -1515,6 +1515,18 @@ func (c *conn) cmdData(p *parser) {
} }
} }
if Localserve {
// Require that message can be parsed fully.
p, err := message.Parse(dataFile)
if err == nil {
err = p.Walk(nil)
}
if err != nil {
// ../rfc/6409:541
xsmtpUserErrorf(smtp.C554TransactionFailed, smtp.SeMsg6Other0, "malformed message: %v", err)
}
}
// Prepare "Received" header. // Prepare "Received" header.
// ../rfc/5321:2051 ../rfc/5321:3302 // ../rfc/5321:2051 ../rfc/5321:3302
// ../rfc/5321:3311 ../rfc/6531:578 // ../rfc/5321:3311 ../rfc/6531:578