From: Timo Sirainen Date: Fri, 16 Sep 2011 13:59:10 +0000 (+0300) Subject: Merged changes from v2.0.15. X-Git-Tag: 2.1.alpha2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc912088f84c263db1609435c2f5d7cb29bf1a33;p=thirdparty%2Fdovecot%2Fcore.git Merged changes from v2.0.15. --- dc912088f84c263db1609435c2f5d7cb29bf1a33 diff --cc .hgsigs index bb94761457,3c4d64f74a..07b1e01486 --- a/.hgsigs +++ b/.hgsigs @@@ -28,4 -28,4 +28,5 @@@ d0d3aca1c9587887a32a890548ec7db76c3bbbe 606faab2b896295b7dae7941b47e9374dbf90a66 0 iEYEABECAAYFAk2kh3YACgkQyUhSUUBViskrNgCfdmuKZ1/9HDFOvBuBnTCw6lUuiaEAn207VAo55MOIb1RwAQgaP8wNC7YS aa8dfa085a99b5c6e1bb6d304adc67b8a199c63a 0 iEYEABECAAYFAk3KpGwACgkQyUhSUUBVismbmQCfTKfNrQnIy2cIQCYUE7zFrRl6nvgAnAu5W0iAfzKwFEAGtnGj1h+D+tY0 aa68f38c04f080fe4d3142fb3f73425b78ef98bd 0 iEYEABECAAYFAk5bEKIACgkQyUhSUUBVislRhwCePWvqh3c+EitvNe1XlMqxpwWvDDgAoJKjDnmLwk0U62IhIQ+x90DEIgl6 +8ae243558677b23f2077c3fe9683cc7890f5eb5d 0 iEYEABECAAYFAk5fSWYACgkQyUhSUUBVism47wCeJe0dWWZZLLXgn3r5oBg+jy9UtN0An3qCOCwxFxql7Ik42c/6kUKiCd1V + 11ef524500964054ae8e4e6150f890b1864139eb 0 iEYEABECAAYFAk5zUvIACgkQyUhSUUBVisnDTgCdHVHSwKeZjHV4KrlTmqipFoO26mkAoIMqPTna3Y1ETIGnPq6XRCB90C8p diff --cc .hgtags index 4794d6c344,895fe5eb41..e619d568d6 --- a/.hgtags +++ b/.hgtags @@@ -65,4 -65,4 +65,5 @@@ d0d3aca1c9587887a32a890548ec7db76c3bbbe 606faab2b896295b7dae7941b47e9374dbf90a66 2.0.12 aa8dfa085a99b5c6e1bb6d304adc67b8a199c63a 2.0.13 aa68f38c04f080fe4d3142fb3f73425b78ef98bd 2.0.14 +8ae243558677b23f2077c3fe9683cc7890f5eb5d 2.1.alpha1 + 11ef524500964054ae8e4e6150f890b1864139eb 2.0.15 diff --cc NEWS index 6ab8e662d2,5e83e00187..27ee0f41c0 --- a/NEWS +++ b/NEWS @@@ -1,32 -1,16 +1,45 @@@ +v2.1.UNSTABLE 2011-xx-xx Timo Sirainen + + * Plugins now use UTF-8 mailbox names rather than mUTF-7: + acl, autocreate, expire, trash, virtual + * auth_username_format default changed to %Lu. If you really want + case sensitive usernames, set it back to empty. + * Solr full text search backend changed to use mailbox GUIDs instead of + mailbox names, requiring reindexing everything. solr_old backend can + be used with old indexes to avoid reindexing, but it doesn't support + some newer features. + + + imapc (= IMAP client) storage allows using a remote IMAP server to + be used as storage. This allows using Dovecot as a smart (caching) + proxy or using dsync to do migration from remote IMAP server. + + Mailbox indexing via queuing indexer service (required for Lucene) + + Lucene full text search (FTS) backend rewritten with support for + different languages + + FTS finally supports "OR" search operation + + FTS supports indexing attachments via external programs + + IMAP FUZZY extension, supported by Lucene and Solr FTS backends + + Mailbox list indexes + + Statistics tracking via stats service. Exported via doveadm stats. + + Autocreate plugin creates/subscribes mailboxes physically only when + the mailbox is opened for the first time. Mailbox listing shows the + autocreated mailboxes even if they don't physically exist. + + Password and user databases now support default_fields and + override_fields settings to specify template defaults/overrides. + - listescape plugin works perfectly now + + v2.0.15 2011-09-16 Timo Sirainen + + + doveadm altmove: Added -r parameter to move mails back to primary + storage. + - v2.0.14: Index reading could have eaten a lot of memory in some + situations + - doveadm index no longer affects future caching decisions + - mbox: Fixed crash during mail delivery when mailbox didn't yet have + GUID assigned to it. + - zlib+mbox: Fetching last message from compressed mailboxes crashed. + - lib-sql: Fixed load balancing and error handling when multiple hosts + are used. + v2.0.14 2011-08-29 Timo Sirainen + doveadm: Added support for running mail commands by proxying to diff --cc src/doveadm/doveadm-mail-altmove.c index 97314c027d,72e7a7412c..06bc48c148 --- a/src/doveadm/doveadm-mail-altmove.c +++ b/src/doveadm/doveadm-mail-altmove.c @@@ -16,19 -21,22 +21,21 @@@ cmd_altmove_box(const struct mailbox_in struct doveadm_mail_iter *iter; struct mailbox_transaction_context *trans; struct mail *mail; + enum modify_type modify_type = + !reverse ? MODIFY_ADD : MODIFY_REMOVE; - if (doveadm_mail_iter_init(info, search_args, &trans, &iter) < 0) + if (doveadm_mail_iter_init(info, search_args, 0, NULL, + &trans, &iter) < 0) return -1; - mail = mail_alloc(trans, 0, NULL); - while (doveadm_mail_iter_next(iter, mail)) { + while (doveadm_mail_iter_next(iter, &mail)) { if (doveadm_debug) { i_debug("altmove: box=%s uid=%u", info->name, mail->uid); } - mail_update_flags(mail, MODIFY_ADD, + mail_update_flags(mail, modify_type, (enum mail_flags)MAIL_INDEX_MAIL_FLAG_BACKEND); } - mail_free(&mail); return doveadm_mail_iter_deinit_sync(&iter); } @@@ -41,11 -49,12 +48,12 @@@ static void ns_purge(struct mail_namesp } static void - cmd_altmove_run(struct doveadm_mail_cmd_context *ctx, struct mail_user *user) + cmd_altmove_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user) { + struct altmove_cmd_context *ctx = (struct altmove_cmd_context *)_ctx; const enum mailbox_list_iter_flags iter_flags = MAILBOX_LIST_ITER_RAW_LIST | - MAILBOX_LIST_ITER_NO_AUTO_INBOX | + MAILBOX_LIST_ITER_NO_AUTO_BOXES | MAILBOX_LIST_ITER_RETURN_NO_FLAGS; struct doveadm_mail_list_iter *iter; const struct mailbox_info *info; diff --cc src/doveadm/doveadm-mail-iter.c index d50872741c,cf25cce8ed..22d8f8e0c2 --- a/src/doveadm/doveadm-mail-iter.c +++ b/src/doveadm/doveadm-mail-iter.c @@@ -64,9 -63,9 +64,9 @@@ doveadm_mail_iter_deinit_transaction(st } if (commit) { if (mailbox_transaction_commit(&iter->t) < 0) { - i_error("Commiting mailbox %s failed: %s", + i_error("Committing mailbox %s failed: %s", mailbox_get_vname(iter->box), - mail_storage_get_last_error(iter->storage, NULL)); + mailbox_get_last_error(iter->box, NULL)); ret = -1; } } else { diff --cc src/lib-index/mail-cache.h index 846e526e3d,e9c3f7d9e0..6c6549f3f2 --- a/src/lib-index/mail-cache.h +++ b/src/lib-index/mail-cache.h @@@ -71,8 -69,8 +71,13 @@@ bool mail_cache_exists(struct mail_cach struct mail_cache_view * mail_cache_view_open(struct mail_cache *cache, struct mail_index_view *iview); -void mail_cache_view_close(struct mail_cache_view *view); +void mail_cache_view_close(struct mail_cache_view **view); + ++/* Normally cache decisions are updated on lookup/add. Use this function to ++ enable/disable this (useful for precaching data). */ ++void mail_cache_view_update_cache_decisions(struct mail_cache_view *view, ++ bool update); + /* Normally cache decisions are updated on lookup/add. Use this function to enable/disable this (useful for precaching data). */ void mail_cache_view_update_cache_decisions(struct mail_cache_view *view, diff --cc src/lib-index/mail-index.h index eea1b3e7b7,0983c970c1..8ed6fba4ff --- a/src/lib-index/mail-index.h +++ b/src/lib-index/mail-index.h @@@ -144,8 -143,7 +144,8 @@@ enum mail_index_sync_flags MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES = 0x08, /* Create the transaction with FSYNC flag */ MAIL_INDEX_SYNC_FLAG_FSYNC = 0x10, - /* If we see "delete index" request transaction, finish it */ + /* If we see "delete index" request transaction, finish it. - This flag also allows commiting more changes to a deleted index. */ ++ This flag also allows committing more changes to a deleted index. */ MAIL_INDEX_SYNC_FLAG_DELETING_INDEX = 0x20 }; diff --cc src/lib-storage/index/index-transaction.c index b92a82b278,2a1b0bb3d4..c24a980525 --- a/src/lib-storage/index/index-transaction.c +++ b/src/lib-storage/index/index-transaction.c @@@ -82,9 -85,12 +82,12 @@@ void index_transaction_init(struct mail array_create(&t->module_contexts, default_pool, sizeof(void *), 5); - it->cache_view = mail_cache_view_open(box->cache, t->view); - it->cache_trans = mail_cache_get_transaction(it->cache_view, t->itrans); + t->cache_view = mail_cache_view_open(box->cache, t->view); + t->cache_trans = mail_cache_get_transaction(t->cache_view, t->itrans); - t->cache_view = it->cache_view; - t->cache_trans = it->cache_trans; ++ if ((flags & MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC) != 0) ++ mail_cache_view_update_cache_decisions(t->cache_view, FALSE); + if ((flags & MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC) != 0) mail_cache_view_update_cache_decisions(t->cache_view, FALSE); diff --cc src/lib-storage/index/mbox/mbox-storage.c index 54f533cc4b,54a7f3fc53..727ffffa88 --- a/src/lib-storage/index/mbox/mbox-storage.c +++ b/src/lib-storage/index/mbox/mbox-storage.c @@@ -595,19 -583,22 +595,29 @@@ mbox_mailbox_get_guid(struct mbox_mailb "Mailbox GUIDs are not permanent without index files"); return -1; } - if (mail_guid_128_is_empty(mbox->mbox_hdr.mailbox_guid)) { + if (!guid_128_is_empty(mbox->mbox_hdr.mailbox_guid)) { + /* we have the GUID */ + } else if (mbox_file_open(mbox) < 0) + return -1; + else if (mbox->backend_readonly) { + mail_storage_set_error(mbox->box.storage, MAIL_ERROR_PERM, + "Can't set mailbox GUID to a read-only mailbox"); + return -1; + } else { - if (mbox_sync_get_guid(mbox) < 0) - return -1; + /* create another mailbox and sync */ + struct mailbox *box2; + struct mbox_mailbox *mbox2; + int ret; + + i_assert(mbox->mbox_lock_type == F_UNLCK); - box2 = mailbox_alloc(box->list, box->name, - MAILBOX_FLAG_KEEP_RECENT); ++ box2 = mailbox_alloc(mbox->box.list, mbox->box.name, 0); + ret = mailbox_sync(box2, 0); + mbox2 = (struct mbox_mailbox *)box2; - memcpy(guid, mbox2->mbox_hdr.mailbox_guid, MAIL_GUID_128_SIZE); ++ memcpy(guid_r, mbox2->mbox_hdr.mailbox_guid, GUID_128_SIZE); + mailbox_free(&box2); + return ret; } - memcpy(guid, mbox->mbox_hdr.mailbox_guid, MAIL_GUID_128_SIZE); + memcpy(guid_r, mbox->mbox_hdr.mailbox_guid, GUID_128_SIZE); return 0; } diff --cc src/lib-storage/index/shared/shared-storage.c index 07f7ada828,b9e048659e..a59fa461ec --- a/src/lib-storage/index/shared/shared-storage.c +++ b/src/lib-storage/index/shared/shared-storage.c @@@ -79,6 -79,12 +79,12 @@@ shared_storage_create(struct mail_stora *error_r = "Shared namespace prefix doesn't contain %u or %n"; return -1; } - if (p[-1] != ns->sep && ++ if (p[-1] != mail_namespace_get_sep(ns) && + (ns->flags & (NAMESPACE_FLAG_LIST_PREFIX | + NAMESPACE_FLAG_LIST_CHILDREN)) != 0) { + *error_r = "Shared namespace prefix doesn't end with hierarchy separator"; + return -1; + } /* truncate prefix after the above checks are done, so they can log the full prefix in error conditions */ diff --cc src/lib-storage/mail-storage-service.c index f445655768,b86f5bae20..13d6c9dd15 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@@ -897,8 -869,6 +896,7 @@@ int mail_storage_service_lookup(struct } user = p_new(user_pool, struct mail_storage_service_user, 1); - memset(user_r, 0, sizeof(user_r)); + user->service_ctx = ctx; user->pool = user_pool; user->input = *input; user->input.userdb_fields = NULL; diff --cc src/lib-storage/mailbox-list.c index bcf1daad89,02bae1df60..0a88f8dd83 --- a/src/lib-storage/mailbox-list.c +++ b/src/lib-storage/mailbox-list.c @@@ -634,32 -434,22 +634,33 @@@ void mailbox_list_get_permissions(struc mailbox_list_set_critical(list, "stat(%s) failed: %m", path); } else if (list->mail_set->mail_debug) { - i_debug("Namespace %s: Permission lookup failed from %s", - list->ns->prefix, path); + i_debug("Namespace %s: %s doesn't exist yet, " + "using default permissions", + list->ns->prefix, path); } if (name != NULL) { - /* return defaults */ - mailbox_list_get_permissions_full(list, NULL, - file_mode_r, - dir_mode_r, gid_r, - gid_origin_r); + /* return parent mailbox */ + p = strrchr(name, mailbox_list_get_hierarchy_sep(list)); + if (p == NULL) { + /* return root defaults */ + parent_name = NULL; + } else { + parent_name = t_strdup_until(name, p); + } + mailbox_list_get_permissions(list, parent_name, + permissions_r); return; } + /* assume current defaults for mailboxes that don't exist or + can't be looked up for some other reason */ + permissions_r->file_uid = geteuid(); + permissions_r->file_gid = getegid(); } else { - *file_mode_r = (st.st_mode & 0666) | 0600; - *dir_mode_r = (st.st_mode & 0777) | 0700; - *gid_origin_r = path; + permissions_r->file_uid = st.st_uid; + permissions_r->file_gid = st.st_gid; + permissions_r->file_create_mode = (st.st_mode & 0666) | 0600; + permissions_r->dir_create_mode = (st.st_mode & 0777) | 0700; + permissions_r->file_create_gid_origin = path; if (!S_ISDIR(st.st_mode)) { /* we're getting permissions from a file.