Skip to content

Commit 3b06675

Browse files
authored
Always set a unique Message-ID header. (#17206)
1 parent 347d48f commit 3b06675

File tree

3 files changed

+30
-26
lines changed

3 files changed

+30
-26
lines changed

models/issue.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"code.gitea.io/gitea/modules/base"
1818
"code.gitea.io/gitea/modules/log"
1919
"code.gitea.io/gitea/modules/references"
20-
"code.gitea.io/gitea/modules/setting"
2120
"code.gitea.io/gitea/modules/structs"
2221
api "code.gitea.io/gitea/modules/structs"
2322
"code.gitea.io/gitea/modules/timeutil"
@@ -415,18 +414,6 @@ func (issue *Issue) HasLabel(labelID int64) bool {
415414
return issue.hasLabel(db.GetEngine(db.DefaultContext), labelID)
416415
}
417416

418-
// ReplyReference returns tokenized address to use for email reply headers
419-
func (issue *Issue) ReplyReference() string {
420-
var path string
421-
if issue.IsPull {
422-
path = "pulls"
423-
} else {
424-
path = "issues"
425-
}
426-
427-
return fmt.Sprintf("%s/%s/%d@%s", issue.Repo.FullName(), path, issue.Index, setting.Domain)
428-
}
429-
430417
func (issue *Issue) addLabel(e db.Engine, label *Label, doer *User) error {
431418
return newIssueLabel(e, issue, label, doer)
432419
}

services/mailer/mail.go

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,13 +305,10 @@ func composeIssueCommentMessages(ctx *mailCommentContext, lang string, recipient
305305
msg := NewMessageFrom([]string{recipient.Email}, ctx.Doer.DisplayName(), setting.MailService.FromEmail, subject, mailBody.String())
306306
msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info)
307307

308-
// Set Message-ID on first message so replies know what to reference
309-
if actName == "new" {
310-
msg.SetHeader("Message-ID", "<"+ctx.Issue.ReplyReference()+">")
311-
} else {
312-
msg.SetHeader("In-Reply-To", "<"+ctx.Issue.ReplyReference()+">")
313-
msg.SetHeader("References", "<"+ctx.Issue.ReplyReference()+">")
314-
}
308+
msg.SetHeader("Message-ID", "<"+createReference(ctx.Issue, ctx.Comment)+">")
309+
reference := createReference(ctx.Issue, nil)
310+
msg.SetHeader("In-Reply-To", "<"+reference+">")
311+
msg.SetHeader("References", "<"+reference+">")
315312

316313
for key, value := range generateAdditionalHeaders(ctx, actType, recipient) {
317314
msg.SetHeader(key, value)
@@ -323,6 +320,22 @@ func composeIssueCommentMessages(ctx *mailCommentContext, lang string, recipient
323320
return msgs, nil
324321
}
325322

323+
func createReference(issue *models.Issue, comment *models.Comment) string {
324+
var path string
325+
if issue.IsPull {
326+
path = "pulls"
327+
} else {
328+
path = "issues"
329+
}
330+
331+
var extra string
332+
if comment != nil {
333+
extra = fmt.Sprintf("/comment/%d", comment.ID)
334+
}
335+
336+
return fmt.Sprintf("%s/%s/%d%s@%s", issue.Repo.FullName(), path, issue.Index, extra, setting.Domain)
337+
}
338+
326339
func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient *models.User) map[string]string {
327340
repo := ctx.Issue.Repo
328341

services/mailer/mail_test.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,16 @@ func TestComposeIssueCommentMessage(t *testing.T) {
7272
gomailMsg := msgs[0].ToMessage()
7373
mailto := gomailMsg.GetHeader("To")
7474
subject := gomailMsg.GetHeader("Subject")
75-
inreplyTo := gomailMsg.GetHeader("In-Reply-To")
75+
messageID := gomailMsg.GetHeader("Message-ID")
76+
inReplyTo := gomailMsg.GetHeader("In-Reply-To")
7677
references := gomailMsg.GetHeader("References")
7778

7879
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
7980
assert.Equal(t, "Re: ", subject[0][:4], "Comment reply subject should contain Re:")
8081
assert.Equal(t, "Re: [user2/repo1] @user2 #1 - issue1", subject[0])
81-
assert.Equal(t, inreplyTo[0], "<user2/repo1/issues/1@localhost>", "In-Reply-To header doesn't match")
82-
assert.Equal(t, references[0], "<user2/repo1/issues/1@localhost>", "References header doesn't match")
82+
assert.Equal(t, "<user2/repo1/issues/1@localhost>", inReplyTo[0], "In-Reply-To header doesn't match")
83+
assert.Equal(t, "<user2/repo1/issues/1@localhost>", references[0], "References header doesn't match")
84+
assert.Equal(t, "<user2/repo1/issues/1/comment/2@localhost>", messageID[0], "Message-ID header doesn't match")
8385
}
8486

8587
func TestComposeIssueMessage(t *testing.T) {
@@ -99,12 +101,14 @@ func TestComposeIssueMessage(t *testing.T) {
99101
mailto := gomailMsg.GetHeader("To")
100102
subject := gomailMsg.GetHeader("Subject")
101103
messageID := gomailMsg.GetHeader("Message-ID")
104+
inReplyTo := gomailMsg.GetHeader("In-Reply-To")
105+
references := gomailMsg.GetHeader("References")
102106

103107
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
104108
assert.Equal(t, "[user2/repo1] @user2 #1 - issue1", subject[0])
105-
assert.Nil(t, gomailMsg.GetHeader("In-Reply-To"))
106-
assert.Nil(t, gomailMsg.GetHeader("References"))
107-
assert.Equal(t, messageID[0], "<user2/repo1/issues/1@localhost>", "Message-ID header doesn't match")
109+
assert.Equal(t, "<user2/repo1/issues/1@localhost>", inReplyTo[0], "In-Reply-To header doesn't match")
110+
assert.Equal(t, "<user2/repo1/issues/1@localhost>", references[0], "References header doesn't match")
111+
assert.Equal(t, "<user2/repo1/issues/1@localhost>", messageID[0], "Message-ID header doesn't match")
108112
}
109113

110114
func TestTemplateSelection(t *testing.T) {

0 commit comments

Comments
 (0)