Mercurial > dovecot > core-2.2
changeset 22341:508663aa112e
virtual: Generate GUID for virtual folder
GUID is generated when index is first created
or the rules change.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Tue, 27 Jun 2017 10:54:08 +0300 |
parents | 06bf20f5e3ec |
children | 68c927bf5863 |
files | src/plugins/virtual/virtual-storage.c src/plugins/virtual/virtual-storage.h src/plugins/virtual/virtual-sync.c |
diffstat | 3 files changed, 40 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/virtual/virtual-storage.c Tue Jun 27 12:42:27 2017 +0300 +++ b/src/plugins/virtual/virtual-storage.c Tue Jun 27 10:54:08 2017 +0300 @@ -268,6 +268,7 @@ mbox->storage = storage; mbox->virtual_ext_id = (uint32_t)-1; + mbox->virtual_guid_ext_id = (uint32_t)-1; return &mbox->box; } @@ -494,11 +495,33 @@ sizeof(struct virtual_mail_index_record), sizeof(uint32_t)); + mbox->virtual_guid_ext_id = + mail_index_ext_register(mbox->box.index, "virtual-guid", GUID_128_SIZE, + 0, 0); + if (virtual_mailbox_ext_header_read(mbox, box->view, &broken) < 0) { virtual_mailbox_close_internal(mbox); index_storage_mailbox_close(box); return -1; } + + /* if GUID is missing write it here */ + if (guid_128_is_empty(mbox->guid)) { + guid_128_generate(mbox->guid); + struct mail_index_transaction *t = + mail_index_transaction_begin(box->view, 0); + mail_index_update_header_ext(t, mbox->virtual_guid_ext_id, + 0, mbox->guid, GUID_128_SIZE); + if (mail_index_transaction_commit(&t) < 0) { + mail_storage_set_critical(box->storage, + "Cannot write GUID for virtual mailbox %s to index", + mailbox_get_vname(box)); + virtual_mailbox_close_internal(mbox); + index_storage_mailbox_close(box); + return -1; + } + } + return 0; } @@ -620,12 +643,17 @@ enum mailbox_metadata_items items, struct mailbox_metadata *metadata_r) { + struct virtual_mailbox *mbox = (struct virtual_mailbox *)box; if (index_mailbox_get_metadata(box, items, metadata_r) < 0) return -1; + i_assert(box->opened); if ((items & MAILBOX_METADATA_GUID) != 0) { - mail_storage_set_error(box->storage, MAIL_ERROR_NOTPOSSIBLE, - "Virtual mailboxes have no GUIDs"); - return -1; + if (guid_128_is_empty(mbox->guid)) { + mail_storage_set_critical(box->storage, "GUID missing for virtual folder %s", + mailbox_get_vname(box)); + return -1; + } + guid_128_copy(metadata_r->guid, mbox->guid); } return 0; }
--- a/src/plugins/virtual/virtual-storage.h Tue Jun 27 12:42:27 2017 +0300 +++ b/src/plugins/virtual/virtual-storage.h Tue Jun 27 10:54:08 2017 +0300 @@ -119,11 +119,13 @@ struct virtual_storage *storage; uint32_t virtual_ext_id; + uint32_t virtual_guid_ext_id; uint32_t prev_uid_validity; uint32_t prev_change_counter; uint32_t highest_mailbox_id; uint32_t search_args_crc32; + guid_128_t guid; struct virtual_backend_box *lookup_prev_bbox; uint32_t sync_virtual_next_uid;
--- a/src/plugins/virtual/virtual-sync.c Tue Jun 27 12:42:27 2017 +0300 +++ b/src/plugins/virtual/virtual-sync.c Tue Jun 27 10:54:08 2017 +0300 @@ -179,6 +179,13 @@ ext_name_offset = 0; ext_mailbox_count = 0; } else { + const void *guid_data; + size_t guid_size; + mail_index_get_header_ext(view, mbox->virtual_guid_ext_id, + &guid_data, &guid_size); + if (guid_size >= GUID_128_SIZE) + guid_128_copy(mbox->guid, guid_data); + mbox->prev_change_counter = ext_hdr->change_counter; mailboxes = (const void *)(ext_hdr + 1); ext_name_offset = sizeof(*ext_hdr) +