]> git.ipfire.org Git - thirdparty/dovecot/core.git/log
thirdparty/dovecot/core.git
8 years agolib-http: Restructured the header, message, request, and response parsers to have...
Stephan Bosch [Tue, 11 Jul 2017 12:18:47 +0000 (14:18 +0200)] 
lib-http: Restructured the header, message, request, and response parsers to have an extensible and consistent API using flags.

Extended the test suites with a few cases that test parsing with and without the STRICT flag.

8 years agolib-http: Changed test-http-server to actually use the http-server API.
Stephan Bosch [Fri, 12 May 2017 02:25:08 +0000 (04:25 +0200)] 
lib-http: Changed test-http-server to actually use the http-server API.

This currently serves as a simple demonstration of how to structure an HTTP server.

8 years agolib-storage: Hide and rmdir \NoSelect leaf mailboxes with NO-NOSELECT
Timo Sirainen [Tue, 25 Jul 2017 17:53:18 +0000 (20:53 +0300)] 
lib-storage: Hide and rmdir \NoSelect leaf mailboxes with NO-NOSELECT

If the leaf is successfully rmdir()ed, rmdir() also its parents.

This doesn't work perfectly with if there are multiple levels of \NoSelect
mailboxes. For example with "a/b/c" the listing will already have returned
"a" and "a/b" before it reaches the "a/b/c" code, which will rmdir all of
them, but it's a bit too late at that point. It's too much work to fix
though, and the situation will be fixed on the next list anyway.

8 years agolib-storage: Add setting to disable \NoSelect mailboxes
Timo Sirainen [Tue, 25 Jul 2017 13:10:51 +0000 (16:10 +0300)] 
lib-storage: Add setting to disable \NoSelect mailboxes

Enabled using mail_location = ...:NO-NOSELECT

Trying to create \NoSelect "dir/" will result just creating "dir", similar
to how Maildir++ layout already did it.

Deleting a mailbox will delete all of its \NoSelect parents.

8 years agolib-storage: Mailbox rename shouldn't auto-rmdir parent index dirs with ITERINDEX
Timo Sirainen [Tue, 25 Jul 2017 12:54:37 +0000 (15:54 +0300)] 
lib-storage: Mailbox rename shouldn't auto-rmdir parent index dirs with ITERINDEX

For example:
 - create a/b
 - rename a/b c

This resulted in "a" existing in mail root directory, but not in index
directory. With ITERINDEX this meant that the "a" was lost.

8 years agolib-storage: If userdb returns chdir extra field, chdir() there instead of home
Timo Sirainen [Mon, 24 Jul 2017 13:37:42 +0000 (16:37 +0300)] 
lib-storage: If userdb returns chdir extra field, chdir() there instead of home

This can avoid unnecessary home directory accesses if indexes are stored
outside the home and there's no other reason to chdir() to home.

8 years agolib-storage: If chdir(home) fails due to EACCES, don't log two errors.
Timo Sirainen [Mon, 24 Jul 2017 13:36:45 +0000 (16:36 +0300)] 
lib-storage: If chdir(home) fails due to EACCES, don't log two errors.

8 years agolib-storage: Add mailbox_list_index_include_inbox setting
Timo Sirainen [Mon, 24 Jul 2017 11:17:22 +0000 (14:17 +0300)] 
lib-storage: Add mailbox_list_index_include_inbox setting

This controls whether to update INBOX's STATUS information in the mailbox
list index. It can be useful especially if LISTINDEX points to a tmpfs,
but perhaps also in other situations.

I considered adding a more generic setting to exclude other mailboxes, but
the namespace prefixes and hierarchy separators get a bit complicated with
shared mailboxes. It's probably also not very useful to change this for
anything but the INBOX.

8 years agoexample-config: Add mailbox_list_index_very_dirty_syncs
Timo Sirainen [Mon, 24 Jul 2017 11:12:55 +0000 (14:12 +0300)] 
example-config: Add mailbox_list_index_very_dirty_syncs

8 years agolib-storage: Allow LISTINDEX to point to a different directory
Timo Sirainen [Sat, 22 Jul 2017 15:39:19 +0000 (18:39 +0300)] 
lib-storage: Allow LISTINDEX to point to a different directory

Most importantly because the mailbox list index is only a cache, it could be
safely pointed to e.g. tmpfs to save disk I/O.

8 years agovirtual: Make sure index is rewritten when new mailboxes are added
Timo Sirainen [Fri, 21 Jul 2017 16:52:23 +0000 (19:52 +0300)] 
virtual: Make sure index is rewritten when new mailboxes are added

Otherwise multiple bbox->sync_mailbox_idx point to 0 and they keep overwriting
each others in the header. This causes the header to be constantly updated with
wrong contents.

8 years agodict-sql: Do not increment on set (again)
Timo Sirainen [Fri, 21 Jul 2017 14:01:05 +0000 (17:01 +0300)] 
dict-sql: Do not increment on set (again)

Reverts f1fc1560914f87dc44a0d48f40b97250adb33e73, which was a broken merge
caused by accidentally trying to re-merge
595b94c8d8e2700a0c50f3a9c06a535adb63f8f3 and somehow ended up reverting
29e8c5a8e26a9ed398c37d4a6e1488d4630f5627.

8 years agoimap: Add %{appended} to imap_logout_format
Martti Rannanjärvi [Tue, 11 Jul 2017 10:12:46 +0000 (13:12 +0300)] 
imap: Add %{appended} to imap_logout_format

8 years agoimap-client: Add %{autoexpunged} to imap_logout_format
Martti Rannanjärvi [Mon, 3 Jul 2017 14:12:08 +0000 (17:12 +0300)] 
imap-client: Add %{autoexpunged} to imap_logout_format

8 years agoimap-client: Add const char *disconnect_reason to client
Martti Rannanjärvi [Tue, 4 Jul 2017 06:25:21 +0000 (09:25 +0300)] 
imap-client: Add const char *disconnect_reason to client

This is to allow using reason given to client_disconnect() via timeout
context.

8 years agolib-index: Fix next_uid lookup in open transaction that has appended mails
Timo Sirainen [Wed, 19 Jul 2017 10:43:09 +0000 (13:43 +0300)] 
lib-index: Fix next_uid lookup in open transaction that has appended mails

The appended mails were used for returning an updated
mail_index_header.next_uid, but only if the mails were assigned UIDs in
mail_index_append(). It should have updated the next_uid also after
mail_index_append_finish_uids() was used to assign the UIDs.

This fixes setting first_recent_uid correctly for virtual mailboxes when the
sync finds new mails. Avoids multiple sessions from getting \Recent flags
for the same mails.

8 years agolib-sql: Remove duplicate Cassandra consistency names
Martti Rannanjärvi [Thu, 20 Jul 2017 06:46:00 +0000 (09:46 +0300)] 
lib-sql: Remove duplicate Cassandra consistency names

8 years agovirtual: Do not remove mailbox notify if the mailbox is closed
Aki Tuomi [Thu, 20 Jul 2017 08:01:37 +0000 (11:01 +0300)] 
virtual: Do not remove mailbox notify if the mailbox is closed

The backend mailbox close/open status is not related to
the notify API usage. The notify is removed in
virtual_mailbox_close_internal instead when we are
actually deinitializing.

8 years agovirtual: Optimize mailbox_notify_changes() when there's only a single backend mailbox
Timo Sirainen [Wed, 19 Jul 2017 20:19:12 +0000 (23:19 +0300)] 
virtual: Optimize mailbox_notify_changes() when there's only a single backend mailbox

8 years agolib-storage: mailbox_watch_extract_notify_fd() - give better reason if mailbox has...
Timo Sirainen [Wed, 19 Jul 2017 20:11:12 +0000 (23:11 +0300)] 
lib-storage: mailbox_watch_extract_notify_fd() - give better reason if mailbox has no IOs

This happens currently with virtual mailboxes.

8 years agolib: io_loop_extract_notify_fd() - Don't crash if no notifys have been added
Timo Sirainen [Wed, 19 Jul 2017 20:09:13 +0000 (23:09 +0300)] 
lib: io_loop_extract_notify_fd() - Don't crash if no notifys have been added

8 years agocassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE
Timo Sirainen [Wed, 19 Jul 2017 07:37:25 +0000 (10:37 +0300)] 
cassandra: Fix read/write buffer overflows after adding CASSANDRA_QUERY_TYPE_READ_MORE

8 years agolib-sql: Add assert to sql_result_more_s()
Timo Sirainen [Wed, 19 Jul 2017 07:35:43 +0000 (10:35 +0300)] 
lib-sql: Add assert to sql_result_more_s()

Should avoid a warning from static analyzer.

8 years agovirtual: Stop watching notification on backend box close
Aki Tuomi [Wed, 19 Jul 2017 09:03:58 +0000 (12:03 +0300)] 
virtual: Stop watching notification on backend box close

Fixes Panic: file mail-index.c: line 662 (mail_index_close_nonopened): assertion failed: (index->views == NULL)

8 years agovirtual: Stop notifications only if they were started
Aki Tuomi [Tue, 18 Jul 2017 18:04:47 +0000 (21:04 +0300)] 
virtual: Stop notifications only if they were started

Fixes Panic: file mail-storage.c: line 1950: assertion failed: (box->opened)

8 years agopop3-migration: Add unit test for checking that trailing tabs are stripped
Timo Sirainen [Wed, 19 Jul 2017 07:58:43 +0000 (10:58 +0300)] 
pop3-migration: Add unit test for checking that trailing tabs are stripped

8 years agolib-mail: message_header_hash() - add v4 that strips tabs
Timo Sirainen [Wed, 19 Jul 2017 07:57:36 +0000 (10:57 +0300)] 
lib-mail: message_header_hash() - add v4 that strips tabs

This helps with Zimbra, which strips away trailing tabs in BODY[HEADER].

8 years agolib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen [Tue, 18 Jul 2017 11:42:23 +0000 (14:42 +0300)] 
lib-index: Fix mail_index_get_modification_time() to work when index isn't open.

index->filepath may be NULL after a failed index open, and it's a bit unsafe
to trust that index->log->filepath isn't NULL either.  So just build the full
path from elements that are definitely non-NULL.

Also stat() only dovecot.index.log, because it's always supposed to exist.
If it doesn't, something's broken and stat()ing dovecot.index doesn't make
much sense.

This commit removes mail_transaction_log_get_mtime(), which is no longer
needed.

Fixes:
Panic: file mail-index.c: line 931 (mail_index_file_set_syscall_error): assertion failed: (filepath != NULL)

8 years agolib-index: Mark index deleted if index log file is missing
Aki Tuomi [Tue, 18 Jul 2017 11:37:53 +0000 (14:37 +0300)] 
lib-index: Mark index deleted if index log file is missing

This fixes all kinds of errors caused by mailbox being
deleted by another process.

8 years agolib-storage: Don't allow removing \Recent flags with mail_update_flags()
Timo Sirainen [Tue, 18 Jul 2017 09:39:44 +0000 (12:39 +0300)] 
lib-storage: Don't allow removing \Recent flags with mail_update_flags()

Reverts an ancient commit 7deb24e7453249d09741641bff0f269f68165033. I don't
know why it was added in the first place. Normally \Recent flags are
removed during sync with MAIL_INDEX_SYNC_FLAG_DROP_RECENT. This should be
enough, especially since it's not even possible to remove a single \Recent
flag - only update the first_recent_uid.

The code was also wrong: It was dropping \Recent flags even when
modify_type/flags combination didn't ask for it. Even if this was fixed,
there would still be race conditions with multiple processes since this
update is done without locking.

Fixes:
Error: Recent flags state corrupted for mailbox

8 years agolib-storage: If mail_index_header.first_recent_uid shrinks, reset \Recent flags
Timo Sirainen [Tue, 18 Jul 2017 08:57:24 +0000 (11:57 +0300)] 
lib-storage: If mail_index_header.first_recent_uid shrinks, reset \Recent flags

This should never happen.

8 years agocassandra: Improve logging for multipage queries
Timo Sirainen [Mon, 17 Jul 2017 15:10:49 +0000 (18:10 +0300)] 
cassandra: Improve logging for multipage queries

warn_timeout is applied to both individual page requests as well as the sum
of all the page requests.

8 years agocassandra: Add page_size setting to enable paged results for queries
Timo Sirainen [Mon, 17 Jul 2017 14:54:07 +0000 (17:54 +0300)] 
cassandra: Add page_size setting to enable paged results for queries

8 years agocassandra: Add wrapper functions in preparation for following commits
Timo Sirainen [Mon, 17 Jul 2017 14:51:03 +0000 (17:51 +0300)] 
cassandra: Add wrapper functions in preparation for following commits

No functional changes. Shrinks the following commits.

8 years agodict-sql: Add support for sql_result_more()
Timo Sirainen [Mon, 17 Jul 2017 14:54:36 +0000 (17:54 +0300)] 
dict-sql: Add support for sql_result_more()

8 years agolib-sql: Add API support for asynchronously iterating over rows.
Timo Sirainen [Mon, 17 Jul 2017 11:22:35 +0000 (14:22 +0300)] 
lib-sql: Add API support for asynchronously iterating over rows.

sql_query() can already do an async lookup, but the full result needs
to be available immediately. This can be inefficient for large results.
Add a new SQL_RESULT_NEXT_MORE return value and sql_result_more() for
asynchronously requesting more results.

This changes the API a bit, but isn't done by default by any drivers yet.
Also callers that can't handle this are hopefully checking for "ret < 0",
which allows them to handle such an async-more request as an error
instead.

sql_result_next_row() will be changed to return enum in a separate commit to
keep backwards compatibility in v2.2.x.

8 years agovirtual: If virtual_uid is not assigned skip it
Aki Tuomi [Thu, 6 Jul 2017 09:40:33 +0000 (12:40 +0300)] 
virtual: If virtual_uid is not assigned skip it

We cannot lookup mails with uid 0, so if we see
that mail has virtual uid 0, do not attempt to look it
up from index, but skip it.

Fixes Panic: file mail-index-map.c: line 549 (mail_index_map_lookup_seq_range): assertion failed: (first_uid > 0)

8 years agovirtual: Append virtual mailbox name to open reason on box alloc
Aki Tuomi [Wed, 5 Jul 2017 12:20:32 +0000 (15:20 +0300)] 
virtual: Append virtual mailbox name to open reason on box alloc

8 years agovirtual: Append virtual mailbox information to get stream reason
Aki Tuomi [Wed, 5 Jul 2017 12:20:18 +0000 (15:20 +0300)] 
virtual: Append virtual mailbox information to get stream reason

8 years agovirtual: Expunge virtual mails if backend box is deleted
Aki Tuomi [Wed, 5 Jul 2017 11:24:49 +0000 (14:24 +0300)] 
virtual: Expunge virtual mails if backend box is deleted

When mail is added to a mailbox and then deleted, expunge
the sequences from virtual index in sync.

Fixes Error: Unexpectedly lost Mailbox ID 4

8 years agovirtual: Do not mark broken folder as initialized
Aki Tuomi [Mon, 3 Jul 2017 10:53:49 +0000 (13:53 +0300)] 
virtual: Do not mark broken folder as initialized

Otherwise it won't get repaired

8 years agovirtual: Fix highest_mailbox_id if it's wrong
Aki Tuomi [Mon, 3 Jul 2017 10:53:31 +0000 (13:53 +0300)] 
virtual: Fix highest_mailbox_id if it's wrong

8 years agovirtual: Force header rewrite if header not found or crc32 changed
Aki Tuomi [Mon, 3 Jul 2017 10:25:35 +0000 (13:25 +0300)] 
virtual: Force header rewrite if header not found or crc32 changed

Otherwise the header gets only partially written

8 years agolib-storage: Clarify keywords handling in mail_save_finish
Aki Tuomi [Thu, 29 Jun 2017 10:22:32 +0000 (13:22 +0300)] 
lib-storage: Clarify keywords handling in mail_save_finish

8 years agovirtual: Fix keywords handling
Aki Tuomi [Wed, 28 Jun 2017 10:45:19 +0000 (13:45 +0300)] 
virtual: Fix keywords handling

Keywords are per-mail object, and should be treated as one. The old
code left pointer to keywords dandling which lead into double-free.
Now the ctx->data is treated in similar way as other backends.

Fixes Panic: file mail-index.c: line 417 (mail_index_keywords_unref): assertion failed: (keywords->refcount > 0)
Fixes Panic: file mail-storage.c: line 2311 (mailbox_save_context_reset): assertion failed: (!ctx->unfinished)

8 years agovirtual: Fix recent flag updates
Aki Tuomi [Tue, 27 Jun 2017 11:19:16 +0000 (14:19 +0300)] 
virtual: Fix recent flag updates

View must be updated before looking up seqs

8 years agovirtual: Call mailbox_save_context_deinit before freeing context
Aki Tuomi [Thu, 29 Jun 2017 10:46:06 +0000 (13:46 +0300)] 
virtual: Call mailbox_save_context_deinit before freeing context

Otherwise dest_mail does not get free'd

8 years agovirtual: Use mailbox_notify_list API when mailbox_list_index is enabled
Aki Tuomi [Tue, 27 Jun 2017 09:51:51 +0000 (12:51 +0300)] 
virtual: Use mailbox_notify_list API when mailbox_list_index is enabled

8 years agovirtual: Generate GUID for virtual folder
Aki Tuomi [Tue, 27 Jun 2017 07:54:08 +0000 (10:54 +0300)] 
virtual: Generate GUID for virtual folder

GUID is generated when index is first created
or the rules change.

8 years agolib-storage: Add type checking for mailbox_list_notify_wait
Aki Tuomi [Tue, 27 Jun 2017 09:42:27 +0000 (12:42 +0300)] 
lib-storage: Add type checking for mailbox_list_notify_wait

8 years agovirtual: Avoid assert-crash if backend mailbox's have_guid lookup fails
Timo Sirainen [Thu, 6 Jul 2017 08:24:35 +0000 (11:24 +0300)] 
virtual: Avoid assert-crash if backend mailbox's have_guid lookup fails

The MAIL_ERROR_NOTFOUND can happen if the mailbox was already deleted.
Other errors aren't expected to happen and possibly point to a bug.

Fixes:
Panic: file mail-storage.c: line 1831: unreached

8 years agovirtual: Match any metadata condition
Aki Tuomi [Thu, 18 May 2017 11:59:51 +0000 (14:59 +0300)] 
virtual: Match any metadata condition

The old code ignored succesful earlier matches for
patterns, and stopped looking on first non-matching
metadata pattern. Now it breaks on error or on first
matching pattern.

8 years agoimapc: Fix caching >= 32 kB mail bodies
Timo Sirainen [Mon, 17 Jul 2017 11:05:45 +0000 (14:05 +0300)] 
imapc: Fix caching >= 32 kB mail bodies

When closing the mail, only in-memory mail bodies were stored to cache.

8 years agolib-storage: When index dir rmdir() fails with ENOTEMPTY, retry it for 1 second
Timo Sirainen [Thu, 13 Jul 2017 23:11:56 +0000 (02:11 +0300)] 
lib-storage: When index dir rmdir() fails with ENOTEMPTY, retry it for 1 second

This helps to avoid leaving those index directories lying around with NFS.
Hopefully within the 1 second any existing processes that have been keeping those
files open have finished their task. Especially IMAP IDLE will take 0.5 seconds
to start syncing indexes and realize that they're deleted.

8 years agolib-index: If refreshing finds dovecot.index.log gone, assume the mailbox was deleted
Timo Sirainen [Thu, 13 Jul 2017 22:54:31 +0000 (01:54 +0300)] 
lib-index: If refreshing finds dovecot.index.log gone, assume the mailbox was deleted

Don't try to recreate the log file again. It can just cause further problems.

A way to reproduce this problem with NFS when INDEX dir is specified:
 * create mailbox foo, select foo, IDLE
 * delete mailbox foo
--> foo's index is recreated back by IDLEing process

8 years agoquota: Fix negative storage-based quota_warnings to work with count backend
Timo Sirainen [Thu, 13 Jul 2017 00:15:36 +0000 (03:15 +0300)] 
quota: Fix negative storage-based quota_warnings to work with count backend

Finishes f9362223346d10a5866b376ed227b77b26ea4292, which fixed it for
"messages" but not for "storage".

8 years agoquota: When setting auto_updating to transaction, skip invisible quota roots
Timo Sirainen [Wed, 12 Jul 2017 23:56:33 +0000 (02:56 +0300)] 
quota: When setting auto_updating to transaction, skip invisible quota roots

Skip the quota root also if the mailbox matches "ignore" quota_rule.
This is only an optimization fix so that unnecessary work isn't done for
quota roots that aren't actually used.

8 years agolib-storage: Remove user namespaces on hook error
Aki Tuomi [Tue, 11 Jul 2017 07:45:16 +0000 (10:45 +0300)] 
lib-storage: Remove user namespaces on hook error

If there is a hook error during namespaces added
remove the namespaces from user. This avoids attempts
to use the namespaces later on without proper initialization.

8 years agolib-storage: Ensure list index is present
Aki Tuomi [Tue, 11 Jul 2017 07:26:38 +0000 (10:26 +0300)] 
lib-storage: Ensure list index is present

Otherwise we end up with signal 11 crash later on.

8 years agolib-storage: mailbox_create_missing_dir() - Handle mailbox delete race condition
Timo Sirainen [Wed, 12 Jul 2017 13:18:42 +0000 (16:18 +0300)] 
lib-storage: mailbox_create_missing_dir() - Handle mailbox delete race condition

Make sure the directory isn't created if the mail root directory no longer
exists. This might happen during mailbox deletion when another process is
opening the mailbox at the same time.

8 years agolib-storage: Improve MAILBOX_LIST_PROP_AUTOCREATE_DIRS related comments
Timo Sirainen [Wed, 12 Jul 2017 13:15:13 +0000 (16:15 +0300)] 
lib-storage: Improve MAILBOX_LIST_PROP_AUTOCREATE_DIRS related comments

8 years agosdbox: Create missing mail directory on resync if index directory exists
Timo Sirainen [Tue, 11 Jul 2017 11:14:47 +0000 (14:14 +0300)] 
sdbox: Create missing mail directory on resync if index directory exists

This problem should be visible only with ITERINDEX enabled.

8 years agolib-index: Fix compiler warning with 32bit time_t
Timo Sirainen [Wed, 12 Jul 2017 14:54:44 +0000 (17:54 +0300)] 
lib-index: Fix compiler warning with 32bit time_t

8 years agolib-index: Track .log.2 rotation time in index header
Timo Sirainen [Tue, 11 Jul 2017 12:35:16 +0000 (15:35 +0300)] 
lib-index: Track .log.2 rotation time in index header

This avoids unnecessarily stat()ing the file. Also it's a bit better
since it's tracking the actual rotation time, not the mtime of what the
.log file happened to have at the time of rotation.

The initial rotation timestamp is written only to the dovecot.index header
without going through dovecot.index.log. This works, because the
dovecot.index is written practically always after a log rotation. For the
rare cases when it doesn't happen, the dovecot.index.log.2 just gets
deleted later after the next log rotation.

8 years agolib-index: Check .log.2 rotation only when syncing
Timo Sirainen [Tue, 11 Jul 2017 12:33:56 +0000 (15:33 +0300)] 
lib-index: Check .log.2 rotation only when syncing

Instead of also whenever appending transactions to .log file. This
shouldn't change the behavior much, and it's needed for the following
change to work correctly.

8 years agodoveadm dump: Include "last temp file scan" in index header dump
Timo Sirainen [Tue, 11 Jul 2017 12:32:33 +0000 (15:32 +0300)] 
doveadm dump: Include "last temp file scan" in index header dump

8 years agolib-index: Use nfs_safe_stat() to avoid having to handle stat() ESTALE error
Timo Sirainen [Tue, 11 Jul 2017 11:31:10 +0000 (14:31 +0300)] 
lib-index: Use nfs_safe_stat() to avoid having to handle stat() ESTALE error

Slightly simplifies the code.

8 years agolib-storage: Fix mailbox_update() to always update mailbox list index.
Timo Sirainen [Mon, 10 Jul 2017 13:11:48 +0000 (16:11 +0300)] 
lib-storage: Fix mailbox_update() to always update mailbox list index.

It previously was updating it only if the list index for the mailbox was
already fully up-to-date. But that doesn't really matter, because
mailbox_update() is supposed to be changing the values regardless.

This fixes mailbox_update() to always work with LAYOUT=index. It also
fixes mailbox_update() for INBOX to update UIDVALIDITY/GUID.

8 years agolib-storage: Don't use mailbox list index if it has refresh_flag set
Timo Sirainen [Mon, 10 Jul 2017 12:54:07 +0000 (15:54 +0300)] 
lib-storage: Don't use mailbox list index if it has refresh_flag set

For example if INBOX is deleted, looking up its GUID shouldn't be returned
from the list index since it contains the old GUID.

8 years agolib-storage: Track INBOX UIDVALIDITY and GUID in mailbox list index
Timo Sirainen [Mon, 10 Jul 2017 10:34:17 +0000 (13:34 +0300)] 
lib-storage: Track INBOX UIDVALIDITY and GUID in mailbox list index

This allows existence checks and GUID lookups for INBOX to be done from the
index.

8 years agolib-storage: Avoid index refresh with mailbox_list_index_very_dirty_syncs=yes
Timo Sirainen [Thu, 6 Jul 2017 16:00:35 +0000 (19:00 +0300)] 
lib-storage: Avoid index refresh with mailbox_list_index_very_dirty_syncs=yes

8 years agolib-storage: Refresh mailbox list index if mailbox's existence differs from index
Timo Sirainen [Thu, 6 Jul 2017 14:48:19 +0000 (17:48 +0300)] 
lib-storage: Refresh mailbox list index if mailbox's existence differs from index

8 years agolib-storage: Set mailbox list index to be refreshed after changes, not before
Timo Sirainen [Thu, 6 Jul 2017 14:45:02 +0000 (17:45 +0300)] 
lib-storage: Set mailbox list index to be refreshed after changes, not before

Mailbox deletion and rename set the refresh-flag before the change was done.
This was unnecessary if the change didn't happen. Also there was a race
condition that another process could have done the refresh before the
change was even done.

8 years agolib-storage: Add mailbox_list_last_error_push/pop()
Timo Sirainen [Thu, 6 Jul 2017 14:36:28 +0000 (17:36 +0300)] 
lib-storage: Add mailbox_list_last_error_push/pop()

These are similar to mail_storage_last_error_push/pop()

8 years agolib-storage: Try to avoid opening mailbox list index on mailbox access
Timo Sirainen [Mon, 10 Jul 2017 11:37:04 +0000 (14:37 +0300)] 
lib-storage: Try to avoid opening mailbox list index on mailbox access

Perform the STATUS (and other relevant) updates only if syncing or
transaction commits changed anything. This could be optimized further to
check even more strongly whether the seen changes could cause changes to
the list index, but it's probably not worth the effort.

8 years agolib-storage: Storage backend sync_init()s no longer need to check if mailbox is open
Timo Sirainen [Mon, 10 Jul 2017 11:20:50 +0000 (14:20 +0300)] 
lib-storage: Storage backend sync_init()s no longer need to check if mailbox is open

The previous change guarantees it.

8 years agolib-storage: mailbox_sync_init() - open mailbox immediately if it's not open yet
Timo Sirainen [Mon, 10 Jul 2017 11:19:47 +0000 (14:19 +0300)] 
lib-storage: mailbox_sync_init() - open mailbox immediately if it's not open yet

This simplifies the work for plugins that want to hook into
mailbox.sync_init() so they no longer have to handle the "mailbox isn't
opened" case.

8 years agoimap: Don't do autoexpunging when IMAP client is hibernated
Timo Sirainen [Mon, 10 Jul 2017 10:56:49 +0000 (13:56 +0300)] 
imap: Don't do autoexpunging when IMAP client is hibernated

8 years agoglobal: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()
Timo Sirainen [Thu, 20 Oct 2016 14:45:44 +0000 (17:45 +0300)] 
global: Replaced t_strsplit_tab() calls with t_strsplit_tabescaped()

This is useful especially in auth code to support LFs in extra fields.

Other pieces of code were also tab-escaping strings, but never unescaping
them. Usually it didn't matter, because nobody would use the escaped
characters. Still, the code wasn't exactly behaving correctly.

One downside to this change is that it's now possible to pass through TABs,
CRs and LFs through the various protocols. In theory this shouldn't cause
any problems, but combined with other bugs this could trigger some security
problems.

8 years agofts: Do not attempt to deinitialize backend if it's not set
Aki Tuomi [Wed, 17 May 2017 09:26:42 +0000 (12:26 +0300)] 
fts: Do not attempt to deinitialize backend if it's not set

If FTS backend initialization fails or does not happen,
flist->backend might end up being NULL, and attempt to
deinitialize NULL won't end well.

8 years agoimap: Add more error checking to NOTIFY parameter parsing
Timo Sirainen [Fri, 30 Jun 2017 14:51:34 +0000 (17:51 +0300)] 
imap: Add more error checking to NOTIFY parameter parsing

This should make it clearer to realize when invalid syntax is being used
rather than just ignoring the problem.

8 years agoimap: Fix NOTIFY parameter parsing by reverting earlier change
Timo Sirainen [Fri, 30 Jun 2017 14:33:15 +0000 (17:33 +0300)] 
imap: Fix NOTIFY parameter parsing by reverting earlier change

I misread the RFC and wrote broken tests.
Reverts 64d2efdc4b0bdf92249840e9db89b91c8dc0f3a3

8 years agolib-storage: mail_add_temp_wanted_fields() - delay opening stream
Timo Sirainen [Sun, 25 Jun 2017 06:10:52 +0000 (09:10 +0300)] 
lib-storage: mail_add_temp_wanted_fields() - delay opening stream

Allows plugins to call it in mail.get_stream() without infinite loop.

8 years agolib-storage: Another fix to mail storage initialization.
Timo Sirainen [Mon, 2 May 2016 21:25:43 +0000 (00:25 +0300)] 
lib-storage: Another fix to mail storage initialization.

Allow mail_namespaces_init_location() to add the namespace directly to user,
since that's what the current callers always want. But compared to the
original code we're now calling mail_namespaces_init_finish() rather than
doing the same things ourself.

8 years agolib-storage: Changed mail storage initialization.
Timo Sirainen [Mon, 2 May 2016 14:00:22 +0000 (17:00 +0300)] 
lib-storage: Changed mail storage initialization.

Most importantly require mail_namespaces_init_finish() after
mail_storage_create(). This was needed so that
mail_namespaces_created/added hook would always have the ns->list set, which
is required for several of the hooks to work (e.g. mailbox list index)

8 years agoimapc: Prefech - Initialize cached stream only if needed
Timo Sirainen [Mon, 3 Jul 2017 18:08:02 +0000 (21:08 +0300)] 
imapc: Prefech - Initialize cached stream only if needed

If the mail is immediately accessed for other purposes (e.g. fetching
message flags), there's no need to go through all the trouble of
initializing the mail stream.

8 years agolib-storage: Fix ITERINDEX to leave \NoSelect parents after deleting child mailbox
Timo Sirainen [Fri, 30 Jun 2017 10:46:22 +0000 (13:46 +0300)] 
lib-storage: Fix ITERINDEX to leave \NoSelect parents after deleting child mailbox

For example if "a/b" was created and deleted, "a" should be left behind.
(Or at least it shouldn't have left "a" to mail root directory and kept it
invisible since it didn't exist in index dir.)

8 years agodbox: Check mailbox existence from index directory with ITERINDEX
Timo Sirainen [Mon, 26 Jun 2017 16:06:26 +0000 (19:06 +0300)] 
dbox: Check mailbox existence from index directory with ITERINDEX

8 years agodbox: Use mail_index_header.last_temp_file_scan instead of directory's atime
Timo Sirainen [Wed, 28 Jun 2017 16:46:01 +0000 (19:46 +0300)] 
dbox: Use mail_index_header.last_temp_file_scan instead of directory's atime

This will be required for the following ITERINDEX change.

8 years agolib-index, lib-storage: Add mail_index_header.last_temp_file_scan
Timo Sirainen [Wed, 28 Jun 2017 16:41:21 +0000 (19:41 +0300)] 
lib-index, lib-storage: Add mail_index_header.last_temp_file_scan

Also add index_mailbox_update_last_temp_file_scan() for easily updating it.

This is reusing an old "sync timestamp" field. Because it was a timestamp,
it doesn't matter if the old data still exists in it. This field could have
been added as an extension, but that's more work and this feature is generic
enough that it should be useful for many of the mail storage backends.

8 years agodbox: Cleanup - reorganize old temp file cleanup code
Timo Sirainen [Mon, 26 Jun 2017 15:59:17 +0000 (18:59 +0300)] 
dbox: Cleanup - reorganize old temp file cleanup code

No functional changes. In preparation for the next commits.

8 years agolib-storage: Check for storage existence from index dir with ITERINDEX
Timo Sirainen [Mon, 26 Jun 2017 16:30:11 +0000 (19:30 +0300)] 
lib-storage: Check for storage existence from index dir with ITERINDEX

The root path creation doesn't really even seem to be necessary, because any
mailbox access will automatically mkdir the missing directories anyway.
Although writing other files might not work so well, such as
mail_attribute_dict that points inside the mail directory.

This change simply changes the mailboxes/ directory to be looked up from
index directory instead of the mail root directory. It also mkdirs the
index/mailboxes/ directory afterwards if it didn't exist. So practically
this change shouldn't break anything, since the mailboxes/ directory should
always exist for both root and the indexes.

8 years agolib-storage: mailbox_list_get_permissions() - Use index dir with ITERINDEX
Timo Sirainen [Mon, 26 Jun 2017 15:50:24 +0000 (18:50 +0300)] 
lib-storage: mailbox_list_get_permissions() - Use index dir with ITERINDEX

8 years agolib-storage: mailbox_list_get_permissions() - Use index dir for storage without mails
Timo Sirainen [Mon, 26 Jun 2017 15:46:30 +0000 (18:46 +0300)] 
lib-storage: mailbox_list_get_permissions() - Use index dir for storage without mails

The index dir might still exist.

8 years agolib-storage: Cleanup - move code to mailbox_list_get_permissions_stat()
Timo Sirainen [Mon, 26 Jun 2017 15:41:27 +0000 (18:41 +0300)] 
lib-storage: Cleanup - move code to mailbox_list_get_permissions_stat()

Comments changed also a bit, but no functional changes.

8 years agolib-storage: Cleanup - Use mailbox_permissions_copy() instead of duplicating it
Timo Sirainen [Mon, 26 Jun 2017 15:23:01 +0000 (18:23 +0300)] 
lib-storage: Cleanup - Use mailbox_permissions_copy() instead of duplicating it

8 years agolib-storage: Add mailbox_permissions_copy()
Timo Sirainen [Mon, 26 Jun 2017 15:19:17 +0000 (18:19 +0300)] 
lib-storage: Add mailbox_permissions_copy()

8 years agolib-storage: Add mail_location=..:ITERINDEX
Timo Sirainen [Mon, 26 Jun 2017 17:10:17 +0000 (20:10 +0300)] 
lib-storage: Add mail_location=..:ITERINDEX

This changes mailbox list iteration to work using INDEX directory instead of
the normal mail directory. This can be helpful when the indexes are stored
on a faster storage.

8 years agosdbox: Don't create index directory when trying to open nonexistent mailboxes
Timo Sirainen [Tue, 27 Jun 2017 13:55:34 +0000 (16:55 +0300)] 
sdbox: Don't create index directory when trying to open nonexistent mailboxes

8 years agolib-storage: Fix mailbox delete to not delete childrens' INDEX or CONTROL dirs
Timo Sirainen [Fri, 30 Jun 2017 10:56:54 +0000 (13:56 +0300)] 
lib-storage: Fix mailbox delete to not delete childrens' INDEX or CONTROL dirs

If mail_location had separate INDEX and/or CONTROL set, deleting a mailbox
with children caused the childrens' index and/or control directories to be
deleted (but the mail/ALT directories weren't).

I'm not sure why the _FLAG_MAILBOX_FILES was treated as a special case
earlier. It shouldn't make a difference.