mirror of
https://github.com/mjl-/mox.git
synced 2025-07-12 13:04:38 +03:00
add strict mode when parsing messages, typically enabled for incoming special-use messages like tls/dmarc reports, subjectpass emails
and pass a logger to the message parser, so problems with message parsing get the cid logged.
This commit is contained in:
@ -13,6 +13,7 @@ import (
|
||||
"strings"
|
||||
|
||||
"github.com/mjl-/mox/message"
|
||||
"github.com/mjl-/mox/mlog"
|
||||
"github.com/mjl-/mox/moxio"
|
||||
)
|
||||
|
||||
@ -33,17 +34,17 @@ func ParseReport(r io.Reader) (*Feedback, error) {
|
||||
// ParseMessageReport parses an aggregate feedback report from a mail message. The
|
||||
// maximum message size is 15MB, the maximum report size after decompression is
|
||||
// 20MB.
|
||||
func ParseMessageReport(r io.ReaderAt) (*Feedback, error) {
|
||||
func ParseMessageReport(log *mlog.Log, r io.ReaderAt) (*Feedback, error) {
|
||||
// ../rfc/7489:1801
|
||||
p, err := message.Parse(&moxio.LimitAtReader{R: r, Limit: 15 * 1024 * 1024})
|
||||
p, err := message.Parse(log, true, &moxio.LimitAtReader{R: r, Limit: 15 * 1024 * 1024})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("parsing mail message: %s", err)
|
||||
}
|
||||
|
||||
return parseMessageReport(p)
|
||||
return parseMessageReport(log, p)
|
||||
}
|
||||
|
||||
func parseMessageReport(p message.Part) (*Feedback, error) {
|
||||
func parseMessageReport(log *mlog.Log, p message.Part) (*Feedback, error) {
|
||||
// Pretty much any mime structure is allowed. ../rfc/7489:1861
|
||||
// In practice, some parties will send the report as the only (non-multipart)
|
||||
// content of the message.
|
||||
@ -53,14 +54,14 @@ func parseMessageReport(p message.Part) (*Feedback, error) {
|
||||
}
|
||||
|
||||
for {
|
||||
sp, err := p.ParseNextPart()
|
||||
sp, err := p.ParseNextPart(log)
|
||||
if err == io.EOF {
|
||||
return nil, ErrNoReport
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
report, err := parseMessageReport(*sp)
|
||||
report, err := parseMessageReport(log, *sp)
|
||||
if err == ErrNoReport {
|
||||
continue
|
||||
} else if err != nil || report != nil {
|
||||
|
Reference in New Issue
Block a user