Kevin McCarthy [Fri, 8 Mar 2019 11:48:41 +0000 (19:48 +0800)]
Check noconv for mailcap %{charset} send mode expansion
Improve the previous commit by checking to make sure a->noconv also
isn't set. If noconv is set, we ignore any value a->charset might
have picked up during previous encoding checks.
Kevin McCarthy [Fri, 22 Feb 2019 21:50:52 +0000 (13:50 -0800)]
Add $include_encrypted config to prevent reply-decryption attack
@jensvoid, in cooperation with Ruhr-Uni Bochum and FH Münster,
Germany, reported a possible "Oracle decryption" attack on various
mail clients. An attacker could include previously encrypted contents
they obtained access to, and include it in a message. Replying
without trimming would include the decrypted contents.
This attack relies on several "ifs", and is more dangerous for clients
that compose HTML mail. However, it is still an issue that an
unwary/busy Mutt user could fall for.
Add a new config $include_encrytped, defaulting off, to reduce the
possibility of the user being unaware of previously encrypted parts in
the reply. Only the main initial encrypted part will be included in
the reply.
Andrey Skvortsov [Thu, 21 Feb 2019 13:37:05 +0000 (16:37 +0300)]
Fix truncation of long filenames in attachments
Currently mutt truncates long filenames in attachments and doesn't
take into account UTF-8 character size. If filename is truncated in
the middle of multi-byte UTF-8 character (last character is bad),
then some mail clients assume whole attachment name bad and don't
display its name (use 'Noname' instead).
Filenames can be up to 255 *characters* long depending on used
filesystem. ReiserFS, NFTS, FAT, APFS and some other supports up to
255 characters.
In the worst case 255 characters in UTF-8 will take 255*4 = 1020
bytes. Every non-ascii byte in the filename will be encoded using 3
bytes (for example, %8D).
So 'Content-Disposition' will take in the worst case up to: 1020*3 =
3060 bytes. Therefore even LONG_STRING (1024) isn't enough.
Kevin McCarthy [Mon, 21 Jan 2019 23:19:08 +0000 (15:19 -0800)]
Fix raw socket read/write to follow expected behavior
The mutt_sasl.c code expects conn_write() to write the entire buffer.
This is inconsistent with mutt_socket.c, but since other conn_write()
implementations guarantee this, change raw_socket_write() to do so too
for now.
Also, update reading and writing to loop on EINTR, as gnutls does.
They won't return EAGAIN or EWOULDBLOCK because we don't mark sockets
as non-blocking.
Pietro Cerutti [Thu, 4 Apr 2019 07:28:03 +0000 (07:28 +0000)]
Disable mailbox notify on close
This fixes a crash when two mailboxes have been opened within a session,
and an 'unmailboxes *' command is issued. In this case, both the current
mailbox and the previously opened mailbox have a non-NULL `notify`
member. The notify method assumes the mailbox is currently active within
the context. The context gets thus doubly freed.
Darshit Shah [Tue, 26 Mar 2019 07:40:11 +0000 (08:40 +0100)]
sidebar: New option to display only non-empty mailboxes
Adds a new option $sidebar_only_non_empty_mailboxes which forces neomutt
to display only the mailboxes that have atleast one mail in them. This
option will also work in tandem with the existing $side_new_mail_only
Pietro Cerutti [Fri, 15 Mar 2019 12:27:16 +0000 (12:27 +0000)]
Do not prepend "attach_save_dir" to an absolute path
This happens when saving multiple attachment. Assume `attach_save_dir = ./`.
When saving multiple attachments to `/tmp/att`, the proposed path
becomes `.//tmp/att`.
Kevin McCarthy [Wed, 13 Mar 2019 04:06:11 +0000 (12:06 +0800)]
Fix incorrect IMAP message purging bug.
Thanks to Ivan Middleton @imiddle for the awesome bug report and
suggested fix.
The bug is most easily generated using Gmail with the $trash variable
set.
Deleted messages are first copied to the $trash folder. If this is
set to "[Gmail]/Trash", then Gmail inteprets the copy as a "delete"
and sends EXPUNGE messages back for the messages.
cmd_parse_expunge() and cmd_parse_vanished() set the hdr->index to
INT_MAX, which subsequently an imap_expunge_mailbox() will use to
remove the messages from the local mailbox.
If we close the mailbox instead of sync it, Mutt will end up executing
the 'Deleted' flag setting before processing the expunge (because
"imap_check_mailbox() -> imap_cmd_finish()' doesn't set check_status
when we are closing). The expunged messages will then be included in
the set of 'Deleted' flags.
Unfortunately, because the messages are sorted by *index* before
msgset generation, an incorrect range of UIDs will be sent, which
could easily include messages that should not be deleted.
This fix is a minimal fix for a stable bug fix excluding
messages with the index set to INT_MAX from all msg sets. Other
things that should be investigated in master are:
- sorting by UID instead of index before msgset generation
- unsetting the 'active' flag in cmd_parse_expunge() and
cmd_parse_vanished() instead of waiting until imap_expunge_mailbox()
to do so.