mbox-storage.c revision e5afebd2df1d4990f7bec2a839260ff2e6d78168
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen#define CREATE_MODE 0770 /* umask() should limit it more */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* How often to touch the dotlock file when using KEEP_LOCKED flag */
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* Assume that if atime < mtime, there are new mails. If it's good enough for
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch UW-IMAP, it's good enough for us. */
feba5e502b2131c9a1c766b7ef9ff041dbf71d1dStephan Bosch (st).st_atime < (st).st_mtime ? MAILBOX_MARKED : MAILBOX_UNMARKED)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* NOTE: must be sorted for istream-header-filter. Note that it's not such
feba5e502b2131c9a1c766b7ef9ff041dbf71d1dStephan Bosch a good idea to change this list, as the messages will then change from
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch client's point of view. So if you do it, change all mailboxes' UIDVALIDITY
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch so all caches are reset. */
7384b4e78eaab44693c985192276e31322155e32Stephan Boschconst char *mbox_hide_headers[] = {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "Content-Length",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "X-IMAPbase",
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen "X-Keywords",
7384b4e78eaab44693c985192276e31322155e32Stephan Boschunsigned int mbox_hide_headers_count = N_ELEMENTS(mbox_hide_headers);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch/* A bit ugly duplification of the above list. It's safe to modify this list
6dad0888fcec8372f230941c70d8940b8c203b32Stephan Bosch without bad side effects, just keep the list sorted. */
6a90041707f1290c8970a3bacb0f8f928aeaaba6Stephan Bosch "Content-Length",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "X-Delivery-ID"
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch "X-IMAPbase",
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen "X-Keywords",
7384b4e78eaab44693c985192276e31322155e32Stephan Boschunsigned int mbox_save_drop_headers_count = N_ELEMENTS(mbox_save_drop_headers);
6a90041707f1290c8970a3bacb0f8f928aeaaba6Stephan Boschstatic MODULE_CONTEXT_DEFINE_INIT(mbox_mailbox_list_module,
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic int mbox_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx,
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainenstatic int mbox_list_delete_mailbox(struct mailbox_list *list,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *name);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschint mbox_set_syscall_error(struct mbox_mailbox *mbox, const char *function)
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen mail_storage_set_error(&mbox->storage->storage,
6dad0888fcec8372f230941c70d8940b8c203b32Stephan Bosch mail_storage_set_critical(&mbox->storage->storage,
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen "%s failed with mbox file %s: %m",
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic bool mbox_is_file(const char *path, const char *name, bool debug)
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox autodetect: %s: stat(%s) failed: %m",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox autodetect: %s: is a directory (%s)",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox autodetect: %s: no R/W access (%s)",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox autodetect: %s: yes (%s)", name, path);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic bool mbox_is_dir(const char *path, const char *name, bool debug)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox autodetect: %s: stat(%s) failed: %m",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox autodetect: %s: is not a directory (%s)",
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox autodetect: %s: no R/W/X access (%s)",
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox autodetect: %s: yes (%s)", name, path);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic bool mbox_autodetect(const char *data, enum mail_storage_flags flags)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox autodetect: data=%s, splitting ':' -> %s",
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (*path != '\0' && mbox_is_file(path, "INBOX file", debug))
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (mbox_is_dir(t_strconcat(path, "/"MBOX_INDEX_DIR_NAME, NULL),
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen if (mbox_is_file(t_strconcat(path, "/inbox", NULL), "has inbox", debug))
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen if (mbox_is_file(t_strconcat(path, "/mbox", NULL), "has mbox", debug))
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic const char *get_root_dir(struct mail_storage *storage)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch bool debug = (storage->flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox: root: access(%s, rwx) failed: %m", path);
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox: root: access(%s, rwx) failed: %m", path);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox: root mail directory not found");
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainenstatic const char *
7384b4e78eaab44693c985192276e31322155e32Stephan Boschget_inbox_file(const char *user, const char *root_dir,
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox: INBOX: access(%s, rw) failed: %m", path);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch path = t_strconcat("/var/spool/mail/", user, NULL);
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen i_info("mbox: INBOX: access(%s, rw) failed: %m", path);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschstatic const char *create_root_dir(struct mail_storage *storage,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char **error_r)
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen "home directory is missing";
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if (mkdir_parents(path, CREATE_MODE) < 0 && errno != EEXIST) {
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch *error_r = t_strdup_printf("mkdir(%s) failed: %m", path);
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch if ((storage->flags & MAIL_STORAGE_FLAG_DEBUG) != 0)
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch i_info("mbox: root directory created: %s", path);
7384b4e78eaab44693c985192276e31322155e32Stephan Boschmbox_get_list_settings(struct mailbox_list_settings *list_set,
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *data, struct mail_storage *storage,
9e7bf91667639a2390207ab4d90bf88e2afcec2aStephan Bosch enum mail_storage_flags flags = storage->flags;
b72c3363092b73cab1da2de4a9d75592e7d8fd6bTimo Sirainen bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
7384b4e78eaab44693c985192276e31322155e32Stephan Bosch const char *p;
6a90041707f1290c8970a3bacb0f8f928aeaaba6Stephan Bosch list_set->subscription_fname = MBOX_SUBSCRIPTION_FILE_NAME;
e8f1e510df3ab051a816715c2056f0d10aee929eStephan Bosch if ((flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) != 0) {
if (debug)
error_r) < 0)
const char *path, *p;
if (p == NULL)
return path;
const char **error_r)
const char *layout;
int fd;
(void)restrict_access_use_priv_gid();
rootdir);
const char *env;
unsigned int min_size;
return FALSE;
if (min_size == 0)
return FALSE;
return FALSE;
static struct mbox_mailbox *
return NULL;
return mbox;
static struct mailbox *
static struct mailbox *
const char *path;
return NULL;
static struct mailbox *
const char *path;
return NULL;
name));
return NULL;
path);
return NULL;
bool directory)
const char *path, *p;
int fd;
if (p != NULL) {
if (directory) {
int ret = 0;
const char *inbox_path;
return FALSE;
const char *name)
static void mbox_class_init(void)
static void mbox_class_deinit(void)
NULL,
NULL,
NULL,