forward,recall: fix charsets in part attachment

Fix charset to UTF-8 in part attachments. The forward and recall
commands fetch message parts with the go-message package which decodes
to UTF-8. Hence, we should set the charset of the part attachment to
utf-8 and not just copying over the one from the original message.

Reported-by: Bence Ferdinandy <bence@ferdinandy.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-10-05 22:50:40 +02:00 committed by Robin Jarry
parent d2f4f12f66
commit c6561d32a8
3 changed files with 23 additions and 4 deletions

View File

@ -198,12 +198,13 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error {
}
store.FetchBodyPart(msg.Uid, p, func(reader io.Reader) {
mime := fmt.Sprintf("%s/%s", bs.MIMEType, bs.MIMESubType)
name, ok := bs.Params["name"]
params := lib.SetUtf8Charset(bs.Params)
name, ok := params["name"]
if !ok {
name = fmt.Sprintf("%s_%s_%d", bs.MIMEType, bs.MIMESubType, rand.Uint64())
}
mu.Lock()
composer.AddPartAttachment(name, mime, bs.Params, reader)
composer.AddPartAttachment(name, mime, params, reader)
mu.Unlock()
})
}

View File

@ -204,12 +204,13 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error {
}
msg.FetchBodyPart(p, func(reader io.Reader) {
mime := fmt.Sprintf("%s/%s", bs.MIMEType, bs.MIMESubType)
name, ok := bs.Params["name"]
params := lib.SetUtf8Charset(bs.Params)
name, ok := params["name"]
if !ok {
name = fmt.Sprintf("%s_%s_%d", bs.MIMEType, bs.MIMESubType, rand.Uint64())
}
mu.Lock()
composer.AddPartAttachment(name, mime, bs.Params, reader)
composer.AddPartAttachment(name, mime, params, reader)
mu.Unlock()
})
}

View File

@ -7,7 +7,9 @@ import (
"net/http"
"os"
"path/filepath"
"strings"
"git.sr.ht/~rjarry/aerc/logging"
"github.com/emersion/go-message/mail"
"github.com/pkg/errors"
)
@ -134,3 +136,18 @@ func (pa *PartAttachment) WriteTo(w *mail.Writer) error {
}
return nil
}
// SetUtf8Charset sets the charset in a params map to UTF-8.
func SetUtf8Charset(origParams map[string]string) map[string]string {
params := make(map[string]string)
for k, v := range origParams {
switch strings.ToLower(k) {
case "charset":
logging.Infof("substitute charset %s with utf-8", v)
params[k] = "utf-8"
default:
params[k] = v
}
}
return params
}