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) +