threading: fix msg-id order in references header

Fix order in the references header when an in-reply-to msg-id is
erroneously added at the beginning instead of at the end. Add
description to the function that cleans up the reference headers for
threading.

Reported-by: Evan Gates <evan.gates@gmail.com>
Signed-off-by: Koni Marti <koni.marti@gmail.com>
Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
Koni Marti 2022-03-23 20:25:37 +01:00 committed by Robin Jarry
parent 374d3a0d01
commit 1b6ce56164

View file

@ -192,18 +192,25 @@ func (t *threadable) MessageThreadReferences() []string {
if t.IsDummy() || t.MsgInfo == nil { if t.IsDummy() || t.MsgInfo == nil {
return nil return nil
} }
irp, err := t.MsgInfo.InReplyTo()
if err != nil {
irp = ""
}
refs, err := t.MsgInfo.References() refs, err := t.MsgInfo.References()
if err != nil || len(refs) == 0 { if err != nil || len(refs) == 0 {
inreplyto, err := t.MsgInfo.InReplyTo() if irp == "" {
if err != nil {
return nil return nil
} }
refs = []string{inreplyto} refs = []string{irp}
} }
return cleanRefs(t.MessageThreadID(), refs) return cleanRefs(t.MessageThreadID(), irp, refs)
} }
func cleanRefs(m string, refs []string) []string { // cleanRefs cleans up the references headers for threading
// 1) message-id should not be part of the references
// 2) no message-id should occur twice (avoid circularities)
// 3) in-reply-to header should not be at the beginning
func cleanRefs(m, irp string, refs []string) []string {
considered := make(map[string]interface{}) considered := make(map[string]interface{})
cleanRefs := make([]string, 0, len(refs)) cleanRefs := make([]string, 0, len(refs))
for _, r := range refs { for _, r := range refs {
@ -212,6 +219,11 @@ func cleanRefs(m string, refs []string) []string {
cleanRefs = append(cleanRefs, r) cleanRefs = append(cleanRefs, r)
} }
} }
if irp != "" && len(cleanRefs) > 0 {
if cleanRefs[0] == irp {
cleanRefs = append(cleanRefs[1:], irp)
}
}
return cleanRefs return cleanRefs
} }