mirror of
https://git.sr.ht/~rjarry/aerc
synced 2026-03-06 18:23:44 +01:00
open: preserve the original filename
Change the name of the temporary file that is :open'ed using the system handler from `aerc-<randint>.ext` to `aerc-<randint>/<actual-filename.ext>`. This preserves the original filename, while retaining collision avoidance and the current base location (os.TempDir()). Changelog-changed: `:open` commands now preserve the original filename. Signed-off-by: Maarten Aertsen <maarten@nlnetlabs.nl> Tested-by: Bence Ferdinandy <bence@ferdinandy.com> Acked-by: Robin Jarry <robin@jarry.cc>
This commit is contained in:
committed by
Robin Jarry
parent
777bbb77e8
commit
d99c49de2f
@@ -3,7 +3,6 @@ package msgview
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"mime"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
@@ -42,23 +41,21 @@ func (o Open) Execute(args []string) error {
|
||||
p := mv.SelectedMessagePart()
|
||||
|
||||
mv.MessageView().FetchBodyPart(p.Index, func(reader io.Reader) {
|
||||
extension := ""
|
||||
mimeType := ""
|
||||
|
||||
// try to determine the correct extension
|
||||
if part, err := mv.MessageView().BodyStructure().PartAtIndex(p.Index); err == nil {
|
||||
mimeType = part.FullMIMEType()
|
||||
// see if we can get extension directly from the attachment name
|
||||
extension = filepath.Ext(part.FileName())
|
||||
// if there is no extension, try using the attachment mime type instead
|
||||
if extension == "" {
|
||||
if exts, _ := mime.ExtensionsByType(mimeType); len(exts) > 0 {
|
||||
extension = exts[0]
|
||||
}
|
||||
}
|
||||
part, err := mv.MessageView().BodyStructure().PartAtIndex(p.Index)
|
||||
if err != nil {
|
||||
app.PushError(err.Error())
|
||||
return
|
||||
}
|
||||
mimeType = part.FullMIMEType()
|
||||
|
||||
tmpFile, err := os.CreateTemp(os.TempDir(), "aerc-*"+extension)
|
||||
tmpDir, err := os.MkdirTemp(os.TempDir(), "aerc-*")
|
||||
if err != nil {
|
||||
app.PushError(err.Error())
|
||||
return
|
||||
}
|
||||
tmpFile, err := os.Create(filepath.Join(tmpDir, part.FileName()))
|
||||
if err != nil {
|
||||
app.PushError(err.Error())
|
||||
return
|
||||
@@ -74,7 +71,7 @@ func (o Open) Execute(args []string) error {
|
||||
go func() {
|
||||
defer log.PanicHandler()
|
||||
if o.Delete {
|
||||
defer os.Remove(tmpFile.Name())
|
||||
defer os.RemoveAll(tmpDir)
|
||||
}
|
||||
err = lib.XDGOpenMime(tmpFile.Name(), mimeType, o.Cmd)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user