FetchBodyParts: decode source in the workers
Previously the workers returned a mixture of decoded / encoded parts. This lead to a whole bunch of issues. This commit changes the msgviewer and the commands to assume parts to already be decoded
This commit is contained in:
parent
19dfc49481
commit
9096049f75
8 changed files with 29 additions and 117 deletions
commands
|
@ -10,9 +10,6 @@ import (
|
|||
"path"
|
||||
"strings"
|
||||
|
||||
"github.com/emersion/go-message"
|
||||
"github.com/emersion/go-message/mail"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc/models"
|
||||
"git.sr.ht/~sircmpwn/aerc/widgets"
|
||||
"git.sr.ht/~sircmpwn/getopt"
|
||||
|
@ -138,28 +135,9 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
|
||||
// TODO: something more intelligent than fetching the 1st part
|
||||
// TODO: add attachments!
|
||||
store.FetchBodyPart(msg.Uid, []int{1}, func(reader io.Reader) {
|
||||
header := message.Header{}
|
||||
header.SetText(
|
||||
"Content-Transfer-Encoding", msg.BodyStructure.Encoding)
|
||||
header.SetContentType(
|
||||
msg.BodyStructure.MIMEType, msg.BodyStructure.Params)
|
||||
header.SetText("Content-Description", msg.BodyStructure.Description)
|
||||
entity, err := message.New(header, reader)
|
||||
if err != nil {
|
||||
// TODO: Do something with the error
|
||||
addTab()
|
||||
return
|
||||
}
|
||||
mreader := mail.NewReader(entity)
|
||||
part, err := mreader.NextPart()
|
||||
if err != nil {
|
||||
// TODO: Do something with the error
|
||||
addTab()
|
||||
return
|
||||
}
|
||||
store.FetchBodyPart(msg.Uid, msg.BodyStructure, []int{1}, func(reader io.Reader) {
|
||||
buf := new(bytes.Buffer)
|
||||
buf.ReadFrom(part.Body)
|
||||
buf.ReadFrom(reader)
|
||||
defaults["Original"] = buf.String()
|
||||
addTab()
|
||||
})
|
||||
|
|
|
@ -1,13 +1,10 @@
|
|||
package msg
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"mime/quotedprintable"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc/commands"
|
||||
|
@ -129,14 +126,7 @@ func (Pipe) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
})
|
||||
} else if pipePart {
|
||||
p := provider.SelectedMessagePart()
|
||||
p.Store.FetchBodyPart(p.Msg.Uid, p.Index, func(reader io.Reader) {
|
||||
// email parts are encoded as 7bit (plaintext), quoted-printable, or base64
|
||||
if strings.EqualFold(p.Part.Encoding, "base64") {
|
||||
reader = base64.NewDecoder(base64.StdEncoding, reader)
|
||||
} else if strings.EqualFold(p.Part.Encoding, "quoted-printable") {
|
||||
reader = quotedprintable.NewReader(reader)
|
||||
}
|
||||
|
||||
p.Store.FetchBodyPart(p.Msg.Uid, p.Msg.BodyStructure, p.Index, func(reader io.Reader) {
|
||||
if background {
|
||||
doExec(reader)
|
||||
} else {
|
||||
|
|
|
@ -9,9 +9,6 @@ import (
|
|||
"strings"
|
||||
|
||||
"git.sr.ht/~sircmpwn/getopt"
|
||||
"github.com/emersion/go-message"
|
||||
_ "github.com/emersion/go-message/charset"
|
||||
"github.com/emersion/go-message/mail"
|
||||
|
||||
"git.sr.ht/~sircmpwn/aerc/models"
|
||||
"git.sr.ht/~sircmpwn/aerc/widgets"
|
||||
|
@ -155,56 +152,9 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
template = aerc.Config().Templates.QuotedReply
|
||||
}
|
||||
|
||||
store.FetchBodyPart(msg.Uid, []int{1}, func(reader io.Reader) {
|
||||
header := message.Header{}
|
||||
if len(msg.BodyStructure.Parts) > 0 {
|
||||
partID := 0 // TODO: will we always choose first msg part?
|
||||
header.SetText(
|
||||
"Content-Transfer-Encoding", msg.BodyStructure.Parts[partID].Encoding)
|
||||
if msg.BodyStructure.Parts[partID].MIMESubType == "" {
|
||||
header.SetContentType(
|
||||
msg.BodyStructure.Parts[partID].MIMEType,
|
||||
msg.BodyStructure.Parts[partID].Params)
|
||||
} else {
|
||||
// include SubType if defined (text/plain, text/html, ...)
|
||||
header.SetContentType(
|
||||
fmt.Sprintf("%s/%s", msg.BodyStructure.Parts[partID].MIMEType,
|
||||
msg.BodyStructure.Parts[partID].MIMESubType),
|
||||
msg.BodyStructure.Parts[partID].Params)
|
||||
}
|
||||
header.SetText("Content-Description", msg.BodyStructure.Parts[partID].Description)
|
||||
} else { // Parts has no headers, so we use global headers info
|
||||
header.SetText(
|
||||
"Content-Transfer-Encoding", msg.BodyStructure.Encoding)
|
||||
if msg.BodyStructure.MIMESubType == "" {
|
||||
header.SetContentType(
|
||||
msg.BodyStructure.MIMEType,
|
||||
msg.BodyStructure.Params)
|
||||
} else {
|
||||
// include SubType if defined (text/plain, text/html, ...)
|
||||
header.SetContentType(
|
||||
fmt.Sprintf("%s/%s", msg.BodyStructure.MIMEType,
|
||||
msg.BodyStructure.MIMESubType),
|
||||
msg.BodyStructure.Params)
|
||||
}
|
||||
header.SetText("Content-Description", msg.BodyStructure.Description)
|
||||
}
|
||||
entity, err := message.New(header, reader)
|
||||
if err != nil {
|
||||
// TODO: Do something with the error
|
||||
addTab()
|
||||
return
|
||||
}
|
||||
mreader := mail.NewReader(entity)
|
||||
part, err := mreader.NextPart()
|
||||
if err != nil {
|
||||
// TODO: Do something with the error
|
||||
addTab()
|
||||
return
|
||||
}
|
||||
|
||||
store.FetchBodyPart(msg.Uid, msg.BodyStructure, []int{1}, func(reader io.Reader) {
|
||||
buf := new(bytes.Buffer)
|
||||
buf.ReadFrom(part.Body)
|
||||
buf.ReadFrom(reader)
|
||||
defaults["Original"] = buf.String()
|
||||
addTab()
|
||||
})
|
||||
|
@ -214,6 +164,7 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
}
|
||||
}
|
||||
|
||||
//TODO (RPB): unused function
|
||||
func findPlaintext(bs *models.BodyStructure,
|
||||
path []int) (*models.BodyStructure, []int) {
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ func (Open) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
mv := aerc.SelectedTab().(*widgets.MessageViewer)
|
||||
p := mv.SelectedMessagePart()
|
||||
|
||||
p.Store.FetchBodyPart(p.Msg.Uid, p.Index, func(reader io.Reader) {
|
||||
p.Store.FetchBodyPart(p.Msg.Uid, p.Msg.BodyStructure, p.Index, func(reader io.Reader) {
|
||||
// email parts are encoded as 7bit (plaintext), quoted-printable, or base64
|
||||
|
||||
if strings.EqualFold(p.Part.Encoding, "base64") {
|
||||
|
|
|
@ -60,7 +60,7 @@ func (Save) Execute(aerc *widgets.Aerc, args []string) error {
|
|||
mv := aerc.SelectedTab().(*widgets.MessageViewer)
|
||||
p := mv.SelectedMessagePart()
|
||||
|
||||
p.Store.FetchBodyPart(p.Msg.Uid, p.Index, func(reader io.Reader) {
|
||||
p.Store.FetchBodyPart(p.Msg.Uid, p.Msg.BodyStructure, p.Index, func(reader io.Reader) {
|
||||
// email parts are encoded as 7bit (plaintext), quoted-printable, or base64
|
||||
|
||||
if strings.EqualFold(p.Part.Encoding, "base64") {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue