From 8c922057904239f962c1a9e5862b41b2bd01fbe3 Mon Sep 17 00:00:00 2001 From: Julian Mundhahs Date: Mon, 8 Apr 2024 21:36:18 +0200 Subject: [PATCH] Fix handling of mailto URIs with multiple recipients --- htmltest/check-link.go | 37 ++++++++++--------- htmltest/check-link_test.go | 6 +++ .../links/mailto_multiple_recipients.html | 9 +++++ 3 files changed, 35 insertions(+), 17 deletions(-) create mode 100644 htmltest/fixtures/links/mailto_multiple_recipients.html diff --git a/htmltest/check-link.go b/htmltest/check-link.go index dae18d7..50f8eab 100644 --- a/htmltest/check-link.go +++ b/htmltest/check-link.go @@ -405,23 +405,26 @@ func (hT *HTMLTest) checkMailto(ref *htmldoc.Reference) { }) return } - emailAddress, decodeErr := url.QueryUnescape(ref.URL.Opaque) - if decodeErr != nil { - hT.issueStore.AddIssue(issues.Issue{ - Level: issues.LevelError, - Message: fmt.Sprintf("cannot decode email (%s): '%s'", decodeErr, ref.URL.Opaque), - Reference: ref, - }) - return - } - formatErr := checkmail.ValidateFormat(emailAddress) - if formatErr != nil { - hT.issueStore.AddIssue(issues.Issue{ - Level: issues.LevelError, - Message: fmt.Sprintf("invalid email address (%s): '%s'", formatErr, emailAddress), - Reference: ref, - }) - return + // mailto URIs may contain multiple recipients separated by "," (https://datatracker.ietf.org/doc/html/rfc6068#autoid-2) + for _, recipient := range strings.Split(ref.URL.Opaque, ",") { + emailAddress, decodeErr := url.QueryUnescape(recipient) + if decodeErr != nil { + hT.issueStore.AddIssue(issues.Issue{ + Level: issues.LevelError, + Message: fmt.Sprintf("cannot decode email (%s): '%s'", decodeErr, ref.URL.Opaque), + Reference: ref, + }) + return + } + formatErr := checkmail.ValidateFormat(emailAddress) + if formatErr != nil { + hT.issueStore.AddIssue(issues.Issue{ + Level: issues.LevelError, + Message: fmt.Sprintf("invalid email address (%s): '%s'", formatErr, emailAddress), + Reference: ref, + }) + return + } } } diff --git a/htmltest/check-link_test.go b/htmltest/check-link_test.go index 3322b02..c3c4ddc 100644 --- a/htmltest/check-link_test.go +++ b/htmltest/check-link_test.go @@ -595,6 +595,12 @@ func TestMailtoEncoded(t *testing.T) { tExpectIssueCount(t, hT, 0) } +func TestMailtoMultipleRecipients(t *testing.T) { + // ignores valid mailto links + hT := tTestFile("fixtures/links/mailto_multiple_recipients.html") + tExpectIssueCount(t, hT, 0) +} + func TestMailtoEncodedInvalid(t *testing.T) { // ignores valid mailto links hT := tTestFile("fixtures/links/mailto_encoded_invalid.html") diff --git a/htmltest/fixtures/links/mailto_multiple_recipients.html b/htmltest/fixtures/links/mailto_multiple_recipients.html new file mode 100644 index 0000000..43ef209 --- /dev/null +++ b/htmltest/fixtures/links/mailto_multiple_recipients.html @@ -0,0 +1,9 @@ + + + + +Mail me. + + + +