sdbox-storage.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "fs-api.h"
8363f50d7b5d605912e55c34f7f28e9f4ce01341Timo Sirainen#include "master-service.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-index-modseq.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "mail-search-build.h"
e8bdf1be00aec45d0c6dd72ad9c8be02a3dfc778Timo Sirainen#include "mailbox-list-private.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "index-pop3-uidl.h"
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen#include "dbox-mail.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "dbox-save.h"
de4e3a2e1e8f82b2d3226c090b71b518b43bf9cfTimo Sirainen#include "sdbox-file.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "sdbox-sync.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "sdbox-storage.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenextern struct mail_storage dbox_storage, sdbox_storage;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainenextern struct mailbox sdbox_mailbox;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainenextern struct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainenstatic struct mail_storage *sdbox_storage_alloc(void)
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen{
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen struct sdbox_storage *storage;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen pool_t pool;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen pool = pool_alloconly_create("sdbox storage", 512+256);
8363f50d7b5d605912e55c34f7f28e9f4ce01341Timo Sirainen storage = p_new(pool, struct sdbox_storage, 1);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen storage->storage.v = sdbox_dbox_storage_vfuncs;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen storage->storage.storage = sdbox_storage;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen storage->storage.storage.pool = pool;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen return &storage->storage.storage;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int sdbox_storage_create(struct mail_storage *_storage,
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen struct mail_namespace *ns,
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen const char **error_r)
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen{
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen struct dbox_storage *storage = DBOX_STORAGE(_storage);
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen enum fs_properties props;
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen if (dbox_storage_create(_storage, ns, error_r) < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (storage->attachment_fs != NULL) {
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen props = fs_get_properties(storage->attachment_fs);
2cfe9983ce7a6280636ee12beccc2e865111967bTimo Sirainen if ((props & FS_PROPERTY_RENAME) == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *error_r = "mail_attachment_fs: "
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "Backend doesn't support renaming";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return 0;
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen}
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainenstatic const char *
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainensdbox_storage_find_root_dir(const struct mail_namespace *ns)
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen{
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen bool debug = ns->mail_set->mail_debug;
98922c5675bbbfadc84d58768bef867fe82256c2Timo Sirainen const char *home, *path;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ns->owner != NULL &&
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_user_get_home(ns->owner, &home) > 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = t_strconcat(home, "/sdbox", NULL);
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen if (access(path, R_OK|W_OK|X_OK) == 0) {
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen if (debug)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_debug("sdbox: root exists (%s)", path);
d42eb03b3a4e79a2da22a1be2de59b95660af2beTimo Sirainen return path;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen }
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen if (debug)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_debug("sdbox: access(%s, rwx): failed: %m", path);
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return NULL;
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen}
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainenstatic bool sdbox_storage_autodetect(const struct mail_namespace *ns,
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen struct mailbox_list_settings *set)
fc40a9a002458e372ff4b9f6f4e15239520c0bcdTimo Sirainen{
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen bool debug = ns->mail_set->mail_debug;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen struct stat st;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen const char *path, *root_dir;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen if (set->root_dir != NULL)
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen root_dir = set->root_dir;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen else {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen root_dir = sdbox_storage_find_root_dir(ns);
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen if (root_dir == NULL) {
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen if (debug)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_debug("sdbox: couldn't find root dir");
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return FALSE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
bace943c67e6cd14ce6c994f533d82a3caad5bf1Timo Sirainen }
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen /* NOTE: this check works for mdbox as well. we'll rely on the
f6f021c133f680cf3d559187524fd9abcbaae9b9Timo Sirainen autodetect ordering to catch mdbox before we get here. */
f6f021c133f680cf3d559187524fd9abcbaae9b9Timo Sirainen path = t_strconcat(root_dir, "/"DBOX_MAILBOX_DIR_NAME, NULL);
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen if (stat(path, &st) < 0) {
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen if (debug)
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen i_debug("sdbox autodetect: stat(%s) failed: %m", path);
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen return FALSE;
c60d1eda4df179d83d531647732d5e3e45064219Timo Sirainen }
f0a2d04321ba456e5c5ba821c0d1ed9e8e0e2e08Timo Sirainen
d42eb03b3a4e79a2da22a1be2de59b95660af2beTimo Sirainen if (!S_ISDIR(st.st_mode)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (debug)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_debug("sdbox autodetect: %s not a directory", path);
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen return FALSE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
b0a901f1dbe9e05ac1c92a0974af6bce0274f31aTimo Sirainen set->root_dir = root_dir;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen dbox_storage_get_list_settings(ns, set);
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen return TRUE;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainenstatic struct mailbox *
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainensdbox_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen const char *vname, enum mailbox_flags flags)
ebe6df72f1309135f02b6a4d2aef1e81a073f91cTimo Sirainen{
bc6ef0b01b99c43ee46aa796420516e89a744c30Timo Sirainen struct sdbox_mailbox *mbox;
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen struct index_mailbox_context *ibox;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen pool_t pool;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen /* dbox can't work without index files */
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen flags &= ~MAILBOX_FLAG_NO_INDEX_FILES;
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen
992a13add4eea0810e4db0f042a595dddf85536aTimo Sirainen pool = pool_alloconly_create("sdbox mailbox", 1024*3);
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen mbox = p_new(pool, struct sdbox_mailbox, 1);
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen mbox->box = sdbox_mailbox;
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen mbox->box.pool = pool;
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen mbox->box.storage = storage;
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen mbox->box.list = list;
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen mbox->box.mail_vfuncs = &sdbox_mail_vfuncs;
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
fe0d19245382de9d4710d6ed0f7977ff5be4b3b2Timo Sirainen
3eb63515855f386449c22233d1f1baf1ddfe8a2dTimo Sirainen ibox = INDEX_STORAGE_CONTEXT(&mbox->box);
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen ibox->index_flags |= MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS |
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY;
e9d29ae46d435aee85514decfe6ee27399ebf794Timo Sirainen
e9d29ae46d435aee85514decfe6ee27399ebf794Timo Sirainen mbox->storage = SDBOX_STORAGE(storage);
e9d29ae46d435aee85514decfe6ee27399ebf794Timo Sirainen return &mbox->box;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen}
e9d29ae46d435aee85514decfe6ee27399ebf794Timo Sirainen
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainenint sdbox_read_header(struct sdbox_mailbox *mbox,
2d01cc1880cf2afd4fb1c8ad7fa6ce78e562e71eTimo Sirainen struct sdbox_index_header *hdr, bool log_error,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen bool *need_resize_r)
35283613d4c04ce18836e9fc431582c87b3710a0Timo Sirainen{
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen struct mail_index_view *view;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen const void *data;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen size_t data_size;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen int ret = 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen i_assert(mbox->box.opened);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen view = mail_index_view_open(mbox->box.index);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen mail_index_get_header_ext(view, mbox->hdr_ext_id,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen &data, &data_size);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen if (data_size < SDBOX_INDEX_HEADER_MIN_SIZE &&
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen (!mbox->box.creating || data_size != 0)) {
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen if (log_error) {
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mailbox_set_critical(&mbox->box,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen "sdbox: Invalid dbox header size");
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen }
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen ret = -1;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen } else {
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen i_zero(hdr);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr)));
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (guid_128_is_empty(hdr->mailbox_guid))
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen ret = -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen else {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* data is valid. remember it in case mailbox
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen is being reset */
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mail_index_set_ext_init_data(mbox->box.index,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen mbox->hdr_ext_id,
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen hdr, sizeof(*hdr));
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen }
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen }
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen mail_index_view_close(&view);
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen *need_resize_r = data_size < sizeof(*hdr);
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen return ret;
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen}
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainenstatic void sdbox_update_header(struct sdbox_mailbox *mbox,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen struct mail_index_transaction *trans,
51078c3413b7ed4811bc725acbb1289723361ba9Timo Sirainen const struct mailbox_update *update)
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen{
90adcaa0a00eba29b7fbd50ca66be11c8d086d6aTimo Sirainen struct sdbox_index_header hdr, new_hdr;
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen bool need_resize;
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE, &need_resize) < 0) {
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen i_zero(&hdr);
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen need_resize = TRUE;
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen }
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen new_hdr = hdr;
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen if (update != NULL && !guid_128_is_empty(update->mailbox_guid)) {
6013fbad6638795a00e6c2a2dd2cdbee19612494Timo Sirainen memcpy(new_hdr.mailbox_guid, update->mailbox_guid,
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen sizeof(new_hdr.mailbox_guid));
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen } else if (guid_128_is_empty(new_hdr.mailbox_guid)) {
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen guid_128_generate(new_hdr.mailbox_guid);
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen }
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen if (need_resize) {
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen mail_index_ext_resize_hdr(trans, mbox->hdr_ext_id,
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen sizeof(new_hdr));
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen }
b66d803de86bfb411165b3465b0d9ef64ecfe2a1Timo Sirainen if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) {
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0,
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen &new_hdr, sizeof(new_hdr));
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen }
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen memcpy(mbox->mailbox_guid, new_hdr.mailbox_guid,
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen sizeof(mbox->mailbox_guid));
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen}
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainenint sdbox_mailbox_create_indexes(struct mailbox *box,
9334fbad0aabb2fed88f40b2205d0d6f80bdffa2Timo Sirainen const struct mailbox_update *update,
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen struct mail_index_transaction *trans)
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainen{
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen struct sdbox_mailbox *mbox = SDBOX_MAILBOX(box);
3ec2c1f31631bb5ff86f5fc93a563c33e5cae90dTimo Sirainen struct mail_index_transaction *new_trans = NULL;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen const struct mail_index_header *hdr;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen uint32_t uid_validity, uid_next;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen if (trans == NULL) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen new_trans = mail_index_transaction_begin(box->view, 0);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen trans = new_trans;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen hdr = mail_index_get_header(box->view);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (update != NULL && update->uid_validity != 0)
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen uid_validity = update->uid_validity;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen else if (hdr->uid_validity != 0)
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen uid_validity = hdr->uid_validity;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen else {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* set uidvalidity */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen uid_validity = dbox_get_uidvalidity_next(box->list);
5eb85ec9546bac4eea7d78de8997920ba3debd30Timo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (hdr->uid_validity != uid_validity) {
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen mail_index_update_header(trans,
ecd69c4e8371853667e01b0c16d436ef7f7393e2Timo Sirainen offsetof(struct mail_index_header, uid_validity),
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen &uid_validity, sizeof(uid_validity), TRUE);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen if (update != NULL && hdr->next_uid < update->min_next_uid) {
d22301419109ed4a38351715e6760011421dadecTimo Sirainen uid_next = update->min_next_uid;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_index_update_header(trans,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen offsetof(struct mail_index_header, next_uid),
d22301419109ed4a38351715e6760011421dadecTimo Sirainen &uid_next, sizeof(uid_next), TRUE);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (update != NULL && update->min_first_recent_uid != 0 &&
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen hdr->first_recent_uid < update->min_first_recent_uid) {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen uint32_t first_recent_uid = update->min_first_recent_uid;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen mail_index_update_header(trans,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen offsetof(struct mail_index_header, first_recent_uid),
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen &first_recent_uid, sizeof(first_recent_uid), FALSE);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (update != NULL && update->min_highest_modseq != 0 &&
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen mail_index_modseq_get_highest(box->view) <
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen update->min_highest_modseq) {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen mail_index_modseq_enable(box->index);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen mail_index_update_highest_modseq(trans,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen update->min_highest_modseq);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (box->inbox_user && box->creating) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen /* initialize pop3-uidl header when creating mailbox
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen (not on mailbox_update()) */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen index_pop3_uidl_set_max_uid(box, trans, 0);
236bedf76e31651ea9fca63fbdc25be673819526Timo Sirainen }
d22301419109ed4a38351715e6760011421dadecTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen sdbox_update_header(mbox, trans, update);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (new_trans != NULL) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (mail_index_transaction_commit(&new_trans) < 0) {
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen mailbox_set_index_error(box);
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen return -1;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen }
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen return 0;
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen}
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainenstatic const char *
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainensdbox_get_attachment_path_suffix(struct dbox_file *_file)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct sdbox_file *file = (struct sdbox_file *)_file;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return t_strdup_printf("-%s-%u",
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen guid_128_to_string(file->mbox->mailbox_guid),
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen file->uid);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
3eb63515855f386449c22233d1f1baf1ddfe8a2dTimo Sirainen
7ede6554e451ec039a67beec7d6ee4aff61d386eTimo Sirainenvoid sdbox_set_mailbox_corrupted(struct mailbox *box)
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen{
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen struct sdbox_mailbox *mbox = SDBOX_MAILBOX(box);
f567e9ad51a3b4f61580299f12b67e070fb16c5cTimo Sirainen struct sdbox_index_header hdr;
f567e9ad51a3b4f61580299f12b67e070fb16c5cTimo Sirainen bool need_resize;
f567e9ad51a3b4f61580299f12b67e070fb16c5cTimo Sirainen
f567e9ad51a3b4f61580299f12b67e070fb16c5cTimo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE, &need_resize) < 0 ||
b142deb9a831c89b1bb9129ada655f3e56b9d4ccTimo Sirainen hdr.rebuild_count == 0)
b142deb9a831c89b1bb9129ada655f3e56b9d4ccTimo Sirainen mbox->corrupted_rebuild_count = 1;
b142deb9a831c89b1bb9129ada655f3e56b9d4ccTimo Sirainen else
b142deb9a831c89b1bb9129ada655f3e56b9d4ccTimo Sirainen mbox->corrupted_rebuild_count = hdr.rebuild_count;
b6a7e0a7899e7f5d60c23cdaa50e025e4c67d05fTimo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void sdbox_set_file_corrupted(struct dbox_file *_file)
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen{
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen struct sdbox_file *file = (struct sdbox_file *)_file;
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen sdbox_set_mailbox_corrupted(&file->mbox->box);
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen}
80bcc6caa317a52bddcafe74fede886247dbba5bTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainenstatic int sdbox_mailbox_alloc_index(struct sdbox_mailbox *mbox)
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen{
3eb63515855f386449c22233d1f1baf1ddfe8a2dTimo Sirainen struct sdbox_index_header hdr;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen if (index_storage_mailbox_alloc_index(&mbox->box) < 0)
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen return -1;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen mbox->hdr_ext_id =
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen mail_index_ext_register(mbox->box.index, "dbox-hdr",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen sizeof(struct sdbox_index_header), 0, 0);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen /* set the initialization data in case the mailbox is created */
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen i_zero(&hdr);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen guid_128_generate(hdr.mailbox_guid);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen mail_index_set_ext_init_data(mbox->box.index, mbox->hdr_ext_id,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen &hdr, sizeof(hdr));
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen return 0;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen}
d22301419109ed4a38351715e6760011421dadecTimo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainenstatic int sdbox_mailbox_open(struct mailbox *box)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen{
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen struct sdbox_mailbox *mbox = SDBOX_MAILBOX(box);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen struct sdbox_index_header hdr;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen bool need_resize;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen time_t path_ctime;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (dbox_mailbox_check_existence(box, &path_ctime) < 0)
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen return -1;
55b6e3105184ad6a2f987346380966f556300055Timo Sirainen
7aeaf23f760d86aad525d831efcac9f860a55a39Timo Sirainen if (sdbox_mailbox_alloc_index(mbox) < 0)
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen return -1;
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen if (dbox_mailbox_open(box, path_ctime) < 0)
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return -1;
63aaafe7e6b201d6633f8c25610ecd30c9cda99cTimo Sirainen
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen if (box->creating) {
63aaafe7e6b201d6633f8c25610ecd30c9cda99cTimo Sirainen /* wait for mailbox creation to initialize the index */
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen return 0;
2ff23d6fb7e2ff85aa23b7f4769aeac1d0316a1bTimo Sirainen }
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen
d22301419109ed4a38351715e6760011421dadecTimo Sirainen /* get/generate mailbox guid */
63aaafe7e6b201d6633f8c25610ecd30c9cda99cTimo Sirainen if (sdbox_read_header(mbox, &hdr, FALSE, &need_resize) < 0) {
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen /* looks like the mailbox is corrupted */
63aaafe7e6b201d6633f8c25610ecd30c9cda99cTimo Sirainen (void)sdbox_sync(mbox, SDBOX_SYNC_FLAG_FORCE);
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen if (sdbox_read_header(mbox, &hdr, TRUE, &need_resize) < 0)
2ff23d6fb7e2ff85aa23b7f4769aeac1d0316a1bTimo Sirainen i_zero(&hdr);
cf49fc07f541c0f74578ac6c3b334ddade143aa1Timo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
7aeaf23f760d86aad525d831efcac9f860a55a39Timo Sirainen if (guid_128_is_empty(hdr.mailbox_guid)) {
7aeaf23f760d86aad525d831efcac9f860a55a39Timo Sirainen /* regenerate it */
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (sdbox_mailbox_create_indexes(box, NULL, NULL) < 0 ||
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen sdbox_read_header(mbox, &hdr, TRUE, &need_resize) < 0)
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen return -1;
18065635d4e79dd96eb3b3215718abd12f6a6808Timo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen memcpy(mbox->mailbox_guid, hdr.mailbox_guid,
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen sizeof(mbox->mailbox_guid));
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen return 0;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen}
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainenstatic void sdbox_mailbox_close(struct mailbox *box)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen{
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen struct sdbox_mailbox *mbox = SDBOX_MAILBOX(box);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
c36ec256c1bd1abe1c12e792cf64f0b7e3b3135aTimo Sirainen if (mbox->corrupted_rebuild_count != 0)
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen (void)sdbox_sync(mbox, 0);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen index_storage_mailbox_close(box);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen}
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainenstatic int
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainensdbox_mailbox_create(struct mailbox *box,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen const struct mailbox_update *update, bool directory)
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen{
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen struct sdbox_mailbox *mbox = SDBOX_MAILBOX(box);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen struct sdbox_index_header hdr;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen bool need_resize;
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen if (dbox_mailbox_create(box, update, directory) < 0)
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen return -1;
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen if (directory || !guid_128_is_empty(mbox->mailbox_guid))
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen return 0;
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen /* another process just created the mailbox. read the mailbox_guid. */
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (sdbox_read_header(mbox, &hdr, FALSE, &need_resize) < 0) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen mailbox_set_critical(box,
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen "sdbox: Failed to read newly created dbox header");
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen return -1;
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen }
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen memcpy(mbox->mailbox_guid, hdr.mailbox_guid,
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen sizeof(mbox->mailbox_guid));
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen i_assert(!guid_128_is_empty(mbox->mailbox_guid));
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen return 0;
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen}
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainen
a0aedab7cd06125e4d73638b1bd0c01c7caa2626Timo Sirainenstatic int
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainensdbox_mailbox_get_metadata(struct mailbox *box,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen enum mailbox_metadata_items items,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen struct mailbox_metadata *metadata_r)
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen{
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen struct sdbox_mailbox *mbox = SDBOX_MAILBOX(box);
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen return -1;
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen if ((items & MAILBOX_METADATA_GUID) != 0) {
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen memcpy(metadata_r->guid, mbox->mailbox_guid,
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen sizeof(metadata_r->guid));
ae1b268ffff743ad9927c304a1344c5cbd7f909dTimo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen return 0;
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen}
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainenstatic int
d67fde1a8ebc1d85704c5986d8f93aae97eccef3Timo Sirainendbox_mailbox_update(struct mailbox *box, const struct mailbox_update *update)
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen{
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen if (!box->opened) {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen if (mailbox_open(box) < 0)
d22301419109ed4a38351715e6760011421dadecTimo Sirainen return -1;
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen if (sdbox_mailbox_create_indexes(box, update, NULL) < 0)
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen return -1;
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen return index_storage_mailbox_update_common(box, update);
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen}
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainenstruct mail_storage sdbox_storage = {
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen .name = SDBOX_STORAGE_NAME,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen .class_flags = MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG |
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS |
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS |
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen MAIL_STORAGE_CLASS_FLAG_BINARY_DATA |
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen MAIL_STORAGE_CLASS_FLAG_STUBS,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen .v = {
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen NULL,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen sdbox_storage_alloc,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen sdbox_storage_create,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen dbox_storage_destroy,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen NULL,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen dbox_storage_get_list_settings,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen sdbox_storage_autodetect,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen sdbox_mailbox_alloc,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen NULL,
6d50c4d875bb05f9076e9e0ecbacb8beb2e9ae42Timo Sirainen NULL,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen};
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainenstruct mail_storage dbox_storage = {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen .name = "dbox", /* alias */
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen .class_flags = MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG,
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen .v = {
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen NULL,
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen sdbox_storage_alloc,
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen sdbox_storage_create,
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen dbox_storage_destroy,
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen NULL,
7e6522921c81999ec389dab54b338a6fb0f193aaTimo Sirainen dbox_storage_get_list_settings,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen sdbox_storage_autodetect,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen sdbox_mailbox_alloc,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen NULL,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen NULL,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen }
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen};
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainenstruct mailbox sdbox_mailbox = {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen .v = {
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_is_readonly,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_mailbox_enable,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_mailbox_exists,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen sdbox_mailbox_open,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen sdbox_mailbox_close,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_mailbox_free,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen sdbox_mailbox_create,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen dbox_mailbox_update,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_mailbox_delete,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_mailbox_rename,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_get_status,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen sdbox_mailbox_get_metadata,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_set_subscribed,
97eb53ade9057e6966dbb77289ad0204c7e1657bTimo Sirainen index_storage_attribute_set,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen index_storage_attribute_get,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen index_storage_attribute_iter_init,
83bb013a99f0936995f9c7a1077822662d8fefdbTimo Sirainen index_storage_attribute_iter_next,
366d6311c9d5bac6613e3cd64619eb878adce9ecTimo Sirainen index_storage_attribute_iter_deinit,
366d6311c9d5bac6613e3cd64619eb878adce9ecTimo Sirainen index_storage_list_index_has_changed,
d22301419109ed4a38351715e6760011421dadecTimo Sirainen index_storage_list_index_update_sync,
e1eeb3be29afde2830c2b7ed594c6f1fef2f69dcTimo Sirainen sdbox_storage_sync_init,
03de962febfc2ac572f9e4029463c16d29c1ed55Timo Sirainen index_mailbox_sync_next,
366d6311c9d5bac6613e3cd64619eb878adce9ecTimo Sirainen index_mailbox_sync_deinit,
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen NULL,
b19a1420da0618a10edf67c2cfd13c8c8633057aTimo Sirainen dbox_notify_changes,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen index_transaction_begin,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen index_transaction_commit,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen index_transaction_rollback,
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen NULL,
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen dbox_mail_alloc,
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen index_storage_search_init,
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen index_storage_search_deinit,
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen index_storage_search_next_nonblock,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen index_storage_search_next_update_seq,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen sdbox_save_alloc,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen sdbox_save_begin,
24cd47a2c8f7507e555459b7e841de771ba3c318Timo Sirainen dbox_save_continue,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen sdbox_save_finish,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen sdbox_save_cancel,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen sdbox_copy,
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainen sdbox_transaction_save_commit_pre,
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen sdbox_transaction_save_commit_post,
5f44975ec6c5755dd74bcd4c47a123a7242ecab3Timo Sirainen sdbox_transaction_save_rollback,
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainen index_storage_is_inconsistent
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainen }
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainen};
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainen
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainenstruct dbox_storage_vfuncs sdbox_dbox_storage_vfuncs = {
ed34a210eff7707787ee154e5581528b8f4b2daaTimo Sirainen sdbox_file_free,
3df398a463e931b63586726adb3309c9692208c1Timo Sirainen sdbox_file_create_fd,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen sdbox_mail_open,
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen sdbox_mailbox_create_indexes,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen sdbox_get_attachment_path_suffix,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen sdbox_set_mailbox_corrupted,
e4e7475f646d66a257d682738fbff1f206ce4924Timo Sirainen sdbox_set_file_corrupted
5eb85ec9546bac4eea7d78de8997920ba3debd30Timo Sirainen};
46c903eac3abcc7d32780da76ee6a79c26d185b6Timo Sirainen