mailbox-list.c revision 2cb0a0438b625cd399a4aaa0615d69f4b54d349a
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (c) 2006-2012 Dovecot authors, see the included COPYING file */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen/* 20 * (200+1) < 4096 which is the standard PATH_MAX. Having these settings
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen prevents malicious user from creating eg. "a/a/a/.../a" mailbox name and
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen then start renaming them to larger names from end to beginning, which
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen eventually would start causing the failures when trying to use too
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen long mailbox names. */
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainenstruct mailbox_list_module_register mailbox_list_module_register = { 0 };
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainenstatic ARRAY(const struct mailbox_list *) mailbox_list_drivers;
942302b0247403645394d848b3c620ead262a2a5Timo Sirainenstatic bool mailbox_list_driver_find(const char *name, unsigned int *idx_r)
942302b0247403645394d848b3c620ead262a2a5Timo Sirainen unsigned int i, count;
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen drivers = array_get(&mailbox_list_drivers, &count);
11352dc3e4b29f3d2763c82f8ea4f99e8daf4fa3Timo Sirainen for (i = 0; i < count; i++) {
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen if (strcasecmp(drivers[i]->name, name) == 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenvoid mailbox_list_register(const struct mailbox_list *list)
cd8507179823de33d6e8242e10dbc15d136245b5Timo Sirainen unsigned int idx;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mailbox_list_driver_find(list->name, &idx)) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_fatal("mailbox_list_register(%s): duplicate driver",
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen array_append(&mailbox_list_drivers, &list, 1);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenvoid mailbox_list_unregister(const struct mailbox_list *list)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen unsigned int idx;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (!mailbox_list_driver_find(list->name, &idx)) {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_fatal("mailbox_list_unregister(%s): unknown driver",
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen unsigned int idx;
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen class_p = array_idx(&mailbox_list_drivers, idx);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenint mailbox_list_create(const char *driver, struct mail_namespace *ns,
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen struct mailbox_list **list_r, const char **error_r)
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen unsigned int idx;
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (!mailbox_list_driver_find(driver, &idx)) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen class_p = array_idx(&mailbox_list_drivers, idx);
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (((*class_p)->props & MAILBOX_LIST_PROP_NO_MAILDIR_NAME) != 0 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen *error_r = "maildir_name not supported by this driver";
4ece61edd7c266a4b8f3b290a7f0a3cb3d13ca0fTimo Sirainen if (((*class_p)->props & MAILBOX_LIST_PROP_NO_ALT_DIR) != 0 &&
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen *error_r = "alt_dir not supported by this driver";
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen i_assert(set->root_dir == NULL || *set->root_dir != '\0' ||
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen ((*class_p)->props & MAILBOX_LIST_PROP_NO_ROOT) != 0);
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen array_create(&list->module_contexts, list->pool, sizeof(void *), 5);
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen list->root_permissions.file_create_mode = (mode_t)-1;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen list->root_permissions.dir_create_mode = (mode_t)-1;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen list->root_permissions.file_create_gid = (gid_t)-1;
c93ff0433cc3d348116f75a64f9988fedb86fd18Timo Sirainen /* copy settings */
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen list->set.root_dir = p_strdup(list->pool, set->root_dir);
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen list->set.index_dir = set->index_dir == NULL ||
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen strcmp(set->index_dir, set->root_dir) == 0 ? NULL :
132487b9a47c2eb6fc80cfa2b0aaf82c6dc3af56Timo Sirainen list->set.index_pvt_dir = set->index_pvt_dir == NULL ||
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen strcmp(set->index_pvt_dir, set->root_dir) == 0 ? NULL :
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen list->set.control_dir = set->control_dir == NULL ||
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen strcmp(set->control_dir, set->root_dir) == 0 ? NULL :
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen list->set.inbox_path = p_strdup(list->pool, set->inbox_path);
755aea84bbe2b15ed7fe991f6462a93333ff571fTimo Sirainen p_strdup(list->pool, set->subscription_fname);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen list->set.alt_dir = p_strdup(list->pool, set->alt_dir);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen list->set.alt_dir_nocheck = set->alt_dir_nocheck;
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen else if (set->mailbox_dir_name[strlen(set->mailbox_dir_name)-1] == '/') {
596433ccbca59ce2328dc1d029586154cd937155Timo Sirainen p_strconcat(list->pool, set->mailbox_dir_name, "/", NULL);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen i_debug("%s: root=%s, index=%s, indexpvt=%s, control=%s, inbox=%s, alt=%s",
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen list->set.root_dir == NULL ? "" : list->set.root_dir,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen list->set.index_dir == NULL ? "" : list->set.index_dir,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen list->set.index_pvt_dir == NULL ? "" : list->set.index_pvt_dir,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen list->set.alt_dir == NULL ? "" : list->set.alt_dir);
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen if ((flags & MAILBOX_LIST_FLAG_SECONDARY) == 0)
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainenstatic int fix_path(struct mail_user *user, const char *path,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (path[0] == '~' && path[1] != '/' && path[1] != '\0') {
6b399f555c9c5c722d4cd5eab8faa02b2a4731d3Timo Sirainen "No home directory for system user. "
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mail_user_try_home_expand(user, &path) < 0) {
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen *error_r = "Home directory not set for user. "
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen "Can't expand ~/ for ";
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic const char *split_next_arg(const char *const **_args)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen /* string ends with ":", just ignore it. */
8c909e451d14075c05d90382cf8eebc4e354f569Timo Sirainenint mailbox_list_settings_parse(struct mail_user *user, const char *data,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen const char **error_r)
d22301419109ed4a38351715e6760011421dadecTimo Sirainen const char *const *tmp, *key, *value, **dest, *str, *error;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen /* <root dir> */
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen if (fix_path(user, str, &set_r->root_dir, &error) < 0) {
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen *error_r = t_strconcat(error, "mail root dir in: ", data, NULL);
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen if (strncmp(set_r->root_dir, "INBOX=", 6) == 0) {
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen /* probably mbox user trying to avoid root_dir */
ce930f99c6a78f2c74b00df1ad2337095978a9dbTimo Sirainen *error_r = t_strconcat("Mail root directory not given: ",
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen *error_r = t_strdup_printf("Unknown setting: %s", key);
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen if (fix_path(user, value, dest, &error) < 0) {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen *error_r = t_strconcat(error, key, " in: ", data, NULL);
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen if (set_r->index_dir != NULL && strcmp(set_r->index_dir, "MEMORY") == 0)
9cb0fe28ae6f59b9f075e1edfc30f417e846c4a2Timo Sirainenconst char *mailbox_list_get_unexpanded_path(struct mailbox_list *list,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen const char *location = list->ns->unexpanded_set->location;
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (*location == SETTING_STRVAR_EXPANDED[0]) {
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen /* set using -o or userdb lookup. */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_assert(*location == SETTING_STRVAR_UNEXPANDED[0]);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen mail_set = mail_user_set_get_driver_settings(user->set_info,
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen user->unexpanded_set, MAIL_STORAGE_SET_DRIVER_NAME);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen i_assert(*location == SETTING_STRVAR_UNEXPANDED[0]);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen /* type:settings */
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (mailbox_list_settings_parse(user, p + 1, &set, &error) < 0)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen if (mailbox_list_set_get_root_path(&set, type, &path) <= 0)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstatic bool need_escape_dirstart(const char *vname, const char *maildir_name)
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen unsigned int len;
dd37e2ff291fbebac1b94e8aad50f3bdf7531049Timo Sirainen if (vname[1] == '.' && (vname[2] == '\0' || vname[2] == '/'))
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenstatic const char *
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainenmailbox_list_escape_name(struct mailbox_list *list, const char *vname)
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen char ns_sep = mail_namespace_get_sep(list->ns);
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainen char list_sep = mailbox_list_get_hierarchy_sep(list);
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainen /* no escaping of namespace prefix */
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainen if (strncmp(list->ns->prefix, vname, list->ns->prefix_len) == 0) {
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainen str_append_n(escaped_name, vname, list->ns->prefix_len);
212e9e43a7d49242446331fd43ba519eda936d60Timo Sirainen /* escape the mailbox name */
047e3bbb00e68a0d43355e11a67b2e912e06de19Timo Sirainen need_escape_dirstart(vname, list->set.maildir_name))) {
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenmailbox_list_unescape_broken_chars(struct mailbox_list *list, char *name)
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainen unsigned char chr;
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainen if ((src = strchr(name, list->set.broken_char)) == NULL)
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenstatic char *mailbox_list_convert_sep(const char *storage_name, char src, char dest)
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainen ret = p_strdup(unsafe_data_stack_pool, storage_name);
eca30f1fe8556c46abc75c94d03f59b2e89d4162Timo Sirainenconst char *mailbox_list_default_get_storage_name(struct mailbox_list *list,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen storage_name = mailbox_list_escape_name(list, vname);
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen if (prefix_len > 0 && (strcmp(storage_name, "INBOX") != 0 ||
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen (ns->flags & NAMESPACE_FLAG_INBOX_USER) == 0)) {
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen /* skip namespace prefix, except if this is INBOX */
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen if (strncmp(ns->prefix, storage_name, prefix_len) == 0)
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen else if (strncmp(ns->prefix, storage_name, prefix_len-1) == 0 &&
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen ns->prefix[prefix_len-1] == mail_namespace_get_sep(ns)) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen /* trying to access the namespace prefix itself */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen /* we're converting a nonexistent mailbox name,
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen such as a LIST pattern. */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen /* UTF-8 -> mUTF-7 conversion */
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen list_sep = mailbox_list_get_hierarchy_sep(list);
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen if (*storage_name == '\0' && ns->type == MAIL_NAMESPACE_TYPE_SHARED &&
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen (ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0 &&
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen !list->mail_set->mail_shared_explicit_inbox) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainen /* opening shared/$user. it's the same as INBOX. */
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen (ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0) {
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen /* shared namespace root. the backend storage's
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen hierarchy separator isn't known yet, so do
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen ret = mailbox_list_convert_sep(storage_name, ns_sep, list_sep);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen strchr(storage_name, list->set.broken_char) == NULL) {
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen /* no need to convert broken chars */
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen ret = p_strdup(unsafe_data_stack_pool, storage_name);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen if (mailbox_list_unescape_broken_chars(list, ret) < 0) {
18a41cbd38f83429b790414c1159c097af4a59b8Timo Sirainenconst char *mailbox_list_get_storage_name(struct mailbox_list *list,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenstatic const char *
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenmailbox_list_unescape_name(struct mailbox_list *list, const char *src)
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen char ns_sep = mail_namespace_get_sep(list->ns);
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen char list_sep = mailbox_list_get_hierarchy_sep(list);
d859478e8b106de6cea54f26861bd4232c92f62cTimo Sirainen unsigned int num;
206ed2f6fa3a6fb291498627b2da626581c07a18Timo Sirainen if (strncmp(src, list->ns->prefix, list->ns->prefix_len) == 0) {
51327f2489a4e0e615eb9f7d921473cf8512bb79Timo Sirainen str_append_n(dest, src, list->ns->prefix_len);
a385399497bdb50d4dfce729ffc852b75ed46a36Timo Sirainenmailbox_list_escape_broken_chars(struct mailbox_list *list, string_t *str)
d979c1179d55ad86e40f869e48ef3e4db9c817b5Timo Sirainen unsigned int i;
a385399497bdb50d4dfce729ffc852b75ed46a36Timo Sirainen if (strchr(str_c(str), list->set.broken_char) == NULL)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenmailbox_list_escape_broken_name(struct mailbox_list *list,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (*vname == '&' || (unsigned char)*vname >= 0x80) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen str_printfa(str, "%c%02x", list->set.broken_char,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenconst char *mailbox_list_default_get_vname(struct mailbox_list *list,
cc7e2c3903f8fadb7474f09665b2280463850bebTimo Sirainen if ((list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 &&
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* user's INBOX - use as-is. NOTE: don't do case-insensitive
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen comparison, otherwise we can't differentiate between INBOX
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen and <ns prefix>/inBox. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen list->ns->type == MAIL_NAMESPACE_TYPE_SHARED &&
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (list->ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0 &&
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen !list->mail_set->mail_shared_explicit_inbox) {
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* convert to shared/$user, we don't really care about the
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen INBOX suffix here. */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* return namespace prefix without the separator */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* mUTF-7 -> UTF-8 conversion */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mailbox_list_escape_broken_name(list, vname, str);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen list_sep = mailbox_list_get_hierarchy_sep(list);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* @UNSAFE */
ecdce39e5ef4b62eefa9f5818f17d153fd5d710aTimo Sirainen for (i = 0; i < name_len; i++) {
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainen vname = mailbox_list_unescape_name(list, vname);
3852872e6954b7132e637294132005e86b8ebd4aTimo Sirainenconst char *mailbox_list_get_vname(struct mailbox_list *list, const char *name)
4cf5f0934a25f1fd58f2780108f9d6498c455a1fTimo Sirainenvoid mailbox_list_destroy(struct mailbox_list **_list)
4cf5f0934a25f1fd58f2780108f9d6498c455a1fTimo Sirainen if (hash_table_is_created(list->guid_cache)) {
013c0431b58809e16fd0afea0429d0b7bb1ef8a1Timo Sirainenconst char *mailbox_list_get_driver_name(const struct mailbox_list *list)
013c0431b58809e16fd0afea0429d0b7bb1ef8a1Timo Sirainenenum mailbox_list_flags mailbox_list_get_flags(const struct mailbox_list *list)
4ba9a1d3facc515b3feb5238a16bcf91f76fac61Timo Sirainenmailbox_list_get_namespace(const struct mailbox_list *list)
047e3bbb00e68a0d43355e11a67b2e912e06de19Timo Sirainen /* add the execute bit if either read or write bit is set */
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenmailbox_list_get_user(const struct mailbox_list *list)
1d2b188f0eedc3cab6e27ceac5425a037f38042eTimo Sirainenint mailbox_list_get_storage(struct mailbox_list **list, const char *vname,
17ad2164c747cedbf81dae1893063e71a3df0356Timo Sirainen return (*list)->v.get_storage(list, vname, storage_r);
62041dfb7d6ac6e9c633a557075999cdfcff7bd5Timo Sirainenvoid mailbox_list_get_closest_storage(struct mailbox_list *list,
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainenchar mailbox_list_get_hierarchy_sep(struct mailbox_list *list)
eb0816090cf5a549280ad783b9aa6fec199d36baTimo Sirainenmailbox_list_get_permissions_internal(struct mailbox_list *list,
f5a7396b31762a1f876517e13ce9065820139f7cTimo Sirainen memset(permissions_r, 0, sizeof(*permissions_r));
c115c742f730e312d6b6ab5064595cd0d8b4e26eTimo Sirainen /* use safe defaults */
1460ef7a18c53216ddb4a94bb62fba96076aae8eTimo Sirainen permissions_r->file_create_gid_origin = "defaults";
24e5e4526d8f5cbc056ab97fd0d154d0936d7a5eTimo Sirainen if (mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen (void)mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_DIR,
path);
if (p == NULL) {
if (p == NULL)
const char *expanded_full)
const char *ret;
slash_count++;
slash2_count++;
if (slash_count == 0)
slash_count--;
if (slash_count != 0)
if (slash2_count == 0)
slash2_count--;
if (slash2_count != 0)
return ret;
const char **error_r)
if (p == NULL)
if (p == unexpanded)
i_unreached();
error_r) < 0)
const char **error_r)
i_unreached();
const char *error;
const char **error_r)
return TRUE;
return FALSE;
return FALSE;
T_BEGIN {
const char *const *names;
const char *n = *names;
if (!allow_internal_dirs &&
} T_END;
return ret;
return TRUE;
const char **path_r)
int ret;
return ret;
const char **path_r)
int ret;
i_unreached();
if (ret == 0)
return ret > 0;
const char *path;
i_unreached();
return path;
const char **path_r)
switch (type) {
return pattern;
const char *pattern;
int ret;
return ret;
unsigned int len;
*flags_r = 0;
int ret;
if (ret < 0) {
switch (existence) {
case MAILBOX_EXISTENCE_NONE:
case MAILBOX_EXISTENCE_SELECT:
const char *vname;
i_unreached();
fname++;
&inbox) <= 0)
i_unreached();
flags_r);
const char *path;
return TRUE;
return FALSE;
return TRUE;
&index_dir) <= 0)
&root_dir) <= 0 ||
int ret;
return ret;
const char *error;
const char *error;
return TRUE;
levels++;
level_len = 0;
level_len++;
return TRUE;
return TRUE;
return FALSE;
#ifdef HAVE_DIRENT_D_TYPE
switch (d->d_type) {
case DT_UNKNOWN:
case DT_REG:
case DT_DIR:
case DT_LNK:
return type;
const char *dir_path,
const struct dirent *d)
int ret;
T_BEGIN {
ret = 0;
} T_END;
return ret;
return FALSE;
return FALSE;
return TRUE;
const char **name)
unsigned int len;
return FALSE;
return FALSE;
return FALSE;
&path) <= 0)
return FALSE;
return FALSE;
return TRUE;
const char *str;
const char *error_string;
return FALSE;
return TRUE;