MM-48089 Fix relative email urls

Этот коммит содержится в:
Maximilian Ripper
2023-01-17 18:21:32 +01:00
родитель 087aa38afb
Коммит 6020499a42
6 изменённых файлов: 58 добавлений и 17 удалений

Просмотреть файл

@@ -315,7 +315,7 @@ func (es *Service) sendBatchedEmailNotification(userID string, notifications []*
MessageURL: MessageURL,
ShowChannelIcon: showChannelIcon,
OtherChannelMembersCount: otherChannelMembersCount,
MessageAttachments: ProcessMessageAttachments(notification.post),
MessageAttachments: ProcessMessageAttachments(notification.post, siteURL),
})
}
}

Просмотреть файл

@@ -60,14 +60,14 @@ func (es *Service) GetMessageForNotification(post *model.Post, translateFunc i18
return translateFunc("api.post.get_message_for_notification.files_sent", len(filenames), props)
}
func ProcessMessageAttachments(post *model.Post) []*EmailMessageAttachment {
func ProcessMessageAttachments(post *model.Post, siteURL string) []*EmailMessageAttachment {
emailMessageAttachments := []*EmailMessageAttachment{}
for _, messageAttachment := range post.Attachments() {
emailMessageAttachment := &EmailMessageAttachment{
SlackAttachment: *messageAttachment,
Pretext: prepareTextForEmail(messageAttachment.Pretext),
Text: prepareTextForEmail(messageAttachment.Text),
Pretext: prepareTextForEmail(messageAttachment.Pretext, siteURL),
Text: prepareTextForEmail(messageAttachment.Text, siteURL),
}
stripedTitle, err := utils.StripMarkdown(emailMessageAttachment.Title)
@@ -92,7 +92,7 @@ func ProcessMessageAttachments(post *model.Post) []*EmailMessageAttachment {
}
if stringValue, ok := field.Value.(string); ok {
field.Value = prepareTextForEmail(stringValue)
field.Value = prepareTextForEmail(stringValue, siteURL)
}
if !field.Short {
@@ -124,9 +124,9 @@ func ProcessMessageAttachments(post *model.Post) []*EmailMessageAttachment {
return emailMessageAttachments
}
func prepareTextForEmail(text string) template.HTML {
func prepareTextForEmail(text, siteURL string) template.HTML {
escapedText := html.EscapeString(text)
markdownText, err := utils.MarkdownToHTML(escapedText)
markdownText, err := utils.MarkdownToHTML(escapedText, siteURL)
if err != nil {
mlog.Warn("Encountered error while converting markdown to HTML", mlog.Err(err))
return template.HTML(text)

Просмотреть файл

@@ -63,10 +63,10 @@ func TestProcessMessageAttachments(t *testing.T) {
model.ParseSlackAttachment(post, messageAttachments)
processedAttachcmentsPost := ProcessMessageAttachments(post)
require.NotNil(t, processedAttachcmentsPost)
require.Len(t, processedAttachcmentsPost, 2)
require.Equal(t, processedAttachcmentsPost[0].Color, "#FF0000")
require.Equal(t, processedAttachcmentsPost[0].FieldRows[0].Cells[0].Title, "message attachment 1 field 1 title")
require.Equal(t, processedAttachcmentsPost[1].Color, "#FF0000")
processedAttachmentsPost := ProcessMessageAttachments(post, "https://example.com")
require.NotNil(t, processedAttachmentsPost)
require.Len(t, processedAttachmentsPost, 2)
require.Equal(t, processedAttachmentsPost[0].Color, "#FF0000")
require.Equal(t, processedAttachmentsPost[0].FieldRows[0].Cells[0].Title, "message attachment 1 field 1 title")
require.Equal(t, processedAttachmentsPost[1].Color, "#FF0000")
}

Просмотреть файл

@@ -234,7 +234,7 @@ func (a *App) getNotificationEmailBody(c request.CTX, recipient *model.User, pos
if emailNotificationContentsType == model.EmailNotificationContentsFull {
postMessage := a.GetMessageForNotification(post, translateFunc)
postMessage = html.EscapeString(postMessage)
mdPostMessage, mdErr := utils.MarkdownToHTML(postMessage)
mdPostMessage, mdErr := utils.MarkdownToHTML(postMessage, a.GetSiteURL())
if mdErr != nil {
mlog.Warn("Encountered error while converting markdown to HTML", mlog.Err(mdErr))
mdPostMessage = postMessage
@@ -247,7 +247,7 @@ func (a *App) getNotificationEmailBody(c request.CTX, recipient *model.User, pos
}
pData.Message = template.HTML(normalizedPostMessage)
pData.Time = translateFunc("app.notification.body.dm.time", messageTime)
pData.MessageAttachments = email.ProcessMessageAttachments(post)
pData.MessageAttachments = email.ProcessMessageAttachments(post, a.GetSiteURL())
}
data := a.Srv().EmailService.NewEmailTemplateData(recipient.Locale)

Просмотреть файл

@@ -36,10 +36,17 @@ func StripMarkdown(markdown string) (string, error) {
}
// MarkdownToHTML takes a string containing Markdown and returns a string with HTML tagged version
func MarkdownToHTML(markdown string) (string, error) {
func MarkdownToHTML(markdown, siteURL string) (string, error) {
// Turn relative links into absolute links
relLinkRe := regexp.MustCompile(`\[(.*)]\((/.*)\)`)
absLinkMarkdown := relLinkRe.ReplaceAllFunc([]byte(markdown), func(s []byte) []byte {
out := relLinkRe.ReplaceAllString(string(s), "[$1]("+siteURL+"$2)")
return []byte(out)
})
// Unescape any blockquote text to be parsed by the markdown parser.
re := regexp.MustCompile(`^|\n(>)`)
markdownClean := re.ReplaceAllFunc([]byte(markdown), func(s []byte) []byte {
markdownClean := re.ReplaceAllFunc([]byte(absLinkMarkdown), func(s []byte) []byte {
out := html.UnescapeString(string(s))
return []byte(out)
})

Просмотреть файл

@@ -280,3 +280,37 @@ func TestStripMarkdown(t *testing.T) {
})
}
}
func TestMarkdownToHTML(t *testing.T) {
siteURL := "https://example.com"
tests := []struct {
name string
markdown string
want string
}{
{
name: "absolute url not changed",
markdown: "[Link](https://example.com)",
want: "<p><a href=\"https://example.com\">Link</a></p>\n",
},
{
name: "relative url changed to absolute url",
markdown: "[Link](/foo)",
want: "<p><a href=\"https://example.com/foo\">Link</a></p>\n",
},
{
name: "relative url with query params changed to absolute url",
markdown: "[Link](/foo?bar=true)",
want: "<p><a href=\"https://example.com/foo?bar=true\">Link</a></p>\n",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := MarkdownToHTML(tt.markdown, siteURL)
if err != nil {
t.Fatalf("error: %v", err)
}
assert.Equal(t, tt.want, got)
})
}
}