]> 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)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 18 Jul 2017 10:41:51 +0000 (13:41 +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 cd2c498694ab5f2924d9f227465e76ad0e4078a6..8e9d6cf329221d4998d63eee672810e7cab01893 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 4588c593bece195c83819a4238e473056e79b660..7f36cc6c08744984a732637427f71af5579823b8 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 ff286080866d50eaf822b1b0e61d0218f98c7ecc..44b1a79d1b2ac56e588424b21fd886d1d39ffd01 100644 (file)
@@ -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) +