From e84e402e489569b2ab1636ae04016464ec6d46c3 Mon Sep 17 00:00:00 2001 From: Leszek CimaƂa Date: Sat, 7 Dec 2019 00:06:29 +0100 Subject: decode(RFC 2047) imap headers to fix encoding in subject & filenames Me again, this time fixing encoding of subjects and attachments. It was problem in IMAP backend. While other backends user MessageInfo() function which generates MessageInfo decoded via go-message methodes, IMAP worker is creating MessageInfo directly, so all non-utf8 subjects and filenames were in raw form. This patch fixes it. Not sure if we should care about errors (if DecodeHeader fails it returns raw string back). >From what I see, this should solve all encoding problem (tested only IMAP). So, now I can focus on features. ;-) Have a great weekend! Leszek --- worker/imap/imap.go | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'worker/imap/imap.go') diff --git a/worker/imap/imap.go b/worker/imap/imap.go index 06bcd009..b0aacf62 100644 --- a/worker/imap/imap.go +++ b/worker/imap/imap.go @@ -4,6 +4,7 @@ import ( "github.com/emersion/go-imap" "git.sr.ht/~sircmpwn/aerc/models" + "github.com/emersion/go-message/charset" ) func toSeqSet(uids []uint32) *imap.SeqSet { @@ -22,15 +23,30 @@ func translateBodyStructure(bs *imap.BodyStructure) *models.BodyStructure { for _, part := range bs.Parts { parts = append(parts, translateBodyStructure(part)) } + + // we need to decode, because imap store do not use MessageInfo() + // which do it via go-message + desc, _ := charset.DecodeHeader(bs.Description) + params := map[string]string{} + for k, v := range bs.Params { + params[k], _ = charset.DecodeHeader(v) + } + dispParams := map[string]string{} + for k, v := range bs.DispositionParams { + dispParams[k], _ = charset.DecodeHeader(v) + } + + // TODO: is that all? + return &models.BodyStructure{ MIMEType: bs.MIMEType, MIMESubType: bs.MIMESubType, - Params: bs.Params, - Description: bs.Description, + Params: params, + Description: desc, Encoding: bs.Encoding, Parts: parts, Disposition: bs.Disposition, - DispositionParams: bs.DispositionParams, + DispositionParams: dispParams, } } @@ -38,9 +54,12 @@ func translateEnvelope(e *imap.Envelope) *models.Envelope { if e == nil { return nil } + // TODO: where we should send error? + subject, _ := charset.DecodeHeader(e.Subject) + return &models.Envelope{ Date: e.Date, - Subject: e.Subject, + Subject: subject, From: translateAddresses(e.From), ReplyTo: translateAddresses(e.ReplyTo), To: translateAddresses(e.To), @@ -54,8 +73,9 @@ func translateAddress(a *imap.Address) *models.Address { if a == nil { return nil } + personalName, _ := charset.DecodeHeader(a.PersonalName) return &models.Address{ - Name: a.PersonalName, + Name: personalName, Mailbox: a.MailboxName, Host: a.HostName, } -- cgit