From c574a838fa89bf46bf7188442f400b206b04df95 Mon Sep 17 00:00:00 2001 From: Reto Brunner Date: Fri, 19 Jun 2020 17:58:08 +0200 Subject: Remove hard coded bodystruct path everywhere Aerc usually used the path []int{1} if it didn't know what the proper path is. However this only works for multipart messages and breaks if it isn't one. This patch removes all the hard coding and extracts the necessary helpers to lib. --- commands/msg/forward.go | 9 ++++----- commands/msg/recall.go | 4 ++-- commands/msg/reply.go | 13 ++++++------- commands/msg/utils.go | 32 -------------------------------- 4 files changed, 12 insertions(+), 46 deletions(-) (limited to 'commands') diff --git a/commands/msg/forward.go b/commands/msg/forward.go index 5f4da5c..3ff0194 100644 --- a/commands/msg/forward.go +++ b/commands/msg/forward.go @@ -10,6 +10,7 @@ import ( "path" "strings" + "git.sr.ht/~sircmpwn/aerc/lib" "git.sr.ht/~sircmpwn/aerc/models" "git.sr.ht/~sircmpwn/aerc/widgets" "git.sr.ht/~sircmpwn/aerc/worker/types" @@ -137,12 +138,10 @@ func (forward) Execute(aerc *widgets.Aerc, args []string) error { } // TODO: add attachments! - part := findPlaintext(msg.BodyStructure, nil) + part := lib.FindPlaintext(msg.BodyStructure, nil) if part == nil { - part = findFirstNonMultipart(msg.BodyStructure, nil) - if part == nil { - part = []int{1} - } + part = lib.FindFirstNonMultipart(msg.BodyStructure, nil) + // if it's still nil here, we don't have a multipart msg, that's fine } store.FetchBodyPart(msg.Uid, part, func(reader io.Reader) { buf := new(bytes.Buffer) diff --git a/commands/msg/recall.go b/commands/msg/recall.go index 7c9ac19..5212041 100644 --- a/commands/msg/recall.go +++ b/commands/msg/recall.go @@ -8,6 +8,7 @@ import ( "github.com/emersion/go-message/mail" "github.com/pkg/errors" + "git.sr.ht/~sircmpwn/aerc/lib" "git.sr.ht/~sircmpwn/aerc/models" "git.sr.ht/~sircmpwn/aerc/widgets" "git.sr.ht/~sircmpwn/aerc/worker/types" @@ -107,12 +108,11 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error { part *models.BodyStructure ) if len(msgInfo.BodyStructure.Parts) != 0 { - path = findPlaintext(msgInfo.BodyStructure, path) + path = lib.FindPlaintext(msgInfo.BodyStructure, path) } part, err = msgInfo.BodyStructure.PartAtIndex(path) if part == nil || err != nil { part = msgInfo.BodyStructure - path = []int{1} } store.FetchBodyPart(msgInfo.Uid, path, func(reader io.Reader) { diff --git a/commands/msg/reply.go b/commands/msg/reply.go index 1deab31..6fd6141 100644 --- a/commands/msg/reply.go +++ b/commands/msg/reply.go @@ -10,6 +10,7 @@ import ( "git.sr.ht/~sircmpwn/getopt" + "git.sr.ht/~sircmpwn/aerc/lib" "git.sr.ht/~sircmpwn/aerc/models" "git.sr.ht/~sircmpwn/aerc/widgets" ) @@ -169,14 +170,12 @@ func (reply) Execute(aerc *widgets.Aerc, args []string) error { template = aerc.Config().Templates.QuotedReply } - part := findPlaintext(msg.BodyStructure, nil) + part := lib.FindPlaintext(msg.BodyStructure, nil) if part == nil { - //mkey... let's get the first thing that isn't a container - part = findFirstNonMultipart(msg.BodyStructure, nil) - if part == nil { - // give up, use whatever is first - part = []int{1} - } + // mkey... let's get the first thing that isn't a container + // if that's still nil it's either not a multipart msg (ok) or + // broken (containers only) + part = lib.FindFirstNonMultipart(msg.BodyStructure, nil) } store.FetchBodyPart(msg.Uid, part, func(reader io.Reader) { buf := new(bytes.Buffer) diff --git a/commands/msg/utils.go b/commands/msg/utils.go index 5eb5fe5..cad0f82 100644 --- a/commands/msg/utils.go +++ b/commands/msg/utils.go @@ -2,7 +2,6 @@ package msg import ( "errors" - "strings" "git.sr.ht/~sircmpwn/aerc/commands" "git.sr.ht/~sircmpwn/aerc/lib" @@ -49,34 +48,3 @@ func (h *helper) messages() ([]*models.MessageInfo, error) { } return commands.MsgInfoFromUids(store, uid) } - -func findPlaintext(bs *models.BodyStructure, path []int) []int { - for i, part := range bs.Parts { - cur := append(path, i+1) - if strings.ToLower(part.MIMEType) == "text" && - strings.ToLower(part.MIMESubType) == "plain" { - return cur - } - if strings.ToLower(part.MIMEType) == "multipart" { - if path := findPlaintext(part, cur); path != nil { - return path - } - } - } - return nil -} - -func findFirstNonMultipart(bs *models.BodyStructure, path []int) []int { - for i, part := range bs.Parts { - cur := append(path, i+1) - mimetype := strings.ToLower(part.MIMEType) - if mimetype != "multipart" { - return path - } else if mimetype == "multipart" { - if path := findPlaintext(part, cur); path != nil { - return path - } - } - } - return nil -} -- cgit v1.2.3