Archived
1
0

srnd: more lax Message-ID check

This axes out literally insane overly restrictive regex-based
Message-ID check and replaces it with clean and simple conditions
specified in RFC 3977.
Old check wasn't compliant with any email or netnews internet
standard I know of, and was causing propagation issues.
Even old RFC 822 (email) and RFC 850 (usenet) specifications
don't have so restrictive specifications.
This commit is contained in:
cathugger 2018-11-27 05:15:11 +02:00
parent be7eec855a
commit 2d3c304c81
No known key found for this signature in database
GPG Key ID: 9BADDA2DAF6F01A8

View File

@ -60,10 +60,34 @@ func EnsureDir(dirname string) {
}
}
var exp_valid_message_id = regexp.MustCompilePOSIX(`^<[a-zA-Z0-9$.]{2,128}@[a-zA-Z0-9\-.]{2,63}>$`)
// printableASCII tells whether string is made of US-ASCII printable characters
// except of specified one.
func printableASCII(s string, e byte) bool {
for i := 0; i < len(s); i++ {
c := s[i]
// NOTE: doesn't include space, which is neither printable nor control
if c <= 32 || c >= 127 || c == e {
return false
}
}
return true
}
func ValidMessageID(id string) bool {
return exp_valid_message_id.MatchString(id)
/*
{RFC 3977}
o A message-id MUST begin with "<", end with ">", and MUST NOT
contain the latter except at the end.
o A message-id MUST be between 3 and 250 octets in length.
o A message-id MUST NOT contain octets other than printable US-ASCII
characters.
additionally, we check path characters, they may be dangerous
*/
return len(id) >= 3 && len(id) <= 250 &&
id[0] == '<' && id[len(id)-1] == '>' &&
printableASCII(id[1:len(id)-1], '>') &&
strings.IndexAny(id[1:len(id)-1], "/\\") < 0
}
// message id hash
@ -482,7 +506,7 @@ func IPNet2MinMax(inet *net.IPNet) (min, max net.IP) {
maskb := []byte(inet.Mask)
maxb := make([]byte, len(netb))
for i, _ := range maxb {
for i := range maxb {
maxb[i] = netb[i] | (^maskb[i])
}
min = net.IP(netb)