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
This commit is contained in:
parent
30aa77c1c9
commit
e84e402e48
1 changed files with 25 additions and 5 deletions
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/emersion/go-imap"
|
"github.com/emersion/go-imap"
|
||||||
|
|
||||||
"git.sr.ht/~sircmpwn/aerc/models"
|
"git.sr.ht/~sircmpwn/aerc/models"
|
||||||
|
"github.com/emersion/go-message/charset"
|
||||||
)
|
)
|
||||||
|
|
||||||
func toSeqSet(uids []uint32) *imap.SeqSet {
|
func toSeqSet(uids []uint32) *imap.SeqSet {
|
||||||
|
@ -22,15 +23,30 @@ func translateBodyStructure(bs *imap.BodyStructure) *models.BodyStructure {
|
||||||
for _, part := range bs.Parts {
|
for _, part := range bs.Parts {
|
||||||
parts = append(parts, translateBodyStructure(part))
|
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{
|
return &models.BodyStructure{
|
||||||
MIMEType: bs.MIMEType,
|
MIMEType: bs.MIMEType,
|
||||||
MIMESubType: bs.MIMESubType,
|
MIMESubType: bs.MIMESubType,
|
||||||
Params: bs.Params,
|
Params: params,
|
||||||
Description: bs.Description,
|
Description: desc,
|
||||||
Encoding: bs.Encoding,
|
Encoding: bs.Encoding,
|
||||||
Parts: parts,
|
Parts: parts,
|
||||||
Disposition: bs.Disposition,
|
Disposition: bs.Disposition,
|
||||||
DispositionParams: bs.DispositionParams,
|
DispositionParams: dispParams,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,9 +54,12 @@ func translateEnvelope(e *imap.Envelope) *models.Envelope {
|
||||||
if e == nil {
|
if e == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
// TODO: where we should send error?
|
||||||
|
subject, _ := charset.DecodeHeader(e.Subject)
|
||||||
|
|
||||||
return &models.Envelope{
|
return &models.Envelope{
|
||||||
Date: e.Date,
|
Date: e.Date,
|
||||||
Subject: e.Subject,
|
Subject: subject,
|
||||||
From: translateAddresses(e.From),
|
From: translateAddresses(e.From),
|
||||||
ReplyTo: translateAddresses(e.ReplyTo),
|
ReplyTo: translateAddresses(e.ReplyTo),
|
||||||
To: translateAddresses(e.To),
|
To: translateAddresses(e.To),
|
||||||
|
@ -54,8 +73,9 @@ func translateAddress(a *imap.Address) *models.Address {
|
||||||
if a == nil {
|
if a == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
personalName, _ := charset.DecodeHeader(a.PersonalName)
|
||||||
return &models.Address{
|
return &models.Address{
|
||||||
Name: a.PersonalName,
|
Name: personalName,
|
||||||
Mailbox: a.MailboxName,
|
Mailbox: a.MailboxName,
|
||||||
Host: a.HostName,
|
Host: a.HostName,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue