mirror of
https://github.com/mjl-/mox.git
synced 2025-07-10 10:34:40 +03:00
when checking domain settings, check that dmarc & tls reporting addresses are present if there is a record
This commit is contained in:
@ -21,19 +21,42 @@ type Record struct {
|
||||
Version string // "TLSRPTv1", for "v=".
|
||||
|
||||
// Aggregate reporting URI, for "rua=". "rua=" can occur multiple times, each can
|
||||
// be a list. Must be URL-encoded strings, with ",", "!" and ";" encoded.
|
||||
RUAs [][]string
|
||||
// be a list.
|
||||
RUAs [][]RUA
|
||||
// ../rfc/8460:383
|
||||
|
||||
Extensions []Extension
|
||||
}
|
||||
|
||||
// RUA is a reporting address with scheme and special characters ",", "!" and
|
||||
// ";" not encoded.
|
||||
type RUA string
|
||||
|
||||
// String returns the RUA with special characters encoded, for inclusion in a
|
||||
// TLSRPT record.
|
||||
func (rua RUA) String() string {
|
||||
s := string(rua)
|
||||
s = strings.ReplaceAll(s, ",", "%2C")
|
||||
s = strings.ReplaceAll(s, "!", "%21")
|
||||
s = strings.ReplaceAll(s, ";", "%3B")
|
||||
return s
|
||||
}
|
||||
|
||||
// URI parses a RUA as URI, with either a mailto or https scheme.
|
||||
func (rua RUA) URI() (*url.URL, error) {
|
||||
return url.Parse(string(rua))
|
||||
}
|
||||
|
||||
// String returns a string or use as a TLSRPT DNS TXT record.
|
||||
func (r Record) String() string {
|
||||
b := &strings.Builder{}
|
||||
fmt.Fprint(b, "v="+r.Version)
|
||||
for _, rua := range r.RUAs {
|
||||
fmt.Fprint(b, "; rua="+strings.Join(rua, ","))
|
||||
for _, ruas := range r.RUAs {
|
||||
l := make([]string, len(ruas))
|
||||
for i, rua := range ruas {
|
||||
l[i] = rua.String()
|
||||
}
|
||||
fmt.Fprint(b, "; rua="+strings.Join(l, ","))
|
||||
}
|
||||
for _, p := range r.Extensions {
|
||||
fmt.Fprint(b, "; "+p.Key+"="+p.Value)
|
||||
@ -204,8 +227,8 @@ func (p *parser) wsp() {
|
||||
}
|
||||
|
||||
// ../rfc/8460:358
|
||||
func (p *parser) xruas() []string {
|
||||
l := []string{p.xuri()}
|
||||
func (p *parser) xruas() []RUA {
|
||||
l := []RUA{p.xuri()}
|
||||
p.wsp()
|
||||
for p.take(",") {
|
||||
p.wsp()
|
||||
@ -216,7 +239,7 @@ func (p *parser) xruas() []string {
|
||||
}
|
||||
|
||||
// ../rfc/8460:360
|
||||
func (p *parser) xuri() string {
|
||||
func (p *parser) xuri() RUA {
|
||||
v := p.xtakefn1(func(b rune, i int) bool {
|
||||
return b != ',' && b != '!' && b != ' ' && b != '\t' && b != ';'
|
||||
})
|
||||
@ -227,5 +250,5 @@ func (p *parser) xuri() string {
|
||||
if u.Scheme == "" {
|
||||
p.xerrorf("missing scheme in uri")
|
||||
}
|
||||
return v
|
||||
return RUA(v)
|
||||
}
|
||||
|
Reference in New Issue
Block a user