Always set a unique Message-ID header. (#17206)
This commit is contained in:
parent
347d48fdfe
commit
3b06675811
@ -17,7 +17,6 @@ import (
|
|||||||
"code.gitea.io/gitea/modules/base"
|
"code.gitea.io/gitea/modules/base"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
"code.gitea.io/gitea/modules/references"
|
"code.gitea.io/gitea/modules/references"
|
||||||
"code.gitea.io/gitea/modules/setting"
|
|
||||||
"code.gitea.io/gitea/modules/structs"
|
"code.gitea.io/gitea/modules/structs"
|
||||||
api "code.gitea.io/gitea/modules/structs"
|
api "code.gitea.io/gitea/modules/structs"
|
||||||
"code.gitea.io/gitea/modules/timeutil"
|
"code.gitea.io/gitea/modules/timeutil"
|
||||||
@ -415,18 +414,6 @@ func (issue *Issue) HasLabel(labelID int64) bool {
|
|||||||
return issue.hasLabel(db.GetEngine(db.DefaultContext), labelID)
|
return issue.hasLabel(db.GetEngine(db.DefaultContext), labelID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReplyReference returns tokenized address to use for email reply headers
|
|
||||||
func (issue *Issue) ReplyReference() string {
|
|
||||||
var path string
|
|
||||||
if issue.IsPull {
|
|
||||||
path = "pulls"
|
|
||||||
} else {
|
|
||||||
path = "issues"
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Sprintf("%s/%s/%d@%s", issue.Repo.FullName(), path, issue.Index, setting.Domain)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (issue *Issue) addLabel(e db.Engine, label *Label, doer *User) error {
|
func (issue *Issue) addLabel(e db.Engine, label *Label, doer *User) error {
|
||||||
return newIssueLabel(e, issue, label, doer)
|
return newIssueLabel(e, issue, label, doer)
|
||||||
}
|
}
|
||||||
|
@ -305,13 +305,10 @@ func composeIssueCommentMessages(ctx *mailCommentContext, lang string, recipient
|
|||||||
msg := NewMessageFrom([]string{recipient.Email}, ctx.Doer.DisplayName(), setting.MailService.FromEmail, subject, mailBody.String())
|
msg := NewMessageFrom([]string{recipient.Email}, ctx.Doer.DisplayName(), setting.MailService.FromEmail, subject, mailBody.String())
|
||||||
msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info)
|
msg.Info = fmt.Sprintf("Subject: %s, %s", subject, info)
|
||||||
|
|
||||||
// Set Message-ID on first message so replies know what to reference
|
msg.SetHeader("Message-ID", "<"+createReference(ctx.Issue, ctx.Comment)+">")
|
||||||
if actName == "new" {
|
reference := createReference(ctx.Issue, nil)
|
||||||
msg.SetHeader("Message-ID", "<"+ctx.Issue.ReplyReference()+">")
|
msg.SetHeader("In-Reply-To", "<"+reference+">")
|
||||||
} else {
|
msg.SetHeader("References", "<"+reference+">")
|
||||||
msg.SetHeader("In-Reply-To", "<"+ctx.Issue.ReplyReference()+">")
|
|
||||||
msg.SetHeader("References", "<"+ctx.Issue.ReplyReference()+">")
|
|
||||||
}
|
|
||||||
|
|
||||||
for key, value := range generateAdditionalHeaders(ctx, actType, recipient) {
|
for key, value := range generateAdditionalHeaders(ctx, actType, recipient) {
|
||||||
msg.SetHeader(key, value)
|
msg.SetHeader(key, value)
|
||||||
@ -323,6 +320,22 @@ func composeIssueCommentMessages(ctx *mailCommentContext, lang string, recipient
|
|||||||
return msgs, nil
|
return msgs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createReference(issue *models.Issue, comment *models.Comment) string {
|
||||||
|
var path string
|
||||||
|
if issue.IsPull {
|
||||||
|
path = "pulls"
|
||||||
|
} else {
|
||||||
|
path = "issues"
|
||||||
|
}
|
||||||
|
|
||||||
|
var extra string
|
||||||
|
if comment != nil {
|
||||||
|
extra = fmt.Sprintf("/comment/%d", comment.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%s/%s/%d%s@%s", issue.Repo.FullName(), path, issue.Index, extra, setting.Domain)
|
||||||
|
}
|
||||||
|
|
||||||
func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient *models.User) map[string]string {
|
func generateAdditionalHeaders(ctx *mailCommentContext, reason string, recipient *models.User) map[string]string {
|
||||||
repo := ctx.Issue.Repo
|
repo := ctx.Issue.Repo
|
||||||
|
|
||||||
|
@ -72,14 +72,16 @@ func TestComposeIssueCommentMessage(t *testing.T) {
|
|||||||
gomailMsg := msgs[0].ToMessage()
|
gomailMsg := msgs[0].ToMessage()
|
||||||
mailto := gomailMsg.GetHeader("To")
|
mailto := gomailMsg.GetHeader("To")
|
||||||
subject := gomailMsg.GetHeader("Subject")
|
subject := gomailMsg.GetHeader("Subject")
|
||||||
inreplyTo := gomailMsg.GetHeader("In-Reply-To")
|
messageID := gomailMsg.GetHeader("Message-ID")
|
||||||
|
inReplyTo := gomailMsg.GetHeader("In-Reply-To")
|
||||||
references := gomailMsg.GetHeader("References")
|
references := gomailMsg.GetHeader("References")
|
||||||
|
|
||||||
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
|
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
|
||||||
assert.Equal(t, "Re: ", subject[0][:4], "Comment reply subject should contain Re:")
|
assert.Equal(t, "Re: ", subject[0][:4], "Comment reply subject should contain Re:")
|
||||||
assert.Equal(t, "Re: [user2/repo1] @user2 #1 - issue1", subject[0])
|
assert.Equal(t, "Re: [user2/repo1] @user2 #1 - issue1", subject[0])
|
||||||
assert.Equal(t, inreplyTo[0], "<user2/repo1/issues/1@localhost>", "In-Reply-To header doesn't match")
|
assert.Equal(t, "<user2/repo1/issues/1@localhost>", inReplyTo[0], "In-Reply-To header doesn't match")
|
||||||
assert.Equal(t, references[0], "<user2/repo1/issues/1@localhost>", "References header doesn't match")
|
assert.Equal(t, "<user2/repo1/issues/1@localhost>", references[0], "References header doesn't match")
|
||||||
|
assert.Equal(t, "<user2/repo1/issues/1/comment/2@localhost>", messageID[0], "Message-ID header doesn't match")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestComposeIssueMessage(t *testing.T) {
|
func TestComposeIssueMessage(t *testing.T) {
|
||||||
@ -99,12 +101,14 @@ func TestComposeIssueMessage(t *testing.T) {
|
|||||||
mailto := gomailMsg.GetHeader("To")
|
mailto := gomailMsg.GetHeader("To")
|
||||||
subject := gomailMsg.GetHeader("Subject")
|
subject := gomailMsg.GetHeader("Subject")
|
||||||
messageID := gomailMsg.GetHeader("Message-ID")
|
messageID := gomailMsg.GetHeader("Message-ID")
|
||||||
|
inReplyTo := gomailMsg.GetHeader("In-Reply-To")
|
||||||
|
references := gomailMsg.GetHeader("References")
|
||||||
|
|
||||||
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
|
assert.Len(t, mailto, 1, "exactly one recipient is expected in the To field")
|
||||||
assert.Equal(t, "[user2/repo1] @user2 #1 - issue1", subject[0])
|
assert.Equal(t, "[user2/repo1] @user2 #1 - issue1", subject[0])
|
||||||
assert.Nil(t, gomailMsg.GetHeader("In-Reply-To"))
|
assert.Equal(t, "<user2/repo1/issues/1@localhost>", inReplyTo[0], "In-Reply-To header doesn't match")
|
||||||
assert.Nil(t, gomailMsg.GetHeader("References"))
|
assert.Equal(t, "<user2/repo1/issues/1@localhost>", references[0], "References header doesn't match")
|
||||||
assert.Equal(t, messageID[0], "<user2/repo1/issues/1@localhost>", "Message-ID header doesn't match")
|
assert.Equal(t, "<user2/repo1/issues/1@localhost>", messageID[0], "Message-ID header doesn't match")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestTemplateSelection(t *testing.T) {
|
func TestTemplateSelection(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user