mirror of
https://github.com/mjl-/mox.git
synced 2025-07-14 18:14: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:
@ -141,7 +141,7 @@ func analyze(ctx context.Context, log *mlog.Log, resolver dns.Resolver, d delive
|
||||
// Messages with DMARC aggregate reports must have a dmarc pass. ../rfc/7489:1866
|
||||
if d.dmarcResult.Status != dmarc.StatusPass {
|
||||
log.Info("received dmarc report without dmarc pass, not processing as dmarc report")
|
||||
} else if report, err := dmarcrpt.ParseMessageReport(store.FileMsgReader(d.m.MsgPrefix, d.dataFile)); err != nil {
|
||||
} else if report, err := dmarcrpt.ParseMessageReport(log, store.FileMsgReader(d.m.MsgPrefix, d.dataFile)); err != nil {
|
||||
log.Infox("parsing dmarc report", err)
|
||||
} else if d, err := dns.ParseDomain(report.PolicyPublished.Domain); err != nil {
|
||||
log.Infox("parsing domain in dmarc report", err)
|
||||
@ -173,7 +173,7 @@ func analyze(ctx context.Context, log *mlog.Log, resolver dns.Resolver, d delive
|
||||
|
||||
if !ok {
|
||||
log.Info("received mail to tlsrpt without acceptable DKIM signature, not processing as tls report")
|
||||
} else if report, err := tlsrpt.ParseMessage(store.FileMsgReader(d.m.MsgPrefix, d.dataFile)); err != nil {
|
||||
} else if report, err := tlsrpt.ParseMessage(log, store.FileMsgReader(d.m.MsgPrefix, d.dataFile)); err != nil {
|
||||
log.Infox("parsing tls report", err)
|
||||
} else {
|
||||
var known bool
|
||||
@ -274,7 +274,7 @@ func analyze(ctx context.Context, log *mlog.Log, resolver dns.Resolver, d delive
|
||||
log.Errorx("get key for verifying subject token", err)
|
||||
return reject(smtp.C451LocalErr, smtp.SeSys3Other0, "error processing", err, reasonSubjectpassError)
|
||||
}
|
||||
err = subjectpass.Verify(d.dataFile, []byte(subjectpassKey), conf.SubjectPass.Period)
|
||||
err = subjectpass.Verify(log, d.dataFile, []byte(subjectpassKey), conf.SubjectPass.Period)
|
||||
pass := err == nil
|
||||
log.Infox("pass by subject token", err, mlog.Field("pass", pass))
|
||||
if pass {
|
||||
|
@ -18,7 +18,7 @@ import (
|
||||
|
||||
// rejectPresent returns whether the message is already present in the rejects mailbox.
|
||||
func rejectPresent(log *mlog.Log, acc *store.Account, rejectsMailbox string, m *store.Message, f *os.File) (present bool, msgID string, hash []byte, rerr error) {
|
||||
if p, err := message.Parse(store.FileMsgReader(m.MsgPrefix, f)); err != nil {
|
||||
if p, err := message.Parse(log, false, store.FileMsgReader(m.MsgPrefix, f)); err != nil {
|
||||
log.Infox("parsing reject message for message-id", err)
|
||||
} else if header, err := p.Header(); err != nil {
|
||||
log.Infox("parsing reject message header for message-id", err)
|
||||
|
@ -1548,9 +1548,9 @@ func (c *conn) cmdData(p *parser) {
|
||||
|
||||
if Localserve {
|
||||
// Require that message can be parsed fully.
|
||||
p, err := message.Parse(dataFile)
|
||||
p, err := message.Parse(c.log, false, dataFile)
|
||||
if err == nil {
|
||||
err = p.Walk(nil)
|
||||
err = p.Walk(c.log, nil)
|
||||
}
|
||||
if err != nil {
|
||||
// ../rfc/6409:541
|
||||
@ -1661,7 +1661,7 @@ func (c *conn) submit(ctx context.Context, recvHdrFor func(string) string, msgWr
|
||||
// for other users.
|
||||
// We don't check the Sender field, there is no expectation of verification, ../rfc/7489:2948
|
||||
// and with Resent headers it seems valid to have someone else as Sender. ../rfc/5322:1578
|
||||
msgFrom, header, err := message.From(dataFile)
|
||||
msgFrom, header, err := message.From(c.log, true, dataFile)
|
||||
if err != nil {
|
||||
metricSubmission.WithLabelValues("badmessage").Inc()
|
||||
c.log.Infox("parsing message From address", err, mlog.Field("user", c.username))
|
||||
@ -1854,7 +1854,7 @@ func (c *conn) deliver(ctx context.Context, recvHdrFor func(string) string, msgW
|
||||
|
||||
// todo: in decision making process, if we run into (some) temporary errors, attempt to continue. if we decide to accept, all good. if we decide to reject, we'll make it a temporary reject.
|
||||
|
||||
msgFrom, headers, err := message.From(dataFile)
|
||||
msgFrom, headers, err := message.From(c.log, false, dataFile)
|
||||
if err != nil {
|
||||
c.log.Infox("parsing message for From address", err)
|
||||
}
|
||||
@ -2388,7 +2388,7 @@ func (c *conn) deliver(ctx context.Context, recvHdrFor func(string) string, msgW
|
||||
|
||||
// Gather the message-id before we deliver and the file may be consumed.
|
||||
if !parsedMessageID {
|
||||
if p, err := message.Parse(store.FileMsgReader(m.MsgPrefix, dataFile)); err != nil {
|
||||
if p, err := message.Parse(c.log, false, store.FileMsgReader(m.MsgPrefix, dataFile)); err != nil {
|
||||
log.Infox("parsing message for message-id", err)
|
||||
} else if header, err := p.Header(); err != nil {
|
||||
log.Infox("parsing message header for message-id", err)
|
||||
|
Reference in New Issue
Block a user