diff options
-rw-r--r-- | commands/msg/recall.go | 125 |
1 files changed, 70 insertions, 55 deletions
diff --git a/commands/msg/recall.go b/commands/msg/recall.go index 8a70a0a1..b59372a6 100644 --- a/commands/msg/recall.go +++ b/commands/msg/recall.go @@ -139,67 +139,82 @@ func (Recall) Execute(aerc *widgets.Aerc, args []string) error { }) } - // find the main body part and add it to the editor - // TODO: copy all parts of the message over? - var ( - path []int - part *models.BodyStructure - ) - if len(msgInfo.BodyStructure.Parts) != 0 { - path = lib.FindPlaintext(msgInfo.BodyStructure, path) - } - part, err = msgInfo.BodyStructure.PartAtIndex(path) - if part == nil || err != nil { - part = msgInfo.BodyStructure - } + lib.NewMessageStoreView(msgInfo, store, aerc.Crypto, aerc.DecryptKeys, + func(msg lib.MessageView, err error) { + if err != nil { + aerc.PushError(err.Error()) + return + } - store.FetchBodyPart(msgInfo.Uid, path, func(reader io.Reader) { - header := message.Header{} - header.SetText( - "Content-Transfer-Encoding", part.Encoding) - header.SetContentType(part.MIMEType, part.Params) - header.SetText("Content-Description", part.Description) - entity, err := message.New(header, reader) - if err != nil { - aerc.PushError(err.Error()) - addTab() - return - } - mreader := mail.NewReader(entity) - part, err := mreader.NextPart() - if err != nil { - aerc.PushError(err.Error()) - addTab() - return - } - composer.SetContents(part.Body) - addTab() - - // add attachements if present - var mu sync.Mutex - parts := lib.FindAllNonMultipart(msgInfo.BodyStructure, nil, nil) - for _, p := range parts { - if lib.EqualParts(p, path) { - continue + var ( + path []int + part *models.BodyStructure + ) + if len(msg.BodyStructure().Parts) != 0 { + path = lib.FindPlaintext(msg.BodyStructure(), path) } - bs, err := msgInfo.BodyStructure.PartAtIndex(p) - if err != nil { - acct.Logger().Println("recall: PartAtIndex:", err) - continue + part, err = msg.BodyStructure().PartAtIndex(path) + if part == nil || err != nil { + part = msg.BodyStructure() } - store.FetchBodyPart(msgInfo.Uid, p, func(reader io.Reader) { - mime := fmt.Sprintf("%s/%s", bs.MIMEType, bs.MIMESubType) - name, ok := bs.Params["name"] - if !ok { - name = fmt.Sprintf("%s_%s_%d", bs.MIMEType, bs.MIMESubType, rand.Uint64()) + + msg.FetchBodyPart(path, func(reader io.Reader) { + header := message.Header{} + header.SetText( + "Content-Transfer-Encoding", part.Encoding) + header.SetContentType(part.MIMEType, part.Params) + header.SetText("Content-Description", part.Description) + entity, err := message.New(header, reader) + if err != nil { + aerc.PushError(err.Error()) + addTab() + return + } + mreader := mail.NewReader(entity) + part, err := mreader.NextPart() + if err != nil { + aerc.PushError(err.Error()) + addTab() + return } - mu.Lock() - composer.AddPartAttachment(name, mime, bs.Params, reader) - mu.Unlock() + composer.SetContents(part.Body) + if md := msg.MessageDetails(); md != nil { + if md.IsEncrypted { + composer.SetEncrypt(md.IsEncrypted) + } + if md.IsSigned { + composer.SetSign(md.IsSigned) + } + } + addTab() + + // add attachements if present + var mu sync.Mutex + parts := lib.FindAllNonMultipart(msg.BodyStructure(), nil, nil) + for _, p := range parts { + if lib.EqualParts(p, path) { + continue + } + bs, err := msg.BodyStructure().PartAtIndex(p) + if err != nil { + acct.Logger().Println("recall: PartAtIndex:", err) + continue + } + msg.FetchBodyPart(p, func(reader io.Reader) { + mime := fmt.Sprintf("%s/%s", bs.MIMEType, bs.MIMESubType) + name, ok := bs.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) + mu.Unlock() + }) + } + }) - } - }) + }) return nil } |