]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Generate GUID for virtual folder
authorAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 27 Jun 2017 07:54:08 +0000 (10:54 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Fri, 7 Jul 2017 06:59:08 +0000 (09:59 +0300)
GUID is generated when index is first created
or the rules change.

src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-storage.h
src/plugins/virtual/virtual-sync.c

index 2066ea81bed7f3c1dd9c156641b76b64b62fade5..64c3004090b41ec501521895e8f4883dea8dbb62 100644 (file)
@@ -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;
 }
index a7a7f0d96723c2f80a46daf46d0320db63ea76c1..a8d1c1f8c7401e2fe8b5e8414387dcea3df4f4de 100644 (file)
@@ -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;
index c09c0d06ed7c441c0f6ee82e164031753b2c1fce..b3d52aa31812d146f1ed8b029c6062b4b8602299 100644 (file)
@@ -180,6 +180,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) +