From: Aki Tuomi Date: Tue, 27 Jun 2017 07:54:08 +0000 (+0300) Subject: virtual: Generate GUID for virtual folder X-Git-Tag: 2.2.32.rc1~91 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c9a7794a9286b9d1921157964dbae78b1884d428;p=thirdparty%2Fdovecot%2Fcore.git virtual: Generate GUID for virtual folder GUID is generated when index is first created or the rules change. --- diff --git a/src/plugins/virtual/virtual-storage.c b/src/plugins/virtual/virtual-storage.c index cd2c498694..8e9d6cf329 100644 --- a/src/plugins/virtual/virtual-storage.c +++ b/src/plugins/virtual/virtual-storage.c @@ -268,6 +268,7 @@ virtual_mailbox_alloc(struct mail_storage *_storage, struct mailbox_list *list, 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 @@ static int virtual_mailbox_open(struct mailbox *box) 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 @@ virtual_mailbox_get_metadata(struct mailbox *box, 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; } diff --git a/src/plugins/virtual/virtual-storage.h b/src/plugins/virtual/virtual-storage.h index 4588c593be..7f36cc6c08 100644 --- a/src/plugins/virtual/virtual-storage.h +++ b/src/plugins/virtual/virtual-storage.h @@ -119,11 +119,13 @@ struct virtual_mailbox { 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; diff --git a/src/plugins/virtual/virtual-sync.c b/src/plugins/virtual/virtual-sync.c index ff28608086..44b1a79d1b 100644 --- a/src/plugins/virtual/virtual-sync.c +++ b/src/plugins/virtual/virtual-sync.c @@ -179,6 +179,13 @@ int virtual_mailbox_ext_header_read(struct virtual_mailbox *mbox, 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) +