Skip to content

Commit

Permalink
virtual: Generate GUID for virtual folder
Browse files Browse the repository at this point in the history
GUID is generated when index is first created
or the rules change.
  • Loading branch information
cmouse committed Jul 7, 2017
1 parent ffe330e commit 825b0e8
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 3 deletions.
34 changes: 31 additions & 3 deletions src/plugins/virtual/virtual-storage.c
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/virtual/virtual-storage.h
Expand Up @@ -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;
Expand Down
7 changes: 7 additions & 0 deletions src/plugins/virtual/virtual-sync.c
Expand Up @@ -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) +
Expand Down

0 comments on commit 825b0e8

Please sign in to comment.