mirror of
https://github.com/mjl-/mox.git
synced 2025-07-12 12:24:38 +03:00
normalize localparts with unicode nfc when parsing
both when parsing our configs, and for incoming on smtp or in messages. so we properly compare things like é and e+accent as equal, and accept the different encodings of that same address.
This commit is contained in:
21
dsn/parse.go
21
dsn/parse.go
@ -65,7 +65,11 @@ func Parse(elog *slog.Logger, r io.ReaderAt) (*Message, *message.Part, error) {
|
||||
if err != nil {
|
||||
return smtp.Path{}, fmt.Errorf("parsing domain: %v", err)
|
||||
}
|
||||
return smtp.Path{Localpart: smtp.Localpart(a.User), IPDomain: dns.IPDomain{Domain: d}}, nil
|
||||
lp, err := smtp.ParseLocalpart(a.User)
|
||||
if err != nil {
|
||||
return smtp.Path{}, fmt.Errorf("parsing localpart: %v", err)
|
||||
}
|
||||
return smtp.Path{Localpart: lp, IPDomain: dns.IPDomain{Domain: d}}, nil
|
||||
}
|
||||
if len(part.Envelope.From) == 1 {
|
||||
m.From, err = addressPath(part.Envelope.From[0])
|
||||
@ -318,17 +322,18 @@ func parseAddress(s string, utf8 bool) (smtp.Path, error) {
|
||||
}
|
||||
}
|
||||
// todo: more proper parser
|
||||
t = strings.SplitN(s, "@", 2)
|
||||
if len(t) != 2 || t[0] == "" || t[1] == "" {
|
||||
t = strings.Split(s, "@")
|
||||
if len(t) == 1 {
|
||||
return smtp.Path{}, fmt.Errorf("invalid email address")
|
||||
}
|
||||
d, err := dns.ParseDomain(t[1])
|
||||
d, err := dns.ParseDomain(t[len(t)-1])
|
||||
if err != nil {
|
||||
return smtp.Path{}, fmt.Errorf("parsing domain: %v", err)
|
||||
}
|
||||
var lp string
|
||||
var esc string
|
||||
for _, c := range t[0] {
|
||||
lead := strings.Join(t[:len(t)-1], "@")
|
||||
for _, c := range lead {
|
||||
if esc == "" && c == '\\' || esc == `\` && (c == 'x' || c == 'X') || esc == `\x` && c == '{' {
|
||||
if c == 'X' {
|
||||
c = 'x'
|
||||
@ -352,7 +357,11 @@ func parseAddress(s string, utf8 bool) (smtp.Path, error) {
|
||||
if esc != "" {
|
||||
return smtp.Path{}, fmt.Errorf("parsing localpart: unfinished embedded unicode char")
|
||||
}
|
||||
p := smtp.Path{Localpart: smtp.Localpart(lp), IPDomain: dns.IPDomain{Domain: d}}
|
||||
localpart, err := smtp.ParseLocalpart(lp)
|
||||
if err != nil {
|
||||
return smtp.Path{}, fmt.Errorf("parsing localpart: %v", err)
|
||||
}
|
||||
p := smtp.Path{Localpart: localpart, IPDomain: dns.IPDomain{Domain: d}}
|
||||
return p, nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user