aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Jarry <robin@jarry.cc>2023-07-04 17:09:27 +0200
committerRobin Jarry <robin@jarry.cc>2023-07-17 10:23:54 +0200
commitcf061e1b0b536da1cc401c19af456ea373c47e6e (patch)
tree517611bf2bc11aeb7e3b2c097451616cc0ea30e9
parenta9fdf417662bd203dbd923126ad6233e965cfc2d (diff)
downloadaerc-cf061e1b0b536da1cc401c19af456ea373c47e6e.tar.gz
aerc-cf061e1b0b536da1cc401c19af456ea373c47e6e.zip
compose: always use cr-lf line endings
.eml files are universally formatted with DOS line-endings, per RFC5322. Make sure to replace line endings with CRLF before sending the message. Always present CRLF files to the text editor. If the editor forces LF line endings, convert them back to CRLF. Text editors (vim and nvim at least) detect the .eml extension and force dos line endings. Emacs seems not to care and will use whatever line endings are present in the file. Kakoune seems to force unix line endings and does not care about the contents of the file. Notes: * add explicit calls to Truncate() to ensure any trailing content is stripped from the file when overwriting with shorter content. * NewCRLFReader cannot be reused since we need buffered and unbuffered versions of it (for GetBody and {Set,append}Contents, respectively). Link: https://datatracker.ietf.org/doc/html/rfc5322 Link: https://github.com/vim/vim/blob/v8.2.3583/runtime/ftplugin/mail.vim#L29-L35 Link: https://github.com/neovim/neovim/blob/v0.6.0/runtime/ftplugin/mail.vim#L29-L35 Signed-off-by: Robin Jarry <robin@jarry.cc> Tested-by: Bence Ferdinandy <bence@ferdinandy.com> Tested-by: Koni Marti <koni.marti@gmail.com>
-rw-r--r--widgets/compose.go48
1 files changed, 32 insertions, 16 deletions
diff --git a/widgets/compose.go b/widgets/compose.go
index a243ba95..371e0839 100644
--- a/widgets/compose.go
+++ b/widgets/compose.go
@@ -428,6 +428,21 @@ func (c *Composer) updateCrypto() error {
return nil
}
+func (c *Composer) writeCRLF(reader io.Reader) error {
+ // .eml files must always use '\r\n' line endings
+ scanner := bufio.NewScanner(reader)
+ for scanner.Scan() {
+ _, err := c.email.WriteString(scanner.Text() + "\r\n")
+ if err != nil {
+ return err
+ }
+ }
+ if scanner.Err() != nil {
+ return scanner.Err()
+ }
+ return c.email.Sync()
+}
+
// Note: this does not reload the editor. You must call this before the first
// Draw() call.
func (c *Composer) setContents(reader io.Reader) error {
@@ -435,15 +450,11 @@ func (c *Composer) setContents(reader io.Reader) error {
if err != nil {
return err
}
- _, err = io.Copy(c.email, reader)
- if err != nil {
- return err
- }
- err = c.email.Sync()
+ err = c.email.Truncate(0)
if err != nil {
return err
}
- return nil
+ return c.writeCRLF(reader)
}
func (c *Composer) appendContents(reader io.Reader) error {
@@ -451,15 +462,7 @@ func (c *Composer) appendContents(reader io.Reader) error {
if err != nil {
return err
}
- _, err = io.Copy(c.email, reader)
- if err != nil {
- return err
- }
- err = c.email.Sync()
- if err != nil {
- return err
- }
- return nil
+ return c.writeCRLF(reader)
}
func (c *Composer) AppendPart(mimetype string, params map[string]string, body io.Reader) error {
@@ -609,8 +612,13 @@ func (c *Composer) GetBody() (*bytes.Buffer, error) {
if err != nil {
return nil, err
}
+ scanner := bufio.NewScanner(c.email)
+ // .eml files must always use '\r\n' line endings
buf := new(bytes.Buffer)
- _, err = io.Copy(buf, c.email)
+ for scanner.Scan() {
+ buf.WriteString(scanner.Text() + "\r\n")
+ }
+ err = scanner.Err()
if err != nil {
return nil, err
}
@@ -1068,6 +1076,14 @@ func (c *Composer) ShowTerminal() error {
if c.editor != nil {
return nil
}
+ body, err := c.GetBody()
+ if err != nil {
+ return err
+ }
+ err = c.setContents(body)
+ if err != nil {
+ return err
+ }
if c.review != nil {
c.grid.RemoveChild(c.review)
}