Skip to content

Commit 599b78d

Browse files
committed
temp fix
1 parent e98affb commit 599b78d

File tree

2 files changed

+38
-64
lines changed

2 files changed

+38
-64
lines changed

services/mailer/mail.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ func Base64InlineImages(body string, ctx *mailCommentContext) (string, error) {
7575
log.Trace("attachmentSrcToDataURI not possible: %v", err) // Not an error, just skip. This is probably an image from outside the gitea instance.
7676
continue
7777
}
78-
log.Trace("Old value of src attribute: %s, new value (first 100 characters): %s", attr.Val, dataURI[:100])
7978
n.Attr[i].Val = dataURI
8079
break
8180
}
@@ -115,7 +114,7 @@ func AttachmentSrcToBase64DataURI(attachmentPath string, ctx *mailCommentContext
115114
}
116115

117116
// "Doer" is theoretically not the correct permission check (as Doer created the action on which to send), but as this is batch processed the receipants can't be accessed.
118-
// Therefore we check the Doer, with which we counter leaking information as a Doer brute force attack on attachments would be possible.
117+
// Therefore, we check the Doer, with which we counter leaking information as a Doer brute force attack on attachments would be possible.
119118
perm, err := access_model.GetUserRepoPermission(ctx, ctx.Issue.Repo, ctx.Doer)
120119
if err != nil {
121120
return "", err

services/mailer/mail_test.go

Lines changed: 37 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
user_model "code.gitea.io/gitea/models/user"
2424
"code.gitea.io/gitea/modules/markup"
2525
"code.gitea.io/gitea/modules/setting"
26-
"code.gitea.io/gitea/modules/test"
26+
"code.gitea.io/gitea/services/attachment"
2727
sender_service "code.gitea.io/gitea/services/mailer/sender"
2828

2929
"github.com/stretchr/testify/assert"
@@ -55,23 +55,36 @@ const bodyTpl = `
5555

5656
func prepareMailerTest(t *testing.T) (doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, comment *issues_model.Comment) {
5757
assert.NoError(t, unittest.PrepareTestDatabase())
58-
mailService := setting.Mailer{
59-
From: "test@gitea.com",
60-
}
61-
62-
setting.MailService = &mailService
58+
setting.MailService = &setting.Mailer{From: "test@gitea.com"}
6359
setting.Domain = "localhost"
6460
setting.AppURL = "https://try.gitea.io/"
6561

6662
doer = unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
6763
repo = unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1, Owner: doer})
6864
issue = unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{ID: 1, Repo: repo, Poster: doer})
69-
assert.NoError(t, issue.LoadRepo(db.DefaultContext))
7065
comment = unittest.AssertExistsAndLoadBean(t, &issues_model.Comment{ID: 2, Issue: issue})
66+
require.NoError(t, issue.LoadRepo(db.DefaultContext))
7167
return doer, repo, issue, comment
7268
}
7369

74-
func TestComposeIssueCommentMessage(t *testing.T) {
70+
func prepareMailerBase64Test(t *testing.T) (doer *user_model.User, repo *repo_model.Repository, issue *issues_model.Issue, att *repo_model.Attachment) {
71+
user, repo, issue, comment := prepareMailerTest(t)
72+
setting.MailService.Base64EmbedImages = true
73+
setting.MailService.Base64EmbedImagesMaxSizePerEmail = 10 * 1024 * 1024
74+
att, err := attachment.NewAttachment(t.Context(), &repo_model.Attachment{
75+
RepoID: repo.ID,
76+
IssueID: issue.ID,
77+
UploaderID: user.ID,
78+
CommentID: comment.ID,
79+
Name: "test.png",
80+
}, bytes.NewReader([]byte("\x89\x50\x4e\x47\x0d\x0a\x1a\x0a")), 8)
81+
require.NoError(t, err)
82+
issue.Content = fmt.Sprintf(`MSG-BEFORE <image src="attachments/%s"> MSG-AFTER`, att.UUID)
83+
require.NoError(t, issues_model.UpdateIssueCols(t.Context(), issue, "content"))
84+
return user, repo, issue, att
85+
}
86+
87+
func TestComposeIssueComment(t *testing.T) {
7588
doer, _, issue, comment := prepareMailerTest(t)
7689

7790
markup.Init(&markup.RenderHelperFuncs{
@@ -112,7 +125,8 @@ func TestComposeIssueCommentMessage(t *testing.T) {
112125
assert.Len(t, gomailMsg.GetGenHeader("List-Unsubscribe"), 2) // url + mailto
113126

114127
var buf bytes.Buffer
115-
gomailMsg.WriteTo(&buf)
128+
_, err = gomailMsg.WriteTo(&buf)
129+
require.NoError(t, err)
116130

117131
b, err := io.ReadAll(quotedprintable.NewReader(&buf))
118132
assert.NoError(t, err)
@@ -407,9 +421,9 @@ func TestGenerateMessageIDForRelease(t *testing.T) {
407421
}
408422

409423
func TestFromDisplayName(t *testing.T) {
410-
template, err := texttmpl.New("mailFrom").Parse("{{ .DisplayName }}")
424+
tmpl, err := texttmpl.New("mailFrom").Parse("{{ .DisplayName }}")
411425
assert.NoError(t, err)
412-
setting.MailService = &setting.Mailer{FromDisplayNameFormatTemplate: template}
426+
setting.MailService = &setting.Mailer{FromDisplayNameFormatTemplate: tmpl}
413427
defer func() { setting.MailService = nil }()
414428

415429
tests := []struct {
@@ -438,9 +452,9 @@ func TestFromDisplayName(t *testing.T) {
438452
}
439453

440454
t.Run("template with all available vars", func(t *testing.T) {
441-
template, err = texttmpl.New("mailFrom").Parse("{{ .DisplayName }} (by {{ .AppName }} on [{{ .Domain }}])")
455+
tmpl, err = texttmpl.New("mailFrom").Parse("{{ .DisplayName }} (by {{ .AppName }} on [{{ .Domain }}])")
442456
assert.NoError(t, err)
443-
setting.MailService = &setting.Mailer{FromDisplayNameFormatTemplate: template}
457+
setting.MailService = &setting.Mailer{FromDisplayNameFormatTemplate: tmpl}
444458
oldAppName := setting.AppName
445459
setting.AppName = "Code IT"
446460
oldDomain := setting.Domain
@@ -455,20 +469,7 @@ func TestFromDisplayName(t *testing.T) {
455469
}
456470

457471
func TestEmbedBase64ImagesInEmail(t *testing.T) {
458-
doer, repo, _, _ := prepareMailerTest(t)
459-
defer test.MockVariableValue(&setting.MailService.Base64EmbedImages, true)
460-
defer test.MockVariableValue(&setting.MailService.Base64EmbedImagesMaxSizePerEmail, 10*1024*1024)
461-
462-
err := issues_model.NewIssue(t.Context(), repo, &issues_model.Issue{
463-
Poster: doer,
464-
RepoID: repo.ID,
465-
Title: "test issue attachment",
466-
Content: `content including this image: <image alt="gitea.png" src="attachments/1b267670-1793-4cd0-abc1-449269b7cff9" /> with some more content behind it`,
467-
}, nil, nil)
468-
require.NoError(t, err)
469-
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "test issue attachment"})
470-
require.NoError(t, issue.LoadRepo(t.Context()))
471-
472+
doer, _, issue, _ := prepareMailerBase64Test(t)
472473
subjectTemplates = texttmpl.Must(texttmpl.New("issue/new").Parse(subjectTpl))
473474
bodyTemplates = template.Must(template.New("issue/new").Parse(bodyTpl))
474475

@@ -480,52 +481,26 @@ func TestEmbedBase64ImagesInEmail(t *testing.T) {
480481
ActionType: activities_model.ActionCreateIssue,
481482
Content: strings.ReplaceAll(issue.Content, `src="`, `src="`+setting.AppURL),
482483
}, "en-US", recipients, false, "issue create")
484+
require.NoError(t, err)
483485

484486
mailBody := msgs[0].Body
485-
re := regexp.MustCompile(`(?s)<body>(.*?)</body>`)
487+
re := regexp.MustCompile(`MSG-BEFORE.*MSG-AFTER`)
486488
matches := re.FindStringSubmatch(mailBody)
487-
if len(matches) > 1 {
488-
mailBody = matches[1]
489-
}
490-
// check if the mail body was correctly generated
491-
assert.NoError(t, err)
492-
assert.Contains(t, mailBody, "content including this image")
493-
494-
// check if an image was embedded
495-
assert.Contains(t, mailBody, "data:image/png;base64,")
496-
497-
// check if the image was embedded only once
498-
assert.Equal(t, 1, strings.Count(mailBody, "data:image/png;base64,"))
499-
500-
img2InternalBase64 := "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAxAQMAAAB3d7wRAAAABlBMVEVgmyF6qkqITHmkAAAAAXRSTlMBN+Ho8AAAAJhJREFUKM+V0DsOwyAQBNCxXLjkCFwk0t7McDQfhS4tpQuEzWc/iaUU2eo1zC4DUMWYF3DxVKzGTXjBGb2RsjJEo6ZhN1Zj+cEgi/9hBQl3YflkkIsbo5IO5glKTuhPpavM3Hp4C7WdjEWYrL5GMkp/R+s4GPlh/CZn4MEwv9aHHiyD3ujm5X22eaMyDa5yAm+O0B1TPa1l3W2qZWMg+KgtAAAAAElFTkSuQmCC"
501-
502-
// check if the image was embedded correctly
503-
assert.Contains(t, mailBody, img2InternalBase64)
489+
require.NotEmpty(t, matches)
490+
mailBody = matches[0]
491+
assert.Equal(t, `MSG-BEFORE <img src="data:image/png;base64,iVBORw0KGgo="/> MSG-AFTER`, mailBody)
504492
}
505493

506494
func TestEmbedBase64Images(t *testing.T) {
507-
user, repo, _, _ := prepareMailerTest(t)
508-
defer test.MockVariableValue(&setting.MailService.Base64EmbedImages, true)
509-
defer test.MockVariableValue(&setting.MailService.Base64EmbedImagesMaxSizePerEmail, 10*1024*1024)
510-
511-
err := issues_model.NewIssue(t.Context(), repo, &issues_model.Issue{
512-
Poster: user,
513-
RepoID: repo.ID,
514-
Title: "test issue attachment",
515-
Content: `content including this image: <image alt="gitea.png" src="attachments/1b267670-1793-4cd0-abc1-449269b7cff9" /> with some more content behind it`,
516-
}, nil, nil)
517-
require.NoError(t, err)
518-
issue := unittest.AssertExistsAndLoadBean(t, &issues_model.Issue{Title: "test issue attachment"})
519-
require.NoError(t, issue.LoadRepo(t.Context()))
520-
attachment := unittest.AssertExistsAndLoadBean(t, &repo_model.Attachment{ID: 13, IssueID: issue.ID, RepoID: repo.ID})
495+
user, repo, issue, att := prepareMailerBase64Test(t)
521496
ctx := &mailCommentContext{Context: t.Context(), Issue: issue, Doer: user}
522497

523498
img1ExternalURL := "https://via.placeholder.com/10"
524499
img1ExternalImg := "<img src=\"" + img1ExternalURL + "\"/>"
525500

526-
img2InternalURL := setting.AppURL + repo.Owner.Name + "/" + repo.Name + "/attachments/" + attachment.UUID
501+
img2InternalURL := setting.AppURL + repo.Owner.Name + "/" + repo.Name + "/attachments/" + att.UUID
527502
img2InternalImg := "<img src=\"" + img2InternalURL + "\"/>"
528-
img2InternalBase64 := "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAAAxAQMAAAB3d7wRAAAABlBMVEVgmyF6qkqITHmkAAAAAXRSTlMBN+Ho8AAAAJhJREFUKM+V0DsOwyAQBNCxXLjkCFwk0t7McDQfhS4tpQuEzWc/iaUU2eo1zC4DUMWYF3DxVKzGTXjBGb2RsjJEo6ZhN1Zj+cEgi/9hBQl3YflkkIsbo5IO5glKTuhPpavM3Hp4C7WdjEWYrL5GMkp/R+s4GPlh/CZn4MEwv9aHHiyD3ujm5X22eaMyDa5yAm+O0B1TPa1l3W2qZWMg+KgtAAAAAElFTkSuQmCC"
503+
img2InternalBase64 := "data:image/png;base64,iVBORw0KGgo="
529504
img2InternalBase64Img := "<img src=\"" + img2InternalBase64 + "\"/>"
530505

531506
// 1st Test: convert internal image to base64
@@ -558,7 +533,7 @@ func TestEmbedBase64Images(t *testing.T) {
558533

559534
// 4th Test, generate email body with 2 internal images, but set Mailer.Base64EmbedImagesMaxSizePerEmail to the size of the first image (+1), expect the first image to be replaced and the second not
560535
t.Run("generateEmailBodyWithMaxSize", func(t *testing.T) {
561-
setting.MailService.Base64EmbedImagesMaxSizePerEmail = int64(len(img2InternalBase64) + 1)
536+
setting.MailService.Base64EmbedImagesMaxSizePerEmail = 10
562537

563538
mailBody := "<html><head></head><body><p>Test1</p>" + img2InternalImg + "<p>Test2</p>" + img2InternalImg + "<p>Test3</p></body></html>"
564539
expectedMailBody := "<html><head></head><body><p>Test1</p>" + img2InternalBase64Img + "<p>Test2</p>" + img2InternalImg + "<p>Test3</p></body></html>"

0 commit comments

Comments
 (0)