diff options
author | Robin Jarry <robin@jarry.cc> | 2024-03-11 17:31:24 +0100 |
---|---|---|
committer | Robin Jarry <robin@jarry.cc> | 2024-04-13 22:37:22 +0200 |
commit | f204c736759f4d6647a50aa94a415545c0d3a8f7 (patch) | |
tree | 51a5febd494ed4ac0d9427ffbeb18a8bd536a835 | |
parent | 953355acc950c53ee95469bad2ee9e9c206970a3 (diff) | |
download | aerc-f204c736759f4d6647a50aa94a415545c0d3a8f7.tar.gz |
compose,viewer: do not always wrap people names in quotes
Currently, names of recipients in From, To, Cc and Bcc headers are
(almost) always wrapped in quotes. Even if they are pure ASCII and
contain one upper case letter. E.g.:
From: "Foo" <foo@baz.org>
There is no valid reason to add these quotes unless the name contains
special characters as specified by RFC 5322, section 3.2.3:
specials = "(" / ")" / ; Special characters that do
"<" / ">" / ; not appear in atext
"[" / "]" /
":" / ";" /
"@" / "\" /
"," / "." /
DQUOTE
Adapt the check accordingly.
Link: https://datatracker.ietf.org/doc/html/rfc5322#section-3.2.3
Signed-off-by: Robin Jarry <robin@jarry.cc>
Tested-by: Bence Ferdinandy <bence@ferdinandy.com>
-rw-r--r-- | lib/format/format.go | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/lib/format/format.go b/lib/format/format.go index a8600009..430abf75 100644 --- a/lib/format/format.go +++ b/lib/format/format.go @@ -2,7 +2,6 @@ package format import ( "fmt" - "regexp" "strings" "time" "unicode" @@ -10,24 +9,23 @@ import ( "github.com/emersion/go-message/mail" ) -// AddressForHumans formats the address. If the address's name -// contains non-ASCII characters it will be quoted but not encoded. +const rfc5322specials string = `()<>[]:;@\,."` + +// AddressForHumans formats the address. // Meant for display purposes to the humans, not for sending over the wire. func AddressForHumans(a *mail.Address) string { if a.Name != "" { - if atom.MatchString(a.Name) { - return fmt.Sprintf("%s <%s>", a.Name, a.Address) - } else { + if strings.ContainsAny(a.Name, rfc5322specials) { return fmt.Sprintf("\"%s\" <%s>", strings.ReplaceAll(a.Name, "\"", "'"), a.Address) + } else { + return fmt.Sprintf("%s <%s>", a.Name, a.Address) } } else { return fmt.Sprintf("<%s>", a.Address) } } -var atom *regexp.Regexp = regexp.MustCompile("^[a-z0-9!#$%7'*+-/=?^_`{}|~ ]+$") - // FormatAddresses formats a list of addresses into a human readable string func FormatAddresses(l []*mail.Address) string { formatted := make([]string, len(l)) |