Brandon Long [Mon, 11 Jun 2018 17:39:49 +0000 (10:39 -0700)]
Initial support for OAUTHBEARER for IMAP.
Gmail supports RFC 7628 for using OAUTH with IMAP, and they really don't
like you using password based auth. You can still enable "less secure
apps" and then generate an application specific password, but I figured it
was time to support it.
Being mutt, I punted on some of the "hard" work to an external script, ie
getting/refreshing the OAUTH tokens. This avoids the issue of how do you
have a client-id and client-secret for an open source project, and the fact
that OAUTH discovery is still nascent, so you'd likely need separate things
for each of the providers.
At least for Gmail, you can use the oauth2.py script from Google's
gmail-oauth2-tools:
https://github.com/google/gmail-oauth2-tools/blob/master/python/oauth2.py
You'd need to get your own oauth client credentials for Gmail here:
https://console.developers.google.com/apis/credentials
Then, you'd use oauth2.py with --generate_oauth2_token to get a refresh
token, and configure mutt with:
set imap_authenticators="oauthbearer"
set imap_user="<email_address>"
set imap_pass=`/path/to/oauth2.py --quiet --user=<email_address>
--client_id=<client_id> --client_secret=<client_secret>
--refresh_token=<refresh_token>`
For this patch, I didn't add any new configuration, but I'm open to
suggestions on that.
The patch also only support SASL-IR to reduce round-trips to the server,
but it's certainly possible to change that if we think there are
OAUTHBEARER IMAP servers that don't support SASL-IR. It also requires the
connection to be encrypted as the access token is re-usable for an hour or
so. Again, Gmail only allows encrypted IMAP connections, not sure if any
OAUTHBEARER services allow non-encrypted.
Turns out that auth failure leaves you in SASL mode, so I have a hack to
issue a noop command on error. Not sure if that's just OAUTHBEARER
oddness, or whether I should be using lower level mutt imap functions.
Kevin McCarthy [Wed, 6 Jun 2018 00:38:44 +0000 (17:38 -0700)]
Quick fix for ncurses buffering issue with inotify polling.
Ncurses does its own buffering for some character sequences, notable
Esc-prefixed input. Add a non-blocking check for getch() before
performing the mutt_monitor_poll() call.
This is a quick fix, which I'll clean up more later.
Kevin McCarthy [Tue, 5 Jun 2018 04:31:33 +0000 (21:31 -0700)]
Add GnuPG status fd checks for inline pgp.
The difficulty is that "BEGIN PGP MESSAGE" could be a signed and
armored part, so we can't fail hard if it isn't encrypted.
Change pgp_check_decryption_okay() to return more status codes, with
>=0 indicating an actual decryption; -2 and -1 indicating plaintext
found; and -3 indicating an actual DECRYPTION_FAILED status code seen.
Fail hard on -3, but change the message for -2 and -1 to indicate the
message was not encrypted.
Kevin McCarthy [Mon, 4 Jun 2018 22:40:57 +0000 (15:40 -0700)]
Add $pgp_check_gpg_decrypt_status_fd.
If set (the default) mutt performs more thorough checking of the
$pgp_decrypt_command status output for GnuPG result codes.
Ticket #39 revealed that GnuPG (currently) does not protect against
messages that have been manipulated to contain an empty encryption
packet followed by a plaintext packet.
A huge thanks to Marcus Brinkmann for researching this issue, taking
the time to report it to us (and the GnuPG team), and taking even more
time to clarify exactly what needed to be checked for.
Kevin McCarthy [Mon, 4 Jun 2018 01:34:21 +0000 (18:34 -0700)]
Add new timeout functions to work with inotify monitors.
The ncurses timeout() function doesn't affect the new poll inside
mutt_monitor_poll(). This meant that $imap_keepalive and $timeout
were not being respected when the monitor was used.
Create mutt_getch_timeout(), which delegates to timeout() and sets a
timeout value mutt_monitor_poll() uses too.
Kevin McCarthy [Sun, 3 Jun 2018 21:52:37 +0000 (14:52 -0700)]
Revert showing real size for small files in mutt_pretty_size().
I thought the change made in 0fa64ba9 was small enough not to matter,
but at least one long-time user took the time to track down the change
and request it be reverted.
Kevin McCarthy [Sun, 3 Jun 2018 21:05:13 +0000 (14:05 -0700)]
Change direct mutt_getch() callers to handle new mail event.
The inotify handler now returns -2 (timeout) on a new mail event.
Change the direct callers to ignore, so prompts aren't strangely
aborted.
Also, fix mutt_change_flag() to call mutt_refresh() before the
prompt. Apparently ncurses getch() was doing this for us, but now
that we are polling STDIN instead, the prompt wasn't displaying.
Kevin McCarthy [Mon, 21 May 2018 20:33:14 +0000 (13:33 -0700)]
Fix mutt_strncmp size comparison for 'uncolor header'.
Thanks to Fabian Groffen for pointing out the discrepancy.
mutt_extract_token() null-terminates the token,, so actually there is
no need to use "strncmp" for the comparison in this case.
However, since the token is being checked against Fields there is no
potential harm of a prefix match, so we should fix the number to be
consistent with the other token comparisons.
Kevin McCarthy [Sat, 28 Apr 2018 20:21:42 +0000 (13:21 -0700)]
Update pattern documentation.
Note that ~b, ~B, ~h, ~M, and ~X read the message in, and that this
can be much slower.
Change =b, =B, =h table rows to document just the IMAP behavior. The
"=" simple string behavior is already covered below, and makes it less
obvious whether "***)" should be added to those entries in the table.
Break up the simple string and imap server-side matching explanation
into two paragraphs.
Add ~M to the list of patterns you can't use message scoring with.
Add equivalent, if briefer, explanations to the muttrc.man page.
Kevin McCarthy [Mon, 30 Apr 2018 23:17:52 +0000 (16:17 -0700)]
Add more explanation of known vs subscribed lists to manual.
Mention in both the "Mailing Lists" and "Handling Mailing Lists"
sections the difference between known and subscribed mailing lists.
Note that the Mail-Followup-To header is generated if any of the
recipients are known mailing lists. If any of those are subscribed
mailing lists, the sender's address will not be in the header. If all
of them are known (but not subscribed), the sender's address will be
added to the header.
Kevin McCarthy [Thu, 19 Apr 2018 20:51:07 +0000 (13:51 -0700)]
Add $browser_abbreviate_mailboxes.
This allows '=' and '~' mailboxes shortcuts to be turned off in the
browser mailbox list.
The default $sort_browser value of "alpha" uses strcoll(3), which
ignores some punctuation. When using multiple accounts with
dynamically changing values of $folder, this can lead to an
unintuitive sorting order. (See issue #22 for an example.)
This problem came about because of commit 8328ce68, which enabled
mutt_pretty_mailbox() calls for IMAP and POP mailboxes too. The
commit had a valid point about consistency and too-wide mailbox
listings, so I don't really want to revert it.
This option provides an alternative to completely enable/disable the
shortcuts for those who run into an issue.
Kevin McCarthy [Sat, 14 Apr 2018 03:39:35 +0000 (20:39 -0700)]
Improve gss debug printing of status_string.
Commit f52ee2f7 ensured the debug strings were properly '\0'
terminated. However, it did not prevent the strncpy from reading past
the end of the status_string.value data; it simply capped it
afterwards. Improve the code so it only reads up to
status_string.length without overwriting the buffer.
Kevin McCarthy [Sat, 14 Apr 2018 02:03:29 +0000 (19:03 -0700)]
Remove trailing null count from gss_buffer_desc.length field.
RFC 2744 section 3.2.2 clearly states that trailing NULL characters
are not to be included in the length field, and are not to be assumed
to be present in the value field.
Thanks to Greg Hudson, who recently debugged this same issue with
fetchmail, and kindly took the time to look at Mutt's code too.
Kevin McCarthy [Sun, 8 Apr 2018 22:37:09 +0000 (15:37 -0700)]
Rename _regex.h to _mutt_regex.h to avoid name collision on Macs.
On Macs, <regex.h> includes <_regex.h>. Because Mutt defines '-I .'
during compilation, our bundled version of _regex.h was being used
instead of the system one.
I have no idea how it managed to work before, but starting in Xcode
9.3, the differences in struct size and fields started to produce a
crash and other strange behavior.
The real issue is our use of '-I .' during compilation, which allows
our local headers to override system ones. An easier fix for now is
to rename the header.
Many thanks to Charles Diza, Christian Ebert, and Fabian Groffen for
their help trying things out and helping to debug the problem.
Also, a huge thanks to Steve Karmeinsky for allowing me to ssh in to
his Mac so I could track down the underlying issue.
Kevin McCarthy [Mon, 2 Apr 2018 18:30:31 +0000 (11:30 -0700)]
configure: check for tinfo matching ncurses
When we selected ncursesw, look for tinfow as well. Since ncurses-6.1
the binary compatibility between tinfo and tinfow disappeared, resulting
in crashes and other odd behaviour.
This change checks for tinfo or tinfow based on which ncurses we found
to continue with.
https://bugs.gentoo.org/651552
[Thanks to Fabian Groffen for the patch. I made a minor modification
to fall back to tinfo because pre-6.1 systems may not have a tinfow
but still need tinfo to compile.]
Kevin McCarthy [Sat, 24 Mar 2018 22:10:13 +0000 (15:10 -0700)]
Increase account.user/login size to 128.
Like the pass field in commit 52949004, the existing size was
insufficient for the reporter of issue #18. For now, just bump up the
size, but I'll move up looking into making these dynamically sized.
Kevin McCarthy [Fri, 23 Mar 2018 03:23:46 +0000 (20:23 -0700)]
Remove dead code in pgp.c
pgp_extract_keys_from_messages() has been subsumed by
crypt_extract_keys_from_messages(). The function had incorrect
multi-bit flag comparisons, but since it's dead code, remove it
instead.
Kevin McCarthy [Fri, 23 Mar 2018 03:04:46 +0000 (20:04 -0700)]
Fix comparison of flags with multiple bits set.
PGPENCRYPT, PGPKEY, SMIMEENCRYPT, and SMIMEOPAQUE are all combination
flags, with multiple bits set. In a few places these flags were
bitwise-and'ed incorrectly: expecting a non-zero result to indicate
all the bits in the flag were set. Change those to explicitly compare
the result against the original flag.
Kevin McCarthy [Thu, 22 Mar 2018 16:32:31 +0000 (09:32 -0700)]
Fix s/mime non-detached signature handling.
This fix is based on stbuehler's patch from
https://dev.gnupg.org/T2919.
Recent versions of gpgme seem to terminate the connection for a
protocol error. stbuehler's analysis is that this is actually a
gpgme bug, but recreating the context works around the problem.
Kevin McCarthy [Sun, 11 Mar 2018 19:48:46 +0000 (12:48 -0700)]
Add $abort_noattach and $abort_noattach_regexp options.
$abort_noattach_regexp is matched against the body of a message. If
so, the $abort_noattach quadoption is used to prompt whether to abort
sending.
Thanks to Antonio Radici for bringing the original version of the
patch to our attention, which he pulled from
https://github.com/tlvince/pkgbuild/blob/master/mutt-kiss/mutt-attach.patch
This version was rewritten to use a regexp, to fix a few issues, and
to better fit in with Mutt styles and conventions.
Kevin McCarthy [Thu, 22 Feb 2018 02:25:37 +0000 (18:25 -0800)]
Fix is_from() year parsing to abort on year overflow.
Unlike mutt_parse_date(), is_from() was not checking for overflow, and
could end up passing a negative year to mutt_mktime().
It should perhaps be changed to use mutt_atoi(), which does better
range checking, but that requires mutt_atoi() being changed to allow
trailing characters and its callers return value checks being
updated. I'll put that on the todo list.
Kevin McCarthy [Thu, 22 Feb 2018 02:18:53 +0000 (18:18 -0800)]
Cap parsed years at 9999 when converting to time_t.
Large year values, even those less than INT_MAX, apparently can cause
gmtime() and localtime() to return NULL. Mutt needs larger changes
checking and handling those errors, but this will prevent the
immediately triggerable issue.
Kevin McCarthy [Sun, 4 Feb 2018 02:08:28 +0000 (18:08 -0800)]
Add history-search function, bound to ctrl-r.
Create a very basic "search history" functionality in the line editor.
It uses the current input, and searches backward through history. If
there is one match, it immediately uses that otherwise it pops up a
simple menu of matches.
Kevin McCarthy [Thu, 1 Feb 2018 19:10:01 +0000 (11:10 -0800)]
Add stub flea and muttbug scripts back.
It was rightfully pointed out that the removal was too abrupt. These
programs have been around for a long time, and many internet searches
still say to use them for reporting bugs.
Add stub versions which inform to use the gitlab url instead.