1package message
2
3import (
4 "strings"
5 "testing"
6)
7
8func TestFrom(t *testing.T) {
9 check := func(headers, expAddr string, expErr error) {
10 t.Helper()
11
12 msg := strings.ReplaceAll(headers, "\n", "\r\n") + "\r\nbody\r\n"
13 addr, _, _, err := From(pkglog.Logger, false, strings.NewReader(msg), nil)
14 tfail(t, err, expErr)
15 if expErr == nil {
16 tcompare(t, addr.String(), expAddr)
17 }
18 }
19
20 check("From: mjl@mox.example\n", "mjl@mox.example", nil)
21 check("From: Mechiel <mjl@mox.example>\n", "mjl@mox.example", nil)
22
23 // Exactly one from header, with exactly one address. ../rfc/5322:1145
24 check("Subject: test\n", "", errFromHeaders)
25 check("From: mjl@mox.example, other@mox.example\n", "", errFromAddresses)
26
27 // With multiple from headers we would use the first, while DKIM signs the last, so
28 // we reject. ../rfc/5322:1993 ../rfc/6376:2320
29 check("From: attacker@evil.example\nFrom: ceo@bank.example\n", "", errFromHeaders)
30 check("From: ceo@bank.example\nFrom: attacker@evil.example\n", "", errFromHeaders)
31 check("From: mjl@mox.example\nFrom: mjl@mox.example\n", "", errFromHeaders)
32}
33