]>
git.ipfire.org Git - thirdparty/dovecot/core.git/log
Timo Sirainen [Wed, 14 Jun 2017 08:47:00 +0000 (11:47 +0300)]
imap-login: Remove duplicate spaces between ID x-forward parameters
Timo Sirainen [Wed, 14 Jun 2017 07:50:38 +0000 (10:50 +0300)]
imap-login: Fix crash in ID if trusted client sends NIL value to internal field
Fixes:
Panic: imap-login: file imap-login-client.c: line 215 (cmd_id_handle_keyvalue): assertion failed: (client_id_str == !client_id_reserved_word(key))
Timo Sirainen [Tue, 13 Jun 2017 19:14:11 +0000 (22:14 +0300)]
lib-index: Fix cache lookups from uncommitted transactions with in-memory indexes
This especially fixes mail_get_header_stream() with imapc and
imapc_features=fetch-headers, because it works by first fetching the
specific headers and putting them to the cache transaction, then later on
relying on index_mail_get_header_stream() to get them from the transaction.
Before this fix they wouldn't be found, which triggered another unnecessary
FETCH BODY.PEEK[HEADER].
Timo Sirainen [Tue, 13 Jun 2017 18:54:00 +0000 (21:54 +0300)]
lib-mail: istream-header-filter - Fix HEADER_FILTER_ADD_MISSING_EOH with empty input
The result for "" should be "\n", not "\n\n". The second "\n" would belong
to the mail body.
This fixes calculating hashes for incremental dsync when mail didn't have
Date or Message-ID headers, resulting in e.g.:
Warning: Deleting mailbox 'INBOX': UID=1 already exists locally for a different mail: Headers hashes don't match (
e1c06d85ae7b8b032bef47e42e4c08f9 vs
68b329da9893e34099c7d8ad5cb9c940 )
Timo Sirainen [Wed, 14 Jun 2017 00:21:19 +0000 (03:21 +0300)]
lib: istream-seekable - Fix reading when parent stream's content is larger than max_buffer_size
When writing the parent stream to fd and trying to read it back, it would
try to enforce the max_buffer_size and fail with:
istream-seekable: Couldn't read back in-memory input ...: buffer full
But since the data was already in buffer, istream-seekable shouldn't try to
enforce it at this point anymore.
Timo Sirainen [Mon, 12 Jun 2017 20:45:05 +0000 (23:45 +0300)]
push-notification: Switch to main ioloop while calling drivers' commit callbacks
There aren't any guarantees what ioloop happens to be active at the time
the commit is called. The active ioloop can also be destroyed early on,
which can cause an I/O leak and crashes later on.
Timo Sirainen [Fri, 9 Jun 2017 15:10:14 +0000 (18:10 +0300)]
mail-crypt-acl: Fix assert-crash due to missing namespace initialization
This was broken by
e031d9aaae59a9f79710dc1138b76b69272615a3 .
Josef 'Jeff' Sipek [Tue, 23 May 2017 11:12:49 +0000 (14:12 +0300)]
pop3: send back auth reply sooner
If possible (i.e., pop3_lock_session=no), we can send back the OK
response earlier.
Josef 'Jeff' Sipek [Tue, 23 May 2017 10:01:48 +0000 (13:01 +0300)]
pop3: initialize namespaces explicitly
(instead of relying on mail user initialization to instantiate them for
us)
Josef 'Jeff' Sipek [Fri, 19 May 2017 07:58:18 +0000 (10:58 +0300)]
pop3: client_create_from_input shouldn't process input
This makes the pop3 code resemble the imap code more. Making the subsequent
changes easier.
Josef 'Jeff' Sipek [Fri, 19 May 2017 07:51:22 +0000 (10:51 +0300)]
pop3: client_create_from_input should return the client struct
This makes the code more similar to imap's, making subsequent changes
easier.
Josef 'Jeff' Sipek [Fri, 19 May 2017 07:46:05 +0000 (10:46 +0300)]
pop3: rename login_client_connected() client arg to login_client
This makes the next commit cleaner.
Josef 'Jeff' Sipek [Fri, 19 May 2017 07:42:03 +0000 (10:42 +0300)]
pop3: move pop3 session locking out of client_create
As a result, we can directly return the client structure (instead of
passing it back via a _r arg).
This makes the pop3 client_create look more like the imap version.
Timo Sirainen [Tue, 30 May 2017 13:57:45 +0000 (16:57 +0300)]
auth: Don't lose all forward_ fields if the first passdb lookup fails.
Stephan Bosch [Wed, 24 May 2017 18:19:11 +0000 (20:19 +0200)]
lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch [Wed, 24 May 2017 19:59:32 +0000 (21:59 +0200)]
lib-http: client: When a request is destroyed prematurely during payload input, consider the payload stream destroyed and act accordingly.
The application may hold a reference to the payload stream still, and it may be difficult to prevent that.
This causes lib-http to keep waiting for the payload to be destroyed.
When nothing else is going on, the current ioloop may then become empty, which caused the familiar assert failure.
Stephan Bosch [Wed, 24 May 2017 17:08:43 +0000 (19:08 +0200)]
lib-http: client: Explicitly destroy the response payload timeout stream when the request is destroyed while receiving payload.
This way, the timeout is stopped.
This caused ioloop panics.
Timo Sirainen [Tue, 30 May 2017 15:25:50 +0000 (18:25 +0300)]
lib-storage: Fix crash in mail_get_header_stream() when its previous stream wasn't at EOF
At least this could have happened when indexes were disabled and running:
FETCH 1 (envelope body.peek[header.fields (foo)] bodystructure)
Fixes:
Panic: file index-mail-headers.c: line 198 (index_mail_parse_header_init): assertion failed: (!mail->data.header_parser_initialized)
Sergey Kitov [Wed, 31 May 2017 11:32:30 +0000 (14:32 +0300)]
quota: assertion for *args != NULL is added in order to avoid warning from static analyzer and *args[0] changed to (*args)[0]
Timo Sirainen [Wed, 24 May 2017 15:27:10 +0000 (18:27 +0300)]
quota: Fix infinite loop when parsing quota parameters
Broken by previous quota changes.
Sergey Kitov [Fri, 19 May 2017 08:00:22 +0000 (11:00 +0300)]
Whitespace cleanup
Sergey Kitov [Fri, 19 May 2017 07:58:52 +0000 (10:58 +0300)]
Dict backend parameters reading changed to use common parsing function
Sergey Kitov [Fri, 19 May 2017 07:57:02 +0000 (10:57 +0300)]
fs backend parameter parsing changed to use common function
Sergey Kitov [Fri, 19 May 2017 07:52:46 +0000 (10:52 +0300)]
imapc backend parameter parsing changed to use common function
Sergey Kitov [Fri, 19 May 2017 07:49:01 +0000 (10:49 +0300)]
maildir backend parameter parsing changed to use common function
Sergey Kitov [Fri, 19 May 2017 07:46:27 +0000 (10:46 +0300)]
quota root default init changed to use common param parse function
Sergey Kitov [Thu, 18 May 2017 10:30:25 +0000 (13:30 +0300)]
common quota parameter parsing function implemented
Timo Sirainen [Wed, 7 Jun 2017 16:54:10 +0000 (19:54 +0300)]
lib-storage: test-mail-search-args-simplify - test with initialized args
Timo Sirainen [Wed, 7 Jun 2017 16:53:00 +0000 (19:53 +0300)]
lib-storage: mail_search_args_simplify() - Fix merging already-initialized keywords
It was deinitializing the arg that was kept instead of the one being removed.
Timo Sirainen [Wed, 7 Jun 2017 16:37:46 +0000 (19:37 +0300)]
lib-storage: Fix mail_search_args_simplify() to not deinit too many args
Removing an arg should deinit it, but not its following siblings.
Timo Sirainen [Wed, 7 Jun 2017 16:36:19 +0000 (19:36 +0300)]
lib-storage: Add mail_search_arg_one_deinit()
Timo Sirainen [Tue, 13 Jun 2017 23:15:34 +0000 (02:15 +0300)]
quota-clone: Fix compile warning
Timo Sirainen [Mon, 12 Jun 2017 09:44:37 +0000 (12:44 +0300)]
welcome: Fix sending parameters to welcome script.
Broken by
f38b0dafbffa9d79542e36b4b3e598ed4115e5a3
Timo Sirainen [Mon, 12 Jun 2017 11:24:59 +0000 (14:24 +0300)]
pop3-migration: Strip trailing spaces from headers when calculating hash
Fixes matching mails with Zimbra.
Timo Sirainen [Mon, 12 Jun 2017 11:35:22 +0000 (14:35 +0300)]
imapc: If mailbox iteration fails, make sure error message isn't lost.
Timo Sirainen [Mon, 12 Jun 2017 11:33:46 +0000 (14:33 +0300)]
lib-storage: Fail mailbox list iteration early if it fails to get INBOX flags
The resulting INBOX reply could be wrong in that case.
Also with imapc if the remote server is down, this causes two connection
errors instead of just one.
Timo Sirainen [Mon, 12 Jun 2017 11:16:13 +0000 (14:16 +0300)]
lib-storage: If mailbox list iteration fails, don't add INBOX
It possibly should have been returned by the list iteration itself and we
could be returning it wrong here.
Also calling this causes imapc to lost the error message in mailbox_list.
Timo Sirainen [Mon, 12 Jun 2017 09:18:28 +0000 (12:18 +0300)]
imapc: Don't reconnect on DELETE if auth failure was already seen.
Timo Sirainen [Mon, 12 Jun 2017 09:16:19 +0000 (12:16 +0300)]
imapc: Don't reconnect on STATUS if auth failure was already seen.
Timo Sirainen [Mon, 12 Jun 2017 08:57:52 +0000 (11:57 +0300)]
imapc: Remove root_sep_lookup_failed cache
The auth_failed_* should already be enough for this. This removal also
fixes the storage error message to be auth_failed_reason when possible.
Timo Sirainen [Mon, 12 Jun 2017 09:07:52 +0000 (12:07 +0300)]
imapc: Check for auth failures when saving messages
First, don't even attempt an APPEND if we've already seen an auth failure.
Second, if APPEND does fail because of auth error, set the correct error to
storage.
Timo Sirainen [Mon, 12 Jun 2017 09:03:39 +0000 (12:03 +0300)]
imapc: Fix APPEND error message to include APPEND, not COPY
Timo Sirainen [Mon, 12 Jun 2017 08:40:03 +0000 (11:40 +0300)]
imapc: Make sure storage error has the proper auth failure error string
The first failed command always had the correct error string, but the
following failed commands just returned -1 without updating storage error.
The storage error could have been something completely different by then.
Timo Sirainen [Mon, 12 Jun 2017 08:33:38 +0000 (11:33 +0300)]
imapc: Cleanup - Rename auth_error to auth_failed_reason for consistency
Timo Sirainen [Mon, 12 Jun 2017 08:32:23 +0000 (11:32 +0300)]
imapc: Change auth_failed boolean to more specific auth_failed_state
Since we now rely on auth_failed_state being initialized to zero,
explicitly set IMAPC_COMMAND_STATE_OK to be defined as 0.
Timo Sirainen [Mon, 12 Jun 2017 08:05:31 +0000 (11:05 +0300)]
imapc: Remove auth_failed check from imapc_list_get_storage_name()
Reverts
9949dc3649ac7a00289f6bf0662c793bee3d4286 . It doesn't seem to be
actually needed at least now, and it's breaking:
* SELECT INBOX -> failure due to remote server being down
* SELECT INBOX -> NO [CANNOT] Invalid mailbox name: Name is empty
Timo Sirainen [Thu, 8 Jun 2017 17:34:39 +0000 (20:34 +0300)]
imap-quota: If quota lookups fail, return NO for GETQUOTA/GETQUOTAROOT
Timo Sirainen [Thu, 8 Jun 2017 17:34:27 +0000 (20:34 +0300)]
quota: Update comments in quota.h
Timo Sirainen [Thu, 8 Jun 2017 17:25:11 +0000 (20:25 +0300)]
quota: quota_root_iter_next() - Iterate all visible roots
Don't try to skip the roots that don't have an active quota. imap_quota
plugin does the skipping now itself, and quota_clone shouldn't really be
even used with more than one quota root.
Timo Sirainen [Thu, 8 Jun 2017 17:24:26 +0000 (20:24 +0300)]
imap-quota: If quota root doesn't have any quotas, don't send empty QUOTA reply
For example if GETQUOTA is asked for fs quota, but the user doesn't have fs
quota enabled.
Timo Sirainen [Thu, 8 Jun 2017 17:29:05 +0000 (20:29 +0300)]
quota-clone: Don't clone quota resources that aren't enabled.
They would always just be zeros anyway, so this makes the update slightly
more efficient. Although practically this only matters with dirsize and
fs quotas, which people generally don't use with quota_clone.
Timo Sirainen [Thu, 8 Jun 2017 17:39:47 +0000 (20:39 +0300)]
lib-imap-client: Fix hang when imapc_client_get_capabilities() is called without connection
Timo Sirainen [Wed, 7 Jun 2017 15:10:10 +0000 (18:10 +0300)]
lib-mail: message_address_parse() - Fix fill_missing==TRUE handling
Mainly MISSING_DOMAIN wasn't set in all situations. Also added unit tests.
Timo Sirainen [Wed, 7 Jun 2017 12:33:42 +0000 (15:33 +0300)]
lib-mail: message_address_parse() - Handle invalid standalone phrases better
We'll treat "local-part" (without quotes) as a mailbox even without
@domain, but if it continues with anything or if it's a quoted-string,
we'll treat it as a display-name instead.
This is probably better than just converting everything to display-name,
since there are likely to exist headers like "To: localuser"
Timo Sirainen [Wed, 7 Jun 2017 12:22:22 +0000 (15:22 +0300)]
lib-mail: Improve test-message-address to test invalid addresses in lists
Test in both a group and list of addresses.
Timo Sirainen [Wed, 7 Jun 2017 12:21:10 +0000 (15:21 +0300)]
lib-mail: message_address_parse() - don't stop at <> when parsing address lists
And similarly don't stop at <@domain>
Timo Sirainen [Wed, 7 Jun 2017 12:08:27 +0000 (15:08 +0300)]
lib-mail: message_address_parse() - don't stop at invalid addresses when parsing group
Also the end-group's message_address shouldn't have invalid_syntax=TRUE,
except when we didn't actually find the ending ';'
Timo Sirainen [Wed, 7 Jun 2017 11:57:12 +0000 (14:57 +0300)]
lib-mail: message_address_parse() - Fix reading out-of-bounds read on invalid input
Timo Sirainen [Wed, 7 Jun 2017 10:34:39 +0000 (13:34 +0300)]
lib-mail: message_address_parse() - Remove unnecessary NULL checks
message_address_parse() always initialized rfc822_parser_init() with
last_comment string.
Timo Sirainen [Wed, 7 Jun 2017 10:19:40 +0000 (13:19 +0300)]
lib-mail: test-message-address - add more and better organized tests
Timo Sirainen [Wed, 7 Jun 2017 09:58:21 +0000 (12:58 +0300)]
lib-mail: message_address_parse() - Add INVALID_ROUTE/SYNTAX_ERROR only if fill_missing==TRUE
This allows message_address_write() to write the parsed invalid address in a
way that at least somewhat resembles the original input.
Timo Sirainen [Wed, 7 Jun 2017 09:42:28 +0000 (12:42 +0300)]
lib-mail: message_address_write() - Write empy username as ""
We can't output <@domain> because that conflicts with the <@route:...>
syntax. Also ""@domain seems to be a valid address.
Timo Sirainen [Wed, 7 Jun 2017 09:37:09 +0000 (12:37 +0300)]
lib-mail: message_address_write() - Always write <user@domain> as output
This is the standard format nowadays, so don't convert <user@domain> into
plain user@domain.
Timo Sirainen [Wed, 7 Jun 2017 09:35:35 +0000 (12:35 +0300)]
lib-mail: message_address_write() - Don't write empty <>
Timo Sirainen [Wed, 7 Jun 2017 09:34:17 +0000 (12:34 +0300)]
lib-mail: message_address_write() - Don't add '@' if domain is missing
Timo Sirainen [Wed, 7 Jun 2017 09:33:10 +0000 (12:33 +0300)]
lib-mail: test-message-address - Test also writing invalid addresses
Timo Sirainen [Wed, 7 Jun 2017 09:01:07 +0000 (12:01 +0300)]
lib-mail: test-message-address cleanup
Merge input and output into the same struct to make it clearer.
Timo Sirainen [Tue, 7 Jun 2016 00:41:18 +0000 (03:41 +0300)]
-Wstrict-bool warning fixes
Timo Sirainen [Mon, 6 Jun 2016 14:10:12 +0000 (17:10 +0300)]
lib-mail: Fixed to
91fdb25b5
Caused by my manual edits to avoid the -Wstrict-bool warnings.
Pali Rohár [Sun, 5 Jun 2016 13:48:20 +0000 (15:48 +0200)]
lib-mail: Update tests for message address
Pali Rohár [Sun, 5 Jun 2016 13:48:19 +0000 (15:48 +0200)]
lib-mail: message_address_write: Quote and escape strings if needed
ATEXT characters must be properly quoted when are in phrase.
Test case:
{ name = "test\"test", mailbox = "user", domain = "host" }
converts to:
"test\"test" <user@host>
Pali Rohár [Sun, 5 Jun 2016 13:48:18 +0000 (15:48 +0200)]
lib-mail: parse_mailbox: Set display name instead mailbox when parsing failed
It does not make sense to set mailbox without domain on incorrect input.
Rather set display name which is more likely useable value.
Test case:
test
is parsed as:
{ name = "test", mailbox = NULL, domain = NULL }
Pali Rohár [Sun, 5 Jun 2016 13:48:17 +0000 (15:48 +0200)]
lib-mail: parse_addr_spec: Email address without local-part is invalid
Add explicit invalid_syntax flag also when end of input occure because
address is without domain invalid and in this case it was not correctly
propagated.
Pali Rohár [Sun, 5 Jun 2016 13:48:16 +0000 (15:48 +0200)]
lib-mail: parse_addr_spec: Like in rfc822_skip_comment() check if last_comment is not NULL
This will fix possible NULL pointer dereference when caller does not set last_comment.
Pali Rohár [Sun, 5 Jun 2016 13:48:15 +0000 (15:48 +0200)]
lib-mail: message_address_write: Fix generating group list with empty name
Empty name for group list must be quoted.
Test case:
{ { name = NULL, mailbox = "", domain = NULL }, { name = NULL, mailbox = NULL, domain = NULL } }
converts to:
"":;
Pali Rohár [Sun, 5 Jun 2016 13:48:14 +0000 (15:48 +0200)]
lib-mail: message_address_write: Fix generating empty group list
Empty group list ends with ": " not with ", ".
Test case:
{ { name = NULL, mailbox = "group", domain = NULL }, { name = NULL, mailbox = NULL, domain = NULL } }
converts to:
group:;
Timo Sirainen [Fri, 9 Jun 2017 20:32:28 +0000 (23:32 +0300)]
lib: ioloop-kqueue - Improve kevent() panic log message
Timo Sirainen [Fri, 9 Jun 2017 09:42:51 +0000 (12:42 +0300)]
lib-storage: Fix sort index writing to not leave sort_id=0 gaps
This fixes errors like:
Error: INBOX: Broken sort-f indexes, resetting
Timo Sirainen [Fri, 9 Jun 2017 09:25:36 +0000 (12:25 +0300)]
lib-storage: Add details to "Broken sort-* indexes" error
Timo Sirainen [Fri, 9 Jun 2017 11:31:15 +0000 (14:31 +0300)]
lib-storage: Fix setting the correct cache record corrupted
It was mixing UIDs and sequences, so a wrong mail could have been set
corrupted or it could have crashed with:
Panic: file mail-index-transaction-update.c: line 1018 (mail_index_update_ext): assertion failed: (seq > 0 && (seq <= mail_index_view_get_messages_count(t->view) || seq <= t->last_new_seq))
Timo Sirainen [Fri, 9 Jun 2017 09:07:00 +0000 (12:07 +0300)]
quota: Fix negative quota_warnings with count backend
For example this never triggered:
quota_warning = -messages=100%% quota-warning %u -100
The change to quota_alloc() to update the count_used doesn't seem to
actually fix anything right now, but it makes the code more correct.
Aki Tuomi [Wed, 31 May 2017 11:39:55 +0000 (14:39 +0300)]
lib: Use unix streams with connection when using unix socket
This makes it easier to send file descriptors over connection
Timo Sirainen [Tue, 30 May 2017 18:57:06 +0000 (21:57 +0300)]
quota: Fix imapc backend not to try to find out mail's size.
This removes unnecessary FETCH RFC822.SIZE command sent to server when
expunging mails.
Timo Sirainen [Tue, 30 May 2017 07:37:24 +0000 (10:37 +0300)]
lib-imap-client: Fix test-imapc-client unit test to work on OSX
connect() to port 0 fails in it, so for the "connect failure" test first
open a random free listener port and then close it. Hopefully nothing else
reopens it in the mean time.
Timo Sirainen [Tue, 30 May 2017 21:07:46 +0000 (00:07 +0300)]
imapc: Don't send UID FETCH 1:* after SELECT if mailbox is empty
Timo Sirainen [Tue, 30 May 2017 21:00:32 +0000 (00:00 +0300)]
imapc: SEARCH - Don't add parenthesis around OR
There's no need to write "(OR a b)" when "OR a b" works just the same.
Timo Sirainen [Tue, 30 May 2017 20:53:44 +0000 (23:53 +0300)]
lib-storage: mail_search_args_to_imap() - don't add parenthesis around OR
There's no need to write "(OR a b)" when "OR a b" works just the same.
Timo Sirainen [Fri, 9 Jun 2017 10:17:38 +0000 (13:17 +0300)]
lib-mail: Fix compiler warnings
Timo Sirainen [Wed, 7 Jun 2017 08:35:18 +0000 (11:35 +0300)]
global: Use i_realloc_type() wherever possible
Timo Sirainen [Wed, 7 Jun 2017 08:24:38 +0000 (11:24 +0300)]
lib: Add test-mempool unit test.
It verifies that the p_new() and p_realloc_type() handle overflows
correctly. test-malloc-overflow already does this for the low-level
MALLOC_*() macros, but here we're cheking that the actually used
memory allocation macros also work.
Timo Sirainen [Wed, 7 Jun 2017 08:24:03 +0000 (11:24 +0300)]
lib: Add i_realloc_type() for i_realloc() that checks for overflows
Timo Sirainen [Thu, 12 May 2016 09:40:29 +0000 (05:40 -0400)]
lmtp: Removed (Dovecot) from Received header.
Some people want to hide it, and I don't really see much benefit in
including it anyway. So lets just hide it from everyone.
Timo Sirainen [Thu, 8 Jun 2017 08:35:58 +0000 (11:35 +0300)]
imapc: Fix potential crash if initial sync fails.
Happened at least if mailbox had 0 mails and a failing mailbox_sync() was
called twice.
Fixes:
Panic: file imapc-sync.c: line 477 (imapc_sync_index): assertion failed: (mbox->sync_fetch_first_uid == 1)
Josef 'Jeff' Sipek [Mon, 5 Jun 2017 11:21:23 +0000 (14:21 +0300)]
lib: test for guid_128_generate() time handling
Make sure that guids always increase regardless of what is happening to
the time.
Josef 'Jeff' Sipek [Mon, 5 Jun 2017 09:55:56 +0000 (12:55 +0300)]
lib: guid_128_generate() shouldn't generate invalid timestamps
The nsec validity check must take into account the soon-to-be-done increment.
Josef 'Jeff' Sipek [Mon, 5 Jun 2017 09:53:23 +0000 (12:53 +0300)]
lib: guid_128_generate() needs to correctly convert usecs to nsecs
The timestamp in the guid starts off with real time, but "runs ahead" if a lot
of guids are generated. If not many guids are being generated, the timestamp
is fast-forwarded to the current ioloop_timeval. The buggy comparison prevented
fast forwarding when tv_sec matched, but tv_nsec value was > 0 (which
was true most of the time).
Timo Sirainen [Tue, 6 Jun 2017 14:18:27 +0000 (17:18 +0300)]
lib-index: Fix reset_id handling in mail_cache_get_missing_reason() cache
Broken by
bd897f82a5d9b00ba256b462d2056c2dc7df257c
Timo Sirainen [Tue, 6 Jun 2017 06:39:34 +0000 (09:39 +0300)]
lib-storage: Fix assert-crash in SORT caused by earlier changes
Broken by
0a6a527f0c42b5478d80ac53ab357885676fd516
Fixes:
Panic: file index-sort-string.c: line 668 (index_sort_add_ids_range): assertion failed: (str != NULL)
Timo Sirainen [Mon, 5 Jun 2017 18:53:18 +0000 (21:53 +0300)]
lib-index: Add cache to mail_cache_get_missing_reason()
This avoids excessive CPU usage when it's called in a loop for many mails.
Timo Sirainen [Mon, 5 Jun 2017 18:44:45 +0000 (21:44 +0300)]
lib-index: mail_cache_get_missing_reason() - Minor code cleanup