mailbox-list-fs.c revision c0a87e5f3316a57e6f915882fa1951d0fbb74a61
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* Copyright (c) 2006-2010 Dovecot authors, see the included COPYING file */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster list->temp_prefix = p_strconcat(pool, GLOBAL_TEMP_PREFIX,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void fs_list_deinit(struct mailbox_list *_list)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct fs_mailbox_list *list = (struct fs_mailbox_list *)_list;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic bool fs_list_is_valid_common(const char *name, size_t *len_r)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_list_is_valid_common_nonfs(struct mailbox_list *list, const char *name)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* make sure it's not absolute path */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* make sure the mailbox name doesn't contain any foolishness:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "../" could give access outside the mailbox directory.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster "./" and "//" could fool ACL checks. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster allow_internal_dirs = list->v.is_internal_name == NULL ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *const *names;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const char *n = *names;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (*n == '\0')
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break; /* // */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (*n == '.') {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break; /* ./ */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster break; /* ../ */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* don't allow maildir_name to be used as part
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster of the mailbox name */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_is_valid_pattern(struct mailbox_list *list, const char *pattern)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (list->mail_set->mail_full_filesystem_access)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return fs_list_is_valid_common_nonfs(list, pattern);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_is_valid_existing_name(struct mailbox_list *list, const char *name)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (list->mail_set->mail_full_filesystem_access)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return fs_list_is_valid_common_nonfs(list, name);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_is_valid_create_name(struct mailbox_list *list, const char *name)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (list->mail_set->mail_full_filesystem_access)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return fs_list_is_valid_common_nonfs(list, name);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic char fs_list_get_hierarchy_sep(struct mailbox_list *list ATTR_UNUSED)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_list_get_path(struct mailbox_list *_list, const char *name,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster const struct mailbox_list_settings *set = &_list->set;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* return root directories */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster i_assert(mailbox_list_is_valid_pattern(_list, name));
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (mailbox_list_try_get_absolute_path(_list, &name))
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return t_strdup_printf("%s/%s%s", set->root_dir,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return t_strdup_printf("%s/%s%s", set->alt_dir,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return t_strdup_printf("%s/%s%s", set->control_dir,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return t_strdup_printf("%s/%s%s", set->index_dir,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* don't use inbox_path */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster } else if (strcmp(name, "INBOX") == 0 && set->inbox_path != NULL) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* If INBOX is a file, index and control directories are
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster located in root directory. */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((_list->flags & MAILBOX_LIST_FLAG_MAILBOX_FILES) == 0 ||
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_list_get_temp_prefix(struct mailbox_list *_list, bool global)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct fs_mailbox_list *list = (struct fs_mailbox_list *)_list;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return global ? GLOBAL_TEMP_PREFIX : list->temp_prefix;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic const char *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterfs_list_join_refpattern(struct mailbox_list *_list ATTR_UNUSED,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* pattern overrides reference */
return pattern;
const char *path;
int ret;
if (create_parent_dir) {
if (p == NULL)
if (create_parent_dir)
return ret;
const char *root_dir;
int ret = 0;
if (ret < 0)
path);
if (ret == 0) {
rmdir_path) < 0)
const char *path)
char sep;
const char *oldname,
const char *p, *origin;
if (rename_children) {
oldname));
if (p != NULL) {
newpath);
if (!rename_children) {
.props = 0,
NULL,
NULL,